From 44174fdc0482e6d28dedd92db38785a41213c13a Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 21 Nov 2023 23:31:56 +0100 Subject: [PATCH 01/54] Add 1.20.50 Bedrock support (#4296) * Start on 1.20.50 * Add 1.20.50 block_palette.1_20_50.nbt, creative_items.1_20_50.json and runtime_item_states.1_20_50.json * fix stone and planks mappings * add and do something with the new SetPlayerInventoryOptionsPacket * Add readme version bump * Cleanup/Explain the new BedrockSetPlayerInventoryOptionsTranslator --- README.md | 2 +- .../geysermc/geyser/network/GameProtocol.java | 6 +- .../geyser/network/LoggingPacketHandler.java | 22 +- .../populator/BlockRegistryPopulator.java | 9 +- .../populator/ItemRegistryPopulator.java | 15 + ...ckSetPlayerInventoryOptionsTranslator.java | 63 + .../bedrock/block_palette.1_20_50.nbt | Bin 0 -> 170466 bytes .../bedrock/creative_items.1_20_50.json | 5787 ++++++++++++++++ .../bedrock/runtime_item_states.1_20_50.json | 5846 +++++++++++++++++ gradle/libs.versions.toml | 6 +- 10 files changed, 11734 insertions(+), 22 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerInventoryOptionsTranslator.java create mode 100644 core/src/main/resources/bedrock/block_palette.1_20_50.nbt create mode 100644 core/src/main/resources/bedrock/creative_items.1_20_50.json create mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_20_50.json diff --git a/README.md b/README.md index 07fb34209c6..b878db64d30 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! -### Currently supporting Minecraft Bedrock 1.20.0 - 1.20.40 and Minecraft Java 1.20.2 +### Currently supporting Minecraft Bedrock 1.20.0 - 1.20.50 and Minecraft Java 1.20.2 ## Setting Up Take a look [here](https://wiki.geysermc.org/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 5555375cd27..4ffdbcf48b9 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; +import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; import org.geysermc.geyser.session.GeyserSession; @@ -47,7 +48,7 @@ public final class GameProtocol { * Default Bedrock codec that should act as a fallback. Should represent the latest available * release of the game that Geyser supports. */ - public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v622.CODEC; + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v630.CODEC; /** * A list of all supported Bedrock versions that can join Geyser @@ -70,6 +71,9 @@ public final class GameProtocol { SUPPORTED_BEDROCK_CODECS.add(Bedrock_v618.CODEC.toBuilder() .minecraftVersion("1.20.30/1.20.32") .build()); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v622.CODEC.toBuilder() + .minecraftVersion("1.20.40/1.20.41") + .build()); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } diff --git a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java index 61c8dbe3d90..ec1bef1df78 100644 --- a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java @@ -32,7 +32,7 @@ /** * Bare bones implementation of BedrockPacketHandler suitable for extension. - * + *

* Logs and ignores all packets presented. Allows subclasses to override/implement only * packets of interest and limit boilerplate code. */ @@ -60,11 +60,6 @@ public PacketSignal handle(ResourcePackClientResponsePacket packet) { return defaultHandler(packet); } - @Override - public PacketSignal handle(AdventureSettingsPacket packet) { - return defaultHandler(packet); - } - @Override public PacketSignal handle(AnimatePacket packet) { return defaultHandler(packet); @@ -120,11 +115,6 @@ public PacketSignal handle(ContainerClosePacket packet) { return defaultHandler(packet); } - @Override - public PacketSignal handle(CraftingEventPacket packet) { - return defaultHandler(packet); - } - @Override public PacketSignal handle(EntityEventPacket packet) { return defaultHandler(packet); @@ -505,11 +495,6 @@ public PacketSignal handle(RespawnPacket packet) { return defaultHandler(packet); } - @Override - public PacketSignal handle(ScriptCustomEventPacket packet) { - return defaultHandler(packet); - } - @Override public PacketSignal handle(ServerSettingsResponsePacket packet) { return defaultHandler(packet); @@ -560,6 +545,11 @@ public PacketSignal handle(SetLastHurtByPacket packet) { return defaultHandler(packet); } + @Override + public PacketSignal handle(SetPlayerInventoryOptionsPacket packet) { + return defaultHandler(packet); + } + @Override public PacketSignal handle(SetScoreboardIdentityPacket packet) { return defaultHandler(packet); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 278ebadfb22..265c6b1f744 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -37,12 +37,17 @@ import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_10; import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_30; import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_40; +import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_50; import org.cloudburstmc.blockstateupdater.util.tagupdater.CompoundTagUpdaterContext; -import org.cloudburstmc.nbt.*; +import org.cloudburstmc.nbt.NBTInputStream; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; +import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.geysermc.geyser.GeyserImpl; @@ -120,12 +125,14 @@ private static void registerBedrockBlocks() { Remapper mapper594 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE); Remapper mapper618 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE); Remapper mapper622 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE, BlockStateUpdater_1_20_40.INSTANCE); + Remapper mapper630 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE, BlockStateUpdater_1_20_40.INSTANCE, BlockStateUpdater_1_20_50.INSTANCE); var blockMappers = ImmutableMap., Remapper>builder() .put(ObjectIntPair.of("1_20_0", Bedrock_v589.CODEC.getProtocolVersion()), tag -> tag) .put(ObjectIntPair.of("1_20_10", Bedrock_v594.CODEC.getProtocolVersion()), mapper594) .put(ObjectIntPair.of("1_20_30", Bedrock_v618.CODEC.getProtocolVersion()), mapper618) .put(ObjectIntPair.of("1_20_40", Bedrock_v622.CODEC.getProtocolVersion()), mapper622) + .put(ObjectIntPair.of("1_20_50", Bedrock_v630.CODEC.getProtocolVersion()), mapper630) .build(); // We can keep this strong as nothing should be garbage collected diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 85772603872..fe6e21e6f12 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -42,6 +42,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; +import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; @@ -113,11 +114,25 @@ public static void populate() { return mapping; }; + Remapper remapper630 = (item, mapping) -> { + mapping = remapper618.remap(item, mapping); // apply 1.20.30 remapper first + + String id = item.javaIdentifier(); + // 1.20.50 replaced stone & planks to individual stone types + // E.g.: granite, diorite, andesite, polished variants, dark_oak_planks etc + if (mapping.getBedrockIdentifier().equals("minecraft:stone") || mapping.getBedrockIdentifier().equals("minecraft:planks")) { + return mapping.withBedrockIdentifier(id); + } + + return mapping; + }; + List paletteVersions = new ArrayList<>(3); paletteVersions.add(new PaletteVersion("1_20_0", Bedrock_v589.CODEC.getProtocolVersion())); paletteVersions.add(new PaletteVersion("1_20_10", Bedrock_v594.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper594)); paletteVersions.add(new PaletteVersion("1_20_30", Bedrock_v618.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); // NO item changes between 1.20.30 and 1.20.40 + paletteVersions.add(new PaletteVersion("1_20_50", Bedrock_v630.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper630)); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerInventoryOptionsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerInventoryOptionsTranslator.java new file mode 100644 index 00000000000..0f07d84da0c --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerInventoryOptionsTranslator.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.bedrock.entity.player; + +import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; +import com.github.steveice10.mc.protocol.data.game.inventory.CraftingBookStateType; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundRecipeBookChangeSettingsPacket; +import org.cloudburstmc.protocol.bedrock.data.inventory.InventoryTabLeft; +import org.cloudburstmc.protocol.bedrock.data.inventory.InventoryTabRight; +import org.cloudburstmc.protocol.bedrock.packet.SetPlayerInventoryOptionsPacket; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; + +@Translator(packet = SetPlayerInventoryOptionsPacket.class) +public class BedrockSetPlayerInventoryOptionsTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, SetPlayerInventoryOptionsPacket packet) { + // Sent by 1.20.50+ - we can pass it through to the java server + + // This should ensure that we never send these packets when the player inventory is opened while in creative + // Java edition can't craft in the 2x2 grid in creative, and subsequently doesn't have a recipe book + if (session.getGameMode() == GameMode.CREATIVE && session.getPlayerInventory() == session.getOpenInventory()) { + return; + } + + boolean filtered = packet.isFiltering(); + boolean bookOpen = isBookOpen(packet.getLeftTab(), packet.getRightTab()); + + // Hardcoded to crafting; bedrock does not have any furnace recipe books + session.sendDownstreamPacket(new ServerboundRecipeBookChangeSettingsPacket(CraftingBookStateType.CRAFTING, bookOpen, filtered)); + } + + private boolean isBookOpen(InventoryTabLeft leftTab, InventoryTabRight rightTab) { + boolean leftOpen = (leftTab != InventoryTabLeft.NONE && leftTab != InventoryTabLeft.SURVIVAL); + boolean rightOpen = rightTab == InventoryTabRight.CRAFTING; + return leftOpen || rightOpen; + } +} diff --git a/core/src/main/resources/bedrock/block_palette.1_20_50.nbt b/core/src/main/resources/bedrock/block_palette.1_20_50.nbt new file mode 100644 index 0000000000000000000000000000000000000000..0eecda74f72dcf026d3f665c050d04a1f8485bb8 GIT binary patch literal 170466 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 JkFhIPadz0t*h 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

oYIzSyh{iiN^y?}E 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 LqW$og#cL=429 Date: Wed, 22 Nov 2023 22:03:24 +0100 Subject: [PATCH 02/54] Don't send an awkward "null" when a exeption disconnect cause doesn't have a message (#4306) * Don't send an awkward "null" when a cause doesn't have a message * Fix accidental regression leading to unhandled "CraftingEventPackets" --- .../org/geysermc/geyser/network/LoggingPacketHandler.java | 5 +++++ .../java/org/geysermc/geyser/session/GeyserSession.java | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java index ec1bef1df78..80e62489597 100644 --- a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java @@ -115,6 +115,11 @@ public PacketSignal handle(ContainerClosePacket packet) { return defaultHandler(packet); } + @Override + public PacketSignal handle(CraftingEventPacket packet) { + return defaultHandler(packet); + } + @Override public PacketSignal handle(EntityEventPacket packet) { return defaultHandler(packet); diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index ebb0025da12..9bfb4e01ced 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1039,7 +1039,11 @@ public void disconnected(DisconnectedEvent event) { geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.disconnect", authData.name(), remoteServer.address(), disconnectMessage)); } if (cause != null) { - GeyserImpl.getInstance().getLogger().error(cause.getMessage()); + if (cause.getMessage() != null) { + GeyserImpl.getInstance().getLogger().error(cause.getMessage()); + } else { + GeyserImpl.getInstance().getLogger().error("An exception occurred: ", cause); + } // GeyserSession is disconnected via session.disconnect() called indirectly be the server // This only needs to be "initiated" here when there is an exception, hence the cause clause GeyserSession.this.disconnect(disconnectMessage); From 3292718e696b2e26b89750e339de4267a70c422d Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 23 Nov 2023 09:51:57 +0100 Subject: [PATCH 03/54] Don't show custom names on display entities (#4309) * Ensure that a custom text display entity name doesn't show up - it doesn't show on Java, and if we show it, the text display contents aren't shown. * Update core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com> --------- Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com> --- .../org/geysermc/geyser/entity/type/TextDisplayEntity.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java index 703d5210b6b..0b61604018c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java @@ -34,6 +34,7 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.text.MessageTranslator; +import java.util.Optional; import java.util.UUID; // Note: 1.19.4 requires that the billboard is set to something in order to show, on Java Edition @@ -56,6 +57,12 @@ public void setDisplayNameVisible(BooleanEntityMetadata entityMetadata) { // On JE: Hiding the display name still shows the display entity text. } + @Override + public void setDisplayName(EntityMetadata, ?> entityMetadata) { + // This would usually set EntityDataTypes.NAME, but we are instead using NAME for the text display. + // On JE: custom name does not override text display. + } + public void setText(EntityMetadata entityMetadata) { this.dirtyMetadata.put(EntityDataTypes.NAME, MessageTranslator.convertMessage(entityMetadata.getValue())); } From 0f50a3cbe604f6c4ab8d6004c6dd09d7a071879c Mon Sep 17 00:00:00 2001 From: Kas-tle <26531652+Kas-tle@users.noreply.github.com> Date: Tue, 28 Nov 2023 20:33:07 -0800 Subject: [PATCH 04/54] Re-implement subchunk v9 with proper index (#4287) * Re-implement subchunk v9 with proper index Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com> * typo in comment --------- Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com> --- build.gradle.kts | 4 +++- .../level/chunk/GeyserChunkSection.java | 19 +++++++++------- .../JavaLevelChunkWithLightTranslator.java | 22 +++++++++++-------- .../org/geysermc/geyser/util/ChunkUtils.java | 22 +++++++++++++------ 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9eb8a6ed080..d7360b7019d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,7 @@ plugins { `java-library` + // Ensure AP works in eclipse (no effect on other IDEs) + `eclipse` id("geyser.build-logic") id("io.freefair.lombok") version "6.3.0" apply false } @@ -35,4 +37,4 @@ subprojects { in platforms -> plugins.apply("geyser.platform-conventions") else -> plugins.apply("geyser.base-conventions") } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/geysermc/geyser/level/chunk/GeyserChunkSection.java b/core/src/main/java/org/geysermc/geyser/level/chunk/GeyserChunkSection.java index f3e6b839921..8a3534a8ec2 100644 --- a/core/src/main/java/org/geysermc/geyser/level/chunk/GeyserChunkSection.java +++ b/core/src/main/java/org/geysermc/geyser/level/chunk/GeyserChunkSection.java @@ -30,18 +30,20 @@ public class GeyserChunkSection { - // Temporary reversion to v8 as it reduces the frequnecy of https://github.com/GeyserMC/Geyser/issues/4240 - // This does not fully resolve the issue so a better solution is still needed - private static final int CHUNK_SECTION_VERSION = 8; + // As of at least 1.19.80 + private static final int CHUNK_SECTION_VERSION = 9; private final BlockStorage[] storage; + // Counts up from 00 for y >= 0 and down from FF for y < 0 + private final int subChunkIndex; - public GeyserChunkSection(int airBlockId) { - this(new BlockStorage[]{new BlockStorage(airBlockId), new BlockStorage(airBlockId)}); + public GeyserChunkSection(int airBlockId, int subChunkIndex) { + this(new BlockStorage[]{new BlockStorage(airBlockId), new BlockStorage(airBlockId)}, subChunkIndex); } - public GeyserChunkSection(BlockStorage[] storage) { + public GeyserChunkSection(BlockStorage[] storage, int subChunkIndex) { this.storage = storage; + this.subChunkIndex = subChunkIndex; } public int getFullBlock(int x, int y, int z, int layer) { @@ -60,6 +62,7 @@ public void writeToNetwork(ByteBuf buffer) { buffer.writeByte(CHUNK_SECTION_VERSION); buffer.writeByte(this.storage.length); // Required for chunk version 9+ + buffer.writeByte(this.subChunkIndex); for (BlockStorage blockStorage : this.storage) { blockStorage.writeToNetwork(buffer); } @@ -86,12 +89,12 @@ public boolean isEmpty() { return true; } - public GeyserChunkSection copy() { + public GeyserChunkSection copy(int subChunkIndex) { BlockStorage[] storage = new BlockStorage[this.storage.length]; for (int i = 0; i < storage.length; i++) { storage[i] = this.storage[i].copy(); } - return new GeyserChunkSection(storage); + return new GeyserChunkSection(storage, subChunkIndex); } public static int blockPosition(int x, int y, int z) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java index 85eec40e02b..9a86815422f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java @@ -78,7 +78,8 @@ import java.util.List; import java.util.Map; -import static org.geysermc.geyser.util.ChunkUtils.SERIALIZED_CHUNK_DATA; +import static org.geysermc.geyser.util.ChunkUtils.EMPTY_BLOCK_STORAGE; +import static org.geysermc.geyser.util.ChunkUtils.EMPTY_CHUNK_SECTION_SIZE; import static org.geysermc.geyser.util.ChunkUtils.indexYZXtoXZY; @Translator(packet = ClientboundLevelChunkWithLightPacket.class) @@ -127,6 +128,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke boolean thisExtendedCollisionNextSection = false; int bedrockSectionY = sectionY + (yOffset - (bedrockDimension.minY() >> 4)); + int subChunkIndex = sectionY + yOffset; if (bedrockSectionY < 0 || maxBedrockSectionY < bedrockSectionY) { // Ignore this chunk section since it goes outside the bounds accepted by the Bedrock client if (useExtendedCollisions) { @@ -154,7 +156,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke } BlockStorage[] layers = new BlockStorage[]{ layer0 }; - sections[bedrockSectionY] = new GeyserChunkSection(layers); + sections[bedrockSectionY] = new GeyserChunkSection(layers, subChunkIndex); } EXTENDED_COLLISIONS_STORAGE.get().clear(); extendedCollisionNextSection = false; @@ -167,7 +169,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke if (javaPalette instanceof GlobalPalette) { // As this is the global palette, simply iterate through the whole chunk section once - GeyserChunkSection section = new GeyserChunkSection(session.getBlockMappings().getBedrockAir().getRuntimeId()); + GeyserChunkSection section = new GeyserChunkSection(session.getBlockMappings().getBedrockAir().getRuntimeId(), subChunkIndex); for (int yzx = 0; yzx < BlockStorage.SIZE; yzx++) { int javaId = javaData.get(yzx); int bedrockId = session.getBlockMappings().getBedrockBlockId(javaId); @@ -217,9 +219,9 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke if (BlockRegistries.WATERLOGGED.get().get(javaId)) { BlockStorage waterlogged = new BlockStorage(SingletonBitArray.INSTANCE, IntLists.singleton(session.getBlockMappings().getBedrockWater().getRuntimeId())); - sections[bedrockSectionY] = new GeyserChunkSection(new BlockStorage[] {blockStorage, waterlogged}); + sections[bedrockSectionY] = new GeyserChunkSection(new BlockStorage[] {blockStorage, waterlogged}, subChunkIndex); } else { - sections[bedrockSectionY] = new GeyserChunkSection(new BlockStorage[] {blockStorage}); + sections[bedrockSectionY] = new GeyserChunkSection(new BlockStorage[] {blockStorage}, subChunkIndex); } if (useExtendedCollisions) { EXTENDED_COLLISIONS_STORAGE.get().clear(); @@ -378,7 +380,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke layers = new BlockStorage[]{ layer0, new BlockStorage(BitArrayVersion.V1.createArray(BlockStorage.SIZE, layer1Data), layer1Palette) }; } - sections[bedrockSectionY] = new GeyserChunkSection(layers); + sections[bedrockSectionY] = new GeyserChunkSection(layers, subChunkIndex); extendedCollisionNextSection = thisExtendedCollisionNextSection; } @@ -426,13 +428,14 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke BlockDefinition blockDefinition = SkullBlockEntityTranslator.translateSkull(session, tag, Vector3i.from(x + chunkBlockX, y, z + chunkBlockZ), blockState); if (blockDefinition != null) { int bedrockSectionY = (y >> 4) - (bedrockDimension.minY() >> 4); + int subChunkIndex = (y >> 4) + (bedrockDimension.minY() >> 4); if (0 <= bedrockSectionY && bedrockSectionY < maxBedrockSectionY) { // Custom skull is in a section accepted by Bedrock GeyserChunkSection bedrockSection = sections[bedrockSectionY]; IntList palette = bedrockSection.getBlockStorageArray()[0].getPalette(); if (palette instanceof IntImmutableList || palette instanceof IntLists.Singleton) { // TODO there has to be a better way to expand the palette .-. - bedrockSection = bedrockSection.copy(); + bedrockSection = bedrockSection.copy(subChunkIndex); sections[bedrockSectionY] = bedrockSection; } bedrockSection.setFullBlock(x, y & 0xF, z, 0, blockDefinition.getRuntimeId()); @@ -458,7 +461,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke if (section != null) { size += section.estimateNetworkSize(); } else { - size += SERIALIZED_CHUNK_DATA.length; + size += EMPTY_CHUNK_SECTION_SIZE; } } size += ChunkUtils.EMPTY_BIOME_DATA.length * biomeCount; @@ -472,7 +475,8 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke if (section != null) { section.writeToNetwork(byteBuf); } else { - byteBuf.writeBytes(SERIALIZED_CHUNK_DATA); + int subChunkIndex = (i + (bedrockDimension.minY() >> 4)); + new GeyserChunkSection(EMPTY_BLOCK_STORAGE, subChunkIndex).writeToNetwork(byteBuf); } } diff --git a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java index cded234f973..114a7b6ded4 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java @@ -54,19 +54,27 @@ @UtilityClass public class ChunkUtils { - /** - * An empty subchunk. - */ - public static final byte[] SERIALIZED_CHUNK_DATA; + public static final byte[] EMPTY_BIOME_DATA; + public static final BlockStorage[] EMPTY_BLOCK_STORAGE; + + public static final int EMPTY_CHUNK_SECTION_SIZE; + static { + EMPTY_BLOCK_STORAGE = new BlockStorage[0]; + ByteBuf byteBuf = Unpooled.buffer(); try { - new GeyserChunkSection(new BlockStorage[0]) + new GeyserChunkSection(EMPTY_BLOCK_STORAGE, 0) .writeToNetwork(byteBuf); - SERIALIZED_CHUNK_DATA = new byte[byteBuf.readableBytes()]; - byteBuf.readBytes(SERIALIZED_CHUNK_DATA); + + byte[] emptyChunkData = new byte[byteBuf.readableBytes()]; + byteBuf.readBytes(emptyChunkData); + + EMPTY_CHUNK_SECTION_SIZE = emptyChunkData.length; + + emptyChunkData = null; } finally { byteBuf.release(); } From 11945db7a040587d71390443fa67cde4d131e2e9 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 1 Dec 2023 10:27:42 +0100 Subject: [PATCH 05/54] Clear mob spawners if the Java server so requests (#4232) * Clear mob spawners if the Java server so requests * Empty spawners by replacing the spawner block with a new one instead of adding an invalid identifier to them. Unfortunately, sending one UpdateBlockPacket that replaces the spawner does not work, we need to set the spawner to air first. Cool. But at least we don't summon particles for all empty spawners now * store position vector (address review by @konicai) * remove empty line --- .../populator/BlockRegistryPopulator.java | 8 ++++- .../geyser/registry/type/BlockMappings.java | 1 + .../block/entity/BlockEntityTranslator.java | 3 +- .../entity/SpawnerBlockEntityTranslator.java | 36 +++++++++++++++++-- .../level/JavaBlockEntityDataTranslator.java | 4 +-- .../JavaLevelChunkWithLightTranslator.java | 2 +- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 265c6b1f744..e3f4e685d2c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -221,6 +221,7 @@ private static void registerBedrockBlocks() { GeyserBedrockBlock airDefinition = null; BlockDefinition commandBlockDefinition = null; + BlockDefinition mobSpawnerBlockDefinition = null; BlockDefinition waterDefinition = null; BlockDefinition movingBlockDefinition = null; Iterator> blocksIterator = BLOCKS_JSON.fields(); @@ -269,6 +270,7 @@ private static void registerBedrockBlocks() { case "minecraft:air" -> airDefinition = bedrockDefinition; case "minecraft:water[level=0]" -> waterDefinition = bedrockDefinition; case "minecraft:command_block[conditional=false,facing=north]" -> commandBlockDefinition = bedrockDefinition; + case "minecraft:spawner" -> mobSpawnerBlockDefinition = bedrockDefinition; case "minecraft:moving_piston[facing=north,type=normal]" -> movingBlockDefinition = bedrockDefinition; } @@ -298,9 +300,13 @@ private static void registerBedrockBlocks() { if (commandBlockDefinition == null) { throw new AssertionError("Unable to find command block in palette"); } - builder.commandBlock(commandBlockDefinition); + if (mobSpawnerBlockDefinition == null) { + throw new AssertionError("Unable to find mob spawner block in palette"); + } + builder.mobSpawnerBlock(mobSpawnerBlockDefinition); + if (waterDefinition == null) { throw new AssertionError("Unable to find water in palette"); } diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java index 80be3fbcead..3d06cecac10 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java @@ -54,6 +54,7 @@ public class BlockMappings implements DefinitionRegistry { int[] remappedVanillaIds; BlockDefinition commandBlock; + BlockDefinition mobSpawnerBlock; Map itemFrames; Map flowerPotBlocks; diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BlockEntityTranslator.java index b89a2a5471b..7566e0d9048 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BlockEntityTranslator.java @@ -30,6 +30,7 @@ import com.github.steveice10.opennbt.tag.builtin.Tag; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; /** @@ -41,7 +42,7 @@ protected BlockEntityTranslator() { public abstract void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState); - public NbtMap getBlockEntityTag(BlockEntityType type, int x, int y, int z, CompoundTag tag, int blockState) { + public NbtMap getBlockEntityTag(GeyserSession session, BlockEntityType type, int x, int y, int z, CompoundTag tag, int blockState) { NbtMapBuilder tagBuilder = getConstantBedrockTag(BlockEntityUtils.getBedrockBlockEntityId(type), x, y, z); translateTag(tagBuilder, tag, blockState); return tagBuilder.build(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java index d1af70d8d45..0aa8af27928 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java @@ -29,12 +29,44 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.cloudburstmc.math.vector.Vector3i; +import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; +import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; @BlockEntity(type = BlockEntityType.MOB_SPAWNER) public class SpawnerBlockEntityTranslator extends BlockEntityTranslator { + + @Override + public NbtMap getBlockEntityTag(GeyserSession session, BlockEntityType type, int x, int y, int z, CompoundTag tag, int blockState) { + // Sending an empty EntityIdentifier to empty the spawner is ignored by the client, so we send a whole new spawner! + // Fixes https://github.com/GeyserMC/Geyser/issues/4214 + CompoundTag spawnData = tag.get("SpawnData"); + if (spawnData != null) { + CompoundTag entityTag = spawnData.get("entity"); + if (entityTag.isEmpty()) { + Vector3i position = Vector3i.from(x, y, z); + // Set to air and back to reset the spawner - "just" updating the spawner doesn't work + UpdateBlockPacket emptyBlockPacket = new UpdateBlockPacket(); + emptyBlockPacket.setDataLayer(0); + emptyBlockPacket.setBlockPosition(position); + emptyBlockPacket.setDefinition(session.getBlockMappings().getBedrockAir()); + session.sendUpstreamPacket(emptyBlockPacket); + + UpdateBlockPacket spawnerBlockPacket = new UpdateBlockPacket(); + spawnerBlockPacket.setDataLayer(0); + spawnerBlockPacket.setBlockPosition(position); + spawnerBlockPacket.setDefinition(session.getBlockMappings().getMobSpawnerBlock()); + session.sendUpstreamPacket(spawnerBlockPacket); + } + } + + return super.getBlockEntityTag(session, type, x, y, z, tag, blockState); + } + @Override public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) { Tag current; @@ -69,8 +101,8 @@ public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) CompoundTag spawnData = tag.get("SpawnData"); if (spawnData != null) { - StringTag idTag = ((CompoundTag) spawnData.get("entity")).get("id"); - if (idTag != null) { + CompoundTag entityTag = spawnData.get("entity"); + if (entityTag.get("id") instanceof StringTag idTag) { // As of 1.19.3, spawners can be empty String entityId = idTag.getValue(); builder.put("EntityIdentifier", entityId); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEntityDataTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEntityDataTranslator.java index b86882d84ad..c67a6dee4a4 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEntityDataTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEntityDataTranslator.java @@ -62,7 +62,7 @@ public void translate(GeyserSession session, ClientboundBlockEntityDataPacket pa } Vector3i position = packet.getPosition(); - BlockEntityUtils.updateBlockEntity(session, translator.getBlockEntityTag(type, position.getX(), position.getY(), position.getZ(), + BlockEntityUtils.updateBlockEntity(session, translator.getBlockEntityTag(session, type, position.getX(), position.getY(), position.getZ(), packet.getNbt(), blockState), packet.getPosition()); // Check for custom skulls. boolean hasCustomHeadBlock = false; @@ -80,7 +80,7 @@ public void translate(GeyserSession session, ClientboundBlockEntityDataPacket pa } } if (!hasCustomHeadBlock) { - BlockEntityUtils.updateBlockEntity(session, translator.getBlockEntityTag(type, position.getX(), position.getY(), position.getZ(), + BlockEntityUtils.updateBlockEntity(session, translator.getBlockEntityTag(session, type, position.getX(), position.getY(), position.getZ(), packet.getNbt(), blockState), packet.getPosition()); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java index 9a86815422f..19c587bf809 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelChunkWithLightTranslator.java @@ -421,7 +421,7 @@ public void translate(GeyserSession session, ClientboundLevelChunkWithLightPacke } BlockEntityTranslator blockEntityTranslator = BlockEntityUtils.getBlockEntityTranslator(type); - bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(type, x + chunkBlockX, y, z + chunkBlockZ, tag, blockState)); + bedrockBlockEntities.add(blockEntityTranslator.getBlockEntityTag(session, type, x + chunkBlockX, y, z + chunkBlockZ, tag, blockState)); // Check for custom skulls if (session.getPreferencesCache().showCustomSkulls() && type == BlockEntityType.SKULL && tag != null && tag.contains("SkullOwner")) { From b8481cc3cd2c105feaacfc676ea9caef81a5c9d4 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 1 Dec 2023 20:38:25 +0100 Subject: [PATCH 06/54] Fix: Recipe tags application We only need to use recipe tags when there is more than one possible ingredient option. For example, before this, we applied a logs item tag to the planks recipe, which caused an issue with plank type suggestions. (#4321) --- .../translator/protocol/java/JavaUpdateRecipesTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java index 5beb1a20128..71cb6019ae7 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java @@ -337,7 +337,7 @@ private ItemDescriptorWithCount[][] combinations(GeyserSession session, Ingredie GroupedItem groupedItem = entry.getKey(); String recipeTag = RECIPE_TAGS.get(groupedItem.id.getIdentifier()); - if (recipeTag != null) { + if (recipeTag != null && ingredients.length > 1) { optionSet.add(new ItemDescriptorWithCount(new ItemTagDescriptor(recipeTag), groupedItem.count)); continue; } From 308f293021e261a4504fea5831f6e32d5333ffd1 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 4 Dec 2023 01:44:06 +0100 Subject: [PATCH 07/54] Fix potential issue with the settings form - coordinate showing might change while we are in the settings menu (#4324) --- .../geysermc/geyser/util/SettingsUtils.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java b/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java index 8a8d684f6ee..ed97408b996 100644 --- a/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/SettingsUtils.java @@ -49,28 +49,32 @@ public static CustomForm buildForm(GeyserSession session) { .title("geyser.settings.title.main") .iconPath("textures/ui/settings_glyph_color_2x.png"); + // Let's store these to avoid issues + boolean showCoordinates = session.getPreferencesCache().isAllowShowCoordinates(); + boolean cooldownShown = CooldownUtils.getDefaultShowCooldown() != CooldownUtils.CooldownType.DISABLED; + boolean customSkulls = session.getGeyser().getConfig().isAllowCustomSkulls(); + // Only show the client title if any of the client settings are available - boolean showClientSettings = session.getPreferencesCache().isAllowShowCoordinates() - || CooldownUtils.getDefaultShowCooldown() != CooldownUtils.CooldownType.DISABLED - || session.getGeyser().getConfig().isAllowCustomSkulls(); + boolean showClientSettings = showCoordinates || cooldownShown || customSkulls; if (showClientSettings) { builder.label("geyser.settings.title.client"); // Client can only see its coordinates if reducedDebugInfo is disabled and coordinates are enabled in geyser config. - if (session.getPreferencesCache().isAllowShowCoordinates()) { + if (showCoordinates) { builder.toggle("%createWorldScreen.showCoordinates", session.getPreferencesCache().isPrefersShowCoordinates()); } - if (CooldownUtils.getDefaultShowCooldown() != CooldownUtils.CooldownType.DISABLED) { + if (cooldownShown) { DropdownComponent.Builder cooldownDropdown = DropdownComponent.builder("options.attackIndicator"); - cooldownDropdown.option("options.attack.crosshair", session.getPreferencesCache().getCooldownPreference() == CooldownUtils.CooldownType.TITLE); - cooldownDropdown.option("options.attack.hotbar", session.getPreferencesCache().getCooldownPreference() == CooldownUtils.CooldownType.ACTIONBAR); - cooldownDropdown.option("options.off", session.getPreferencesCache().getCooldownPreference() == CooldownUtils.CooldownType.DISABLED); + CooldownUtils.CooldownType currentCooldownType = session.getPreferencesCache().getCooldownPreference(); + cooldownDropdown.option("options.attack.crosshair", currentCooldownType == CooldownUtils.CooldownType.TITLE); + cooldownDropdown.option("options.attack.hotbar", currentCooldownType == CooldownUtils.CooldownType.ACTIONBAR); + cooldownDropdown.option("options.off", currentCooldownType == CooldownUtils.CooldownType.DISABLED); builder.dropdown(cooldownDropdown); } - if (session.getGeyser().getConfig().isAllowCustomSkulls()) { + if (customSkulls) { builder.toggle("geyser.settings.option.customSkulls", session.getPreferencesCache().isPrefersCustomSkulls()); } } @@ -94,17 +98,21 @@ public static CustomForm buildForm(GeyserSession session) { builder.validResultHandler((response) -> { if (showClientSettings) { // Client can only see its coordinates if reducedDebugInfo is disabled and coordinates are enabled in geyser config. - if (session.getPreferencesCache().isAllowShowCoordinates()) { - session.getPreferencesCache().setPrefersShowCoordinates(response.next()); - session.getPreferencesCache().updateShowCoordinates(); + if (showCoordinates) { + // In theory, a server could update the gamerule while the client is in the settings menu. + // We need to still read the response to update the client's preference, but we don't want to update the gamerule. + if (session.getPreferencesCache().isAllowShowCoordinates()) { + session.getPreferencesCache().setPrefersShowCoordinates(response.next()); + session.getPreferencesCache().updateShowCoordinates(); + } } - if (CooldownUtils.getDefaultShowCooldown() != CooldownUtils.CooldownType.DISABLED) { + if (cooldownShown) { CooldownUtils.CooldownType cooldownType = CooldownUtils.CooldownType.VALUES[(int) response.next()]; session.getPreferencesCache().setCooldownPreference(cooldownType); } - if (session.getGeyser().getConfig().isAllowCustomSkulls()) { + if (customSkulls) { session.getPreferencesCache().setPrefersCustomSkulls(response.next()); } } From 998caee156d38245a15e560f15864319ad125cbb Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:05:12 -0500 Subject: [PATCH 08/54] Catch all throwables when loading each extension (#4320) --- .../geyser/extension/GeyserExtensionLoader.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java index da0fbffda1d..2f0ff15802f 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java @@ -56,7 +56,7 @@ public class GeyserExtensionLoader extends ExtensionLoader { private final Map extensionContainers = new HashMap<>(); private final Path extensionsDirectory = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("extensions"); - public GeyserExtensionContainer loadExtension(Path path, GeyserExtensionDescription description) throws InvalidExtensionException { + public GeyserExtensionContainer loadExtension(Path path, GeyserExtensionDescription description) throws Throwable { if (path == null) { throw new InvalidExtensionException("Path is null"); } @@ -92,8 +92,14 @@ public GeyserExtensionContainer loadExtension(Path path, GeyserExtensionDescript this.classLoaders.put(description.id(), loader); - final Extension extension = loader.load(); - return this.setup(extension, description, dataFolder, new GeyserExtensionEventBus(GeyserImpl.getInstance().eventBus(), extension)); + try { + final Extension extension = loader.load(); + return this.setup(extension, description, dataFolder, new GeyserExtensionEventBus(GeyserImpl.getInstance().eventBus(), extension)); + } catch (Throwable e) { + // if the extension failed to load, remove its classloader and close it. + this.classLoaders.remove(description.id()).close(); + throw e; + } } private GeyserExtensionContainer setup(Extension extension, GeyserExtensionDescription description, Path dataFolder, ExtensionEventBus eventBus) { @@ -182,9 +188,10 @@ protected void loadAllExtensions(@NonNull ExtensionManager extensionManager) { return; } + GeyserExtensionContainer container = this.loadExtension(path, description); extensions.put(id, path); - loadedExtensions.put(id, this.loadExtension(path, description)); - } catch (Exception e) { + loadedExtensions.put(id, container); + } catch (Throwable e) { GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.extensions.load.failed_with_name", path.getFileName(), path.toAbsolutePath()), e); } }); From 95d65350e42bbffa0d2901e2b8a558968d85f24a Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 6 Dec 2023 00:54:42 +0100 Subject: [PATCH 09/54] Project wide syntax/annotation cleanup (#4238) Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com> --- CONTRIBUTING.md | 18 +- .../geyser/processor/ClassProcessor.java | 4 +- .../org/geysermc/geyser/api/GeyserApi.java | 1 + .../api/bedrock/camera/CameraShake.java | 2 +- .../custom/component/PlacementConditions.java | 6 +- .../custom/nonvanilla/JavaBlockState.java | 12 +- .../custom/nonvanilla/JavaBoundingBox.java | 4 +- .../geysermc/geyser/api/event/EventBus.java | 1 - .../geyser/api/event/EventSubscriber.java | 1 - .../connection/GeyserBedrockPingEvent.java | 2 +- .../lifecycle/GeyserDefineCommandsEvent.java | 2 +- .../GeyserDefineCustomBlocksEvent.java | 7 +- .../GeyserDefineCustomItemsEvent.java | 2 +- .../GeyserDefineCustomSkullsEvent.java | 2 +- .../InvalidDescriptionException.java | 6 + .../exception/InvalidExtensionException.java | 6 + .../geyser/api/util/CreativeCategory.java | 2 +- .../geysermc/geyser/api/util/TriState.java | 2 +- .../bungeecord/GeyserBungeeDumpInfo.java | 4 +- .../bungeecord/GeyserBungeeInjector.java | 3 +- .../GeyserBungeePingPassthrough.java | 3 +- .../bungeecord/GeyserBungeePlugin.java | 5 +- .../command/BungeeCommandSource.java | 3 +- .../platform/fabric/GeyserFabricMod.java | 6 +- .../fabric/command/FabricCommandSender.java | 7 +- .../command/GeyserFabricCommandExecutor.java | 6 +- .../mixin/client/IntegratedServerMixin.java | 3 + .../world/GeyserFabricWorldManager.java | 16 +- .../spigot/GeyserPaperPingPassthrough.java | 7 +- .../GeyserSpigotCompressionDisabler.java | 2 +- .../platform/spigot/GeyserSpigotDumpInfo.java | 1 + .../platform/spigot/GeyserSpigotInjector.java | 13 +- .../spigot/GeyserSpigotPingPassthrough.java | 9 +- .../platform/spigot/GeyserSpigotPlugin.java | 9 +- .../spigot/GeyserSpigotVersionChecker.java | 1 + .../platform/spigot/PaperAdventure.java | 8 +- .../platform/spigot/ReflectedNames.java | 13 +- .../command/GeyserPaperCommandListener.java | 2 +- .../command/GeyserSpigotCommandExecutor.java | 5 +- .../spigot/command/SpigotCommandSource.java | 6 +- .../GeyserSpigotLegacyNativeWorldManager.java | 2 + .../GeyserSpigotNativeWorldManager.java | 2 +- .../manager/GeyserSpigotWorldManager.java | 41 +++-- .../standalone/GeyserStandaloneBootstrap.java | 8 +- .../platform/standalone/gui/ColorPane.java | 9 +- .../standalone/gui/GeyserStandaloneGUI.java | 7 +- .../platform/standalone/gui/GraphPanel.java | 9 +- .../velocity/GeyserVelocityInjector.java | 3 +- .../velocity/GeyserVelocityPlugin.java | 8 +- .../command/VelocityCommandSource.java | 3 +- .../floodgate/crypto/AesKeyProducer.java | 2 +- .../floodgate/crypto/FloodgateCipher.java | 5 +- .../floodgate/crypto/KeyProducer.java | 2 +- .../org/geysermc/floodgate/news/NewsItem.java | 1 + .../floodgate/news/NewsItemAction.java | 4 +- .../floodgate/news/NewsItemMessage.java | 3 +- .../org/geysermc/floodgate/news/NewsType.java | 3 +- .../news/data/BuildSpecificData.java | 1 + .../news/data/ConfigSpecificData.java | 1 + .../geysermc/floodgate/util/BedrockData.java | 2 + .../util/InvalidFormatException.java | 3 + .../geysermc/floodgate/util/LinkedPlayer.java | 3 +- .../geysermc/floodgate/util/UiProfile.java | 4 +- .../floodgate/util/WebsocketEventType.java | 4 +- .../org/geysermc/geyser/GeyserBootstrap.java | 2 +- .../java/org/geysermc/geyser/GeyserImpl.java | 10 +- .../org/geysermc/geyser/GeyserLogger.java | 5 +- .../java/org/geysermc/geyser/GeyserMain.java | 5 +- .../geyser/command/GeyserCommand.java | 11 +- .../geyser/command/GeyserCommandExecutor.java | 2 +- .../geyser/command/GeyserCommandManager.java | 7 +- .../defaults/ConnectionTestCommand.java | 2 +- .../geyser/command/defaults/DumpCommand.java | 2 +- .../command/defaults/ExtensionsCommand.java | 2 +- .../command/defaults/VersionCommand.java | 7 +- .../configuration/GeyserConfiguration.java | 2 + .../GeyserJacksonConfiguration.java | 5 +- .../org/geysermc/geyser/dump/DumpInfo.java | 63 ++----- .../geyser/entity/EntityDefinition.java | 1 + .../entity/attribute/GeyserAttributeType.java | 3 +- .../entity/type/AreaEffectCloudEntity.java | 1 - .../geysermc/geyser/entity/type/Entity.java | 3 +- .../geyser/entity/type/LivingEntity.java | 3 +- .../geyser/entity/type/ThrowableEntity.java | 1 - .../type/living/AbstractFishEntity.java | 6 +- .../entity/type/living/AllayEntity.java | 10 +- .../entity/type/living/ArmorStandEntity.java | 4 +- .../entity/type/living/DolphinEntity.java | 10 +- .../entity/type/living/IronGolemEntity.java | 6 +- .../geyser/entity/type/living/MobEntity.java | 10 +- .../entity/type/living/SnowGolemEntity.java | 10 +- .../entity/type/living/TadpoleEntity.java | 10 +- .../type/living/animal/AnimalEntity.java | 10 +- .../type/living/animal/AxolotlEntity.java | 6 +- .../entity/type/living/animal/CowEntity.java | 10 +- .../entity/type/living/animal/GoatEntity.java | 6 +- .../type/living/animal/MooshroomEntity.java | 10 +- .../type/living/animal/OcelotEntity.java | 10 +- .../type/living/animal/PandaEntity.java | 12 +- .../entity/type/living/animal/PigEntity.java | 10 +- .../type/living/animal/SheepEntity.java | 10 +- .../type/living/animal/StriderEntity.java | 10 +- .../animal/horse/AbstractHorseEntity.java | 28 ++-- .../type/living/animal/horse/CamelEntity.java | 1 - .../animal/horse/ChestedHorseEntity.java | 8 +- .../animal/horse/SkeletonHorseEntity.java | 10 +- .../animal/horse/ZombieHorseEntity.java | 10 +- .../living/animal/tameable/CatEntity.java | 10 +- .../living/animal/tameable/ParrotEntity.java | 10 +- .../living/animal/tameable/WolfEntity.java | 10 +- .../merchant/AbstractMerchantEntity.java | 10 +- .../type/living/merchant/VillagerEntity.java | 4 +- .../type/living/monster/CreeperEntity.java | 10 +- .../type/living/monster/PiglinEntity.java | 12 +- .../living/monster/ZombieVillagerEntity.java | 10 +- .../entity/type/player/PlayerEntity.java | 5 +- .../type/player/SessionPlayerEntity.java | 6 +- .../AbstractGeyserboundPacketHandler.java | 2 +- .../GeyserboundHandshakePacketHandler.java | 4 +- .../erosion/UnixSocketClientListener.java | 5 +- .../geysermc/geyser/event/GeyserEventBus.java | 1 - .../geyser/event/GeyserEventSubscriber.java | 1 - .../type/GeyserBedrockPingEventImpl.java | 9 +- .../GeyserDefineCustomItemsEventImpl.java | 4 +- .../geyser/inventory/AnvilContainer.java | 3 +- .../geysermc/geyser/inventory/Container.java | 5 +- .../geyser/inventory/Generic3X3Container.java | 2 +- .../geyser/inventory/GeyserEnchantOption.java | 2 +- .../geyser/inventory/GeyserItemStack.java | 12 +- .../geysermc/geyser/inventory/Inventory.java | 4 +- .../geyser/inventory/PlayerInventory.java | 11 +- .../inventory/StonecutterContainer.java | 2 +- .../geyser/inventory/item/Enchantment.java | 7 +- .../geyser/inventory/item/Potion.java | 5 +- .../inventory/item/StoredItemMappings.java | 4 +- .../inventory/item/TippedArrowPotion.java | 9 +- .../updater/AnvilInventoryUpdater.java | 7 +- .../geyser/item/GeyserCustomItemOptions.java | 6 +- .../geyser/item/GeyserCustomMappingData.java | 1 - .../item/GeyserNonVanillaCustomItemData.java | 6 +- .../geyser/item/components/ToolTier.java | 11 -- .../InvalidCustomMappingsFileException.java | 12 +- .../geysermc/geyser/item/type/ArrowItem.java | 4 +- .../geyser/item/type/AxolotlBucketItem.java | 4 +- .../geysermc/geyser/item/type/BannerItem.java | 11 +- .../geyser/item/type/CompassItem.java | 5 +- .../geyser/item/type/CrossbowItem.java | 2 +- .../geyser/item/type/EnchantedBookItem.java | 3 +- .../geyser/item/type/FishingRodItem.java | 3 +- .../geyser/item/type/GoatHornItem.java | 3 +- .../org/geysermc/geyser/item/type/Item.java | 6 +- .../geysermc/geyser/item/type/MapItem.java | 5 +- .../geysermc/geyser/item/type/PotionItem.java | 3 +- .../geysermc/geyser/level/BedrockMapIcon.java | 3 +- .../geysermc/geyser/level/FireworkColor.java | 3 +- .../geyser/level/GeyserAdvancement.java | 4 +- .../geyser/level/GeyserWorldManager.java | 7 +- .../geysermc/geyser/level/WorldManager.java | 11 +- .../geyser/level/block/DoubleChestValue.java | 13 +- .../level/block/GeyserCustomBlockData.java | 6 +- .../level/block/GeyserCustomBlockState.java | 2 +- .../level/block/GeyserJavaBlockState.java | 12 +- .../level/chunk/bitarray/BitArrayVersion.java | 7 +- .../level/physics/CollisionManager.java | 3 +- .../geyser/level/physics/Direction.java | 8 +- .../geyser/level/physics/PistonBehavior.java | 4 +- .../geysermc/geyser/network/GameProtocol.java | 3 +- .../network/GeyserServerInitializer.java | 4 +- .../geyser/network/netty/ChannelWrapper.java | 3 +- .../network/netty/LocalChannelWrapper.java | 13 +- .../geyser/network/netty/LocalSession.java | 5 +- .../handler/RakConnectionRequestHandler.java | 2 +- .../netty/proxy/ProxyProtocolDecoder.java | 11 +- .../pack/GeyserResourcePackManifest.java | 4 +- .../geyser/pack/SkullResourcePackManager.java | 5 +- .../ping/GeyserLegacyPingPassthrough.java | 3 +- .../geyser/ping/IGeyserPingPassthrough.java | 2 +- .../registry/AbstractMappedRegistry.java | 2 +- .../geyser/registry/ArrayRegistry.java | 2 +- .../geyser/registry/BlockRegistries.java | 1 - .../geyser/registry/IntMappedRegistry.java | 2 +- .../geysermc/geyser/registry/Registry.java | 1 - .../geyser/registry/VersionedRegistry.java | 8 +- .../loader/AnnotatedRegistryLoader.java | 1 + .../loader/BiomeIdentifierRegistryLoader.java | 2 +- .../loader/CollisionRegistryLoader.java | 5 +- .../registry/loader/EffectRegistryLoader.java | 2 +- .../loader/EnchantmentRegistryLoader.java | 2 +- .../registry/loader/NbtRegistryLoader.java | 2 +- .../loader/PotionMixRegistryLoader.java | 3 +- .../registry/loader/SoundRegistryLoader.java | 2 +- .../mappings/MappingsConfigReader.java | 17 +- .../mappings/util/CustomBlockMapping.java | 6 +- .../mappings/versions/MappingsReader.java | 9 +- .../mappings/versions/MappingsReader_v1.java | 14 +- .../populator/BlockRegistryPopulator.java | 33 ++-- .../CreativeItemRegistryPopulator.java | 7 +- .../CustomBlockRegistryPopulator.java | 15 +- .../CustomItemRegistryPopulator.java | 30 ++-- .../CustomSkullRegistryPopulator.java | 9 +- .../populator/ItemRegistryPopulator.java | 4 +- .../populator/RecipeRegistryPopulator.java | 2 +- .../geyser/registry/type/BlockMapping.java | 10 +- .../geyser/registry/type/BlockMappings.java | 5 +- .../geyser/registry/type/ParticleMapping.java | 6 +- .../geysermc/geyser/scoreboard/Objective.java | 3 +- .../geyser/scoreboard/Scoreboard.java | 13 +- .../geyser/scoreboard/ScoreboardUpdater.java | 1 + .../org/geysermc/geyser/scoreboard/Team.java | 6 +- .../geyser/session/GeyserSession.java | 17 +- .../PendingMicrosoftAuthentication.java | 12 +- .../geyser/session/SessionManager.java | 5 +- .../session/cache/AdvancementsCache.java | 2 +- .../geyser/session/cache/BookEditCache.java | 2 +- .../geyser/session/cache/LodestoneCache.java | 6 +- .../session/cache/PreferencesCache.java | 4 +- .../geyser/session/cache/SkullCache.java | 3 +- .../geyser/session/cache/WorldBorder.java | 5 +- .../geyser/skin/FakeHeadProvider.java | 4 +- .../org/geysermc/geyser/skin/SkinManager.java | 4 +- .../geysermc/geyser/skin/SkinProvider.java | 35 ++-- .../geyser/text/AsteriskSerializer.java | 10 +- .../geysermc/geyser/text/ChatTypeEntry.java | 7 +- .../text/DummyLegacyHoverEventSerializer.java | 10 +- .../geysermc/geyser/text/GeyserLocale.java | 3 +- .../text/GsonComponentSerializerWrapper.java | 16 +- .../geysermc/geyser/text/MinecraftLocale.java | 5 +- .../text/MinecraftTranslationRegistry.java | 12 +- .../translator/collision/BlockCollision.java | 2 +- .../collision/SpawnerCollision.java | 38 ----- .../inventory/InventoryTranslator.java | 2 +- .../inventory/item/ItemTranslator.java | 22 ++- .../block/entity/BedrockOnlyBlockEntity.java | 3 +- .../ShulkerBoxBlockEntityTranslator.java | 3 +- .../entity/SkullBlockEntityTranslator.java | 3 +- ...BedrockInventoryTransactionTranslator.java | 6 +- .../BedrockItemFrameDropItemTranslator.java | 2 +- .../entity/BedrockEntityEventTranslator.java | 2 +- .../protocol/java/JavaCommandsTranslator.java | 2 +- .../java/JavaLoginDisconnectTranslator.java | 4 +- .../java/JavaUpdateRecipesTranslator.java | 1 + .../java/entity/JavaAnimateTranslator.java | 24 ++- .../entity/JavaTakeItemEntityTranslator.java | 1 - .../JavaPlayerCombatKillTranslator.java | 1 - .../level/JavaBlockDestructionTranslator.java | 1 - .../level/JavaLevelParticlesTranslator.java | 3 +- .../translator/sound/SoundTranslator.java | 2 +- .../ComparatorSoundInteractionTranslator.java | 1 - .../block/DoorSoundInteractionTranslator.java | 1 - .../LeverSoundInteractionTranslator.java | 1 - .../translator/text/MessageTranslator.java | 2 +- .../geysermc/geyser/util/AttributeUtils.java | 2 +- .../geyser/util/BlockEntityUtils.java | 4 +- .../org/geysermc/geyser/util/BlockUtils.java | 3 +- .../geysermc/geyser/util/CooldownUtils.java | 2 +- .../org/geysermc/geyser/util/CpuUtils.java | 6 +- .../org/geysermc/geyser/util/FileUtils.java | 6 +- .../geysermc/geyser/util/InventoryUtils.java | 14 +- .../org/geysermc/geyser/util/ItemUtils.java | 5 +- .../geysermc/geyser/util/JavaCodecUtil.java | 4 +- .../org/geysermc/geyser/util/Metrics.java | 154 ++---------------- .../org/geysermc/geyser/util/SignUtils.java | 2 - .../org/geysermc/geyser/util/SoundUtils.java | 3 +- .../geyser/util/VersionCheckUtils.java | 7 +- .../org/geysermc/geyser/util/WebUtils.java | 13 +- .../util/collection/FixedInt2BooleanMap.java | 6 + .../util/collection/FixedInt2ByteMap.java | 6 + .../util/collection/FixedInt2IntMap.java | 5 + .../util/collection/LecternHasBookMap.java | 5 + .../geyser/util/collection/package-info.java | 2 +- 270 files changed, 891 insertions(+), 977 deletions(-) delete mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/SpawnerCollision.java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dac8a9a07e4..a483fbe9597 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,32 +19,28 @@ public class LongClassName { public int nameWithMultipleWords = 0; /** - * Javadoc comment to explain what a function does. - */ + * Javadoc comment to explain what a function does. + */ @RandomAnnotation(stuff = true, moreStuff = "might exist") public void applyStuff() { Variable variable = new Variable(); Variable otherVariable = new Variable(); if (condition) { - // Do stuff. + // Do stuff. } else if (anotherCondition) { - // Do something else. + // Do something else. } switch (value) { - case 0: - stuff(); - break; - case 1: - differentStuff(); - break; + case 0 -> stuff(); + case 1 -> differentStuff(); } } } ``` -Make sure to comment your code where possible. +Make sure to comment your code where possible. To mark nullable methods, use `@Nullable` (and subsequently, `@NonNull`) from the `org.checkerframework.checker.nullness.qual` package. The nature of our software requires a lot of arrays and maps to be stored - where possible, use Fastutil's specialized maps. For example, if you're storing block state translations, use an `Int2IntMap`. diff --git a/ap/src/main/java/org/geysermc/geyser/processor/ClassProcessor.java b/ap/src/main/java/org/geysermc/geyser/processor/ClassProcessor.java index e1da50f258e..6fcd5d888d3 100644 --- a/ap/src/main/java/org/geysermc/geyser/processor/ClassProcessor.java +++ b/ap/src/main/java/org/geysermc/geyser/processor/ClassProcessor.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.processor; +import org.checkerframework.checker.nullness.qual.Nullable; + import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; @@ -159,7 +161,7 @@ public void complete() { this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Completed processing for " + this.annotationClassName); } - private BufferedReader createReader() throws IOException { + private @Nullable BufferedReader createReader() throws IOException { if (this.outputPath != null) { this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Reading existing " + this.annotationClassName + " list from " + this.outputPath); return Files.newBufferedReader(this.outputPath); diff --git a/api/src/main/java/org/geysermc/geyser/api/GeyserApi.java b/api/src/main/java/org/geysermc/geyser/api/GeyserApi.java index de5c78678b6..0d6007c1ce6 100644 --- a/api/src/main/java/org/geysermc/geyser/api/GeyserApi.java +++ b/api/src/main/java/org/geysermc/geyser/api/GeyserApi.java @@ -77,6 +77,7 @@ public interface GeyserApi extends GeyserApiBase { * @param apiClass the builder class * @param the implementation type * @param the API type + * @throws IllegalArgumentException if there is no provider for the specified API class * @return the builder instance */ @NonNull diff --git a/api/src/main/java/org/geysermc/geyser/api/bedrock/camera/CameraShake.java b/api/src/main/java/org/geysermc/geyser/api/bedrock/camera/CameraShake.java index 18bafb4283b..67b56b1f55f 100644 --- a/api/src/main/java/org/geysermc/geyser/api/bedrock/camera/CameraShake.java +++ b/api/src/main/java/org/geysermc/geyser/api/bedrock/camera/CameraShake.java @@ -27,5 +27,5 @@ public enum CameraShake { POSITIONAL, - ROTATIONAL; + ROTATIONAL } diff --git a/api/src/main/java/org/geysermc/geyser/api/block/custom/component/PlacementConditions.java b/api/src/main/java/org/geysermc/geyser/api/block/custom/component/PlacementConditions.java index d06d9a9675d..e274fd8bd60 100644 --- a/api/src/main/java/org/geysermc/geyser/api/block/custom/component/PlacementConditions.java +++ b/api/src/main/java/org/geysermc/geyser/api/block/custom/component/PlacementConditions.java @@ -25,11 +25,11 @@ package org.geysermc.geyser.api.block.custom.component; +import org.checkerframework.checker.nullness.qual.NonNull; + import java.util.LinkedHashMap; import java.util.Set; -import org.checkerframework.checker.nullness.qual.NonNull; - /** * This class is used to store conditions for a placement filter for a custom block. * @@ -43,7 +43,7 @@ public enum Face { NORTH, SOUTH, WEST, - EAST; + EAST } public enum BlockFilterType { diff --git a/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBlockState.java b/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBlockState.java index 6293506a8ee..f7da4b9322f 100644 --- a/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBlockState.java +++ b/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBlockState.java @@ -39,7 +39,7 @@ public interface JavaBlockState { * * @return whether the block state is waterlogged */ - @NonNull boolean waterlogged(); + boolean waterlogged(); /** * Gets the collision of the block state @@ -53,7 +53,7 @@ public interface JavaBlockState { * * @return whether the block state can be broken with hand */ - @NonNull boolean canBreakWithHand(); + boolean canBreakWithHand(); /** * Gets the pick item of the block state @@ -74,7 +74,7 @@ public interface JavaBlockState { * * @return whether the block state has block entity */ - @Nullable boolean hasBlockEntity(); + boolean hasBlockEntity(); /** * Creates a new {@link JavaBlockState.Builder} instance @@ -94,17 +94,17 @@ interface Builder { Builder blockHardness(@NonNegative float blockHardness); - Builder waterlogged(@NonNull boolean waterlogged); + Builder waterlogged(boolean waterlogged); Builder collision(@NonNull JavaBoundingBox[] collision); - Builder canBreakWithHand(@NonNull boolean canBreakWithHand); + Builder canBreakWithHand(boolean canBreakWithHand); Builder pickItem(@Nullable String pickItem); Builder pistonBehavior(@Nullable String pistonBehavior); - Builder hasBlockEntity(@Nullable boolean hasBlockEntity); + Builder hasBlockEntity(boolean hasBlockEntity); JavaBlockState build(); } diff --git a/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBoundingBox.java b/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBoundingBox.java index 56a4ca3da5f..9065e87113a 100644 --- a/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBoundingBox.java +++ b/api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBoundingBox.java @@ -1,6 +1,4 @@ package org.geysermc.geyser.api.block.custom.nonvanilla; -import org.checkerframework.checker.nullness.qual.NonNull; - -public record JavaBoundingBox(@NonNull double middleX, @NonNull double middleY, @NonNull double middleZ, @NonNull double sizeX, @NonNull double sizeY, @NonNull double sizeZ) { +public record JavaBoundingBox(double middleX, double middleY, double middleZ, double sizeX, double sizeY, double sizeZ) { } diff --git a/api/src/main/java/org/geysermc/geyser/api/event/EventBus.java b/api/src/main/java/org/geysermc/geyser/api/event/EventBus.java index 801bfa45fd3..3344e38f41d 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/EventBus.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/EventBus.java @@ -28,7 +28,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.event.Event; import org.geysermc.event.bus.OwnedEventBus; -import org.geysermc.geyser.api.extension.Extension; import java.util.Set; diff --git a/api/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java b/api/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java index 7f91d09a39e..258ef916440 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java @@ -27,7 +27,6 @@ import org.geysermc.event.Event; import org.geysermc.event.subscribe.OwnedSubscriber; -import org.geysermc.geyser.api.extension.Extension; /** * Represents a subscribed listener to a {@link Event}. Wraps around diff --git a/api/src/main/java/org/geysermc/geyser/api/event/connection/GeyserBedrockPingEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/connection/GeyserBedrockPingEvent.java index 67a81ac58ce..10ccb93d52c 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/connection/GeyserBedrockPingEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/connection/GeyserBedrockPingEvent.java @@ -34,7 +34,7 @@ /** * Called whenever Geyser gets pinged - * + *

* This event allows you to modify/obtain the MOTD, maximum player count, and current number of players online, * Geyser will reply to the client with what was given. */ diff --git a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCommandsEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCommandsEvent.java index 77d5efa658e..99437375233 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCommandsEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCommandsEvent.java @@ -33,7 +33,7 @@ /** * Called when commands are defined within Geyser. - * + *

* This event allows you to register new commands using the {@link #register(Command)} * method and retrieve the default commands defined. */ diff --git a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomBlocksEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomBlocksEvent.java index b1a01d7e6e8..a105578d944 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomBlocksEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomBlocksEvent.java @@ -28,13 +28,12 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.api.block.custom.CustomBlockData; import org.geysermc.geyser.api.block.custom.CustomBlockState; -import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockItem; import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockState; import org.geysermc.event.Event; /** * Called on Geyser's startup when looking for custom blocks. Custom blocks must be registered through this event. - * + *

* This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config. */ public abstract class GeyserDefineCustomBlocksEvent implements Event { @@ -48,8 +47,8 @@ public abstract class GeyserDefineCustomBlocksEvent implements Event { /** * Registers the given {@link CustomBlockState} as an override for the * given java state identifier - * Java state identifiers are listed in - * https://raw.githubusercontent.com/GeyserMC/mappings/master/blocks.json + * Java state identifiers are listed + * here * * @param javaIdentifier the java state identifier to override * @param customBlockState the custom block state with which to override java state identifier diff --git a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java index 0957b8551c1..bd14aaf43c7 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java @@ -36,7 +36,7 @@ /** * Called on Geyser's startup when looking for custom items. Custom items must be registered through this event. - * + *

* This event will not be called if the "add non-Bedrock items" setting is disabled in the Geyser config. */ public interface GeyserDefineCustomItemsEvent extends Event { diff --git a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomSkullsEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomSkullsEvent.java index 17f7b599aa3..6443bbeb3bb 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomSkullsEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomSkullsEvent.java @@ -5,7 +5,7 @@ /** * Called on Geyser's startup when looking for custom skulls. Custom skulls must be registered through this event. - * + *

* This event will not be called if the "add-non-bedrock-items" setting is disabled in the Geyser config. */ public abstract class GeyserDefineCustomSkullsEvent implements Event { diff --git a/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidDescriptionException.java b/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidDescriptionException.java index 1fe88e9e990..5313c1f4049 100644 --- a/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidDescriptionException.java +++ b/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidDescriptionException.java @@ -25,10 +25,16 @@ package org.geysermc.geyser.api.extension.exception; +import java.io.Serial; + /** * Thrown when an extension's description is invalid. */ public class InvalidDescriptionException extends Exception { + + @Serial + private static final long serialVersionUID = 1L; + public InvalidDescriptionException(Throwable cause) { super(cause); } diff --git a/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidExtensionException.java b/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidExtensionException.java index 7fb6b692241..89780fe4643 100644 --- a/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidExtensionException.java +++ b/api/src/main/java/org/geysermc/geyser/api/extension/exception/InvalidExtensionException.java @@ -25,10 +25,16 @@ package org.geysermc.geyser.api.extension.exception; +import java.io.Serial; + /** * Thrown when an extension is invalid. */ public class InvalidExtensionException extends Exception { + + @Serial + private static final long serialVersionUID = 1L; + public InvalidExtensionException(Throwable cause) { super(cause); } diff --git a/api/src/main/java/org/geysermc/geyser/api/util/CreativeCategory.java b/api/src/main/java/org/geysermc/geyser/api/util/CreativeCategory.java index 7519ff15720..207320b1ecb 100644 --- a/api/src/main/java/org/geysermc/geyser/api/util/CreativeCategory.java +++ b/api/src/main/java/org/geysermc/geyser/api/util/CreativeCategory.java @@ -51,7 +51,7 @@ public enum CreativeCategory { * * @return the name of the category */ - @NonNull public String internalName() { + public @NonNull String internalName() { return internalName; } diff --git a/api/src/main/java/org/geysermc/geyser/api/util/TriState.java b/api/src/main/java/org/geysermc/geyser/api/util/TriState.java index 457a38e32e2..a8bb723d6c7 100644 --- a/api/src/main/java/org/geysermc/geyser/api/util/TriState.java +++ b/api/src/main/java/org/geysermc/geyser/api/util/TriState.java @@ -30,7 +30,7 @@ /** * This is a way to represent a boolean, but with a non set value added. - * This class was inspired by adventure's version https://github.com/KyoriPowered/adventure/blob/main/4/api/src/main/java/net/kyori/adventure/util/TriState.java + * This class was inspired by adventure's TriState */ public enum TriState { /** diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java index ba7bc464ffd..85abd285b1b 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeDumpInfo.java @@ -30,6 +30,7 @@ import net.md_5.bungee.api.plugin.Plugin; import org.geysermc.geyser.dump.BootstrapDumpInfo; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -51,7 +52,8 @@ public class GeyserBungeeDumpInfo extends BootstrapDumpInfo { this.plugins = new ArrayList<>(); for (net.md_5.bungee.api.config.ListenerInfo listener : proxy.getConfig().getListeners()) { - this.listeners.add(new ListenerInfo(listener.getHost().getHostString(), listener.getHost().getPort())); + InetSocketAddress address = (InetSocketAddress) listener.getSocketAddress(); + this.listeners.add(new ListenerInfo(address.getHostString(), address.getPort())); } for (Plugin plugin : proxy.getPluginManager().getPlugins()) { diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java index e10b3ce6fc3..7c60ba95d1a 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java @@ -39,6 +39,7 @@ import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.netty.PipelineUtils; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.network.netty.GeyserInjector; @@ -125,7 +126,7 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti .channel(LocalServerChannelWrapper.class) .childHandler(new ChannelInitializer<>() { @Override - protected void initChannel(Channel ch) throws Exception { + protected void initChannel(@NonNull Channel ch) throws Exception { if (proxy.getConfig().getServers() == null) { // Proxy hasn't finished loading all plugins - it loads the config after all plugins // Probably doesn't need to be translatable? diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePingPassthrough.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePingPassthrough.java index e14e8ff66aa..3c3853ed839 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePingPassthrough.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePingPassthrough.java @@ -35,6 +35,7 @@ import net.md_5.bungee.api.event.ProxyPingEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.protocol.ProtocolConstants; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; @@ -104,7 +105,7 @@ public int getVersion() { } @Override - public InetSocketAddress getVirtualHost() { + public @Nullable InetSocketAddress getVirtualHost() { return null; } diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java index e58abc3b46c..c4eea66b8f5 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java @@ -30,6 +30,7 @@ import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.protocol.ProtocolConstants; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.GeyserBootstrap; @@ -44,7 +45,6 @@ import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; -import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; @@ -72,6 +72,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { private static boolean INITIALIZED = false; + @SuppressWarnings({"JavaReflectionMemberAccess", "ResultOfMethodCallIgnored"}) @Override public void onLoad() { GeyserLocale.init(this); @@ -251,7 +252,7 @@ public SocketAddress getSocketAddress() { return this.geyserInjector.getServerSocketAddress(); } - @NotNull + @NonNull @Override public String getServerBindAddress() { return findCompatibleListener().map(InetSocketAddress::getHostString).orElse(""); diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/BungeeCommandSource.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/BungeeCommandSource.java index f65377643a1..e3099f17004 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/BungeeCommandSource.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/command/BungeeCommandSource.java @@ -29,6 +29,7 @@ import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.text.GeyserLocale; @@ -50,7 +51,7 @@ public String name() { } @Override - public void sendMessage(String message) { + public void sendMessage(@NonNull String message) { handle.sendMessage(TextComponent.fromLegacyText(message)); } diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricMod.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricMod.java index af0c9efca21..07140904614 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricMod.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricMod.java @@ -37,6 +37,8 @@ import net.minecraft.commands.Commands; import net.minecraft.server.MinecraftServer; import org.apache.logging.log4j.LogManager; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; @@ -54,8 +56,6 @@ import org.geysermc.geyser.platform.fabric.world.GeyserFabricWorldManager; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -251,7 +251,7 @@ public String getMinecraftServerVersion() { return this.server.getServerVersion(); } - @NotNull + @NonNull @Override public String getServerBindAddress() { String ip = this.server.getLocalIp(); diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/FabricCommandSender.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/FabricCommandSender.java index 6517ac1334e..28875ec6e96 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/FabricCommandSender.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/FabricCommandSender.java @@ -30,11 +30,12 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.text.ChatColor; -import javax.annotation.Nonnull; +import java.util.Objects; public class FabricCommandSender implements GeyserCommandSource { @@ -50,7 +51,7 @@ public String name() { } @Override - public void sendMessage(@Nonnull String message) { + public void sendMessage(@NonNull String message) { if (source.getEntity() instanceof ServerPlayer) { ((ServerPlayer) source.getEntity()).displayClientMessage(Component.literal(message), false); } else { @@ -62,7 +63,7 @@ public void sendMessage(@Nonnull String message) { public void sendMessage(net.kyori.adventure.text.Component message) { if (source.getEntity() instanceof ServerPlayer player) { String decoded = GsonComponentSerializer.gson().serialize(message); - player.displayClientMessage(Component.Serializer.fromJson(decoded), false); + player.displayClientMessage(Objects.requireNonNull(Component.Serializer.fromJson(decoded)), false); return; } GeyserCommandSource.super.sendMessage(message); diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/GeyserFabricCommandExecutor.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/GeyserFabricCommandExecutor.java index 8da7c851240..732b28ca75b 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/GeyserFabricCommandExecutor.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/command/GeyserFabricCommandExecutor.java @@ -52,12 +52,12 @@ public boolean testPermission(CommandSourceStack source) { } @Override - public int run(CommandContext context) { + public int run(CommandContext context) { return runWithArgs(context, ""); } - public int runWithArgs(CommandContext context, String args) { - CommandSourceStack source = (CommandSourceStack) context.getSource(); + public int runWithArgs(CommandContext context, String args) { + CommandSourceStack source = context.getSource(); FabricCommandSender sender = new FabricCommandSender(source); GeyserSession session = getGeyserSession(sender); if (!testPermission(source)) { diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java index 94290906888..f11d3a1ae7d 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java @@ -42,6 +42,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Objects; + @Environment(EnvType.CLIENT) @Mixin(IntegratedServer.class) public class IntegratedServerMixin implements GeyserServerPortGetter { @@ -58,6 +60,7 @@ private void onOpenToLan(GameType gameType, boolean cheatsAllowed, int port, Cal // Ensure player locale has been loaded, in case it's different from Java system language GeyserLocale.loadGeyserLocale(this.minecraft.options.languageCode); // Give indication that Geyser is loaded + Objects.requireNonNull(this.minecraft.player); this.minecraft.player.displayClientMessage(Component.literal(GeyserLocale.getPlayerLocaleString("geyser.core.start", this.minecraft.options.languageCode, "localhost", String.valueOf(this.publishedPort))), false); } diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/world/GeyserFabricWorldManager.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/world/GeyserFabricWorldManager.java index 923db9b2561..9d7b818316e 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/world/GeyserFabricWorldManager.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/world/GeyserFabricWorldManager.java @@ -39,6 +39,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.LecternBlockEntity; import net.minecraft.world.level.chunk.LevelChunk; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; @@ -48,9 +49,9 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; public class GeyserFabricWorldManager extends GeyserWorldManager { @@ -73,9 +74,11 @@ public void sendLecternData(GeyserSession session, int x, int z, List getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { CompletableFuture future = new CompletableFuture<>(); @@ -172,6 +175,7 @@ public CompletableFuture BlockPos pos = new BlockPos(x, y, z); // Don't create a new block entity if invalid + //noinspection resource - level() is just a getter BlockEntity blockEntity = player.level().getChunkAt(pos).getBlockEntity(pos); if (blockEntity instanceof BannerBlockEntity banner) { // Potentially exposes other NBT data? But we need to get the NBT data for the banner patterns *and* @@ -263,7 +267,7 @@ public void visitList(ListTag listTag) { } @Override - public void visitCompound(CompoundTag compoundTag) { + public void visitCompound(@NonNull CompoundTag compoundTag) { currentTag = convert(currentKey, compoundTag); } @@ -271,7 +275,7 @@ private static com.github.steveice10.opennbt.tag.builtin.CompoundTag convert(Str OpenNbtTagVisitor visitor = new OpenNbtTagVisitor(name); for (String key : compoundTag.getAllKeys()) { visitor.currentKey = key; - Tag tag = compoundTag.get(key); + Tag tag = Objects.requireNonNull(compoundTag.get(key)); tag.accept(visitor); visitor.root.put(visitor.currentTag); } @@ -279,7 +283,7 @@ private static com.github.steveice10.opennbt.tag.builtin.CompoundTag convert(Str } @Override - public void visitEnd(EndTag endTag) { + public void visitEnd(@NonNull EndTag endTag) { } } } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java index 60e0ae519a0..6a962f4504f 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserPaperPingPassthrough.java @@ -28,11 +28,11 @@ import com.destroystokyo.paper.event.server.PaperServerListPingEvent; import com.destroystokyo.paper.network.StatusClient; import org.bukkit.Bukkit; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.lang.reflect.Constructor; import java.net.InetSocketAddress; @@ -50,6 +50,7 @@ public GeyserPaperPingPassthrough(GeyserSpigotLogger logger) { this.logger = logger; } + @SuppressWarnings("deprecation") @Nullable @Override public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { @@ -89,7 +90,7 @@ public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { private record GeyserStatusClient(InetSocketAddress address) implements StatusClient { @Override - public @NotNull InetSocketAddress getAddress() { + public @NonNull InetSocketAddress getAddress() { return address; } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotCompressionDisabler.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotCompressionDisabler.java index 9b112f62fdd..2a6056df9c9 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotCompressionDisabler.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotCompressionDisabler.java @@ -34,7 +34,7 @@ /** * Disables the compression packet (and the compression handlers from being added to the pipeline) for Geyser clients * that won't be receiving the data over the network. - * + *

* As of 1.8 - 1.17.1, compression is enabled in the Netty pipeline by adding a listener after a packet is written. * If we simply "cancel" or don't forward the packet, then the listener is never called. */ diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java index d340935b3a2..329663709fc 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotDumpInfo.java @@ -47,6 +47,7 @@ public class GeyserSpigotDumpInfo extends BootstrapDumpInfo { private final int serverPort; private final List plugins; + @SuppressWarnings("deprecation") GeyserSpigotDumpInfo() { super(); this.platformName = Bukkit.getName(); diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java index e3d73fb1939..01bc0bea4c3 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java @@ -32,6 +32,7 @@ import io.netty.channel.local.LocalAddress; import io.netty.util.concurrent.DefaultThreadFactory; import org.bukkit.Bukkit; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; @@ -74,12 +75,10 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti Object connection = null; // Find the class that manages network IO for (Method m : serverClazz.getDeclaredMethods()) { - if (m.getReturnType() != null) { - // First is Spigot-mapped name, second is Mojang-mapped name which is implemented as future-proofing - if (m.getReturnType().getSimpleName().equals("ServerConnection") || m.getReturnType().getSimpleName().equals("ServerConnectionListener")) { - if (m.getParameterTypes().length == 0) { - connection = m.invoke(server); - } + // First is Spigot-mapped name, second is Mojang-mapped name which is implemented as future-proofing + if (m.getReturnType().getSimpleName().equals("ServerConnection") || m.getReturnType().getSimpleName().equals("ServerConnectionListener")) { + if (m.getParameterTypes().length == 0) { + connection = m.invoke(server); } } } @@ -117,7 +116,7 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti .channel(LocalServerChannelWrapper.class) .childHandler(new ChannelInitializer<>() { @Override - protected void initChannel(Channel ch) throws Exception { + protected void initChannel(@NonNull Channel ch) throws Exception { initChannel.invoke(childHandler, ch); if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserSpigotCompressionDisabler.ENABLED) { diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java index df197f13766..4b1e428710a 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPingPassthrough.java @@ -30,10 +30,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.util.CachedServerIcon; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; -import javax.annotation.Nonnull; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Collections; @@ -44,8 +46,9 @@ public class GeyserSpigotPingPassthrough implements IGeyserPingPassthrough { private final GeyserSpigotLogger logger; + @SuppressWarnings("deprecation") @Override - public GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { + public @Nullable GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress) { try { ServerListPingEvent event = new GeyserPingEvent(inetSocketAddress.getAddress(), Bukkit.getMotd(), Bukkit.getOnlinePlayers().size(), Bukkit.getMaxPlayers()); Bukkit.getPluginManager().callEvent(event); @@ -67,7 +70,7 @@ public GeyserPingEvent(InetAddress address, String motd, int numPlayers, int max public void setServerIcon(CachedServerIcon icon) throws IllegalArgumentException, UnsupportedOperationException { } - @Nonnull + @NonNull @Override public Iterator iterator() throws UnsupportedOperationException { return Collections.emptyIterator(); diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java index cfb6ff5ae69..02ea91cf2e6 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java @@ -42,13 +42,14 @@ import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import org.geysermc.geyser.api.util.PlatformType; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.extension.Extension; +import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; @@ -66,7 +67,6 @@ import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; -import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; @@ -76,6 +76,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.logging.Level; @@ -137,6 +138,7 @@ public void onLoad() { // This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed try { if (!getDataFolder().exists()) { + //noinspection ResultOfMethodCallIgnored getDataFolder().mkdir(); } File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", @@ -272,6 +274,7 @@ private void postStartup() { } PluginCommand geyserCommand = this.getCommand("geyser"); + Objects.requireNonNull(geyserCommand, "base command cannot be null"); geyserCommand.setExecutor(new GeyserSpigotCommandExecutor(geyser, geyserCommandManager.getCommands())); for (Map.Entry> entry : this.geyserCommandManager.extensionCommands().entrySet()) { @@ -437,7 +440,7 @@ private boolean isViaVersionNeeded() { return false; } - @NotNull + @NonNull @Override public String getServerBindAddress() { return Bukkit.getIp(); diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotVersionChecker.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotVersionChecker.java index 0212ff9b096..057304357d1 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotVersionChecker.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotVersionChecker.java @@ -39,6 +39,7 @@ public final class GeyserSpigotVersionChecker { private static final String VIAVERSION_DOWNLOAD_URL = "https://ci.viaversion.com/job/ViaVersion/"; + @SuppressWarnings("deprecation") public static void checkForSupportedProtocol(GeyserLogger logger, boolean viaversion) { if (viaversion) { checkViaVersionSupportedVersions(logger); diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/PaperAdventure.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/PaperAdventure.java index 5dd16da33ae..9e0b14b1197 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/PaperAdventure.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/PaperAdventure.java @@ -28,8 +28,8 @@ import com.github.steveice10.mc.protocol.data.DefaultComponentSerializer; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; -import org.jetbrains.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -39,8 +39,8 @@ /** * Utility class for converting our shaded Adventure into the Adventure bundled in Paper. - * - * Code mostly taken from https://github.com/KyoriPowered/adventure-platform/blob/94d5821f2e755170f42bd8a5fe1d5bf6f66d04ad/platform-bukkit/src/main/java/net/kyori/adventure/platform/bukkit/PaperFacet.java#L46 + *

+ * Code mostly taken from here * and the MinecraftReflection class. */ public final class PaperAdventure { @@ -102,7 +102,7 @@ public final class PaperAdventure { SEND_MESSAGE_COMPONENT = playerComponentSendMessage; } - public static Object toNativeComponent(final Component component) { + public static @Nullable Object toNativeComponent(final Component component) { if (NATIVE_GSON_COMPONENT_SERIALIZER_DESERIALIZE_METHOD_BOUND == null) { GeyserImpl.getInstance().getLogger().error("Illegal state where Component serialization was called when it wasn't available!"); return null; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/ReflectedNames.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/ReflectedNames.java index 67e31fea2f4..275fec657eb 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/ReflectedNames.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/ReflectedNames.java @@ -29,8 +29,8 @@ import com.destroystokyo.paper.network.StatusClient; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.util.CachedServerIcon; +import org.checkerframework.checker.nullness.qual.Nullable; -import javax.annotation.Nullable; import java.lang.reflect.Constructor; import java.net.InetAddress; @@ -40,15 +40,8 @@ public final class ReflectedNames { static boolean checkPaperPingEvent() { - return classExists("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); - } - - /** - * @return if this class name exists - */ - private static boolean classExists(String clazz) { try { - Class.forName(clazz); + Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent"); return true; } catch (ClassNotFoundException e) { return false; @@ -59,7 +52,7 @@ static boolean newSpigotPingConstructorExists() { return getConstructor(ServerListPingEvent.class, InetAddress.class, String.class, boolean.class, int.class, int.class) != null; } - static Constructor getOldPaperPingConstructor() { + static @Nullable Constructor getOldPaperPingConstructor() { if (getConstructor(PaperServerListPingEvent.class, StatusClient.class, String.class, int.class, int.class, String.class, int.class, CachedServerIcon.class) != null) { // @NotNull StatusClient client, @NotNull String motd, int numPlayers, int maxPlayers, diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserPaperCommandListener.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserPaperCommandListener.java index 9375e3a6271..dcec045abb8 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserPaperCommandListener.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserPaperCommandListener.java @@ -39,8 +39,8 @@ public final class GeyserPaperCommandListener implements Listener { + @SuppressWarnings("UnstableApiUsage") @EventHandler - @SuppressWarnings("deprecation") // Used to indicate an unstable event public void onCommandSend(AsyncPlayerSendCommandsEvent event) { // Documentation says to check (event.isAsynchronous() || !event.hasFiredAsync()), but as of Paper 1.18.2 // event.hasFiredAsync is never true diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java index 61d39421463..6780bde17fd 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/GeyserSpigotCommandExecutor.java @@ -29,6 +29,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandExecutor; @@ -47,7 +48,7 @@ public GeyserSpigotCommandExecutor(GeyserImpl geyser, Map onTabComplete(CommandSender sender, Command command, String label, String[] args) { + public List onTabComplete(@NonNull CommandSender sender, @NonNull Command command, @NonNull String label, String[] args) { if (args.length == 1) { return tabComplete(new SpigotCommandSource(sender)); } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/SpigotCommandSource.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/SpigotCommandSource.java index 95fba707fe1..365e9ad1783 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/SpigotCommandSource.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/command/SpigotCommandSource.java @@ -29,6 +29,7 @@ import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.platform.spigot.PaperAdventure; import org.geysermc.geyser.text.GeyserLocale; @@ -48,10 +49,11 @@ public String name() { } @Override - public void sendMessage(String message) { + public void sendMessage(@NonNull String message) { handle.sendMessage(message); } + @SuppressWarnings("deprecation") @Override public void sendMessage(Component message) { if (PaperAdventure.canSendMessageUsingComponent()) { @@ -68,9 +70,11 @@ public boolean isConsole() { return handle instanceof ConsoleCommandSender; } + @SuppressWarnings("deprecation") @Override public String locale() { if (this.handle instanceof Player player) { + // getLocale() is deprecated on Paper, but not on Spigot return player.getLocale(); } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java index baffc96792c..021db5ec104 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotLegacyNativeWorldManager.java @@ -37,6 +37,7 @@ import org.geysermc.geyser.session.GeyserSession; import java.util.List; +import java.util.Objects; /** * Used when block IDs need to be translated to the latest version @@ -52,6 +53,7 @@ public GeyserSpigotLegacyNativeWorldManager(GeyserSpigotPlugin plugin) { ProtocolVersion serverVersion = plugin.getServerProtocolVersion(); List protocolList = Via.getManager().getProtocolManager().getProtocolPath(GameProtocol.getJavaProtocolVersion(), serverVersion.getVersion()); + Objects.requireNonNull(protocolList, "protocolList cannot be null"); for (int oldBlockId : allBlockStates) { int newBlockId = oldBlockId; // protocolList should *not* be null; we checked for that before initializing this class diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java index 6b5d1ea1e77..00212663cc7 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotNativeWorldManager.java @@ -28,11 +28,11 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.adapters.spigot.SpigotWorldAdapter; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.Nullable; public class GeyserSpigotNativeWorldManager extends GeyserSpigotWorldManager { protected final SpigotWorldAdapter adapter; diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java index c8ccfffd7e1..74f359e0264 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java @@ -34,21 +34,23 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.erosion.bukkit.BukkitLecterns; import org.geysermc.erosion.bukkit.BukkitUtils; import org.geysermc.erosion.bukkit.PickBlockUtils; import org.geysermc.erosion.bukkit.SchedulerUtils; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.GameRule; import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; -import org.jetbrains.annotations.Nullable; -import javax.annotation.Nonnull; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; /** @@ -128,7 +130,7 @@ public void sendLecternData(GeyserSession session, int x, int z, List blockEntityInfos) { + //noinspection ForLoopReplaceableByForEach - avoid constructing Iterator for (int i = 0; i < blockEntityInfos.size(); i++) { BlockEntityInfo info = blockEntityInfos.get(i); Block block = chunk.getBlock(info.getX(), info.getY(), info.getZ()); @@ -156,19 +159,34 @@ public boolean shouldExpectLecternHandled(GeyserSession session) { } public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) { - String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID()); - if (!value.isEmpty()) { - return Boolean.parseBoolean(value); + org.bukkit.GameRule bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID()); + if (bukkitGameRule == null) { + GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID()); + return gameRule.getDefaultBooleanValue(); } + + Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUuid())); + Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule); + if (value instanceof Boolean booleanValue) { + return booleanValue; + } + GeyserImpl.getInstance().getLogger().debug("Expected a bool for " + gameRule + " but got " + value); return gameRule.getDefaultBooleanValue(); } @Override public int getGameRuleInt(GeyserSession session, GameRule gameRule) { - String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID()); - if (!value.isEmpty()) { - return Integer.parseInt(value); + org.bukkit.GameRule bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID()); + if (bukkitGameRule == null) { + GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID()); + return gameRule.getDefaultIntValue(); + } + Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUuid())); + Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule); + if (value instanceof Integer intValue) { + return intValue; } + GeyserImpl.getInstance().getLogger().debug("Expected an int for " + gameRule + " but got " + value); return gameRule.getDefaultIntValue(); } @@ -179,12 +197,11 @@ public GameMode getDefaultGameMode(GeyserSession session) { @Override public boolean hasPermission(GeyserSession session, String permission) { - return Bukkit.getPlayer(session.getPlayerEntity().getUsername()).hasPermission(permission); + return Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUsername())).hasPermission(permission); } - @Nonnull @Override - public CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { + public @NonNull CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { CompletableFuture<@Nullable CompoundTag> future = new CompletableFuture<>(); Player bukkitPlayer; if ((bukkitPlayer = Bukkit.getPlayer(session.getPlayerEntity().getUuid())) == null) { diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java index b505b361efd..9f2208ea85f 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneBootstrap.java @@ -38,6 +38,7 @@ import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.appender.ConsoleAppender; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; @@ -51,7 +52,6 @@ import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.LoopbackUtil; -import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; @@ -292,7 +292,7 @@ public BootstrapDumpInfo getDumpInfo() { return new GeyserStandaloneDumpInfo(this); } - @NotNull + @NonNull @Override public String getServerBindAddress() { throw new IllegalStateException(); @@ -325,7 +325,7 @@ public static List getPOJOForClass(Class clazz) { // Get the ignored properties Set ignoredProperties = OBJECT_MAPPER.getSerializationConfig().getAnnotationIntrospector() - .findPropertyIgnorals(beanDescription.getClassInfo()).getIgnored(); + .findPropertyIgnoralByName(OBJECT_MAPPER.getSerializationConfig() ,beanDescription.getClassInfo()).getIgnored(); // Filter properties removing the ignored ones return properties.stream() @@ -340,7 +340,7 @@ public static List getPOJOForClass(Class clazz) { * @param parentObject The object to alter * @param value The new value of the property */ - @SuppressWarnings("unchecked") // Required for enum usage + @SuppressWarnings({"unchecked", "rawtypes"}) // Required for enum usage private static void setConfigOption(BeanPropertyDefinition property, Object parentObject, Object value) { Object parsedValue = value; diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/ColorPane.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/ColorPane.java index 1bdc90123cd..8e0eadb08bf 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/ColorPane.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/ColorPane.java @@ -28,11 +28,16 @@ import javax.swing.*; import javax.swing.text.*; import java.awt.*; +import java.io.Serial; /** - * This class was based on this code: https://stackoverflow.com/a/6899478/5299903 + * This class was based on this code */ public class ColorPane extends JTextPane { + + @Serial + private static final long serialVersionUID = 1L; + private static Color colorCurrent = ANSIColor.RESET.getColor(); private String remaining = ""; @@ -62,7 +67,7 @@ public void appendANSI(String s) { // convert ANSI color codes first int aPos = 0; // current char position in addString int aIndex; // index of next Escape sequence int mIndex; // index of "m" terminating Escape sequence - String tmpString = ""; + String tmpString; boolean stillSearching = true; // true until no more Escape sequences String addString = remaining + s; remaining = ""; diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java index af3e1069f15..c3e2e10e8ca 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GeyserStandaloneGUI.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.platform.standalone.gui; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.command.GeyserCommandManager; @@ -64,7 +65,6 @@ public class GeyserStandaloneGUI { private final List ramValues = new ArrayList<>(); private final DefaultTableModel playerTableModel = new DefaultTableModel(); - private final JTable playerTable = new JTable(playerTableModel); /** * Create and show the Geyser-Standalone GUI @@ -158,6 +158,7 @@ public void componentResized(ComponentEvent e) { playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.ip")); playerTableModel.addColumn(GeyserLocale.getLocaleStringLog("geyser.gui.table.username")); + JTable playerTable = new JTable(playerTableModel); JScrollPane playerScrollPane = new JScrollPane(playerTable); rightContentPane.add(playerScrollPane); @@ -253,12 +254,12 @@ public void write(final int b) { } @Override - public void write(byte[] b, int off, int len) { + public void write(byte @NonNull [] b, int off, int len) { appendConsole(new String(b, off, len)); } @Override - public void write(byte[] b) { + public void write(byte @NonNull[] b) { write(b, 0, b.length); } }; diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GraphPanel.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GraphPanel.java index d8fca3e1b09..063824218d7 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GraphPanel.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/gui/GraphPanel.java @@ -29,15 +29,20 @@ import javax.swing.*; import java.awt.*; +import java.io.Serial; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * This has been modified to fit Geyser more but is based on - * https://gist.github.com/roooodcastro/6325153#gistcomment-3107524 + * this Github gist */ public final class GraphPanel extends JPanel { + + @Serial + private static final long serialVersionUID = 1L; + private final static int padding = 10; private final static int labelPadding = 25; private final static int pointWidth = 4; @@ -103,7 +108,7 @@ protected void paintComponent(Graphics graphics) { g.drawLine(padding + labelPadding + 1 + pointWidth, y, width - padding, y); g.setColor(Color.BLACK); - final int tickValue = (int) (minScore + ((scoreRange * i) / numberYDivisions)); + final int tickValue = minScore + ((scoreRange * i) / numberYDivisions); final String yLabel = tickValue + ""; final int labelWidth = fontMetrics.stringWidth(yLabel); g.drawString(yLabel, x1 - labelWidth - 5, y + (fontHeight / 2) - 3); diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityInjector.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityInjector.java index 4ffb286b884..68a9eb40b89 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityInjector.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityInjector.java @@ -29,6 +29,7 @@ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.local.LocalAddress; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; @@ -76,7 +77,7 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti .channel(LocalServerChannelWrapper.class) .childHandler(new ChannelInitializer<>() { @Override - protected void initChannel(Channel ch) throws Exception { + protected void initChannel(@NonNull Channel ch) throws Exception { initChannel.invoke(channelInitializer, ch); if (bootstrap.getGeyserConfig().isDisableCompression() && GeyserVelocityCompressionDisabler.ENABLED) { diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java index d7c6c588ef5..bd3d6085a99 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java @@ -36,11 +36,13 @@ import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; import net.kyori.adventure.util.Codec; -import org.geysermc.geyser.api.util.PlatformType; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.extension.Extension; +import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; @@ -49,8 +51,6 @@ import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import java.io.File; @@ -222,7 +222,7 @@ public SocketAddress getSocketAddress() { return this.geyserInjector.getServerSocketAddress(); } - @NotNull + @NonNull @Override public String getServerBindAddress() { return proxyServer.getBoundAddress().getHostString(); diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/VelocityCommandSource.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/VelocityCommandSource.java index 00c99e92b51..403e4cb202e 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/VelocityCommandSource.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/command/VelocityCommandSource.java @@ -30,6 +30,7 @@ import com.velocitypowered.api.proxy.Player; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.text.GeyserLocale; @@ -56,7 +57,7 @@ public String name() { } @Override - public void sendMessage(String message) { + public void sendMessage(@NonNull String message) { handle.sendMessage(LegacyComponentSerializer.legacy('§').deserialize(message)); } diff --git a/common/src/main/java/org/geysermc/floodgate/crypto/AesKeyProducer.java b/common/src/main/java/org/geysermc/floodgate/crypto/AesKeyProducer.java index 4fae21b327a..e39d5119a84 100644 --- a/common/src/main/java/org/geysermc/floodgate/crypto/AesKeyProducer.java +++ b/common/src/main/java/org/geysermc/floodgate/crypto/AesKeyProducer.java @@ -32,7 +32,7 @@ import java.security.SecureRandom; public final class AesKeyProducer implements KeyProducer { - public static int KEY_SIZE = 128; + public static final int KEY_SIZE = 128; @Override public SecretKey produce() { diff --git a/common/src/main/java/org/geysermc/floodgate/crypto/FloodgateCipher.java b/common/src/main/java/org/geysermc/floodgate/crypto/FloodgateCipher.java index 2f7b442f41e..d3001f3746c 100644 --- a/common/src/main/java/org/geysermc/floodgate/crypto/FloodgateCipher.java +++ b/common/src/main/java/org/geysermc/floodgate/crypto/FloodgateCipher.java @@ -25,6 +25,7 @@ package org.geysermc.floodgate.crypto; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.floodgate.util.InvalidFormatException; import java.security.Key; @@ -97,7 +98,8 @@ default byte[] encryptFromString(String data) throws Exception { * @return the decrypted data in a UTF-8 String * @throws Exception when the decrypting failed */ - default String decryptToString(byte[] data) throws Exception { + @SuppressWarnings("unused") + default @Nullable String decryptToString(byte[] data) throws Exception { byte[] decrypted = decrypt(data); if (decrypted == null) { return null; @@ -113,6 +115,7 @@ default String decryptToString(byte[] data) throws Exception { * @return the decrypted data in a byte[] * @throws Exception when the decrypting failed */ + @SuppressWarnings("unused") default byte[] decryptFromString(String data) throws Exception { return decrypt(data.getBytes(UTF_8)); } diff --git a/common/src/main/java/org/geysermc/floodgate/crypto/KeyProducer.java b/common/src/main/java/org/geysermc/floodgate/crypto/KeyProducer.java index 4ee00f366e6..0b8679dadfa 100644 --- a/common/src/main/java/org/geysermc/floodgate/crypto/KeyProducer.java +++ b/common/src/main/java/org/geysermc/floodgate/crypto/KeyProducer.java @@ -31,7 +31,7 @@ import java.security.Key; public interface KeyProducer { - Key produce(); + @SuppressWarnings("unused") Key produce(); Key produceFrom(byte[] keyFileData); default Key produceFrom(Path keyFileLocation) throws IOException { diff --git a/common/src/main/java/org/geysermc/floodgate/news/NewsItem.java b/common/src/main/java/org/geysermc/floodgate/news/NewsItem.java index 8ae28f4229e..f0dd3fadb6c 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/NewsItem.java +++ b/common/src/main/java/org/geysermc/floodgate/news/NewsItem.java @@ -109,6 +109,7 @@ public T getDataAs(Class type) { return (T) data; } + @SuppressWarnings("unused") public String getRawMessage() { return message; } diff --git a/common/src/main/java/org/geysermc/floodgate/news/NewsItemAction.java b/common/src/main/java/org/geysermc/floodgate/news/NewsItemAction.java index 00e34b62270..31995e25dad 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/NewsItemAction.java +++ b/common/src/main/java/org/geysermc/floodgate/news/NewsItemAction.java @@ -25,6 +25,8 @@ package org.geysermc.floodgate.news; +import org.checkerframework.checker.nullness.qual.Nullable; + public enum NewsItemAction { ON_SERVER_STARTED, ON_OPERATOR_JOIN, @@ -33,7 +35,7 @@ public enum NewsItemAction { private static final NewsItemAction[] VALUES = values(); - public static NewsItemAction getByName(String actionName) { + public static @Nullable NewsItemAction getByName(String actionName) { for (NewsItemAction type : VALUES) { if (type.name().equalsIgnoreCase(actionName)) { return type; diff --git a/common/src/main/java/org/geysermc/floodgate/news/NewsItemMessage.java b/common/src/main/java/org/geysermc/floodgate/news/NewsItemMessage.java index 9c2f3d15de3..ed5d8f94937 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/NewsItemMessage.java +++ b/common/src/main/java/org/geysermc/floodgate/news/NewsItemMessage.java @@ -26,6 +26,7 @@ package org.geysermc.floodgate.news; import com.google.gson.JsonArray; +import org.checkerframework.checker.nullness.qual.Nullable; // {} is used for things that have to be filled in by the server, // {@} is for things that have to be filled in by us @@ -49,7 +50,7 @@ public enum NewsItemMessage { this.messageSplitted = messageFormat.split(" "); } - public static NewsItemMessage getById(int id) { + public static @Nullable NewsItemMessage getById(int id) { return VALUES.length > id ? VALUES[id] : null; } diff --git a/common/src/main/java/org/geysermc/floodgate/news/NewsType.java b/common/src/main/java/org/geysermc/floodgate/news/NewsType.java index ed7c1553bdb..af1d8bc3867 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/NewsType.java +++ b/common/src/main/java/org/geysermc/floodgate/news/NewsType.java @@ -26,6 +26,7 @@ package org.geysermc.floodgate.news; import com.google.gson.JsonObject; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.floodgate.news.data.*; import java.util.function.Function; @@ -44,7 +45,7 @@ public enum NewsType { this.readFunction = readFunction; } - public static NewsType getByName(String newsType) { + public static @Nullable NewsType getByName(String newsType) { for (NewsType type : VALUES) { if (type.name().equalsIgnoreCase(newsType)) { return type; diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java b/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java index 7f2c7360fe7..c987dcfbc96 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java +++ b/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java @@ -56,6 +56,7 @@ public boolean isAffected(String branch, int buildId) { (allAffected || buildId > affectedGreaterThan && buildId < affectedLessThan); } + @SuppressWarnings("unused") public String getBranch() { return branch; } diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java b/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java index 1479d20a161..6993fe91db6 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java +++ b/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java @@ -51,6 +51,7 @@ public static ConfigSpecificData read(JsonObject data) { return configSpecificData; } + @SuppressWarnings("unused") public boolean isAffected(Map config) { for (Map.Entry entry : affectedKeys.entrySet()) { if (config.containsKey(entry.getKey())) { diff --git a/common/src/main/java/org/geysermc/floodgate/util/BedrockData.java b/common/src/main/java/org/geysermc/floodgate/util/BedrockData.java index 95fc62229df..f0ed6ea0063 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/BedrockData.java +++ b/common/src/main/java/org/geysermc/floodgate/util/BedrockData.java @@ -72,6 +72,7 @@ public static BedrockData of( false, subscribeId, verifyCode); } + @SuppressWarnings("unused") public static BedrockData fromString(String data) { String[] split = data.split("\0"); if (split.length != EXPECTED_LENGTH) { @@ -92,6 +93,7 @@ private static BedrockData emptyData(int dataLength) { dataLength); } + @SuppressWarnings("unused") public boolean hasPlayerLink() { return linkedPlayer != null; } diff --git a/common/src/main/java/org/geysermc/floodgate/util/InvalidFormatException.java b/common/src/main/java/org/geysermc/floodgate/util/InvalidFormatException.java index e0630d48ce7..a2526700eac 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/InvalidFormatException.java +++ b/common/src/main/java/org/geysermc/floodgate/util/InvalidFormatException.java @@ -26,6 +26,9 @@ package org.geysermc.floodgate.util; public class InvalidFormatException extends Exception { + + private static final long serialVersionUID = 1L; + public InvalidFormatException(String message) { super(message); } diff --git a/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java b/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java index 681080a3007..0a131071e31 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java +++ b/common/src/main/java/org/geysermc/floodgate/util/LinkedPlayer.java @@ -28,6 +28,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.UUID; @@ -56,7 +57,7 @@ public static LinkedPlayer of(String javaUsername, UUID javaUniqueId, UUID bedro return new LinkedPlayer(javaUsername, javaUniqueId, bedrockId); } - public static LinkedPlayer fromString(String data) { + public static @Nullable LinkedPlayer fromString(String data) { String[] split = data.split(";"); if (split.length != 3) { return null; diff --git a/common/src/main/java/org/geysermc/floodgate/util/UiProfile.java b/common/src/main/java/org/geysermc/floodgate/util/UiProfile.java index d93042277e3..4438ae67fa1 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/UiProfile.java +++ b/common/src/main/java/org/geysermc/floodgate/util/UiProfile.java @@ -25,6 +25,8 @@ package org.geysermc.floodgate.util; +import org.checkerframework.checker.nullness.qual.NonNull; + public enum UiProfile { CLASSIC, POCKET; @@ -37,7 +39,7 @@ public enum UiProfile { * @param id the UiProfile identifier * @return The UiProfile or {@link #CLASSIC} if the UiProfile wasn't found */ - public static UiProfile fromId(int id) { + public static @NonNull UiProfile fromId(int id) { return VALUES.length > id ? VALUES[id] : VALUES[0]; } } diff --git a/common/src/main/java/org/geysermc/floodgate/util/WebsocketEventType.java b/common/src/main/java/org/geysermc/floodgate/util/WebsocketEventType.java index 61e6c63b16f..dffbabaaf47 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/WebsocketEventType.java +++ b/common/src/main/java/org/geysermc/floodgate/util/WebsocketEventType.java @@ -25,6 +25,8 @@ package org.geysermc.floodgate.util; +import org.checkerframework.checker.nullness.qual.Nullable; + public enum WebsocketEventType { /** * Sent once we successfully connected to the server @@ -81,7 +83,7 @@ public enum WebsocketEventType { this.id = id; } - public static WebsocketEventType fromId(int id) { + public static @Nullable WebsocketEventType fromId(int id) { return VALUES.length > id ? VALUES[id] : null; } diff --git a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java index 1827cfb36fa..4dbc1dca3d1 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java @@ -152,7 +152,7 @@ default Path getLogsPath() { * @param resource Resource to get * @return InputStream of the given resource */ - default @NonNull InputStream getResource(String resource) { + default @NonNull InputStream getResourceOrThrow(@NonNull String resource) { InputStream stream = getResourceOrNull(resource); if (stream == null) { throw new AssertionError("Unable to find resource: " + resource); diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index 185ab7c2a6d..aef2288d6f4 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -71,6 +71,7 @@ import org.geysermc.geyser.network.netty.GeyserServer; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.registry.provider.ProviderSupplier; import org.geysermc.geyser.scoreboard.ScoreboardUpdater; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.PendingMicrosoftAuthentication; @@ -622,7 +623,7 @@ public void reload() { */ public boolean isProductionEnvironment() { // First is if Blossom runs, second is if Blossom doesn't run - // noinspection ConstantConditions - changes in production + //noinspection ConstantConditions,MismatchedStringCase - changes in production return !("git-local/dev-0000000".equals(GeyserImpl.GIT_VERSION) || "${gitVersion}".equals(GeyserImpl.GIT_VERSION)); } @@ -638,8 +639,13 @@ public GeyserCommandManager commandManager() { } @Override + @SuppressWarnings("unchecked") public @NonNull R provider(@NonNull Class apiClass, @Nullable Object... args) { - return (R) Registries.PROVIDERS.get(apiClass).create(args); + ProviderSupplier provider = Registries.PROVIDERS.get(apiClass); + if (provider == null) { + throw new IllegalArgumentException("No provider found for " + apiClass); + } + return (R) provider.create(args); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/GeyserLogger.java b/core/src/main/java/org/geysermc/geyser/GeyserLogger.java index 88220eec9d7..aa79e3630f7 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserLogger.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserLogger.java @@ -26,9 +26,10 @@ package org.geysermc.geyser; import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.command.GeyserCommandSource; -import javax.annotation.Nullable; public interface GeyserLogger extends GeyserCommandSource { @@ -119,7 +120,7 @@ default String name() { } @Override - default void sendMessage(String message) { + default void sendMessage(@NonNull String message) { info(message); } diff --git a/core/src/main/java/org/geysermc/geyser/GeyserMain.java b/core/src/main/java/org/geysermc/geyser/GeyserMain.java index 4e60a79b88c..05cbebed425 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserMain.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserMain.java @@ -30,6 +30,7 @@ import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.util.Locale; +import java.util.Objects; import java.util.Scanner; public class GeyserMain { @@ -61,8 +62,8 @@ private String createMessage() { helpStream = GeyserMain.class.getClassLoader().getResourceAsStream("languages/run-help/en_US.txt"); } - Scanner help = new Scanner(helpStream, StandardCharsets.UTF_8).useDelimiter("\\Z"); - String line = ""; + Scanner help = new Scanner(Objects.requireNonNull(helpStream), StandardCharsets.UTF_8).useDelimiter("\\Z"); + String line; while (help.hasNext()) { line = help.next(); diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java index 5808dbc2ce5..47d57e73ff5 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommand.java @@ -29,10 +29,10 @@ import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.session.GeyserSession; -import javax.annotation.Nullable; import java.util.Collections; import java.util.List; @@ -73,15 +73,6 @@ public List subCommands() { return Collections.emptyList(); } - /** - * Shortcut to {@link #subCommands()} ()}{@code .isEmpty()}. - * - * @return true if there are subcommand present for this command. - */ - public boolean hasSubCommands() { - return !this.subCommands().isEmpty(); - } - public void setAliases(List aliases) { this.aliases = aliases; } diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandExecutor.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandExecutor.java index a9b1c734fab..37d2ef4fb16 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandExecutor.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandExecutor.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.command; import lombok.AllArgsConstructor; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.session.GeyserSession; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java index 373395ea270..d646845c7c1 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java @@ -29,6 +29,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; @@ -53,8 +54,6 @@ import org.geysermc.geyser.extension.command.GeyserExtensionCommand; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.HashMap; @@ -136,12 +135,12 @@ private void register(Command command, Map commands) { } } - @NotNull + @NonNull public Map commands() { return Collections.unmodifiableMap(this.commands); } - @NotNull + @NonNull public Map> extensionCommands() { return Collections.unmodifiableMap(this.extensionCommands); } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java index 12294ae06e3..4cda72c9b51 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.command.defaults; import com.fasterxml.jackson.databind.JsonNode; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommand; @@ -34,7 +35,6 @@ import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.LoopbackUtil; import org.geysermc.geyser.util.WebUtils; -import org.jetbrains.annotations.Nullable; import java.util.Random; import java.util.concurrent.CompletableFuture; diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java index 544be7446ac..b3fee375f65 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/DumpCommand.java @@ -98,7 +98,7 @@ public void execute(GeyserSession session, GeyserCommandSource sender, String[] return; } - String uploadedDumpUrl = ""; + String uploadedDumpUrl; if (offlineDump) { sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.dump.writing", sender.locale())); diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ExtensionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ExtensionsCommand.java index 30d422b2337..df33437d957 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ExtensionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ExtensionsCommand.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.command.defaults; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.command.GeyserCommand; @@ -32,7 +33,6 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; -import org.jetbrains.annotations.Nullable; import java.util.Comparator; import java.util.List; diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java index b263d672733..eb2e8ff47bd 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/VersionCommand.java @@ -27,8 +27,8 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.geysermc.geyser.Constants; -import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.network.GameProtocol; @@ -37,7 +37,6 @@ import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.WebUtils; -import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.List; @@ -77,7 +76,7 @@ public void execute(GeyserSession session, GeyserCommandSource sender, String[] sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.version.checking", sender.locale())); try { String buildXML = WebUtils.getBody("https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/" + - URLEncoder.encode(GeyserImpl.BRANCH, StandardCharsets.UTF_8.toString()) + "/lastSuccessfulBuild/api/xml?xpath=//buildNumber"); + URLEncoder.encode(GeyserImpl.BRANCH, StandardCharsets.UTF_8) + "/lastSuccessfulBuild/api/xml?xpath=//buildNumber"); if (buildXML.startsWith("")) { int latestBuildNum = Integer.parseInt(buildXML.replaceAll("<(\\\\)?(/)?buildNumber>", "").trim()); int buildNum = this.geyser.buildNumber(); @@ -90,7 +89,7 @@ public void execute(GeyserSession session, GeyserCommandSource sender, String[] } else { throw new AssertionError("buildNumber missing"); } - } catch (IOException e) { + } catch (Exception e) { GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.commands.version.failed"), e); sender.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.commands.version.failed", sender.locale())); } diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java index 51cd7d4aec0..f9bb15b32e6 100644 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java +++ b/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java @@ -52,6 +52,7 @@ public interface GeyserConfiguration { List getSavedUserLogins(); + @SuppressWarnings("BooleanMethodIsAlwaysInverted") boolean isCommandSuggestions(); @JsonIgnore @@ -93,6 +94,7 @@ public interface GeyserConfiguration { boolean isForceResourcePacks(); + @SuppressWarnings("BooleanMethodIsAlwaysInverted") boolean isXboxAchievementsEnabled(); int getCacheImages(); diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java index 95ac7b1de03..0874daa07ef 100644 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java +++ b/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java @@ -34,6 +34,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.network.CIDRMatcher; @@ -158,7 +159,7 @@ public static class BedrockConfiguration implements IBedrockConfiguration { private String address = "0.0.0.0"; @Override - public String address() { + public @NonNull String address() { return address; } @@ -260,7 +261,7 @@ public int port() { private AuthType authType = AuthType.ONLINE; @Override - public AuthType authType() { + public @NonNull AuthType authType() { return authType; } diff --git a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java index 290a0e3ad90..81860731403 100644 --- a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java +++ b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java @@ -33,7 +33,6 @@ import com.google.common.io.Files; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import lombok.AllArgsConstructor; import lombok.Getter; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.geysermc.floodgate.util.DeviceOs; @@ -106,8 +105,8 @@ public DumpInfo(boolean addLog) { // https://stackoverflow.com/questions/304268/getting-a-files-md5-checksum-in-java File file = new File(DumpInfo.class.getProtectionDomain().getCodeSource().getLocation().toURI()); ByteSource byteSource = Files.asByteSource(file); - // Jenkins uses MD5 for its hash - //noinspection UnstableApiUsage + // Jenkins uses MD5 for its hash - TODO remove + //noinspection UnstableApiUsage,deprecation md5Hash = byteSource.hash(Hashing.md5()).toString(); //noinspection UnstableApiUsage sha256Hash = byteSource.hash(Hashing.sha256()).toString(); @@ -118,7 +117,7 @@ public DumpInfo(boolean addLog) { } this.hashInfo = new HashInfo(md5Hash, sha256Hash); - this.ramInfo = new DumpInfo.RamInfo(); + this.ramInfo = new RamInfo(); if (addLog) { this.logsInfo = new LogsInfo(); @@ -202,7 +201,7 @@ public static class NetworkInfo { private boolean checkDockerBasic() { try { String OS = System.getProperty("os.name").toLowerCase(); - if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0) { + if (OS.contains("nix") || OS.contains("nux") || OS.indexOf("aix") > 0) { String output = new String(java.nio.file.Files.readAllBytes(Paths.get("/proc/1/cgroup"))); if (output.contains("docker")) { @@ -259,60 +258,30 @@ public LogsInfo() { } } - @AllArgsConstructor - @Getter - public static class HashInfo { - private final String md5Hash; - private final String sha256Hash; + public record HashInfo(String md5Hash, String sha256Hash) { } - @Getter - public static class RamInfo { - private final long free; - private final long total; - private final long max; - - RamInfo() { - this.free = Runtime.getRuntime().freeMemory() / MEGABYTE; - this.total = Runtime.getRuntime().totalMemory() / MEGABYTE; - this.max = Runtime.getRuntime().maxMemory() / MEGABYTE; + public record RamInfo(long free, long total, long max) { + public RamInfo() { + this(Runtime.getRuntime().freeMemory() / MEGABYTE, + Runtime.getRuntime().totalMemory() / MEGABYTE, + Runtime.getRuntime().maxMemory() / MEGABYTE); } } /** * E.G. `-Xmx1024M` - all runtime JVM flags on this machine */ - @Getter - public static class FlagsInfo { - private final List flags; - - FlagsInfo() { - this.flags = ManagementFactory.getRuntimeMXBean().getInputArguments(); + public record FlagsInfo(List flags) { + public FlagsInfo() { + this(ManagementFactory.getRuntimeMXBean().getInputArguments()); } } - @Getter - @AllArgsConstructor - public static class ExtensionInfo { - public boolean enabled; - public String name; - public String version; - public String apiVersion; - public String main; - public List authors; + public record ExtensionInfo(boolean enabled, String name, String version, String apiVersion, String main, List authors) { } - @Getter - @AllArgsConstructor - public static class GitInfo { - private final String buildNumber; - @JsonProperty("git.commit.id.abbrev") - private final String commitHashAbbrev; - @JsonProperty("git.commit.id") - private final String commitHash; - @JsonProperty("git.branch") - private final String branchName; - @JsonProperty("git.remote.origin.url") - private final String originUrl; + public record GitInfo(String buildNumber, @JsonProperty("git.commit.id.abbrev") String commitHashAbbrev, @JsonProperty("git.commit.id") String commitHash, + @JsonProperty("git.branch") String branchName, @JsonProperty("git.remote.origin.url") String originUrl) { } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinition.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinition.java index 566b3daff10..8b430d559df 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinition.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinition.java @@ -59,6 +59,7 @@ public static Builder builder(EntityFactory factory) { return new Builder<>(factory); } + @SuppressWarnings("unchecked") public void translateMetadata(T entity, EntityMetadata> metadata) { EntityMetadataTranslator>> translator = (EntityMetadataTranslator>>) this.translators.get(metadata.getId()); if (translator == null) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java index 92bfb75854a..234c1afe99d 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java +++ b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.attribute; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.AttributeData; import lombok.AllArgsConstructor; import lombok.Getter; @@ -69,7 +70,7 @@ public AttributeData getAttribute(float value) { return getAttribute(value, maximum); } - public AttributeData getAttribute(float value, float maximum) { + public @Nullable AttributeData getAttribute(float value, float maximum) { if (bedrockIdentifier == null) { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java index fcd4f216028..84dfae468ca 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/AreaEffectCloudEntity.java @@ -34,7 +34,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.registry.Registries; -import org.geysermc.geyser.registry.type.ParticleMapping; import org.geysermc.geyser.session.GeyserSession; import java.util.UUID; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java index 5ca739f6178..a2b7cc6ece3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/Entity.java @@ -36,6 +36,7 @@ import lombok.Getter; import lombok.Setter; import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -580,7 +581,7 @@ public final void playEntityEvent(EntityEventType type, int data) { } @SuppressWarnings("unchecked") - public I as(Class entityClass) { + public @Nullable I as(Class entityClass) { return entityClass.isInstance(this) ? (I) this : null; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java index be38098ac53..245b99cef00 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java @@ -38,6 +38,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.AttributeData; @@ -120,7 +121,7 @@ public void setHealth(FloatEntityMetadata entityMetadata) { session.sendUpstreamPacket(attributesPacket); } - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + public @Nullable Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { Optional optionalPos = entityMetadata.getValue(); if (optionalPos.isPresent()) { Vector3i bedPosition = optionalPos.get(); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java index 72ae88310e7..60840e65b51 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEntity.java @@ -51,7 +51,6 @@ public ThrowableEntity(GeyserSession session, int entityId, long geyserId, UUID /** * Updates the position for the Bedrock client. - * * Java clients assume the next positions of moving items. Bedrock needs to be explicitly told positions */ @Override diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java index ec0caac3398..9cc3a006e79 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/AbstractFishEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -34,7 +35,6 @@ import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.InteractionResult; -import javax.annotation.Nonnull; import java.util.UUID; public class AbstractFishEntity extends WaterEntity { @@ -48,9 +48,9 @@ public AbstractFishEntity(GeyserSession session, int entityId, long geyserId, UU setFlag(EntityFlag.HAS_GRAVITY, false); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (EntityUtils.attemptToBucket(itemInHand)) { return InteractionResult.SUCCESS; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java index f39200eed97..48d633e5d97 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/AllayEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -36,7 +37,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class AllayEntity extends MobEntity { @@ -54,9 +54,9 @@ public void setCanDuplicate(BooleanEntityMetadata entityMetadata) { this.canDuplicate = entityMetadata.getPrimitiveValue(); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) { // Maybe better as another tag? return InteractiveTag.GIVE_ITEM_TO_ALLAY; @@ -70,9 +70,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (this.canDuplicate && getFlag(EntityFlag.DANCING) && isDuplicationItem(itemInHand)) { //TOCHECK sound return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java index c9018fe76ad..c64776f185f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/ArmorStandEntity.java @@ -70,7 +70,7 @@ public class ArmorStandEntity extends LivingEntity { private boolean primaryEntity = true; /** * Whether the entity's position must be updated to included the offset. - * + *

* This should be true when the Java server marks the armor stand as invisible, but we shrink the entity * to allow the nametag to appear. Basically: * - Is visible: this is irrelevant (false) @@ -207,7 +207,7 @@ public void setRightLegRotation(EntityMetadata entityMetadata) { * @param negativeZToggle the flag to set true if the Z value of rotation is negative * @param rotation the Java rotation value */ - private void onRotationUpdate(EntityDataType dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Vector3f rotation) { + private void onRotationUpdate(EntityDataType dataLeech, EntityFlag negativeXToggle, EntityFlag negativeYToggle, EntityFlag negativeZToggle, Vector3f rotation) { // Indicate that rotation should be checked setFlag(EntityFlag.BRIBED, true); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java index 7c1d8efc72e..f0348bcaffd 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -33,7 +34,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class DolphinEntity extends WaterEntity { @@ -46,18 +46,18 @@ protected boolean canBeLeashed() { return true; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { return InteractiveTag.FEED; } return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { // Feed return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java index 1f653decd40..7afa4b4368c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/IronGolemEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -35,7 +36,6 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; -import javax.annotation.Nonnull; import java.util.UUID; public class IronGolemEntity extends GolemEntity { @@ -51,9 +51,9 @@ public IronGolemEntity(GeyserSession session, int entityId, long geyserId, UUID maxHealth = 100f; } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() == Items.IRON_INGOT) { if (health < maxHealth) { // Healing the iron golem diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java index 60a9a147414..0ac81c95748 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/MobEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -40,7 +41,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class MobEntity extends LivingEntity { @@ -133,13 +133,13 @@ private InteractionResult checkPriorityInteractions(GeyserItemStack itemInHand) return InteractionResult.PASS; } - @Nonnull - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + @NonNull + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return InteractiveTag.NONE; } - @Nonnull - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + @NonNull + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return InteractionResult.PASS; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java index ced274185e9..7f0699415a8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/SnowGolemEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -36,7 +37,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class SnowGolemEntity extends GolemEntity { @@ -51,9 +51,9 @@ public void setSnowGolemFlags(ByteEntityMetadata entityMetadata) { setFlag(EntityFlag.SHEARED, (xd & 0x10) != 0x10); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) { // Shearing the snow golem return InteractiveTag.SHEAR; @@ -61,9 +61,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return InteractiveTag.NONE; } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (Items.SHEARS == itemInHand.asItem() && isAlive() && !getFlag(EntityFlag.SHEARED)) { // Shearing the snow golem return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java index 47ddb912669..7094c431eb4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -34,7 +35,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class TadpoleEntity extends AbstractFishEntity { @@ -42,18 +42,18 @@ public TadpoleEntity(GeyserSession session, int entityId, long geyserId, UUID uu super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (isFood(itemInHand)) { return InteractiveTag.FEED; } return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (isFood(itemInHand)) { //TODO particles return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index 2c46da13b83..7278709ce71 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -38,7 +39,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class AnimalEntity extends AgeableEntity { @@ -59,18 +59,18 @@ public boolean canEat(Item item) { return item == Items.WHEAT; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (canEat(itemInHand)) { return InteractiveTag.FEED; } return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (canEat(itemInHand)) { // FEED if (getFlag(EntityFlag.BABY)) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java index 06eb0791b2a..85b2afc14b0 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -38,7 +39,6 @@ import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.InteractionResult; -import javax.annotation.Nonnull; import java.util.UUID; public class AxolotlEntity extends AnimalEntity { @@ -74,9 +74,9 @@ protected boolean canBeLeashed() { return true; } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (EntityUtils.attemptToBucket(itemInHand)) { return InteractionResult.SUCCESS; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java index 01641c8c3d9..cdcf534a348 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -36,7 +37,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class CowEntity extends AnimalEntity { @@ -44,9 +44,9 @@ public CowEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) { return super.testMobInteraction(hand, itemInHand); } @@ -54,9 +54,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return InteractiveTag.MILK; } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.BABY) || itemInHand.asItem() != Items.BUCKET) { return super.mobInteract(hand, itemInHand); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java index 20b8f5ccfca..9ed94f96f81 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -38,7 +39,6 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; -import javax.annotation.Nonnull; import java.util.UUID; public class GoatEntity extends AnimalEntity { @@ -70,9 +70,9 @@ protected void setDimensions(Pose pose) { // TODO testMobInteraction? - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.BABY) && itemInHand.asItem() == Items.BUCKET) { session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position); return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java index 2d136a169bb..1c347bf3183 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.geysermc.geyser.entity.EntityDefinition; @@ -37,7 +38,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class MooshroomEntity extends AnimalEntity { @@ -52,9 +52,9 @@ public void setVariant(ObjectEntityMetadata entityMetadata) { dirtyMetadata.put(EntityDataTypes.VARIANT, isBrown ? 1 : 0); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!isBaby()) { if (itemInHand.asItem() == Items.BOWL) { // Stew @@ -67,9 +67,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean isBaby = isBaby(); if (!isBaby && itemInHand.asItem() == Items.BOWL) { // Stew diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java index c81ddd52e27..c115ebcdc50 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -36,7 +37,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class OcelotEntity extends AnimalEntity { @@ -50,9 +50,9 @@ public boolean canEat(Item item) { return item == Items.COD || item == Items.SALMON; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { // Attempt to feed return InteractiveTag.FEED; @@ -61,9 +61,9 @@ protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { // Attempt to feed return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java index 212eaa91e0d..d2ef36932e7 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java @@ -28,6 +28,8 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; @@ -41,8 +43,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.UUID; public class PandaEntity extends AnimalEntity { @@ -93,18 +93,18 @@ public boolean canEat(Item item) { return item == Items.BAMBOO; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (mainGene == Gene.WORRIED && session.isThunder()) { return InteractiveTag.NONE; } return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (mainGene == Gene.WORRIED && session.isThunder()) { // Huh! return InteractionResult.PASS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java index 91e94321c71..2bc02cd55b6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -37,7 +38,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class PigEntity extends AnimalEntity { @@ -51,9 +51,9 @@ public boolean canEat(Item item) { return item == Items.CARROT || item == Items.POTATO || item == Items.BEETROOT; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount return InteractiveTag.MOUNT; @@ -68,9 +68,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java index 8c94580127e..13059244a72 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -38,7 +39,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class SheepEntity extends AnimalEntity { @@ -55,9 +55,9 @@ public void setSheepFlags(ByteEntityMetadata entityMetadata) { dirtyMetadata.put(EntityDataTypes.COLOR, (byte) color); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() == Items.SHEARS) { return InteractiveTag.SHEAR; } else { @@ -73,9 +73,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() == Items.SHEARS) { return InteractionResult.CONSUME; } else { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java index e58fa5aca8d..39a55fa1ee2 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -39,7 +40,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class StriderEntity extends AnimalEntity { @@ -98,9 +98,9 @@ public boolean canEat(Item item) { return item == Items.WARPED_FUNGUS; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount Strider return InteractiveTag.RIDE_STRIDER; @@ -115,9 +115,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { // Mount Strider return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java index 872f721906b..faa495487a9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; @@ -44,7 +45,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.Set; import java.util.UUID; @@ -128,14 +128,14 @@ public boolean canEat(Item item) { return DONKEY_AND_HORSE_FOODS.contains(item); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return testHorseInteraction(hand, itemInHand); } - @Nonnull - protected final InteractiveTag testHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + @NonNull + protected final InteractiveTag testHorseInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean isBaby = isBaby(); if (!isBaby) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { @@ -178,14 +178,14 @@ protected final InteractiveTag testHorseInteraction(@Nonnull Hand hand, @Nonnull } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return mobHorseInteract(hand, itemInHand); } - @Nonnull - protected final InteractionResult mobHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + @NonNull + protected final InteractionResult mobHorseInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean isBaby = isBaby(); if (!isBaby) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { @@ -236,21 +236,21 @@ protected final InteractionResult mobHorseInteract(@Nonnull Hand hand, @Nonnull } } - protected boolean testSaddle(@Nonnull GeyserItemStack itemInHand) { + protected boolean testSaddle(@NonNull GeyserItemStack itemInHand) { return isAlive() && !getFlag(EntityFlag.BABY) && getFlag(EntityFlag.TAMED); } - protected boolean testForChest(@Nonnull GeyserItemStack itemInHand) { + protected boolean testForChest(@NonNull GeyserItemStack itemInHand) { return false; } - protected boolean additionalTestForInventoryOpen(@Nonnull GeyserItemStack itemInHand) { + protected boolean additionalTestForInventoryOpen(@NonNull GeyserItemStack itemInHand) { return itemInHand.asItem().javaIdentifier().endsWith("_horse_armor"); } /* Just a place to stuff common code for the undead variants without having duplicate code */ - protected final InteractiveTag testUndeadHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected final InteractiveTag testUndeadHorseInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TAMED)) { return InteractiveTag.NONE; } else if (isBaby()) { @@ -272,7 +272,7 @@ protected final InteractiveTag testUndeadHorseInteraction(@Nonnull Hand hand, @N } } - protected final InteractionResult undeadHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected final InteractionResult undeadHorseInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (!getFlag(EntityFlag.TAMED)) { return InteractionResult.PASS; } else if (isBaby()) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java index 4ce6f062b30..8106b096d2e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java @@ -111,6 +111,5 @@ protected void setDimensions(Pose pose) { } public void setDashing(BooleanEntityMetadata entityMetadata) { - } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ChestedHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ChestedHorseEntity.java index 0fb9438d28f..fc8584de398 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ChestedHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ChestedHorseEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -32,7 +33,6 @@ import org.geysermc.geyser.item.Items; import org.geysermc.geyser.session.GeyserSession; -import javax.annotation.Nonnull; import java.util.UUID; public class ChestedHorseEntity extends AbstractHorseEntity { @@ -47,18 +47,18 @@ protected int getContainerBaseSize() { } @Override - protected boolean testSaddle(@Nonnull GeyserItemStack itemInHand) { + protected boolean testSaddle(@NonNull GeyserItemStack itemInHand) { // Not checked here return false; } @Override - protected boolean testForChest(@Nonnull GeyserItemStack itemInHand) { + protected boolean testForChest(@NonNull GeyserItemStack itemInHand) { return itemInHand.asItem() == Items.CHEST && !getFlag(EntityFlag.CHESTED); } @Override - protected boolean additionalTestForInventoryOpen(@Nonnull GeyserItemStack itemInHand) { + protected boolean additionalTestForInventoryOpen(@NonNull GeyserItemStack itemInHand) { // Armor won't work on these return false; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java index 43c76202c87..7080f9f7511 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/SkeletonHorseEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -33,7 +34,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class SkeletonHorseEntity extends AbstractHorseEntity { @@ -41,15 +41,15 @@ public SkeletonHorseEntity(GeyserSession session, int entityId, long geyserId, U super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return testUndeadHorseInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return undeadHorseInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java index 423537496c6..3275712fcd3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/ZombieHorseEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.inventory.GeyserItemStack; @@ -33,7 +34,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class ZombieHorseEntity extends AbstractHorseEntity { @@ -41,15 +41,15 @@ public ZombieHorseEntity(GeyserSession session, int entityId, long geyserId, UUI super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return testUndeadHorseInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { return undeadHorseInteract(hand, itemInHand); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java index 7903d85caa9..412157b5d46 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -40,7 +41,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class CatEntity extends TameableEntity { @@ -112,9 +112,9 @@ public boolean canEat(Item item) { return item == Items.COD || item == Items.SALMON; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean tamed = getFlag(EntityFlag.TAMED); if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { // Toggle sitting @@ -124,9 +124,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean tamed = getFlag(EntityFlag.TAMED); if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index 43f379de80e..4c4b6a22288 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -36,7 +37,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.Set; import java.util.UUID; @@ -61,9 +61,9 @@ private boolean isPoisonousFood(Item item) { return item == Items.COOKIE; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean tame = getFlag(EntityFlag.TAMED); if (!tame && isTameFood(itemInHand.asItem())) { return InteractiveTag.FEED; @@ -76,9 +76,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { boolean tame = getFlag(EntityFlag.TAMED); if (!tame && isTameFood(itemInHand.asItem())) { return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index ecf0736a35b..0f5b36ec3f1 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -40,7 +41,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.Set; import java.util.UUID; @@ -103,9 +103,9 @@ protected boolean canBeLeashed() { return !getFlag(EntityFlag.ANGRY) && super.canBeLeashed(); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (getFlag(EntityFlag.ANGRY)) { return InteractiveTag.NONE; } @@ -126,9 +126,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (ownerBedrockId == session.getPlayerEntity().getGeyserId() || getFlag(EntityFlag.TAMED) || itemInHand.asItem() == Items.BONE && !getFlag(EntityFlag.ANGRY)) { // Sitting toggle or feeding; not angry diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java index b8465f9cab8..c7b29130fb4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/AbstractMerchantEntity.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.entity.type.living.merchant; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; @@ -37,7 +38,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class AbstractMerchantEntity extends AgeableEntity { @@ -51,9 +51,9 @@ protected boolean canBeLeashed() { return false; } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() != Items.VILLAGER_SPAWN_EGG && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING) && ((VillagerEntity) this).isCanTradeWith())) { // An additional check we know cannot work @@ -64,9 +64,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI return super.testMobInteraction(hand, itemInHand); } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() != Items.VILLAGER_SPAWN_EGG && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING)) && (definition != EntityDefinitions.WANDERING_TRADER || !getFlag(EntityFlag.BABY))) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java index 84fa7d1bdde..9b0f5005047 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/merchant/VillagerEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -78,6 +79,7 @@ public class VillagerEntity extends AbstractMerchantEntity { VILLAGER_REGIONS[6] = 6; } + @Nullable private Vector3i bedPosition; /** * Used in the interactive tag manager @@ -103,7 +105,7 @@ public void setVillagerData(EntityMetadata entityMetadata) { } @Override - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + public @Nullable Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { return bedPosition = super.setBedPosition(entityMetadata); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java index e507226815e..33ea4e54493 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -37,7 +38,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class CreeperEntity extends MonsterEntity { @@ -62,9 +62,9 @@ public void setIgnited(BooleanEntityMetadata entityMetadata) { setFlag(EntityFlag.IGNITED, ignitedByFlintAndSteel); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (session.getTagCache().isCreeperIgniter(itemInHand.asItem())) { return InteractiveTag.IGNITE_CREEPER; } else { @@ -72,9 +72,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (session.getTagCache().isCreeperIgniter(itemInHand.asItem())) { // Ignite creeper - as of 1.19.3 session.playSoundEvent(SoundEvent.IGNITE, position); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java index 25fe7f8025d..450c546ec2c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -37,7 +38,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class PiglinEntity extends BasePiglinEntity { @@ -71,9 +71,9 @@ public void updateOffHand(GeyserSession session) { super.updateOffHand(session); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { InteractiveTag tag = super.testMobInteraction(hand, itemInHand); if (tag != InteractiveTag.NONE) { return tag; @@ -82,9 +82,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { InteractionResult superResult = super.mobInteract(hand, itemInHand); if (superResult.consumesAction()) { return superResult; @@ -93,7 +93,7 @@ protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemS } } - private boolean canGiveGoldTo(@Nonnull GeyserItemStack itemInHand) { + private boolean canGiveGoldTo(@NonNull GeyserItemStack itemInHand) { return !getFlag(EntityFlag.BABY) && itemInHand.asItem() == Items.GOLD_INGOT && !getFlag(EntityFlag.ADMIRING); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java index fbac8663fe3..32e45507af6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/ZombieVillagerEntity.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -40,7 +41,6 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; -import javax.annotation.Nonnull; import java.util.UUID; public class ZombieVillagerEntity extends ZombieEntity { @@ -67,9 +67,9 @@ protected boolean isShaking() { return getFlag(EntityFlag.IS_TRANSFORMING) || super.isShaking(); } - @Nonnull + @NonNull @Override - protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() == Items.GOLDEN_APPLE) { return InteractiveTag.CURE; } else { @@ -77,9 +77,9 @@ protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserI } } - @Nonnull + @NonNull @Override - protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) { + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { if (itemInHand.asItem() == Items.GOLDEN_APPLE) { // The client doesn't know if the entity has weakness as that's not usually sent over the network return InteractionResult.CONSUME; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java index e80418744e0..7504db1b1fe 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java @@ -36,6 +36,7 @@ import lombok.Getter; import lombok.Setter; import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.*; @@ -57,7 +58,6 @@ import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ChunkUtils; -import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -86,6 +86,7 @@ public class PlayerEntity extends LivingEntity implements GeyserPlayerEntity { @Nullable private String texturesProperty; + @Nullable private Vector3i bedPosition; /** @@ -240,7 +241,7 @@ public void setPosition(Vector3f position) { } @Override - public Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { + public @Nullable Vector3i setBedPosition(EntityMetadata, ?> entityMetadata) { bedPosition = super.setBedPosition(entityMetadata); if (bedPosition != null) { // Required to sync position of entity to bed diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java index 58b7ffddb3d..751a2487111 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java @@ -33,6 +33,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.AttributeData; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -44,7 +45,6 @@ import org.geysermc.geyser.util.AttributeUtils; import org.geysermc.geyser.util.DimensionUtils; -import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Map; @@ -112,7 +112,7 @@ public void setPositionManual(Vector3f position) { /** * Sending any updated flags (sprinting, onFire, etc.) to the client while in spectator is not needed - * Also "fixes" https://github.com/GeyserMC/Geyser/issues/3318 + * Also "fixes" issue 3318 */ @Override public void setFlags(ByteEntityMetadata entityMetadata) { @@ -126,7 +126,7 @@ public void setFlags(ByteEntityMetadata entityMetadata) { /** * Since 1.19.40, the client must be re-informed of its bounding box on respawn - * See https://github.com/GeyserMC/Geyser/issues/3370 + * See issue 3370 */ public void updateBoundingBox() { dirtyMetadata.put(EntityDataTypes.HEIGHT, getBoundingBoxHeight()); diff --git a/core/src/main/java/org/geysermc/geyser/erosion/AbstractGeyserboundPacketHandler.java b/core/src/main/java/org/geysermc/geyser/erosion/AbstractGeyserboundPacketHandler.java index eabed8f7b53..b8363efc96b 100644 --- a/core/src/main/java/org/geysermc/geyser/erosion/AbstractGeyserboundPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/erosion/AbstractGeyserboundPacketHandler.java @@ -25,9 +25,9 @@ package org.geysermc.geyser.erosion; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.erosion.packet.geyserbound.*; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.Nullable; public abstract class AbstractGeyserboundPacketHandler implements GeyserboundPacketHandler { protected final GeyserSession session; diff --git a/core/src/main/java/org/geysermc/geyser/erosion/GeyserboundHandshakePacketHandler.java b/core/src/main/java/org/geysermc/geyser/erosion/GeyserboundHandshakePacketHandler.java index 19659538351..0b4f0364375 100644 --- a/core/src/main/java/org/geysermc/geyser/erosion/GeyserboundHandshakePacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/erosion/GeyserboundHandshakePacketHandler.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.erosion; import io.netty.channel.Channel; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.erosion.netty.NettyPacketSender; import org.geysermc.erosion.packet.ErosionPacketHandler; import org.geysermc.erosion.packet.geyserbound.GeyserboundHandshakePacket; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.Nullable; public final class GeyserboundHandshakePacketHandler extends AbstractGeyserboundPacketHandler { @@ -66,7 +66,7 @@ public boolean isActive() { } @Override - public ErosionPacketHandler setChannel(Channel channel) { + public @Nullable ErosionPacketHandler setChannel(Channel channel) { return null; } } diff --git a/core/src/main/java/org/geysermc/geyser/erosion/UnixSocketClientListener.java b/core/src/main/java/org/geysermc/geyser/erosion/UnixSocketClientListener.java index a236099dfe2..1e00fe02cb5 100644 --- a/core/src/main/java/org/geysermc/geyser/erosion/UnixSocketClientListener.java +++ b/core/src/main/java/org/geysermc/geyser/erosion/UnixSocketClientListener.java @@ -31,6 +31,7 @@ import io.netty.channel.EventLoopGroup; import io.netty.channel.epoll.EpollDomainSocketChannel; import io.netty.channel.epoll.EpollEventLoopGroup; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.erosion.netty.impl.AbstractUnixSocketListener; import org.geysermc.erosion.packet.geyserbound.GeyserboundPacketHandler; @@ -49,9 +50,9 @@ public void createClient(GeyserboundPacketHandler handler, SocketAddress address initializeEventLoopGroup(); (new Bootstrap() .channel(EpollDomainSocketChannel.class) - .handler(new ChannelInitializer() { + .handler(new ChannelInitializer<>() { @Override - protected void initChannel(Channel ch) { + protected void initChannel(@NonNull Channel ch) { initPipeline(ch, handler); } }) diff --git a/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java b/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java index 9593e327ebe..d8657b61229 100644 --- a/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java +++ b/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java @@ -34,7 +34,6 @@ import org.geysermc.geyser.api.event.EventBus; import org.geysermc.geyser.api.event.EventRegistrar; import org.geysermc.geyser.api.event.EventSubscriber; -import org.geysermc.geyser.api.extension.Extension; import java.util.Set; import java.util.function.BiConsumer; diff --git a/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java b/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java index d33de8cdd79..ea2b73b5c17 100644 --- a/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java +++ b/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java @@ -31,7 +31,6 @@ import org.geysermc.event.subscribe.impl.OwnedSubscriberImpl; import org.geysermc.geyser.api.event.EventRegistrar; import org.geysermc.geyser.api.event.ExtensionEventSubscriber; -import org.geysermc.geyser.api.extension.Extension; import java.util.function.BiConsumer; import java.util.function.Consumer; diff --git a/core/src/main/java/org/geysermc/geyser/event/type/GeyserBedrockPingEventImpl.java b/core/src/main/java/org/geysermc/geyser/event/type/GeyserBedrockPingEventImpl.java index 579b4c68ce4..df1f166504d 100644 --- a/core/src/main/java/org/geysermc/geyser/event/type/GeyserBedrockPingEventImpl.java +++ b/core/src/main/java/org/geysermc/geyser/event/type/GeyserBedrockPingEventImpl.java @@ -26,12 +26,11 @@ package org.geysermc.geyser.event.type; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.BedrockPong; import org.geysermc.geyser.api.event.connection.GeyserBedrockPingEvent; -import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; import java.net.InetSocketAddress; import java.util.Objects; @@ -45,12 +44,12 @@ public GeyserBedrockPingEventImpl(BedrockPong pong, InetSocketAddress address) { } @Override - public void primaryMotd(@Nonnull String primary) { + public void primaryMotd(@NonNull String primary) { pong.motd(Objects.requireNonNull(primary, "Primary MOTD cannot be null")); } @Override - public void secondaryMotd(@Nonnull String secondary) { + public void secondaryMotd(@NonNull String secondary) { pong.subMotd(Objects.requireNonNull(secondary, "Secondary MOTD cannot be null")); } @@ -87,7 +86,7 @@ public int maxPlayerCount() { } @Override - public @NotNull InetSocketAddress address() { + public @NonNull InetSocketAddress address() { return address; } } diff --git a/core/src/main/java/org/geysermc/geyser/event/type/GeyserDefineCustomItemsEventImpl.java b/core/src/main/java/org/geysermc/geyser/event/type/GeyserDefineCustomItemsEventImpl.java index 65fd7ea0d9e..b9a059f19ac 100644 --- a/core/src/main/java/org/geysermc/geyser/event/type/GeyserDefineCustomItemsEventImpl.java +++ b/core/src/main/java/org/geysermc/geyser/event/type/GeyserDefineCustomItemsEventImpl.java @@ -51,7 +51,7 @@ public GeyserDefineCustomItemsEventImpl(Multimap customI * @return a multimap of all the already registered custom items */ @Override - public Map> getExistingCustomItems() { + public @NonNull Map> getExistingCustomItems() { return Collections.unmodifiableMap(this.customItems.asMap()); } @@ -61,7 +61,7 @@ public Map> getExistingCustomItems() { * @return the list of the already registered non-vanilla custom items */ @Override - public List getExistingNonVanillaCustomItems() { + public @NonNull List getExistingNonVanillaCustomItems() { return Collections.unmodifiableList(this.nonVanillaCustomItems); } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/AnvilContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/AnvilContainer.java index e99b901a471..9e0b83768b6 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/AnvilContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/AnvilContainer.java @@ -29,12 +29,11 @@ import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundRenameItemPacket; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ItemUtils; -import javax.annotation.Nullable; - /** * Used to determine if rename packets should be sent and stores * the expected level cost for AnvilInventoryUpdater diff --git a/core/src/main/java/org/geysermc/geyser/inventory/Container.java b/core/src/main/java/org/geysermc/geyser/inventory/Container.java index 569802a5a23..79fa67da1de 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/Container.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/Container.java @@ -27,12 +27,11 @@ import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.jetbrains.annotations.Range; -import javax.annotation.Nonnull; - /** * Combination of {@link Inventory} and {@link PlayerInventory} */ @@ -67,7 +66,7 @@ public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) { } @Override - public void setItem(int slot, @Nonnull GeyserItemStack newItem, GeyserSession session) { + public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { if (slot < this.size) { super.setItem(slot, newItem, session); } else { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/Generic3X3Container.java b/core/src/main/java/org/geysermc/geyser/inventory/Generic3X3Container.java index 8dbc9b7224a..6518dce7cf1 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/Generic3X3Container.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/Generic3X3Container.java @@ -33,7 +33,7 @@ public class Generic3X3Container extends Container { /** * Whether we need to set the container type as {@link org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType#DROPPER}. - * + *

* Used at {@link Generic3X3InventoryTranslator#openInventory(GeyserSession, Inventory)} */ @Getter diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java index d34ee2cbb10..23365e392a1 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserEnchantOption.java @@ -40,7 +40,7 @@ public class GeyserEnchantOption { private static final List EMPTY = Collections.emptyList(); /** - * This: https://cdn.discordapp.com/attachments/613168850925649981/791030657169227816/unknown.png + * This text * is controlled by the server. * So, of course, we have to throw in some easter eggs. ;) */ diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java index b159193e3d7..a67516c5c99 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java @@ -28,18 +28,18 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import lombok.AccessLevel; +import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; -import lombok.Data; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; -import javax.annotation.Nonnull; - @Data public class GeyserItemStack { public static final GeyserItemStack EMPTY = new GeyserItemStack(0, 0, null); @@ -64,7 +64,7 @@ private GeyserItemStack(int javaId, int amount, CompoundTag nbt, int netId) { this.netId = netId; } - public static @Nonnull GeyserItemStack from(ItemStack itemStack) { + public static @NonNull GeyserItemStack from(ItemStack itemStack) { return itemStack == null ? EMPTY : new GeyserItemStack(itemStack.getId(), itemStack.getAmount(), itemStack.getNbt()); } @@ -76,7 +76,7 @@ public int getAmount() { return isEmpty() ? 0 : amount; } - public CompoundTag getNbt() { + public @Nullable CompoundTag getNbt() { return isEmpty() ? null : nbt; } @@ -96,7 +96,7 @@ public ItemStack getItemStack() { return getItemStack(amount); } - public ItemStack getItemStack(int newAmount) { + public @Nullable ItemStack getItemStack(int newAmount) { return isEmpty() ? null : new ItemStack(javaId, newAmount, nbt); } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java b/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java index 91e8c4e94dd..3376d6c2616 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/Inventory.java @@ -29,6 +29,7 @@ import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3i; import lombok.Getter; import lombok.Setter; @@ -40,7 +41,6 @@ import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.jetbrains.annotations.Range; -import javax.annotation.Nonnull; import java.util.Arrays; @ToString @@ -126,7 +126,7 @@ public GeyserItemStack getItem(int slot) { public abstract int getOffsetForHotbar(@Range(from = 0, to = 8) int slot); - public void setItem(int slot, @Nonnull GeyserItemStack newItem, GeyserSession session) { + public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) { if (slot > this.size) { session.getGeyser().getLogger().debug("Tried to set an item out of bounds! " + this); return; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java b/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java index 7b1064c8ff3..bda09a4ed07 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/PlayerInventory.java @@ -28,12 +28,11 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; import org.jetbrains.annotations.Range; -import javax.annotation.Nonnull; - public class PlayerInventory extends Inventory { /** * Stores the held item slot, starting at index 0. @@ -44,7 +43,7 @@ public class PlayerInventory extends Inventory { private int heldItemSlot; @Getter - @Nonnull + @NonNull private GeyserItemStack cursor = GeyserItemStack.EMPTY; public PlayerInventory() { @@ -57,12 +56,12 @@ public int getOffsetForHotbar(@Range(from = 0, to = 8) int slot) { return slot + 36; } - public void setCursor(@Nonnull GeyserItemStack newCursor, GeyserSession session) { + public void setCursor(@NonNull GeyserItemStack newCursor, GeyserSession session) { updateItemNetId(cursor, newCursor, session); cursor = newCursor; } - public GeyserItemStack getItemInHand(@Nonnull Hand hand) { + public GeyserItemStack getItemInHand(@NonNull Hand hand) { return hand == Hand.OFF_HAND ? getOffhand() : getItemInHand(); } @@ -74,7 +73,7 @@ public GeyserItemStack getItemInHand() { return items[36 + heldItemSlot]; } - public void setItemInHand(@Nonnull GeyserItemStack item) { + public void setItemInHand(@NonNull GeyserItemStack item) { if (36 + heldItemSlot > this.size) { GeyserImpl.getInstance().getLogger().debug("Held item slot was larger than expected!"); return; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java index 6e04e6741cc..f99a0c71e2d 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/StonecutterContainer.java @@ -27,8 +27,8 @@ import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; import lombok.Getter; -import lombok.NonNull; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; public class StonecutterContainer extends Container { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java b/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java index bcbfe3e1725..5fa2a578463 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/Enchantment.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.inventory.item; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Locale; @@ -78,7 +79,7 @@ public enum Enchantment { this.javaIdentifier = "minecraft:" + this.name().toLowerCase(Locale.ENGLISH); } - public static Enchantment getByJavaIdentifier(String javaIdentifier) { + public static @Nullable Enchantment getByJavaIdentifier(String javaIdentifier) { for (Enchantment enchantment : VALUES) { if (enchantment.javaIdentifier.equals(javaIdentifier) || enchantment.name().toLowerCase(Locale.ENGLISH).equalsIgnoreCase(javaIdentifier)) { return enchantment; @@ -87,7 +88,7 @@ public static Enchantment getByJavaIdentifier(String javaIdentifier) { return null; } - public static Enchantment getByBedrockId(int bedrockId) { + public static @Nullable Enchantment getByBedrockId(int bedrockId) { if (bedrockId >= 0 && bedrockId < VALUES.length) { return VALUES[bedrockId]; } @@ -149,7 +150,7 @@ public static JavaEnchantment of(int index) { */ public static final String[] ALL_JAVA_IDENTIFIERS; - public static JavaEnchantment getByJavaIdentifier(String javaIdentifier) { + public static @Nullable JavaEnchantment getByJavaIdentifier(String javaIdentifier) { if (!javaIdentifier.startsWith("minecraft:")) { javaIdentifier = "minecraft:" + javaIdentifier; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/Potion.java b/core/src/main/java/org/geysermc/geyser/inventory/item/Potion.java index 8d2b52aa2e9..7ce0ee278f4 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/Potion.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/Potion.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.inventory.item; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Locale; @@ -84,7 +85,7 @@ public enum Potion { this.bedrockId = (short) bedrockId; } - public static Potion getByJavaIdentifier(String javaIdentifier) { + public static @Nullable Potion getByJavaIdentifier(String javaIdentifier) { for (Potion potion : VALUES) { if (potion.javaIdentifier.equals(javaIdentifier)) { return potion; @@ -93,7 +94,7 @@ public static Potion getByJavaIdentifier(String javaIdentifier) { return null; } - public static Potion getByBedrockId(int bedrockId) { + public static @Nullable Potion getByBedrockId(int bedrockId) { for (Potion potion : VALUES) { if (potion.bedrockId == bedrockId) { return potion; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java b/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java index 16fd7cde64f..6bb786896c4 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/StoredItemMappings.java @@ -27,11 +27,11 @@ import lombok.Getter; import lombok.experimental.Accessors; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.registry.type.ItemMapping; -import javax.annotation.Nonnull; import java.util.Map; /** @@ -70,7 +70,7 @@ public StoredItemMappings(Map itemMappings) { this.writableBook = load(itemMappings, Items.WRITABLE_BOOK); } - @Nonnull + @NonNull private ItemMapping load(Map itemMappings, Item item) { ItemMapping mapping = itemMappings.get(item); if (mapping == null) { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/TippedArrowPotion.java b/core/src/main/java/org/geysermc/geyser/inventory/item/TippedArrowPotion.java index e45667fe202..3ba0ad56fce 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/TippedArrowPotion.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/TippedArrowPotion.java @@ -26,12 +26,13 @@ package org.geysermc.geyser.inventory.item; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Locale; /** * Potion identifiers and their respective Bedrock IDs used with arrows. - * https://minecraft.wiki/w/Arrow#Data_values + * See here */ @Getter public enum TippedArrowPotion { @@ -93,7 +94,7 @@ public enum TippedArrowPotion { this.javaColor = arrowParticleColor.getColor(); } - public static TippedArrowPotion getByJavaIdentifier(String javaIdentifier) { + public static @Nullable TippedArrowPotion getByJavaIdentifier(String javaIdentifier) { for (TippedArrowPotion potion : VALUES) { if (potion.javaIdentifier.equals(javaIdentifier)) { return potion; @@ -102,7 +103,7 @@ public static TippedArrowPotion getByJavaIdentifier(String javaIdentifier) { return null; } - public static TippedArrowPotion getByBedrockId(int bedrockId) { + public static @Nullable TippedArrowPotion getByBedrockId(int bedrockId) { for (TippedArrowPotion potion : VALUES) { if (potion.bedrockId == bedrockId) { return potion; @@ -115,7 +116,7 @@ public static TippedArrowPotion getByBedrockId(int bedrockId) { * @param color the potion color to look up * @return the tipped arrow potion that most closely resembles that color. */ - public static TippedArrowPotion getByJavaColor(int color) { + public static @Nullable TippedArrowPotion getByJavaColor(int color) { for (TippedArrowPotion potion : VALUES) { if (potion.javaColor == color) { return potion; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index aa78970382c..5adee0c20d3 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -64,7 +64,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio super.updateInventory(translator, session, inventory); AnvilContainer anvilContainer = (AnvilContainer) inventory; updateInventoryState(session, anvilContainer); - int targetSlot = getTargetSlot(session, anvilContainer); + int targetSlot = getTargetSlot(anvilContainer); for (int i = 0; i < translator.size; i++) { final int bedrockSlot = translator.javaSlotToBedrock(i); if (bedrockSlot == 50) @@ -89,7 +89,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, updateInventoryState(session, anvilContainer); int lastTargetSlot = anvilContainer.getLastTargetSlot(); - int targetSlot = getTargetSlot(session, anvilContainer); + int targetSlot = getTargetSlot(anvilContainer); if (targetSlot != javaSlot) { // Update the requested slot InventorySlotPacket slotPacket = new InventorySlotPacket(); @@ -136,7 +136,7 @@ private void updateInventoryState(GeyserSession session, AnvilContainer anvilCon * @param anvilContainer the anvil inventory * @return the slot to change the repair cost */ - private int getTargetSlot(GeyserSession session, AnvilContainer anvilContainer) { + private int getTargetSlot(AnvilContainer anvilContainer) { GeyserItemStack input = anvilContainer.getInput(); GeyserItemStack material = anvilContainer.getMaterial(); @@ -433,6 +433,7 @@ private boolean isRenaming(GeyserSession session, AnvilContainer anvilContainer, return !Objects.equals(originalName, ItemUtils.getCustomName(anvilContainer.getResult().getNbt())); } + @SuppressWarnings("SameParameterValue") private int getTagIntValueOr(GeyserItemStack itemStack, String tagName, int defaultValue) { if (itemStack.getNbt() != null) { Tag tag = itemStack.getNbt().get(tagName); diff --git a/core/src/main/java/org/geysermc/geyser/item/GeyserCustomItemOptions.java b/core/src/main/java/org/geysermc/geyser/item/GeyserCustomItemOptions.java index cebad261e21..1434c49d9b6 100644 --- a/core/src/main/java/org/geysermc/geyser/item/GeyserCustomItemOptions.java +++ b/core/src/main/java/org/geysermc/geyser/item/GeyserCustomItemOptions.java @@ -30,15 +30,13 @@ import java.util.OptionalInt; +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public record GeyserCustomItemOptions(TriState unbreakable, OptionalInt customModelData, OptionalInt damagePredicate, boolean defaultItem) implements CustomItemOptions { - public GeyserCustomItemOptions(TriState unbreakable, OptionalInt customModelData, OptionalInt damagePredicate) { - this(unbreakable, customModelData, damagePredicate, false); - } - + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public static class CustomItemOptionsBuilder implements CustomItemOptions.Builder { private TriState unbreakable = TriState.NOT_SET; private OptionalInt customModelData = OptionalInt.empty(); diff --git a/core/src/main/java/org/geysermc/geyser/item/GeyserCustomMappingData.java b/core/src/main/java/org/geysermc/geyser/item/GeyserCustomMappingData.java index 37bf9e02c95..d71f2e54863 100644 --- a/core/src/main/java/org/geysermc/geyser/item/GeyserCustomMappingData.java +++ b/core/src/main/java/org/geysermc/geyser/item/GeyserCustomMappingData.java @@ -27,7 +27,6 @@ import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.inventory.ComponentItemData; -import org.cloudburstmc.protocol.bedrock.packet.StartGamePacket; public record GeyserCustomMappingData(ComponentItemData componentItemData, ItemDefinition itemDefinition, String stringId, int integerId) { } diff --git a/core/src/main/java/org/geysermc/geyser/item/GeyserNonVanillaCustomItemData.java b/core/src/main/java/org/geysermc/geyser/item/GeyserNonVanillaCustomItemData.java index 47b5aed330b..52b0ee7d06b 100644 --- a/core/src/main/java/org/geysermc/geyser/item/GeyserNonVanillaCustomItemData.java +++ b/core/src/main/java/org/geysermc/geyser/item/GeyserNonVanillaCustomItemData.java @@ -32,11 +32,11 @@ import org.geysermc.geyser.api.item.custom.CustomItemOptions; import org.geysermc.geyser.api.item.custom.CustomRenderOffsets; import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData; -import org.jetbrains.annotations.NotNull; import java.util.OptionalInt; import java.util.Set; +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") @EqualsAndHashCode(callSuper = true) @ToString public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData implements NonVanillaCustomItemData { @@ -84,7 +84,7 @@ public GeyserNonVanillaCustomItemData(NonVanillaCustomItemDataBuilder builder) { } @Override - public @NotNull String identifier() { + public @NonNull String identifier() { return identifier; } @@ -134,7 +134,7 @@ public Set repairMaterials() { } @Override - public @NotNull OptionalInt creativeCategory() { + public @NonNull OptionalInt creativeCategory() { return creativeCategory; } diff --git a/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java b/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java index ee144acc614..8484eb18512 100644 --- a/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java +++ b/core/src/main/java/org/geysermc/geyser/item/components/ToolTier.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.item.components; import com.google.common.base.Suppliers; -import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.Item; @@ -66,14 +65,4 @@ public Set getRepairIngredients() { public String toString() { return this.name().toLowerCase(Locale.ROOT); } - - public static ToolTier getByName(@NonNull String name) { - String upperCase = name.toUpperCase(Locale.ROOT); - for (ToolTier tier : VALUES) { - if (tier.name().equals(upperCase)) { - return tier; - } - } - return null; - } } diff --git a/core/src/main/java/org/geysermc/geyser/item/exception/InvalidCustomMappingsFileException.java b/core/src/main/java/org/geysermc/geyser/item/exception/InvalidCustomMappingsFileException.java index 5878f5cc78a..99ca463d761 100644 --- a/core/src/main/java/org/geysermc/geyser/item/exception/InvalidCustomMappingsFileException.java +++ b/core/src/main/java/org/geysermc/geyser/item/exception/InvalidCustomMappingsFileException.java @@ -25,16 +25,14 @@ package org.geysermc.geyser.item.exception; +import java.io.Serial; + public class InvalidCustomMappingsFileException extends Exception { - public InvalidCustomMappingsFileException(Throwable cause) { - super(cause); - } + + @Serial + private static final long serialVersionUID = 1L; public InvalidCustomMappingsFileException(String message) { super(message); } - - public InvalidCustomMappingsFileException(String message, Throwable cause) { - super(message, cause); - } } diff --git a/core/src/main/java/org/geysermc/geyser/item/type/ArrowItem.java b/core/src/main/java/org/geysermc/geyser/item/type/ArrowItem.java index 9a93eeac870..938d4a79afc 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/ArrowItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/ArrowItem.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.inventory.item.TippedArrowPotion; import org.geysermc.geyser.item.Items; @@ -38,7 +39,8 @@ public ArrowItem(String javaIdentifier, Builder builder) { super(javaIdentifier, builder); } - public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { + @Override + public @NonNull ItemStack translateToJava(@NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) { TippedArrowPotion tippedArrowPotion = TippedArrowPotion.getByBedrockId(itemData.getDamage()); ItemStack itemStack = super.translateToJava(itemData, mapping, mappings); if (tippedArrowPotion != null) { diff --git a/core/src/main/java/org/geysermc/geyser/item/type/AxolotlBucketItem.java b/core/src/main/java/org/geysermc/geyser/item/type/AxolotlBucketItem.java index cd53cf90498..81d7bf116a0 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/AxolotlBucketItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/AxolotlBucketItem.java @@ -28,9 +28,9 @@ import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.MinecraftLocale; -import org.jetbrains.annotations.NotNull; public class AxolotlBucketItem extends Item { public AxolotlBucketItem(String javaIdentifier, Builder builder) { @@ -38,7 +38,7 @@ public AxolotlBucketItem(String javaIdentifier, Builder builder) { } @Override - public void translateNbtToBedrock(@NotNull GeyserSession session, @NotNull CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); // Bedrock Edition displays the properties of the axolotl. Java does not. diff --git a/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java b/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java index 920f9e168db..344668836c7 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java @@ -29,14 +29,13 @@ import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.nbt.NbtList; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtType; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; @@ -45,7 +44,7 @@ public class BannerItem extends BlockItem { /** * Holds what a Java ominous banner pattern looks like. - * + *

* Translating the patterns over to Bedrock does not work effectively, but Bedrock has a dedicated type for * ominous banners that we set instead. This variable is used to detect Java ominous banner patterns, and apply * the correct ominous banner pattern if Bedrock pulls the item from creative. @@ -86,7 +85,7 @@ public static NbtList convertBannerPattern(ListTag patterns) { * @param pattern Java edition pattern nbt * @return The Bedrock edition format pattern nbt */ - @Nonnull + @NonNull private static NbtMap getBedrockBannerPattern(CompoundTag pattern) { return NbtMap.builder() .putInt("Color", 15 - (int) pattern.get("Color").getValue()) @@ -121,7 +120,7 @@ public BannerItem(String javaIdentifier, Builder builder) { } @Override - public void translateNbtToBedrock(@NotNull GeyserSession session, @NotNull CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); CompoundTag blockEntityTag = tag.remove("BlockEntityTag"); @@ -137,7 +136,7 @@ public void translateNbtToBedrock(@NotNull GeyserSession session, @NotNull Compo } @Override - public void translateNbtToJava(@NotNull CompoundTag tag, @NotNull ItemMapping mapping) { + public void translateNbtToJava(@NonNull CompoundTag tag, @NonNull ItemMapping mapping) { super.translateNbtToJava(tag, mapping); if (tag.get("Type") instanceof IntTag type && type.getValue() == 1) { diff --git a/core/src/main/java/org/geysermc/geyser/item/type/CompassItem.java b/core/src/main/java/org/geysermc/geyser/item/type/CompassItem.java index d1ed6f6b8e7..87da9644788 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/CompassItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/CompassItem.java @@ -30,6 +30,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMappings; @@ -57,7 +58,7 @@ public ItemMapping toBedrockDefinition(CompoundTag nbt, ItemMappings mappings) { } @Override - public void translateNbtToBedrock(GeyserSession session, CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); Tag lodestoneTag = tag.get("LodestoneTracked"); @@ -77,7 +78,7 @@ private boolean isLodestoneCompass(CompoundTag nbt) { } @Override - public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { + public @NonNull ItemStack translateToJava(@NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) { if (mapping.getBedrockIdentifier().equals("minecraft:lodestone_compass")) { // Revert the entry back to the compass mapping = mappings.getStoredItems().compass(); diff --git a/core/src/main/java/org/geysermc/geyser/item/type/CrossbowItem.java b/core/src/main/java/org/geysermc/geyser/item/type/CrossbowItem.java index 756cd69badd..e409dccfb7a 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/CrossbowItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/CrossbowItem.java @@ -28,11 +28,11 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.*; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; -import org.jetbrains.annotations.Nullable; public class CrossbowItem extends Item { public CrossbowItem(String javaIdentifier, Builder builder) { diff --git a/core/src/main/java/org/geysermc/geyser/item/type/EnchantedBookItem.java b/core/src/main/java/org/geysermc/geyser/item/type/EnchantedBookItem.java index f7743e43031..ac0751c737b 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/EnchantedBookItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/EnchantedBookItem.java @@ -28,6 +28,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; import java.util.ArrayList; @@ -39,7 +40,7 @@ public EnchantedBookItem(String javaIdentifier, Builder builder) { } @Override - public void translateNbtToBedrock(GeyserSession session, CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); List newTags = new ArrayList<>(); diff --git a/core/src/main/java/org/geysermc/geyser/item/type/FishingRodItem.java b/core/src/main/java/org/geysermc/geyser/item/type/FishingRodItem.java index 96241deb3ce..f63a1ec5ac2 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/FishingRodItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/FishingRodItem.java @@ -28,6 +28,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.GeyserSession; public class FishingRodItem extends Item { @@ -36,7 +37,7 @@ public FishingRodItem(String javaIdentifier, Builder builder) { } @Override - public void translateNbtToBedrock(GeyserSession session, CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); // Fix damage inconsistency diff --git a/core/src/main/java/org/geysermc/geyser/item/type/GoatHornItem.java b/core/src/main/java/org/geysermc/geyser/item/type/GoatHornItem.java index 4c21be833b2..aacb906c9e9 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/GoatHornItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/GoatHornItem.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.registry.type.ItemMapping; @@ -71,7 +72,7 @@ public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapp } @Override - public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { + public @NonNull ItemStack translateToJava(@NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) { ItemStack itemStack = super.translateToJava(itemData, mapping, mappings); int damage = itemData.getDamage(); diff --git a/core/src/main/java/org/geysermc/geyser/item/type/Item.java b/core/src/main/java/org/geysermc/geyser/item/type/Item.java index eef02ff0e87..a7a59f6af4b 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/Item.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/Item.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.*; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.inventory.item.Enchantment; @@ -99,8 +100,7 @@ public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapp return builder; } - public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { - if (itemData == null) return null; + public @NonNull ItemStack translateToJava(@NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) { if (itemData.getTag() == null) { return new ItemStack(javaId, itemData.getCount(), new CompoundTag("")); } @@ -206,7 +206,7 @@ public void translateNbtToJava(@NonNull CompoundTag tag, @NonNull ItemMapping ma } } - protected final CompoundTag remapEnchantment(GeyserSession session, CompoundTag tag, CompoundTag rootTag) { + protected final @Nullable CompoundTag remapEnchantment(GeyserSession session, CompoundTag tag, CompoundTag rootTag) { Tag javaEnchId = tag.get("id"); if (!(javaEnchId instanceof StringTag)) return null; diff --git a/core/src/main/java/org/geysermc/geyser/item/type/MapItem.java b/core/src/main/java/org/geysermc/geyser/item/type/MapItem.java index cd63a379973..4405b66adb0 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/MapItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/MapItem.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.item.type; import com.github.steveice10.opennbt.tag.builtin.*; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; @@ -35,7 +36,7 @@ public MapItem(String javaIdentifier, Builder builder) { } @Override - public void translateNbtToBedrock(GeyserSession session, CompoundTag tag) { + public void translateNbtToBedrock(@NonNull GeyserSession session, @NonNull CompoundTag tag) { super.translateNbtToBedrock(session, tag); Tag mapId = tag.remove("map"); @@ -49,7 +50,7 @@ public void translateNbtToBedrock(GeyserSession session, CompoundTag tag) { } @Override - public void translateNbtToJava(CompoundTag tag, ItemMapping mapping) { + public void translateNbtToJava(@NonNull CompoundTag tag, @NonNull ItemMapping mapping) { super.translateNbtToJava(tag, mapping); IntTag mapNameIndex = tag.remove("map_name_index"); diff --git a/core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java b/core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java index 35963943757..24dd56ef23e 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/PotionItem.java @@ -28,6 +28,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.geysermc.geyser.GeyserImpl; @@ -69,7 +70,7 @@ public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapp } @Override - public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { + public @NonNull ItemStack translateToJava(@NonNull ItemData itemData, @NonNull ItemMapping mapping, @NonNull ItemMappings mappings) { Potion potion = Potion.getByBedrockId(itemData.getDamage()); ItemStack itemStack = super.translateToJava(itemData, mapping, mappings); if (potion != null) { diff --git a/core/src/main/java/org/geysermc/geyser/level/BedrockMapIcon.java b/core/src/main/java/org/geysermc/geyser/level/BedrockMapIcon.java index 9bb31799682..eac8aca0957 100644 --- a/core/src/main/java/org/geysermc/geyser/level/BedrockMapIcon.java +++ b/core/src/main/java/org/geysermc/geyser/level/BedrockMapIcon.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.level.map.MapIconType; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; public enum BedrockMapIcon { ICON_WHITE_ARROW(MapIconType.WHITE_ARROW, 0), @@ -87,7 +88,7 @@ public enum BedrockMapIcon { * @param iconType A MapIconType * @return The mapping for a BedrockMapIcon */ - public static BedrockMapIcon fromType(MapIconType iconType) { + public static @Nullable BedrockMapIcon fromType(MapIconType iconType) { for (BedrockMapIcon icon : VALUES) { if (icon.iconType.equals(iconType)) { return icon; diff --git a/core/src/main/java/org/geysermc/geyser/level/FireworkColor.java b/core/src/main/java/org/geysermc/geyser/level/FireworkColor.java index e005ab2d82b..2ee8509a0c1 100644 --- a/core/src/main/java/org/geysermc/geyser/level/FireworkColor.java +++ b/core/src/main/java/org/geysermc/geyser/level/FireworkColor.java @@ -27,6 +27,7 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.util.HSVLike; +import org.checkerframework.checker.nullness.qual.NonNull; public enum FireworkColor { BLACK(1973019), @@ -75,7 +76,7 @@ public static byte fromJavaRGB(int rgbValue) { * @return nearest named color. will always return a value * @since 4.0.0 */ - private static FireworkColor nearestTo(final HSVLike any) { + private static @NonNull FireworkColor nearestTo(final HSVLike any) { float matchedDistance = Float.MAX_VALUE; FireworkColor match = VALUES[0]; for (final FireworkColor potential : VALUES) { diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java index 936248afe09..e09cad19ce1 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.level; import com.github.steveice10.mc.protocol.data.game.advancement.Advancement; -import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.cache.AdvancementsCache; import org.geysermc.geyser.text.ChatColor; @@ -73,7 +73,7 @@ public String getDisplayColor() { return displayData != null && displayData.getFrameType() == Advancement.DisplayData.FrameType.CHALLENGE ? ChatColor.LIGHT_PURPLE : ChatColor.GREEN; } - public String getRootId(AdvancementsCache advancementsCache) { + public @NonNull String getRootId(AdvancementsCache advancementsCache) { if (rootId == null) { if (this.advancement.getParentId() == null) { // We are the root ID diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java index a8e2d00aef7..44c3b94b3d3 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java @@ -31,6 +31,8 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; @@ -39,9 +41,7 @@ import org.geysermc.erosion.util.LecternUtils; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; -import org.jetbrains.annotations.Nullable; -import javax.annotation.Nonnull; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -99,6 +99,7 @@ public void sendLecternData(GeyserSession session, int x, int z, List vectors = new ObjectArrayList<>(blockEntityInfos.size()); + //noinspection ForLoopReplaceableByForEach - avoid constructing iterator for (int i = 0; i < blockEntityInfos.size(); i++) { BlockEntityInfo info = blockEntityInfos.get(i); vectors.add(Vector3i.from(info.getX(), info.getY(), info.getZ())); @@ -171,7 +172,7 @@ public boolean hasPermission(GeyserSession session, String permission) { return false; } - @Nonnull + @NonNull @Override public CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { var erosionHandler = session.getErosionHandler().getAsActive(); diff --git a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java index a4de993d25b..be7e2c139be 100644 --- a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java @@ -29,12 +29,12 @@ import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityInfo; import com.github.steveice10.mc.protocol.data.game.setting.Difficulty; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.geysermc.erosion.util.BlockPositionIterator; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.Nullable; -import javax.annotation.Nonnull; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; @@ -107,7 +107,7 @@ public int[] getBlocksAt(GeyserSession session, BlockPositionIterator iter) { * * We solve this problem by querying all loaded lecterns, where possible, and sending their information in a block entity * tag. - * + *

* Note that the lectern data may be sent asynchronously. * * @param session the session of the player @@ -210,8 +210,7 @@ public void setDifficulty(GeyserSession session, Difficulty difficulty) { /** * Returns a list of biome identifiers available on the server. */ - @Nullable - public String[] getBiomeIdentifiers(boolean withTags) { + public String @Nullable [] getBiomeIdentifiers(boolean withTags) { return null; } @@ -220,7 +219,7 @@ public String[] getBiomeIdentifiers(boolean withTags) { * * @return expected NBT for this item. */ - @Nonnull + @NonNull public CompletableFuture<@Nullable CompoundTag> getPickItemNbt(GeyserSession session, int x, int y, int z, boolean addNbtData) { return CompletableFuture.completedFuture(null); } diff --git a/core/src/main/java/org/geysermc/geyser/level/block/DoubleChestValue.java b/core/src/main/java/org/geysermc/geyser/level/block/DoubleChestValue.java index 8024af65037..97c861df71c 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/DoubleChestValue.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/DoubleChestValue.java @@ -27,19 +27,14 @@ /** * This stores all values of double chests that are part of the Java block state. + * + * @param isFacingEast If true, then chest is facing east/west; if false, south/north + * @param isDirectionPositive If true, direction is positive (east/south); if false, direction is negative (west/north) + * @param isLeft If true, chest is the left of a pair; if false, chest is the right of a pair. */ public record DoubleChestValue( - /** - * If true, then chest is facing east/west; if false, south/north - */ boolean isFacingEast, - /** - * If true, direction is positive (east/south); if false, direction is negative (west/north) - */ boolean isDirectionPositive, - /** - * If true, chest is the left of a pair; if false, chest is the right of a pair. - */ boolean isLeft) { } diff --git a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockData.java b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockData.java index 413a4d1edba..dd58ebcb7c6 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockData.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockData.java @@ -28,6 +28,7 @@ import it.unimi.dsi.fastutil.objects.*; import lombok.RequiredArgsConstructor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.block.custom.CustomBlockData; @@ -37,9 +38,6 @@ import org.geysermc.geyser.api.block.custom.property.CustomBlockProperty; import org.geysermc.geyser.api.block.custom.property.PropertyType; import org.geysermc.geyser.api.util.CreativeCategory; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; import java.util.List; import java.util.Map; @@ -142,7 +140,7 @@ public CustomBlockComponents components() { } @Override - public CustomBlockState.@NotNull Builder blockStateBuilder() { + public CustomBlockState.@NonNull Builder blockStateBuilder() { return new GeyserCustomBlockState.CustomBlockStateBuilder(this); } diff --git a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockState.java b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockState.java index 576bd9743a8..d147ffedcd5 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockState.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockState.java @@ -54,7 +54,7 @@ public class GeyserCustomBlockState implements CustomBlockState { @SuppressWarnings("unchecked") @Override - public @NonNull T property(String propertyName) { + public @NonNull T property(@NonNull String propertyName) { return (T) properties.get(propertyName); } diff --git a/core/src/main/java/org/geysermc/geyser/level/block/GeyserJavaBlockState.java b/core/src/main/java/org/geysermc/geyser/level/block/GeyserJavaBlockState.java index 725afe6df18..5604a543e88 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/GeyserJavaBlockState.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/GeyserJavaBlockState.java @@ -52,7 +52,7 @@ private GeyserJavaBlockState(JavaBlockStateBuilder builder) { } @Override - public @NonNull boolean waterlogged() { + public boolean waterlogged() { return waterlogged; } @@ -62,7 +62,7 @@ private GeyserJavaBlockState(JavaBlockStateBuilder builder) { } @Override - public @NonNull boolean canBreakWithHand() { + public boolean canBreakWithHand() { return canBreakWithHand; } @@ -77,7 +77,7 @@ private GeyserJavaBlockState(JavaBlockStateBuilder builder) { } @Override - public @Nullable boolean hasBlockEntity() { + public boolean hasBlockEntity() { return hasBlockEntity; } @@ -118,7 +118,7 @@ public Builder blockHardness(@NonNegative float blockHardness) { } @Override - public Builder waterlogged(@NonNull boolean waterlogged) { + public Builder waterlogged(boolean waterlogged) { this.waterlogged = waterlogged; return this; } @@ -130,7 +130,7 @@ public Builder collision(@NonNull JavaBoundingBox[] collision) { } @Override - public Builder canBreakWithHand(@NonNull boolean canBreakWithHand) { + public Builder canBreakWithHand(boolean canBreakWithHand) { this.canBreakWithHand = canBreakWithHand; return this; } @@ -148,7 +148,7 @@ public Builder pistonBehavior(@Nullable String pistonBehavior) { } @Override - public Builder hasBlockEntity(@Nullable boolean hasBlockEntity) { + public Builder hasBlockEntity(boolean hasBlockEntity) { this.hasBlockEntity = hasBlockEntity; return this; } diff --git a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java index d95767b976a..fbfd82144fa 100644 --- a/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java +++ b/core/src/main/java/org/geysermc/geyser/level/chunk/bitarray/BitArrayVersion.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.level.chunk.bitarray; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.util.MathUtils; public enum BitArrayVersion { @@ -61,7 +62,7 @@ public static BitArrayVersion get(int version, boolean read) { throw new IllegalArgumentException("Invalid palette version: " + version); } - public static BitArrayVersion forBitsCeil(int bits) { + public static @Nullable BitArrayVersion forBitsCeil(int bits) { for (int i = VALUES.length - 1; i >= 0; i--) { BitArrayVersion version = VALUES[i]; if (version.bits >= bits) { @@ -79,10 +80,6 @@ public int getMaxEntryValue() { return maxEntryValue; } - public int getWordsForSize(int size) { - return MathUtils.ceil((float) size / entriesPerWord); - } - public BitArrayVersion next() { return next; } diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java index b983da8b4f2..2c3da3c4153 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.level.physics; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.GenericMath; import org.cloudburstmc.math.vector.Vector3d; import org.cloudburstmc.math.vector.Vector3f; @@ -133,7 +134,7 @@ public void updatePlayerBoundingBox() { * @param teleported whether the Bedrock player has teleported to a new position. If true, movement correction is skipped. * @return the position to send to the Java server, or null to cancel sending the packet */ - public Vector3d adjustBedrockPosition(Vector3f bedrockPosition, boolean onGround, boolean teleported) { + public @Nullable Vector3d adjustBedrockPosition(Vector3f bedrockPosition, boolean onGround, boolean teleported) { PistonCache pistonCache = session.getPistonCache(); // Bedrock clients tend to fall off of honey blocks, so we need to teleport them to the new position if (pistonCache.isPlayerAttachedToHoney()) { diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/Direction.java b/core/src/main/java/org/geysermc/geyser/level/physics/Direction.java index fa5201db949..09ff8980069 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/Direction.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/Direction.java @@ -25,10 +25,9 @@ package org.geysermc.geyser.level.physics; -import org.cloudburstmc.math.vector.Vector3i; import lombok.Getter; - -import javax.annotation.Nonnull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.cloudburstmc.math.vector.Vector3i; public enum Direction { DOWN(1, Vector3i.from(0, -1, 0), Axis.Y, com.github.steveice10.mc.protocol.data.game.entity.object.Direction.DOWN), @@ -66,8 +65,7 @@ public boolean isHorizontal() { return axis == Axis.X || axis == Axis.Z; } - @Nonnull - public static Direction fromPistonValue(com.github.steveice10.mc.protocol.data.game.entity.object.Direction pistonValue) { + public static @NonNull Direction fromPistonValue(com.github.steveice10.mc.protocol.data.game.entity.object.Direction pistonValue) { for (Direction direction : VALUES) { if (direction.pistonValue == pistonValue) { return direction; diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java b/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java index a6b25d01ef0..fa28e7cb8e8 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/PistonBehavior.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.level.physics; +import org.checkerframework.checker.nullness.qual.NonNull; + import java.util.Locale; public enum PistonBehavior { @@ -35,7 +37,7 @@ public enum PistonBehavior { private static final PistonBehavior[] VALUES = values(); - public static PistonBehavior getByName(String name) { + public static @NonNull PistonBehavior getByName(String name) { String upperCase = name.toUpperCase(Locale.ROOT); for (PistonBehavior type : VALUES) { if (type.name().equals(upperCase)) { diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 4ffdbcf48b9..11c7bc11e5e 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.codec.MinecraftCodec; import com.github.steveice10.mc.protocol.codec.PacketCodec; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; @@ -82,7 +83,7 @@ public final class GameProtocol { * @param protocolVersion The protocol version to attempt to find * @return The packet codec, or null if the client's protocol is unsupported */ - public static BedrockCodec getBedrockCodec(int protocolVersion) { + public static @Nullable BedrockCodec getBedrockCodec(int protocolVersion) { for (BedrockCodec packetCodec : SUPPORTED_BEDROCK_CODECS) { if (packetCodec.getProtocolVersion() == protocolVersion) { return packetCodec; diff --git a/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java b/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java index f19a46e6a28..bb8e8744052 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java +++ b/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java @@ -28,6 +28,7 @@ import io.netty.channel.Channel; import io.netty.channel.DefaultEventLoopGroup; import io.netty.util.concurrent.DefaultThreadFactory; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.BedrockPeer; import org.cloudburstmc.protocol.bedrock.BedrockServerSession; import org.cloudburstmc.protocol.bedrock.netty.initializer.BedrockServerInitializer; @@ -35,7 +36,6 @@ import org.geysermc.geyser.api.event.bedrock.SessionInitializeEvent; import org.geysermc.geyser.session.GeyserSession; -import javax.annotation.Nonnull; import java.net.InetSocketAddress; public class GeyserServerInitializer extends BedrockServerInitializer { @@ -52,7 +52,7 @@ public DefaultEventLoopGroup getEventLoopGroup() { } @Override - public void initSession(@Nonnull BedrockServerSession bedrockServerSession) { + public void initSession(@NonNull BedrockServerSession bedrockServerSession) { try { if (this.geyser.getGeyserServer().getProxiedAddresses() != null) { InetSocketAddress address = this.geyser.getGeyserServer().getProxiedAddresses().get((InetSocketAddress) bedrockServerSession.getSocketAddress()); diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/ChannelWrapper.java b/core/src/main/java/org/geysermc/geyser/network/netty/ChannelWrapper.java index 26015a96f7e..a756c70ebf2 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/ChannelWrapper.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/ChannelWrapper.java @@ -29,6 +29,7 @@ import io.netty.channel.*; import io.netty.util.Attribute; import io.netty.util.AttributeKey; +import org.checkerframework.checker.nullness.qual.NonNull; import java.net.SocketAddress; @@ -259,7 +260,7 @@ public boolean hasAttr(AttributeKey attributeKey) { } @Override - public int compareTo(Channel o) { + public int compareTo(@NonNull Channel o) { return source.compareTo(o); } } diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/LocalChannelWrapper.java b/core/src/main/java/org/geysermc/geyser/network/netty/LocalChannelWrapper.java index 258fa69ebb0..53221274fd9 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/LocalChannelWrapper.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/LocalChannelWrapper.java @@ -30,25 +30,20 @@ import io.netty.channel.local.LocalServerChannel; import java.net.InetSocketAddress; +import java.util.Objects; public class LocalChannelWrapper extends LocalChannel { + private final ChannelWrapper wrapper; + /** * {@link #newChannelPipeline()} is called during super, so this exists until the wrapper can be initialized. */ private volatile ChannelWrapper tempWrapper; - public LocalChannelWrapper() { - wrapper = new ChannelWrapper(this); - } - public LocalChannelWrapper(LocalServerChannel parent, LocalChannel peer) { super(parent, peer); - if (tempWrapper == null) { - this.wrapper = new ChannelWrapper(this); - } else { - this.wrapper = tempWrapper; - } + this.wrapper = Objects.requireNonNullElseGet(tempWrapper, () -> new ChannelWrapper(this)); wrapper.remoteAddress(new InetSocketAddress(0)); } diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java b/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java index 551bc1deb38..a2951116f6c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/LocalSession.java @@ -37,6 +37,7 @@ import io.netty.channel.*; import io.netty.channel.unix.PreferredDirectByteBufAllocator; import io.netty.handler.codec.haproxy.*; +import org.checkerframework.checker.nullness.qual.NonNull; import java.net.Inet4Address; import java.net.InetSocketAddress; @@ -75,7 +76,7 @@ public void connect(boolean wait) { bootstrap.channel(LocalChannelWithRemoteAddress.class); bootstrap.handler(new ChannelInitializer() { @Override - public void initChannel(LocalChannelWithRemoteAddress channel) { + public void initChannel(@NonNull LocalChannelWithRemoteAddress channel) { channel.spoofedRemoteAddress(new InetSocketAddress(clientIp, 0)); PacketProtocol protocol = getPacketProtocol(); protocol.newClientSession(LocalSession.this); @@ -119,7 +120,7 @@ private void addHAProxySupport(ChannelPipeline pipeline) { if (getFlag(BuiltinFlags.ENABLE_CLIENT_PROXY_PROTOCOL, false) && clientAddress != null) { pipeline.addFirst("proxy-protocol-packet-sender", new ChannelInboundHandlerAdapter() { @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { + public void channelActive(@NonNull ChannelHandlerContext ctx) throws Exception { HAProxyProxiedProtocol proxiedProtocol = clientAddress.getAddress() instanceof Inet4Address ? HAProxyProxiedProtocol.TCP4 : HAProxyProxiedProtocol.TCP6; InetSocketAddress remoteAddress; if (ctx.channel().remoteAddress() instanceof InetSocketAddress) { diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/handler/RakConnectionRequestHandler.java b/core/src/main/java/org/geysermc/geyser/network/netty/handler/RakConnectionRequestHandler.java index 8c041224016..26bda9f2b28 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/handler/RakConnectionRequestHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/handler/RakConnectionRequestHandler.java @@ -49,7 +49,7 @@ public class RakConnectionRequestHandler extends ChannelInboundHandlerAdapter { private final GeyserServer server; @Override - public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) throws Exception { + public void channelRead(@NonNull ChannelHandlerContext ctx, @NonNull Object msg) { if (!(msg instanceof DatagramPacket packet)) { ctx.fireChannelRead(msg); return; diff --git a/core/src/main/java/org/geysermc/geyser/network/netty/proxy/ProxyProtocolDecoder.java b/core/src/main/java/org/geysermc/geyser/network/netty/proxy/ProxyProtocolDecoder.java index b14006336e5..67fb3ecdd6f 100644 --- a/core/src/main/java/org/geysermc/geyser/network/netty/proxy/ProxyProtocolDecoder.java +++ b/core/src/main/java/org/geysermc/geyser/network/netty/proxy/ProxyProtocolDecoder.java @@ -30,6 +30,7 @@ import io.netty.handler.codec.haproxy.*; import io.netty.util.ByteProcessor; import io.netty.util.CharsetUtil; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Objects; @@ -75,7 +76,7 @@ public final class ProxyProtocolDecoder { /** * Protocol specification version */ - private int decodingVersion = -1; + private final int decodingVersion; /** * The latest v2 spec (2014/05/18) allows for additional data to be sent in the proxy protocol header beyond the @@ -87,7 +88,7 @@ private ProxyProtocolDecoder(int version) { this.decodingVersion = version; } - public static HAProxyMessage decode(ByteBuf packet, int version) { + public static @Nullable HAProxyMessage decode(ByteBuf packet, int version) { if (version == -1) { return null; } @@ -95,7 +96,7 @@ public static HAProxyMessage decode(ByteBuf packet, int version) { return decoder.decodeHeader(packet); } - private HAProxyMessage decodeHeader(ByteBuf in) { + private @Nullable HAProxyMessage decodeHeader(ByteBuf in) { final ByteBuf decoded = decodingVersion == 1 ? decodeLine(in) : decodeStruct(in); if (decoded == null) { return null; @@ -233,8 +234,8 @@ static HAProxyMessage decodeHeader0(ByteBuf header) { dstPort = header.readUnsignedShort(); } + //noinspection StatementWithEmptyBody while (skipNextTLV(header)) { - } return new HAProxyMessage(ver, cmd, protAndFam, srcAddress, dstAddress, srcPort, dstPort); } @@ -479,7 +480,7 @@ protected HeaderExtractor(int maxHeaderSize) { * @return frame the {@link ByteBuf} which represent the frame or {@code null} if no frame could * be created */ - public ByteBuf extract(ByteBuf buffer) { + public @Nullable ByteBuf extract(ByteBuf buffer) { final int eoh = findEndOfHeader(buffer); if (!discarding) { if (eoh >= 0) { diff --git a/core/src/main/java/org/geysermc/geyser/pack/GeyserResourcePackManifest.java b/core/src/main/java/org/geysermc/geyser/pack/GeyserResourcePackManifest.java index ddcee6ad5e4..25a0f0ee044 100644 --- a/core/src/main/java/org/geysermc/geyser/pack/GeyserResourcePackManifest.java +++ b/core/src/main/java/org/geysermc/geyser/pack/GeyserResourcePackManifest.java @@ -30,8 +30,8 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.api.pack.ResourcePackManifest; -import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.util.Collection; @@ -49,7 +49,7 @@ public record Dependency(UUID uuid, Version version) implements ResourcePackMani public record Version(int major, int minor, int patch) implements ResourcePackManifest.Version { @Override - public @NotNull String toString() { + public @NonNull String toString() { return major + "." + minor + "." + patch; } diff --git a/core/src/main/java/org/geysermc/geyser/pack/SkullResourcePackManager.java b/core/src/main/java/org/geysermc/geyser/pack/SkullResourcePackManager.java index f59ae8026f7..e7a9f4f1e05 100644 --- a/core/src/main/java/org/geysermc/geyser/pack/SkullResourcePackManager.java +++ b/core/src/main/java/org/geysermc/geyser/pack/SkullResourcePackManager.java @@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.pack.ResourcePackManifest; @@ -63,7 +64,7 @@ public class SkullResourcePackManager { public static final Map SKULL_SKINS = new Object2ObjectOpenHashMap<>(); @SuppressWarnings("ResultOfMethodCallIgnored") - public static Path createResourcePack() { + public static @Nullable Path createResourcePack() { Path cachePath = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("cache"); try { Files.createDirectories(cachePath); @@ -165,7 +166,7 @@ public static void cleanSkullSkinCache() { } private static void addBaseResources(ZipOutputStream zipOS) throws IOException { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(GeyserImpl.getInstance().getBootstrap().getResource("bedrock/skull_resource_pack_files.txt")))) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("bedrock/skull_resource_pack_files.txt")))) { List lines = reader.lines().toList(); for (String path : lines) { ZipEntry entry = new ZipEntry(path); diff --git a/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java b/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java index e3c72c1749b..64ad2c445fa 100644 --- a/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java +++ b/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java @@ -27,6 +27,7 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.util.VarInts; import io.netty.handler.codec.haproxy.HAProxyCommand; import io.netty.handler.codec.haproxy.HAProxyProxiedProtocol; @@ -57,7 +58,7 @@ public GeyserLegacyPingPassthrough(GeyserImpl geyser) { * @param geyser Geyser * @return GeyserPingPassthrough, or null if not initialized */ - public static IGeyserPingPassthrough init(GeyserImpl geyser) { + public static @Nullable IGeyserPingPassthrough init(GeyserImpl geyser) { if (geyser.getConfig().isPassthroughMotd() || geyser.getConfig().isPassthroughPlayerCounts()) { GeyserLegacyPingPassthrough pingPassthrough = new GeyserLegacyPingPassthrough(geyser); // Ensure delay is not zero diff --git a/core/src/main/java/org/geysermc/geyser/ping/IGeyserPingPassthrough.java b/core/src/main/java/org/geysermc/geyser/ping/IGeyserPingPassthrough.java index b6095cce2de..318035e32ff 100644 --- a/core/src/main/java/org/geysermc/geyser/ping/IGeyserPingPassthrough.java +++ b/core/src/main/java/org/geysermc/geyser/ping/IGeyserPingPassthrough.java @@ -25,7 +25,7 @@ package org.geysermc.geyser.ping; -import javax.annotation.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable; import java.net.InetSocketAddress; /** diff --git a/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java index fc4e3d02241..aea7d539e22 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/AbstractMappedRegistry.java @@ -25,9 +25,9 @@ package org.geysermc.geyser.registry; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.registry.loader.RegistryLoader; -import javax.annotation.Nullable; import java.util.Map; import java.util.Optional; import java.util.function.Function; diff --git a/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java index 124aea713ac..3df3ded58c5 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/ArrayRegistry.java @@ -25,9 +25,9 @@ package org.geysermc.geyser.registry; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.registry.loader.RegistryLoader; -import javax.annotation.Nullable; import java.util.function.Supplier; /** diff --git a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java index 49fd90cf720..aa9d6fc36fd 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java @@ -33,7 +33,6 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.geysermc.geyser.api.block.custom.CustomBlockData; import org.geysermc.geyser.api.block.custom.CustomBlockState; -import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockItem; import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockState; import org.geysermc.geyser.registry.loader.CollisionRegistryLoader; import org.geysermc.geyser.registry.loader.RegistryLoaders; diff --git a/core/src/main/java/org/geysermc/geyser/registry/IntMappedRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/IntMappedRegistry.java index 892f4a6dfe4..981ed0f8c30 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/IntMappedRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/IntMappedRegistry.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.registry; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.registry.loader.RegistryLoader; -import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; diff --git a/core/src/main/java/org/geysermc/geyser/registry/Registry.java b/core/src/main/java/org/geysermc/geyser/registry/Registry.java index f6be19af246..8836502b37b 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/Registry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/Registry.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.registry; -import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.registry.loader.RegistryLoader; import java.util.function.Consumer; diff --git a/core/src/main/java/org/geysermc/geyser/registry/VersionedRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/VersionedRegistry.java index cfed73d2476..ec7665ff068 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/VersionedRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/VersionedRegistry.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.registry; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.registry.loader.RegistryLoader; import java.util.Map; @@ -53,7 +54,9 @@ protected VersionedRegistry(I input, RegistryLoader> reg * * @param version the version * @return the closest value for the specified version + * @throws IllegalArgumentException if no values exist at or above the given version */ + @NonNull public V forVersion(int version) { Int2ObjectMap.Entry current = null; for (Int2ObjectMap.Entry entry : this.mappings.int2ObjectEntrySet()) { @@ -69,7 +72,10 @@ public V forVersion(int version) { current = entry; } } - return current == null ? null : current.getValue(); + if (current == null) { + throw new IllegalArgumentException("No appropriate value for version: " + version); + } + return current.getValue(); } /** diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/AnnotatedRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/AnnotatedRegistryLoader.java index fdb1bde1115..da3ea7a3553 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/AnnotatedRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/AnnotatedRegistryLoader.java @@ -62,6 +62,7 @@ public AnnotatedRegistryLoader(Class annotation, Function mapper) { this.mapper = mapper; } + @SuppressWarnings("unchecked") @Override public Map load(String input) { Map entries = new Object2ObjectOpenHashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/BiomeIdentifierRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/BiomeIdentifierRegistryLoader.java index f7fb708fb30..3205004e438 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/BiomeIdentifierRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/BiomeIdentifierRegistryLoader.java @@ -47,7 +47,7 @@ public Object2IntMap load(String input) { TypeReference> biomeEntriesType = new TypeReference<>() { }; Map biomeEntries; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource("mappings/biomes.json")) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("mappings/biomes.json")) { biomeEntries = GeyserImpl.JSON_MAPPER.readValue(stream, biomeEntriesType); } catch (IOException e) { throw new AssertionError("Unable to load Bedrock runtime biomes", e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java index bf2d72b27b8..95e8bd2c107 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java @@ -32,6 +32,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.AllArgsConstructor; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.registry.BlockRegistries; @@ -66,7 +67,7 @@ public Int2ObjectMap load(Pair input) { // Load collision mappings file List collisionList; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource(input.value())) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(input.value())) { ArrayNode collisionNode = (ArrayNode) GeyserImpl.JSON_MAPPER.readTree(stream); collisionList = loadBoundingBoxes(collisionNode); } catch (Exception e) { @@ -101,7 +102,7 @@ public Int2ObjectMap load(Pair input) { return collisions; } - private BlockCollision instantiateCollision(BlockMapping mapping, Map, CollisionInfo> annotationMap, List collisionList) { + private @Nullable BlockCollision instantiateCollision(BlockMapping mapping, Map, CollisionInfo> annotationMap, List collisionList) { String[] blockIdParts = mapping.getJavaIdentifier().split("\\["); String blockName = blockIdParts[0].replace("minecraft:", ""); String params = ""; diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/EffectRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/EffectRegistryLoader.java index 9e1bbc6aa2f..aa95c1d563c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/EffectRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/EffectRegistryLoader.java @@ -43,7 +43,7 @@ public abstract class EffectRegistryLoader implements RegistryLoader load(String input) { JsonNode enchantmentsNode; - try (InputStream enchantmentsStream = GeyserImpl.getInstance().getBootstrap().getResource(input)) { + try (InputStream enchantmentsStream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(input)) { enchantmentsNode = GeyserImpl.JSON_MAPPER.readTree(enchantmentsStream); } catch (Exception e) { throw new AssertionError("Unable to load enchantment data", e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/NbtRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/NbtRegistryLoader.java index fcdbfcab377..c1f0d4fee18 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/NbtRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/NbtRegistryLoader.java @@ -37,7 +37,7 @@ public class NbtRegistryLoader implements RegistryLoader { @Override public NbtMap load(String input) { - try (NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(GeyserImpl.getInstance().getBootstrap().getResource(input), true, true)) { + try (NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(input), true, true)) { return (NbtMap) nbtInputStream.readTag(); } catch (Exception e) { throw new AssertionError("Failed to load registrations for " + input, e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java index 7d50613823d..0eec7cdb623 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java @@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.PotionMixData; import org.geysermc.geyser.inventory.item.Potion; import org.geysermc.geyser.item.Items; @@ -44,7 +45,7 @@ * Generates a collection of {@link PotionMixData} that enables the * Bedrock client to place brewing items into the brewing stand. * (Does not contain actual potion mixes.) - * + *

* Designed to replicate Java Edition behavior. * (Ex: Bedrock cannot normally place glass bottles or fully upgraded * potions into the brewing stand, but Java can.) diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundRegistryLoader.java index 6703726eade..318cc08d704 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/SoundRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/SoundRegistryLoader.java @@ -43,7 +43,7 @@ public class SoundRegistryLoader implements RegistryLoader load(String input) { JsonNode soundsTree; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource(input)) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(input)) { soundsTree = GeyserImpl.JSON_MAPPER.readTree(stream); } catch (IOException e) { throw new AssertionError("Unable to load sound mappings", e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/mappings/MappingsConfigReader.java b/core/src/main/java/org/geysermc/geyser/registry/mappings/MappingsConfigReader.java index 039412957f2..d09e0b5a1e1 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/mappings/MappingsConfigReader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/mappings/MappingsConfigReader.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.JsonNode; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.registry.mappings.util.CustomBlockMapping; @@ -57,6 +58,8 @@ public Path[] getCustomMappingsFiles() { } } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public boolean ensureMappingsDirectory(Path mappingsDirectory) { if (!Files.exists(mappingsDirectory)) { try { @@ -92,7 +95,7 @@ public void loadBlockMappingsFromJson(BiConsumer con } } - public JsonNode getMappingsRoot(Path file) { + public @Nullable JsonNode getMappingsRoot(Path file) { JsonNode mappingsRoot; try { mappingsRoot = GeyserImpl.JSON_MAPPER.readTree(file.toFile()); @@ -121,9 +124,13 @@ public int getFormatVersion(JsonNode mappingsRoot, Path file) { public void readItemMappingsFromJson(Path file, BiConsumer consumer) { JsonNode mappingsRoot = getMappingsRoot(file); + if (mappingsRoot == null) { + return; + } + int formatVersion = getFormatVersion(mappingsRoot, file); - if (formatVersion < 0 || mappingsRoot == null) { + if (formatVersion < 0) { return; } @@ -133,9 +140,13 @@ public void readItemMappingsFromJson(Path file, BiConsumer consumer) { JsonNode mappingsRoot = getMappingsRoot(file); + if (mappingsRoot == null) { + return; + } + int formatVersion = getFormatVersion(mappingsRoot, file); - if (formatVersion < 0 || mappingsRoot == null) { + if (formatVersion < 0) { return; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/mappings/util/CustomBlockMapping.java b/core/src/main/java/org/geysermc/geyser/registry/mappings/util/CustomBlockMapping.java index 3dbb7908ee1..10108cc9c4b 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/mappings/util/CustomBlockMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/mappings/util/CustomBlockMapping.java @@ -25,11 +25,11 @@ package org.geysermc.geyser.registry.mappings.util; -import java.util.Map; - import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.api.block.custom.CustomBlockData; +import java.util.Map; + /** * This class is used to store a custom block mappings, which contain all of the * data required to register a custom block that overrides a group of java block @@ -38,7 +38,7 @@ * @param data The custom block data * @param states The custom block state mappings * @param javaIdentifier The java identifier of the block - * @param overrideItem Whether or not the custom block should override the java item + * @param overrideItem Whether the custom block should override the java item */ public record CustomBlockMapping(@NonNull CustomBlockData data, @NonNull Map states, @NonNull String javaIdentifier, boolean overrideItem) { } diff --git a/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader.java b/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader.java index e76df2834d8..b2bdd5a0130 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.registry.mappings.versions; import com.fasterxml.jackson.databind.JsonNode; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.api.item.custom.CustomRenderOffsets; import org.geysermc.geyser.item.exception.InvalidCustomMappingsFileException; @@ -41,7 +42,7 @@ public abstract class MappingsReader { public abstract CustomItemData readItemMappingEntry(JsonNode node) throws InvalidCustomMappingsFileException; public abstract CustomBlockMapping readBlockMappingEntry(String identifier, JsonNode node) throws InvalidCustomMappingsFileException; - protected CustomRenderOffsets fromJsonNode(JsonNode node) { + protected @Nullable CustomRenderOffsets fromJsonNode(JsonNode node) { if (node == null || !node.isObject()) { return null; } @@ -52,7 +53,7 @@ protected CustomRenderOffsets fromJsonNode(JsonNode node) { ); } - protected CustomRenderOffsets.Hand getHandOffsets(JsonNode node, String hand) { + protected CustomRenderOffsets.@Nullable Hand getHandOffsets(JsonNode node, String hand) { JsonNode tmpNode = node.get(hand); if (tmpNode == null || !tmpNode.isObject()) { return null; @@ -64,7 +65,7 @@ protected CustomRenderOffsets.Hand getHandOffsets(JsonNode node, String hand) { ); } - protected CustomRenderOffsets.Offset getPerspectiveOffsets(JsonNode node, String perspective) { + protected CustomRenderOffsets.@Nullable Offset getPerspectiveOffsets(JsonNode node, String perspective) { JsonNode tmpNode = node.get(perspective); if (tmpNode == null || !tmpNode.isObject()) { return null; @@ -77,7 +78,7 @@ protected CustomRenderOffsets.Offset getPerspectiveOffsets(JsonNode node, String ); } - protected CustomRenderOffsets.OffsetXYZ getOffsetXYZ(JsonNode node, String offsetType) { + protected CustomRenderOffsets.@Nullable OffsetXYZ getOffsetXYZ(JsonNode node, String offsetType) { JsonNode tmpNode = node.get(offsetType); if (tmpNode == null || !tmpNode.isObject()) { return null; diff --git a/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader_v1.java b/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader_v1.java index fb4a6acbeae..1a498c3fa4a 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader_v1.java +++ b/core/src/main/java/org/geysermc/geyser/registry/mappings/versions/MappingsReader_v1.java @@ -30,6 +30,7 @@ import com.github.steveice10.mc.protocol.data.game.Identifier; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.block.custom.CustomBlockData; import org.geysermc.geyser.api.block.custom.CustomBlockPermutation; @@ -405,7 +406,9 @@ private CustomBlockComponentsMapping createCustomBlockComponentsMapping(JsonNode if (boneVisibility.isObject()) { Map boneVisibilityMap = new Object2ObjectOpenHashMap<>(); boneVisibility.fields().forEachRemaining(entry -> { - boneVisibilityMap.put(entry.getKey(), entry.getValue().isBoolean() ? (entry.getValue().asBoolean() ? "1" : "0") : entry.getValue().asText()); + String key = entry.getKey(); + String value = entry.getValue().isBoolean() ? (entry.getValue().asBoolean() ? "1" : "0") : entry.getValue().asText(); + boneVisibilityMap.put(key, value); }); geometryBuilder.boneVisibility(boneVisibilityMap); } @@ -483,7 +486,7 @@ private CustomBlockComponentsMapping createCustomBlockComponentsMapping(JsonNode String key = entry.getKey(); JsonNode value = entry.getValue(); if (value.isObject()) { - MaterialInstance materialInstance = createMaterialInstanceComponent(value, name); + MaterialInstance materialInstance = createMaterialInstanceComponent(value); builder.materialInstance(key, materialInstance); } }); @@ -583,7 +586,7 @@ private BoxComponent createBoxComponent(int javaId) { * @param javaId the block's Java ID * @return the {@link BoxComponent} or null if the block's collision box would not exceed 16 y units */ - private BoxComponent createExtendedBoxComponent(int javaId) { + private @Nullable BoxComponent createExtendedBoxComponent(int javaId) { BlockCollision blockCollision = BlockUtils.getCollision(javaId); if (blockCollision == null) { return null; @@ -603,7 +606,7 @@ private BoxComponent createExtendedBoxComponent(int javaId) { * @param node the JSON node * @return the {@link BoxComponent} */ - private BoxComponent createBoxComponent(JsonNode node) { + private @Nullable BoxComponent createBoxComponent(JsonNode node) { if (node != null && node.isObject()) { if (node.has("origin") && node.has("size")) { JsonNode origin = node.get("origin"); @@ -627,10 +630,9 @@ private BoxComponent createBoxComponent(JsonNode node) { * The name is used as a fallback if no texture is provided by the node * * @param node the material instance node - * @param name the custom block name * @return the {@link MaterialInstance} */ - private MaterialInstance createMaterialInstanceComponent(JsonNode node, String name) { + private MaterialInstance createMaterialInstanceComponent(JsonNode node) { // Set default values, and use what the user provides if they have provided something String texture = null; if (node.has("texture")) { diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index e3f4e685d2c..328f61500cc 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -79,7 +79,7 @@ public enum Stage { PRE_INIT, INIT_JAVA, INIT_BEDROCK, - POST_INIT; + POST_INIT } @FunctionalInterface @@ -103,10 +103,10 @@ static Remapper of(BlockStateUpdater... updaters) { public static void populate(Stage stage) { switch (stage) { - case PRE_INIT, POST_INIT -> { nullifyBlocksNode(); } - case INIT_JAVA -> { registerJavaBlocks(); } - case INIT_BEDROCK -> { registerBedrockBlocks(); } - default -> { throw new IllegalArgumentException("Unknown stage: " + stage); } + case PRE_INIT, POST_INIT -> nullifyBlocksNode(); + case INIT_JAVA -> registerJavaBlocks(); + case INIT_BEDROCK -> registerBedrockBlocks(); + default -> throw new IllegalArgumentException("Unknown stage: " + stage); } } @@ -137,14 +137,15 @@ private static void registerBedrockBlocks() { // We can keep this strong as nothing should be garbage collected // Safe to intern since Cloudburst NBT is immutable + //noinspection UnstableApiUsage Interner statesInterner = Interners.newStrongInterner(); for (ObjectIntPair palette : blockMappers.keySet()) { int protocolVersion = palette.valueInt(); List vanillaBlockStates; List blockStates; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource(String.format("bedrock/block_palette.%s.nbt", palette.key())); - NBTInputStream nbtInputStream = new NBTInputStream(new DataInputStream(new GZIPInputStream(stream)), true, true)) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(String.format("bedrock/block_palette.%s.nbt", palette.key())); + NBTInputStream nbtInputStream = new NBTInputStream(new DataInputStream(new GZIPInputStream(stream)), true, true)) { NbtMap blockPalette = (NbtMap) nbtInputStream.readTag(); vanillaBlockStates = new ArrayList<>(blockPalette.getList("blocks", NbtType.COMPOUND)); @@ -153,6 +154,7 @@ private static void registerBedrockBlocks() { builder.remove("version"); // Remove all nbt tags which are not needed for differentiating states builder.remove("name_hash"); // Quick workaround - was added in 1.19.20 builder.remove("network_id"); // Added in 1.19.80 - ???? + //noinspection UnstableApiUsage builder.putCompound("states", statesInterner.intern((NbtMap) builder.remove("states"))); vanillaBlockStates.set(i, builder.build()); } @@ -323,7 +325,7 @@ private static void registerBedrockBlocks() { builder.bedrockMovingBlock(movingBlockDefinition); Map nonVanillaStateOverrides = BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get(); - if (nonVanillaStateOverrides.size() > 0) { + if (!nonVanillaStateOverrides.isEmpty()) { // First ensure all non vanilla runtime IDs at minimum are air in case they aren't consecutive Arrays.fill(javaToVanillaBedrockBlocks, MIN_CUSTOM_RUNTIME_ID, javaToVanillaBedrockBlocks.length, airDefinition); Arrays.fill(javaToBedrockBlocks, MIN_CUSTOM_RUNTIME_ID, javaToBedrockBlocks.length, airDefinition); @@ -374,7 +376,7 @@ private static void registerBedrockBlocks() { private static void registerJavaBlocks() { JsonNode blocksJson; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource("mappings/blocks.json")) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("mappings/blocks.json")) { blocksJson = GeyserImpl.JSON_MAPPER.readTree(stream); } catch (Exception e) { throw new AssertionError("Unable to load Java block mappings", e); @@ -382,9 +384,9 @@ private static void registerJavaBlocks() { JAVA_BLOCKS_SIZE = blocksJson.size(); - if (BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().size() > 0) { - MIN_CUSTOM_RUNTIME_ID = BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().keySet().stream().min(Comparator.comparing(JavaBlockState::javaId)).get().javaId(); - int maxCustomRuntimeID = BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().keySet().stream().max(Comparator.comparing(JavaBlockState::javaId)).get().javaId(); + if (!BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().isEmpty()) { + MIN_CUSTOM_RUNTIME_ID = BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().keySet().stream().min(Comparator.comparing(JavaBlockState::javaId)).orElseThrow().javaId(); + int maxCustomRuntimeID = BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().keySet().stream().max(Comparator.comparing(JavaBlockState::javaId)).orElseThrow().javaId(); if (MIN_CUSTOM_RUNTIME_ID < blocksJson.size()) { throw new RuntimeException("Non vanilla custom block state overrides runtime ID must start after the last vanilla block state (" + JAVA_BLOCKS_SIZE + ")"); @@ -531,7 +533,7 @@ private static void registerJavaBlocks() { } BlockStateValues.JAVA_WATER_ID = waterRuntimeId; - if (BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().size() > 0) { + if (!BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().isEmpty()) { Set usedNonVanillaRuntimeIDs = new HashSet<>(); for (JavaBlockState javaBlockState : BlockRegistries.NON_VANILLA_BLOCK_STATE_OVERRIDES.get().keySet()) { @@ -543,6 +545,7 @@ private static void registerJavaBlocks() { String javaId = javaBlockState.identifier(); int stateRuntimeId = javaBlockState.javaId(); + String pistonBehavior = javaBlockState.pistonBehavior(); BlockMapping blockMapping = BlockMapping.builder() .canBreakWithHand(javaBlockState.canBreakWithHand()) .pickItem(javaBlockState.pickItem()) @@ -550,7 +553,7 @@ private static void registerJavaBlocks() { .javaIdentifier(javaId) .javaBlockId(javaBlockState.stateGroupId()) .hardness(javaBlockState.blockHardness()) - .pistonBehavior(javaBlockState.pistonBehavior() == null ? PistonBehavior.NORMAL : PistonBehavior.getByName(javaBlockState.pistonBehavior())) + .pistonBehavior(pistonBehavior == null ? PistonBehavior.NORMAL : PistonBehavior.getByName(pistonBehavior)) .isBlockEntity(javaBlockState.hasBlockEntity()) .build(); @@ -576,7 +579,7 @@ private static void registerJavaBlocks() { BLOCKS_JSON = blocksJson; JsonNode blockInteractionsJson; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource("mappings/interactions.json")) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("mappings/interactions.json")) { blockInteractionsJson = GeyserImpl.JSON_MAPPER.readTree(stream); } catch (Exception e) { throw new AssertionError("Unable to load Java block interaction mappings", e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java index 6944bbcc3e1..d27a2ed499c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.registry.populator; import com.fasterxml.jackson.databind.JsonNode; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtUtils; @@ -61,7 +62,7 @@ static void populate(ItemRegistryPopulator.PaletteVersion palette, Map definitions) { + private static ItemData.@Nullable Builder createItemData(JsonNode itemNode, BlockMappings blockMappings, Map definitions) { int count = 1; int damage = 0; - int bedrockBlockRuntimeId = -1; + int bedrockBlockRuntimeId; NbtMap tag = null; String identifier = itemNode.get("id").textValue(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java index e4bf43b9342..e4f45ac859e 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java @@ -48,7 +48,7 @@ public enum Stage { DEFINITION, VANILLA_REGISTRATION, NON_VANILLA_REGISTRATION, - CUSTOM_REGISTRATION; + CUSTOM_REGISTRATION } /** @@ -62,11 +62,11 @@ public static void populate(Stage stage) { } switch (stage) { - case DEFINITION -> { populateBedrock(); } - case VANILLA_REGISTRATION -> { populateVanilla(); } - case NON_VANILLA_REGISTRATION -> { populateNonVanilla(); } - case CUSTOM_REGISTRATION -> { registration(); } - default -> { throw new IllegalArgumentException("Unknown stage: " + stage); } + case DEFINITION -> populateBedrock(); + case VANILLA_REGISTRATION -> populateVanilla(); + case NON_VANILLA_REGISTRATION -> populateNonVanilla(); + case CUSTOM_REGISTRATION -> registration(); + default -> throw new IllegalArgumentException("Unknown stage: " + stage); } } @@ -479,7 +479,7 @@ private static List convertPlacementFilter(List pla } private static CustomBlockData createExtendedCollisionBlock(BoxComponent boxComponent, int extendedCollisionBlock) { - CustomBlockData customBlockData = new CustomBlockDataBuilder() + return new CustomBlockDataBuilder() .name("extended_collision_" + extendedCollisionBlock) .components( new CustomBlockComponentsBuilder() @@ -497,6 +497,5 @@ private static CustomBlockData createExtendedCollisionBlock(BoxComponent boxComp .build()) .build()) .build(); - return customBlockData; } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java index 638e41a5edd..6be1aac4c67 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java @@ -27,6 +27,7 @@ import com.google.common.collect.Multimap; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; @@ -48,7 +49,6 @@ import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.NonVanillaItemRegistration; -import javax.annotation.Nullable; import java.util.*; public class CustomItemRegistryPopulator { @@ -171,7 +171,7 @@ private static NbtMapBuilder createComponentNbt(CustomItemData customItemData, I boolean canDestroyInCreative = true; if (mapping.getToolType() != null) { // This is not using the isTool boolean because it is not just a render type here. - canDestroyInCreative = computeToolProperties(mapping.getToolTier(), mapping.getToolType(), itemProperties, componentBuilder); + canDestroyInCreative = computeToolProperties(mapping.getToolType(), itemProperties, componentBuilder); } itemProperties.putBoolean("can_destroy_in_creative", canDestroyInCreative); @@ -192,18 +192,11 @@ private static NbtMapBuilder createComponentNbt(CustomItemData customItemData, I } switch (mapping.getBedrockIdentifier()) { - case "minecraft:fire_charge", "minecraft:flint_and_steel" -> { - computeBlockItemProperties("minecraft:fire", componentBuilder); - } - case "minecraft:bow", "minecraft:crossbow", "minecraft:trident" -> { - computeChargeableProperties(itemProperties, componentBuilder); - } - case "minecraft:honey_bottle", "minecraft:milk_bucket", "minecraft:potion" -> { - computeConsumableProperties(itemProperties, componentBuilder, 2, true); - } - case "minecraft:experience_bottle", "minecraft:egg", "minecraft:ender_pearl", "minecraft:ender_eye", "minecraft:lingering_potion", "minecraft:snowball", "minecraft:splash_potion" -> { - computeThrowableProperties(componentBuilder); - } + case "minecraft:fire_charge", "minecraft:flint_and_steel" -> computeBlockItemProperties("minecraft:fire", componentBuilder); + case "minecraft:bow", "minecraft:crossbow", "minecraft:trident" -> computeChargeableProperties(itemProperties, componentBuilder); + case "minecraft:honey_bottle", "minecraft:milk_bucket", "minecraft:potion" -> computeConsumableProperties(itemProperties, componentBuilder, 2, true); + case "minecraft:experience_bottle", "minecraft:egg", "minecraft:ender_pearl", "minecraft:ender_eye", "minecraft:lingering_potion", "minecraft:snowball", "minecraft:splash_potion" -> + computeThrowableProperties(componentBuilder); } computeRenderOffsets(false, customItemData, componentBuilder); @@ -214,6 +207,7 @@ private static NbtMapBuilder createComponentNbt(CustomItemData customItemData, I return builder; } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private static NbtMapBuilder createComponentNbt(NonVanillaCustomItemData customItemData, String customItemName, int customItemId, OptionalInt creativeCategory, String creativeGroup, boolean isHat, boolean displayHandheld) { @@ -228,7 +222,7 @@ private static NbtMapBuilder createComponentNbt(NonVanillaCustomItemData customI boolean canDestroyInCreative = true; if (customItemData.toolType() != null) { // This is not using the isTool boolean because it is not just a render type here. - canDestroyInCreative = computeToolProperties(customItemData.toolTier(), customItemData.toolType(), itemProperties, componentBuilder); + canDestroyInCreative = computeToolProperties(customItemData.toolType(), itemProperties, componentBuilder); } itemProperties.putBoolean("can_destroy_in_creative", canDestroyInCreative); @@ -300,7 +294,7 @@ private static void setupBasicItemInfo(int maxDamage, int stackSize, boolean dis /** * @return can destroy in creative */ - private static boolean computeToolProperties(String toolTier, String toolType, NbtMapBuilder itemProperties, NbtMapBuilder componentBuilder) { + private static boolean computeToolProperties(String toolType, NbtMapBuilder itemProperties, NbtMapBuilder componentBuilder) { boolean canDestroyInCreative = true; float miningSpeed = 1.0f; @@ -467,7 +461,7 @@ private static NbtMap toNbtMap(CustomRenderOffsets renderOffsets) { return builder.build(); } - private static NbtMap toNbtMap(CustomRenderOffsets.Hand hand) { + private static @Nullable NbtMap toNbtMap(CustomRenderOffsets.Hand hand) { NbtMap firstPerson = toNbtMap(hand.firstPerson()); NbtMap thirdPerson = toNbtMap(hand.thirdPerson()); @@ -486,7 +480,7 @@ private static NbtMap toNbtMap(CustomRenderOffsets.Hand hand) { return builder.build(); } - private static NbtMap toNbtMap(@Nullable CustomRenderOffsets.Offset offset) { + private static @Nullable NbtMap toNbtMap(CustomRenderOffsets.@Nullable Offset offset) { if (offset == null) { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomSkullRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomSkullRegistryPopulator.java index f66d215722d..02d9a75ec66 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomSkullRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomSkullRegistryPopulator.java @@ -27,7 +27,8 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.event.lifecycle.GeyserDefineCustomSkullsEvent; @@ -139,7 +140,7 @@ public void register(@NonNull String texture, @NonNull SkullTextureType type) { * @param profile the base64 encoded profile * @return the skin hash or null if the profile is invalid */ - private static String getSkinHash(String profile) { + private static @Nullable String getSkinHash(String profile) { try { SkinManager.GameProfileData profileData = SkinManager.GameProfileData.loadFromJson(profile); if (profileData == null) { @@ -159,7 +160,7 @@ private static String getSkinHash(String profile) { * @param username the player username * @return the base64 encoded profile or null if the request failed */ - private static String getProfileFromUsername(String username) { + private static @Nullable String getProfileFromUsername(String username) { try { return SkinProvider.requestTexturesFromUsername(username).get(); } catch (InterruptedException | ExecutionException e) { @@ -173,7 +174,7 @@ private static String getProfileFromUsername(String username) { * @param uuid the player UUID * @return the base64 encoded profile or null if the request failed */ - private static String getProfileFromUuid(String uuid) { + private static @Nullable String getProfileFromUuid(String uuid) { try { String uuidDigits = uuid.replace("-", ""); if (uuidDigits.length() != 32) { diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index fe6e21e6f12..f46a49c3a19 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -139,7 +139,7 @@ public static void populate() { TypeReference> mappingItemsType = new TypeReference<>() { }; Map items; - try (InputStream stream = bootstrap.getResource("mappings/items.json")) { + try (InputStream stream = bootstrap.getResourceOrThrow("mappings/items.json")) { // Load item mappings from Java Edition to Bedrock Edition items = GeyserImpl.JSON_MAPPER.readValue(stream, mappingItemsType); } catch (Exception e) { @@ -166,7 +166,7 @@ public static void populate() { TypeReference> paletteEntriesType = new TypeReference<>() {}; List itemEntries; - try (InputStream stream = bootstrap.getResource(String.format("bedrock/runtime_item_states.%s.json", palette.version()))) { + try (InputStream stream = bootstrap.getResourceOrThrow(String.format("bedrock/runtime_item_states.%s.json", palette.version()))) { itemEntries = GeyserImpl.JSON_MAPPER.readValue(stream, paletteEntriesType); } catch (Exception e) { throw new AssertionError("Unable to load Bedrock runtime item IDs", e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/RecipeRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/RecipeRegistryPopulator.java index 3e9e2c257ec..f8929c90002 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/RecipeRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/RecipeRegistryPopulator.java @@ -64,7 +64,7 @@ public class RecipeRegistryPopulator { public static void populate() { JsonNode items; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResource("mappings/recipes.json")) { + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("mappings/recipes.json")) { items = GeyserImpl.JSON_MAPPER.readTree(stream); } catch (Exception e) { throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.toolbox.fail.runtime_java"), e); diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java index 9745a8859f8..0196ac22fa0 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMapping.java @@ -27,16 +27,15 @@ import lombok.Builder; import lombok.Value; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.level.physics.PistonBehavior; import org.geysermc.geyser.util.BlockUtils; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - @Builder @Value public class BlockMapping { - public static BlockMapping DEFAULT = BlockMapping.builder().javaIdentifier("minecraft:air").pistonBehavior(PistonBehavior.NORMAL).build();; + public static BlockMapping DEFAULT = BlockMapping.builder().javaIdentifier("minecraft:air").pistonBehavior(PistonBehavior.NORMAL).build(); String javaIdentifier; /** @@ -53,8 +52,7 @@ public class BlockMapping { int collisionIndex; @Nullable String pickItem; - @Nonnull - PistonBehavior pistonBehavior; + @NonNull PistonBehavior pistonBehavior; boolean isBlockEntity; boolean isNonVanilla; diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java index 3d06cecac10..8c0414a6d48 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java @@ -29,6 +29,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import lombok.Builder; import lombok.Value; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; @@ -96,14 +97,14 @@ public boolean isItemFrame(BlockDefinition definition) { } @Override - public GeyserBedrockBlock getDefinition(int bedrockId) { + public @Nullable GeyserBedrockBlock getDefinition(int bedrockId) { if (bedrockId < 0 || bedrockId >= this.bedrockRuntimeMap.length) { return null; } return bedrockRuntimeMap[bedrockId]; } - public GeyserBedrockBlock getDefinition(NbtMap tag) { + public @Nullable GeyserBedrockBlock getDefinition(NbtMap tag) { if (tag == null) { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java b/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java index f8aeb78ee76..4108fba1f21 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/ParticleMapping.java @@ -25,10 +25,8 @@ package org.geysermc.geyser.registry.type; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.LevelEventType; -import javax.annotation.ParametersAreNullableByDefault; - -@ParametersAreNullableByDefault -public record ParticleMapping(LevelEventType levelEventType, String identifier) { +public record ParticleMapping(@Nullable LevelEventType levelEventType, @Nullable String identifier) { } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/scoreboard/Objective.java b/core/src/main/java/org/geysermc/geyser/scoreboard/Objective.java index 688666c7316..fd9e0fbf3de 100644 --- a/core/src/main/java/org/geysermc/geyser/scoreboard/Objective.java +++ b/core/src/main/java/org/geysermc/geyser/scoreboard/Objective.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.data.game.scoreboard.TeamColor; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -150,7 +151,7 @@ public void pendingRemove() { updateType = UpdateType.REMOVE; } - public TeamColor getTeamColor() { + public @Nullable TeamColor getTeamColor() { return switch (displaySlot) { case SIDEBAR_TEAM_RED -> TeamColor.RED; case SIDEBAR_TEAM_AQUA -> TeamColor.AQUA; diff --git a/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java b/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java index c49e8afc408..1e0ea5eb18d 100644 --- a/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java +++ b/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java @@ -26,13 +26,14 @@ package org.geysermc.geyser.scoreboard; import com.github.steveice10.mc.protocol.data.game.scoreboard.ScoreboardPosition; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.ScoreInfo; import org.cloudburstmc.protocol.bedrock.data.command.CommandEnumConstraint; import org.cloudburstmc.protocol.bedrock.packet.RemoveObjectivePacket; import org.cloudburstmc.protocol.bedrock.packet.SetDisplayObjectivePacket; import org.cloudburstmc.protocol.bedrock.packet.SetScorePacket; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import lombok.Getter; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.entity.type.Entity; @@ -41,14 +42,16 @@ import org.geysermc.geyser.text.GeyserLocale; import org.jetbrains.annotations.Contract; -import javax.annotation.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.stream.Collectors; -import static org.geysermc.geyser.scoreboard.UpdateType.*; +import static org.geysermc.geyser.scoreboard.UpdateType.ADD; +import static org.geysermc.geyser.scoreboard.UpdateType.NOTHING; +import static org.geysermc.geyser.scoreboard.UpdateType.REMOVE; +import static org.geysermc.geyser.scoreboard.UpdateType.UPDATE; public final class Scoreboard { private static final boolean SHOW_SCOREBOARD_LOGS = Boolean.parseBoolean(System.getProperty("Geyser.ShowScoreboardLogs", "true")); @@ -89,7 +92,7 @@ public void removeScoreboard() { } } - public Objective registerNewObjective(String objectiveId) { + public @Nullable Objective registerNewObjective(String objectiveId) { Objective objective = objectives.get(objectiveId); if (objective != null) { // we have no other choice, or we have to make a new map? diff --git a/core/src/main/java/org/geysermc/geyser/scoreboard/ScoreboardUpdater.java b/core/src/main/java/org/geysermc/geyser/scoreboard/ScoreboardUpdater.java index fed3054b439..8c1ef5296b8 100644 --- a/core/src/main/java/org/geysermc/geyser/scoreboard/ScoreboardUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/scoreboard/ScoreboardUpdater.java @@ -173,6 +173,7 @@ private void sleepFor(long millis) { @Getter public static final class ScoreboardSession { private final GeyserSession session; + @SuppressWarnings("WriteOnlyObject") private final AtomicInteger pendingPacketsPerSecond = new AtomicInteger(0); private int packetsPerSecond; private long lastUpdate; diff --git a/core/src/main/java/org/geysermc/geyser/scoreboard/Team.java b/core/src/main/java/org/geysermc/geyser/scoreboard/Team.java index e985ca803cb..9164fec1d06 100644 --- a/core/src/main/java/org/geysermc/geyser/scoreboard/Team.java +++ b/core/src/main/java/org/geysermc/geyser/scoreboard/Team.java @@ -32,9 +32,9 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.HashSet; import java.util.Set; @@ -46,7 +46,7 @@ public final class Team { @Getter(AccessLevel.PACKAGE) private final Set entities; - @Nonnull private NameTagVisibility nameTagVisibility = NameTagVisibility.ALWAYS; + @NonNull private NameTagVisibility nameTagVisibility = NameTagVisibility.ALWAYS; @Setter private TeamColor color; private final TeamData currentData; diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 9bfb4e01ced..2f0d47b382c 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -147,7 +147,6 @@ import org.geysermc.geyser.util.DimensionUtils; import org.geysermc.geyser.util.EntityUtils; import org.geysermc.geyser.util.LoginEncryptionUtils; -import org.jetbrains.annotations.NotNull; import java.net.ConnectException; import java.net.InetSocketAddress; @@ -181,7 +180,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private List certChainData; - @NotNull + @NonNull @Setter private AbstractGeyserboundPacketHandler erosionHandler; @@ -336,7 +335,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { /** * Tracks the original speed attribute. - * + *

* We need to do this in order to emulate speeds when sneaking under 1.5-blocks-tall areas if the player isn't sneaking, * and when crawling. */ @@ -461,7 +460,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { /** * Store the last time the player interacted. Used to fix a right-click spam bug. - * See https://github.com/GeyserMC/Geyser/issues/503 for context. + * See this for context. */ @Setter private long lastInteractionTime; @@ -1318,7 +1317,7 @@ public void setFlying(boolean flying) { * * @return not null if attributes should be updated. */ - public AttributeData adjustSpeed() { + public @Nullable AttributeData adjustSpeed() { AttributeData currentPlayerSpeed = playerEntity.getAttributes().get(GeyserAttributeType.MOVEMENT_SPEED); if (currentPlayerSpeed != null) { if ((pose.equals(Pose.SNEAKING) && !sneaking && collisionManager.mustPlayerSneakHere()) || @@ -1370,7 +1369,7 @@ public void activateArmAnimationTicking() { } /** - * For https://github.com/GeyserMC/Geyser/issues/2113 and combating arm ticking activating being delayed in + * For issue 2113 and combating arm ticking activating being delayed in * BedrockAnimateTranslator. */ public void armSwingPending() { @@ -1405,7 +1404,7 @@ public String name() { } @Override - public void sendMessage(String message) { + public void sendMessage(@NonNull String message) { TextPacket textPacket = new TextPacket(); textPacket.setPlatformChatId(""); textPacket.setSourceName(""); @@ -1911,7 +1910,7 @@ public float getEyeHeight() { } @Override - public String bedrockUsername() { + public @NonNull String bedrockUsername() { return authData.name(); } @@ -1926,7 +1925,7 @@ public UUID javaUuid() { } @Override - public String xuid() { + public @NonNull String xuid() { return authData.xuid(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java b/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java index 93200dcb629..132de67cb9e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java +++ b/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java @@ -32,13 +32,13 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.Getter; -import lombok.NonNull; import lombok.Setter; import lombok.SneakyThrows; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; -import javax.annotation.Nonnull; +import java.io.Serial; import java.util.concurrent.*; /** @@ -63,12 +63,12 @@ public AuthenticationTask load(@NonNull String userKey) { }); } - public AuthenticationTask getTask(@Nonnull String userKey) { + public AuthenticationTask getTask(@NonNull String userKey) { return authentications.getIfPresent(userKey); } @SneakyThrows(ExecutionException.class) - public AuthenticationTask getOrCreateTask(@Nonnull String userKey) { + public AuthenticationTask getOrCreateTask(@NonNull String userKey) { return authentications.get(userKey); } @@ -189,6 +189,10 @@ private ProxyAuthenticationTask(String userKey, long timeoutMs) { * @see PendingMicrosoftAuthentication */ public static class TaskTimeoutException extends Exception { + + @Serial + private static final long serialVersionUID = 1L; + TaskTimeoutException() { super("It took too long to authorize Geyser to access your Microsoft account. " + "Please request new code and try again."); diff --git a/core/src/main/java/org/geysermc/geyser/session/SessionManager.java b/core/src/main/java/org/geysermc/geyser/session/SessionManager.java index 7e5982ab593..14881d0599b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/SessionManager.java +++ b/core/src/main/java/org/geysermc/geyser/session/SessionManager.java @@ -28,9 +28,10 @@ import com.google.common.collect.ImmutableList; import lombok.AccessLevel; import lombok.Getter; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.text.GeyserLocale; -import javax.annotation.Nonnull; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -69,7 +70,7 @@ public void removeSession(GeyserSession session) { } } - public GeyserSession sessionByXuid(@Nonnull String xuid) { + public @Nullable GeyserSession sessionByXuid(@NonNull String xuid) { Objects.requireNonNull(xuid); for (GeyserSession session : sessions.values()) { if (session.xuid().equals(xuid)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java index db032114795..3562f0d4d3b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java @@ -140,7 +140,7 @@ public void buildAndShowListForm() { session.sendDownstreamGamePacket(new ServerboundSeenAdvancementsPacket()); }).validResultHandler((response) -> { - if (response.getClickedButtonId() < visibleAdvancements.size()) { + if (response.clickedButtonId() < visibleAdvancements.size()) { GeyserAdvancement advancement = visibleAdvancements.get(response.clickedButtonId()); buildAndShowInfoForm(advancement); } else { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/BookEditCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/BookEditCache.java index d1ebd0c78f2..6a9025bc03a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/BookEditCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/BookEditCache.java @@ -33,7 +33,7 @@ /** * Manages updating the current writable book. - * + *

* Java sends book updates less frequently than Bedrock, and this can cause issues with servers that rate limit * book packets. Because of this, we need to ensure packets are only send every second or so at maximum. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java index 41f73863e10..f118195b966 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/LodestoneCache.java @@ -30,9 +30,9 @@ import com.github.steveice10.opennbt.tag.builtin.StringTag; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.inventory.GeyserItemStack; -import javax.annotation.Nullable; import java.util.Map; import java.util.WeakHashMap; @@ -54,6 +54,10 @@ public final class LodestoneCache { public void cacheInventoryItem(GeyserItemStack itemStack) { CompoundTag tag = itemStack.getNbt(); + if (tag == null) { + // invalid + return; + } CompoundTag lodestonePos = tag.get("LodestonePos"); if (lodestonePos == null) { // invalid diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java index 9e8597b0f54..2aeb83fa87c 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java @@ -67,10 +67,10 @@ public PreferencesCache(GeyserSession session) { /** * Tell the client to hide or show the coordinates. - * + *

* If {@link #prefersShowCoordinates} is true, coordinates will be shown, unless either of the following conditions apply:
*
- * {@link GeyserSession#reducedDebugInfo} is enabled + * {@link GeyserSession#isReducedDebugInfo()} is enabled * {@link GeyserConfiguration#isShowCoordinates()} is disabled */ public void updateShowCoordinates() { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java index d6e376d8f6c..5b208a41f16 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.session.cache; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -247,7 +248,7 @@ public void clear() { lastPlayerPosition = null; } - private BlockDefinition translateCustomSkull(String skinHash, int blockState) { + private @Nullable BlockDefinition translateCustomSkull(String skinHash, int blockState) { CustomSkull customSkull = BlockRegistries.CUSTOM_SKULLS.get(skinHash); if (customSkull != null) { byte floorRotation = BlockStateValues.getSkullRotation(blockState); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java index d9b9d8a549f..8cb590f5768 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/WorldBorder.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.session.cache; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.GenericMath; import org.cloudburstmc.math.vector.Vector2d; import org.cloudburstmc.math.vector.Vector3f; @@ -37,13 +38,11 @@ import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.session.GeyserSession; -import javax.annotation.Nonnull; - public class WorldBorder { private static final double DEFAULT_WORLD_BORDER_SIZE = 5.9999968E7D; @Setter - private @Nonnull Vector2d center = Vector2d.ZERO; + private @NonNull Vector2d center = Vector2d.ZERO; /** * The diameter in blocks of the world border before it got changed or similar to newDiameter if not changed. */ diff --git a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java index 95a2dcb1ac6..4ae30be1960 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java @@ -34,13 +34,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.type.LivingEntity; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; -import javax.annotation.Nonnull; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; @@ -58,7 +58,7 @@ public class FakeHeadProvider { .maximumSize(10000) .build(new CacheLoader<>() { @Override - public SkinProvider.SkinData load(@Nonnull FakeHeadEntry fakeHeadEntry) throws Exception { + public SkinProvider.SkinData load(@NonNull FakeHeadEntry fakeHeadEntry) throws Exception { SkinProvider.SkinData skinData = SkinProvider.getOrDefault(SkinProvider.requestSkinData(fakeHeadEntry.getEntity()), null, 5); if (skinData == null) { diff --git a/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java b/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java index f7d6d751007..33a51fe8ff4 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java +++ b/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java @@ -29,6 +29,7 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.skin.ImageData; import org.cloudburstmc.protocol.bedrock.data.skin.SerializedSkin; import org.cloudburstmc.protocol.bedrock.packet.PlayerListPacket; @@ -40,7 +41,6 @@ import org.geysermc.geyser.session.auth.BedrockClientData; import org.geysermc.geyser.text.GeyserLocale; -import javax.annotation.Nullable; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -277,7 +277,7 @@ public record GameProfileData(String skinUrl, String capeUrl, boolean isAlex) { return null; } - public static GameProfileData loadFromJson(String encodedJson) throws IOException, IllegalArgumentException { + public static @Nullable GameProfileData loadFromJson(String encodedJson) throws IOException, IllegalArgumentException { JsonNode skinObject; try { skinObject = GeyserImpl.JSON_MAPPER.readTree(new String(Base64.getDecoder().decode(encodedJson), StandardCharsets.UTF_8)); diff --git a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java index f491473be5c..23985c33f06 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java @@ -32,6 +32,8 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.entity.type.player.PlayerEntity; @@ -40,8 +42,6 @@ import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.WebUtils; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; @@ -217,7 +217,7 @@ static SkinData determineFallbackSkinData(UUID uuid) { /** * Used as a fallback if an official Java cape doesn't exist for this user. */ - @Nonnull + @NonNull private static Cape getCachedBedrockCape(UUID uuid) { GeyserSession session = GeyserImpl.getInstance().connectionByUuid(uuid); if (session != null) { @@ -545,7 +545,7 @@ public static BufferedImage requestImage(String imageUrl, CapeProvider provider) BufferedImage image = null; // First see if we have a cached file. We also update the modification stamp so we know when the file was last used - File imageFile = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("cache").resolve("images").resolve(UUID.nameUUIDFromBytes(imageUrl.getBytes()).toString() + ".png").toFile(); + File imageFile = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("cache").resolve("images").resolve(UUID.nameUUIDFromBytes(imageUrl.getBytes()) + ".png").toFile(); if (imageFile.exists()) { try { GeyserImpl.getInstance().getLogger().debug("Reading cached image from file " + imageFile.getPath() + " for " + imageUrl); @@ -617,7 +617,7 @@ private static byte[] requestImageData(String imageUrl, CapeProvider provider) t * @param uuid the player's UUID without any hyphens * @return a completable GameProfile with textures included */ - public static CompletableFuture requestTexturesFromUUID(String uuid) { + public static CompletableFuture<@Nullable String> requestTexturesFromUUID(String uuid) { return CompletableFuture.supplyAsync(() -> { try { JsonNode node = WebUtils.getJson("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid); @@ -643,7 +643,7 @@ public static CompletableFuture requestTexturesFromUUID(String uuid) { * @param username the player's username * @return a completable GameProfile with textures included */ - public static CompletableFuture requestTexturesFromUsername(String username) { + public static CompletableFuture<@Nullable String> requestTexturesFromUsername(String username) { return CompletableFuture.supplyAsync(() -> { try { // Offline skin, or no present UUID @@ -669,20 +669,25 @@ public static CompletableFuture requestTexturesFromUsername(String usern } private static BufferedImage downloadImage(String imageUrl, CapeProvider provider) throws IOException { - if (provider == CapeProvider.FIVEZIG) - return readFiveZigCape(imageUrl); + BufferedImage image; + if (provider == CapeProvider.FIVEZIG) { + image = readFiveZigCape(imageUrl); + } else { + HttpURLConnection con = (HttpURLConnection) new URL(imageUrl).openConnection(); + con.setRequestProperty("User-Agent", "Geyser-" + GeyserImpl.getInstance().getPlatformType().toString() + "/" + GeyserImpl.VERSION); + con.setConnectTimeout(10000); + con.setReadTimeout(10000); - HttpURLConnection con = (HttpURLConnection) new URL(imageUrl).openConnection(); - con.setRequestProperty("User-Agent", "Geyser-" + GeyserImpl.getInstance().getPlatformType().toString() + "/" + GeyserImpl.VERSION); - con.setConnectTimeout(10000); - con.setReadTimeout(10000); + image = ImageIO.read(con.getInputStream()); + } - BufferedImage image = ImageIO.read(con.getInputStream()); - if (image == null) throw new NullPointerException(); + if (image == null) { + throw new IllegalArgumentException("Failed to read image from: %s (cape provider=%s)".formatted(imageUrl, provider)); + } return image; } - private static BufferedImage readFiveZigCape(String url) throws IOException { + private static @Nullable BufferedImage readFiveZigCape(String url) throws IOException { JsonNode element = GeyserImpl.JSON_MAPPER.readTree(WebUtils.getBody(url)); if (element != null && element.isObject()) { JsonNode capeElement = element.get("d"); diff --git a/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java b/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java index 69dbb558e05..702fded92f2 100644 --- a/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java +++ b/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java @@ -35,6 +35,7 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; +import java.io.Serial; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -43,6 +44,9 @@ public class AsteriskSerializer extends StdSerializer implements ContextualSerializer { + @Serial + private static final long serialVersionUID = 1L; + public static final String[] NON_SENSITIVE_ADDRESSES = {"", "0.0.0.0", "localhost", "127.0.0.1", "auto", "unknown"}; public static boolean showSensitive = false; @@ -64,10 +68,6 @@ public class AsteriskSerializer extends StdSerializer implements Context String asterisk; boolean isIp; - public AsteriskSerializer() { - super(Object.class); - } - public AsteriskSerializer(String asterisk, boolean isIp) { super(Object.class); this.asterisk = asterisk; @@ -79,7 +79,7 @@ public JsonSerializer createContextual(SerializerProvider serializerProvider, Optional anno = Optional.ofNullable(property) .map(prop -> prop.getAnnotation(Asterisk.class)); - return new AsteriskSerializer(anno.map(Asterisk::value).orElse(null), anno.map(Asterisk::isIp).orElse(null)); + return new AsteriskSerializer(anno.map(Asterisk::value).orElse(null), anno.map(Asterisk::isIp).orElse(false)); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java b/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java index 41528c1e433..500f44d0bbc 100644 --- a/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java +++ b/core/src/main/java/org/geysermc/geyser/text/ChatTypeEntry.java @@ -26,13 +26,12 @@ package org.geysermc.geyser.text; import com.github.steveice10.mc.protocol.data.game.chat.BuiltinChatType; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.packet.TextPacket; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public record ChatTypeEntry(@Nonnull TextPacket.Type bedrockChatType, @Nullable TextDecoration textDecoration) { +public record ChatTypeEntry(TextPacket.@NonNull Type bedrockChatType, @Nullable TextDecoration textDecoration) { private static final ChatTypeEntry CHAT = new ChatTypeEntry(TextPacket.Type.CHAT, null); private static final ChatTypeEntry RAW = new ChatTypeEntry(TextPacket.Type.RAW, null); diff --git a/core/src/main/java/org/geysermc/geyser/text/DummyLegacyHoverEventSerializer.java b/core/src/main/java/org/geysermc/geyser/text/DummyLegacyHoverEventSerializer.java index e934fc1245f..a6edffcd38b 100644 --- a/core/src/main/java/org/geysermc/geyser/text/DummyLegacyHoverEventSerializer.java +++ b/core/src/main/java/org/geysermc/geyser/text/DummyLegacyHoverEventSerializer.java @@ -30,7 +30,7 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.serializer.json.LegacyHoverEventSerializer; import net.kyori.adventure.util.Codec; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.charset.StandardCharsets; import java.util.UUID; @@ -46,23 +46,23 @@ public DummyLegacyHoverEventSerializer() { } @Override - public HoverEvent.@NotNull ShowItem deserializeShowItem(@NotNull Component input) { + public HoverEvent.@NonNull ShowItem deserializeShowItem(@NonNull Component input) { return dummyShowItem; } @Override - public HoverEvent.@NotNull ShowEntity deserializeShowEntity(@NotNull Component input, + public HoverEvent.@NonNull ShowEntity deserializeShowEntity(@NonNull Component input, Codec.Decoder componentDecoder) { return dummyShowEntity; } @Override - public @NotNull Component serializeShowItem(HoverEvent.@NotNull ShowItem input) { + public @NonNull Component serializeShowItem(HoverEvent.@NonNull ShowItem input) { return Component.empty(); } @Override - public @NotNull Component serializeShowEntity(HoverEvent.@NotNull ShowEntity input, + public @NonNull Component serializeShowEntity(HoverEvent.@NonNull ShowEntity input, Codec.Encoder componentEncoder) { return Component.empty(); } diff --git a/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java b/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java index 340674119a1..c6a58e75e36 100644 --- a/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java +++ b/core/src/main/java/org/geysermc/geyser/text/GeyserLocale.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.text; import it.unimi.dsi.fastutil.objects.ObjectArrays; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; @@ -110,7 +111,7 @@ public static void loadGeyserLocale(String locale) { loadGeyserLocale(locale, geyser.getBootstrap()); } - private static String loadGeyserLocale(String locale, GeyserBootstrap bootstrap) { + private static @Nullable String loadGeyserLocale(String locale, GeyserBootstrap bootstrap) { locale = formatLocale(locale); // Don't load the locale if it's already loaded. if (LOCALE_MAPPINGS.containsKey(locale)) { diff --git a/core/src/main/java/org/geysermc/geyser/text/GsonComponentSerializerWrapper.java b/core/src/main/java/org/geysermc/geyser/text/GsonComponentSerializerWrapper.java index 2140dcc88f2..aaf100009cc 100644 --- a/core/src/main/java/org/geysermc/geyser/text/GsonComponentSerializerWrapper.java +++ b/core/src/main/java/org/geysermc/geyser/text/GsonComponentSerializerWrapper.java @@ -30,7 +30,7 @@ import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.function.UnaryOperator; @@ -40,28 +40,28 @@ public record GsonComponentSerializerWrapper(GsonComponentSerializer source) implements GsonComponentSerializer { @Override - public @NotNull Gson serializer() { + public @NonNull Gson serializer() { return this.source.serializer(); } @Override - public @NotNull UnaryOperator populator() { + public @NonNull UnaryOperator populator() { return this.source.populator(); } @Override - public @NotNull Component deserializeFromTree(@NotNull JsonElement input) { + public @NonNull Component deserializeFromTree(@NonNull JsonElement input) { // This has yet to be an issue, so it won't be overridden unless we have to return this.source.deserializeFromTree(input); } @Override - public @NotNull JsonElement serializeToTree(@NotNull Component component) { + public @NonNull JsonElement serializeToTree(@NonNull Component component) { return this.source.serializeToTree(component); } @Override - public @NotNull Component deserialize(@NotNull String input) { + public @NonNull Component deserialize(@NonNull String input) { // See https://github.com/KyoriPowered/adventure/issues/447 Component component = this.serializer().fromJson(input, Component.class); if (component == null) { @@ -72,12 +72,12 @@ public record GsonComponentSerializerWrapper(GsonComponentSerializer source) imp } @Override - public @NotNull String serialize(@NotNull Component component) { + public @NonNull String serialize(@NonNull Component component) { return this.source.serialize(component); } @Override - public @NotNull Builder toBuilder() { + public @NonNull Builder toBuilder() { return this.source.toBuilder(); } } diff --git a/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java b/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java index 00866eda32f..fa1b322a50b 100644 --- a/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java +++ b/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java @@ -26,12 +26,12 @@ package org.geysermc.geyser.text; import com.fasterxml.jackson.databind.JsonNode; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.util.AssetUtils; import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.WebUtils; -import javax.annotation.Nullable; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; @@ -217,8 +217,7 @@ public static String getLocaleString(String messageText, String locale) { * @param locale Locale to translate to * @return Translated string or null if it was not found in the given locale */ - @Nullable - public static String getLocaleStringIfPresent(String messageText, String locale) { + public static @Nullable String getLocaleStringIfPresent(String messageText, String locale) { Map localeStrings = LOCALE_MAPPINGS.get(locale.toLowerCase(Locale.ROOT)); if (localeStrings != null) { return localeStrings.get(messageText); diff --git a/core/src/main/java/org/geysermc/geyser/text/MinecraftTranslationRegistry.java b/core/src/main/java/org/geysermc/geyser/text/MinecraftTranslationRegistry.java index 3310859d0d2..b59b4db8e6d 100644 --- a/core/src/main/java/org/geysermc/geyser/text/MinecraftTranslationRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/text/MinecraftTranslationRegistry.java @@ -26,9 +26,9 @@ package org.geysermc.geyser.text; import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.text.MessageFormat; import java.util.Locale; import java.util.regex.Matcher; @@ -44,12 +44,12 @@ public class MinecraftTranslationRegistry extends TranslatableComponentRenderer< // Exists to maintain compatibility with Velocity's older Adventure version @Override - public @Nullable MessageFormat translate(@Nonnull String key, @Nonnull String locale) { + public @Nullable MessageFormat translate(@NonNull String key, @NonNull String locale) { return this.translate(key, null, locale); } @Override - protected @Nullable MessageFormat translate(@Nonnull String key, @Nullable String fallback, @Nonnull String locale) { + protected @Nullable MessageFormat translate(@NonNull String key, @Nullable String fallback, @NonNull String locale) { // Get the locale string String localeString = MinecraftLocale.getLocaleStringIfPresent(key, locale); if (localeString == null) { @@ -66,7 +66,7 @@ public class MinecraftTranslationRegistry extends TranslatableComponentRenderer< // Replace the `%s` with numbered inserts `{0}` Pattern p = stringReplacement; Matcher m = p.matcher(localeString); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); int i = 0; while (m.find()) { m.appendReplacement(sb, "{" + (i++) + "}"); @@ -76,7 +76,7 @@ public class MinecraftTranslationRegistry extends TranslatableComponentRenderer< // Replace the `%x$s` with numbered inserts `{x}` p = positionalStringReplacement; m = p.matcher(sb.toString()); - sb = new StringBuffer(); + sb = new StringBuilder(); while (m.find()) { i = Integer.parseInt(m.group(1)) - 1; m.appendReplacement(sb, "{" + i + "}"); diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java index f7e39718b85..e82b994c70a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java @@ -54,7 +54,7 @@ public class BlockCollision { /** * This is used to control the maximum distance a face of a bounding box can push the player away */ - protected double pushAwayTolerance = CollisionManager.COLLISION_TOLERANCE * 1.1; + protected final double pushAwayTolerance = CollisionManager.COLLISION_TOLERANCE * 1.1; protected BlockCollision(BoundingBox[] boxes) { this.boundingBoxes = boxes; diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/SpawnerCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/SpawnerCollision.java deleted file mode 100644 index 7d4dfedc279..00000000000 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/SpawnerCollision.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.translator.collision; - -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@CollisionRemapper(regex = "^spawner$") -public class SpawnerCollision extends SolidCollision { - public SpawnerCollision(String params) { - super(params); - // Increase pushAwayTolerance to work around https://bugs.mojang.com/browse/MCPE-41996 - pushAwayTolerance = 0.0002; - } -} diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java index 106613e2505..5262f048be7 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java @@ -129,7 +129,7 @@ public int getGridSize() { /** * Should be overwritten in cases where specific inventories should reject an item being in a specific spot. * For examples, looms use this to reject items that are dyes in Bedrock but not in Java. - * + *

* The source/destination slot will be -1 if the cursor is the slot * * @return true if this transfer should be rejected diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java index 336809e8ac6..856b22c9bcb 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java @@ -68,7 +68,6 @@ import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.text.MessageTranslator; -import javax.annotation.Nonnull; import java.text.DecimalFormat; import java.util.*; @@ -98,7 +97,7 @@ public static ItemStack translateToJava(ItemData data, ItemMappings mappings) { ItemStack itemStack = javaItem.translateToJava(data, bedrockItem, mappings); - if (itemStack != null && itemStack.getNbt() != null) { + if (itemStack.getNbt() != null) { javaItem.translateNbtToJava(itemStack.getNbt(), bedrockItem); if (itemStack.getNbt().isEmpty()) { // Otherwise, seems to cause issues with villagers accepting books, and I don't see how this will break anything else. - Camotoy @@ -108,8 +107,7 @@ public static ItemStack translateToJava(ItemData data, ItemMappings mappings) { return itemStack; } - @Nonnull - public static ItemData.Builder translateToBedrock(GeyserSession session, int javaId, int count, CompoundTag tag) { + public static ItemData.@NonNull Builder translateToBedrock(GeyserSession session, int javaId, int count, CompoundTag tag) { ItemMapping bedrockItem = session.getItemMappings().getMapping(javaId); if (bedrockItem == ItemMapping.AIR) { session.getGeyser().getLogger().debug("ItemMapping returned air: " + javaId); @@ -118,7 +116,7 @@ public static ItemData.Builder translateToBedrock(GeyserSession session, int jav return translateToBedrock(session, Registries.JAVA_ITEMS.get().get(javaId), bedrockItem, count, tag); } - @Nonnull + @NonNull public static ItemData translateToBedrock(GeyserSession session, ItemStack stack) { if (stack == null) { return ItemData.AIR; @@ -134,8 +132,7 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack .build(); } - @Nonnull - private static ItemData.Builder translateToBedrock(GeyserSession session, Item javaItem, ItemMapping bedrockItem, int count, CompoundTag tag) { + private static ItemData.@NonNull Builder translateToBedrock(GeyserSession session, Item javaItem, ItemMapping bedrockItem, int count, CompoundTag tag) { CompoundTag nbt = tag != null ? tag.clone() : null; if (nbt != null) { @@ -365,7 +362,7 @@ private static CompoundTag addAdvancedTooltips(CompoundTag nbt, Item item, Strin * @param canModifyJava the list of items in Java * @return the new list of items in Bedrock */ - private static String[] getCanModify(ListTag canModifyJava) { + private static String @Nullable [] getCanModify(ListTag canModifyJava) { if (canModifyJava != null && canModifyJava.size() > 0) { String[] canModifyBedrock = new String[canModifyJava.size()]; for (int i = 0; i < canModifyBedrock.length; i++) { @@ -384,7 +381,7 @@ private static String[] getCanModify(ListTag canModifyJava) { * Given an item stack, determine the Bedrock item definition that should be applied to Bedrock players. */ @NonNull - public static ItemDefinition getBedrockItemDefinition(GeyserSession session, @Nonnull GeyserItemStack itemStack) { + public static ItemDefinition getBedrockItemDefinition(GeyserSession session, @NonNull GeyserItemStack itemStack) { if (itemStack.isEmpty()) { return ItemDefinition.AIR; } @@ -429,7 +426,7 @@ public static NbtMap translateNbtToBedrock(CompoundTag tag) { return NbtMap.EMPTY; } - private static Object translateToBedrockNBT(Tag tag) { + private static @Nullable Object translateToBedrockNBT(Tag tag) { if (tag instanceof CompoundTag compoundTag) { return translateNbtToBedrock(compoundTag); } @@ -443,6 +440,7 @@ private static Object translateToBedrockNBT(Tag tag) { if (!tagList.isEmpty()) { type = NbtType.byClass(tagList.get(0).getClass()); } + //noinspection unchecked,rawtypes return new NbtList(type, tagList); } @@ -473,7 +471,7 @@ public static CompoundTag translateToJavaNBT(String name, NbtMap tag) { return javaTag; } - private static Tag translateToJavaNBT(String name, Object object) { + private static @Nullable Tag translateToJavaNBT(String name, Object object) { if (object instanceof int[]) { return new IntArrayTag(name, (int[]) object); } @@ -610,7 +608,7 @@ private static void translateCustomBlock(CustomBlockData customBlockData, Geyser builder.blockDefinition(blockDefinition); } - private static CustomSkull getCustomSkull(GeyserSession session, CompoundTag nbt) { + private static @Nullable CustomSkull getCustomSkull(GeyserSession session, CompoundTag nbt) { if (nbt != null && nbt.contains("SkullOwner")) { if (!(nbt.get("SkullOwner") instanceof CompoundTag skullOwner)) { // It's a username give up d: diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BedrockOnlyBlockEntity.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BedrockOnlyBlockEntity.java index c43dfe8bcd2..07b07569059 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BedrockOnlyBlockEntity.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BedrockOnlyBlockEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.translator.level.block.entity; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtList; import org.cloudburstmc.nbt.NbtMap; @@ -57,7 +58,7 @@ public interface BedrockOnlyBlockEntity extends RequiresBlockState { * @param blockState Java BlockState of block. * @return Bedrock tag, or null if not a Bedrock-only Block Entity */ - static NbtMap getTag(GeyserSession session, Vector3i position, int blockState) { + static @Nullable NbtMap getTag(GeyserSession session, Vector3i position, int blockState) { if (FlowerPotBlockEntityTranslator.isFlowerBlock(blockState)) { return FlowerPotBlockEntityTranslator.getTag(session, blockState, position); } else if (PistonBlockEntityTranslator.isBlock(blockState)) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/ShulkerBoxBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/ShulkerBoxBlockEntityTranslator.java index db7b3073f59..bbe6a07251b 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/ShulkerBoxBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/ShulkerBoxBlockEntityTranslator.java @@ -27,12 +27,11 @@ import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMapBuilder; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.translator.inventory.ShulkerInventoryTranslator; -import javax.annotation.Nullable; - @BlockEntity(type = BlockEntityType.SHULKER_BOX) public class ShulkerBoxBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState { /** diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java index 7f87f946543..9ac9126dbba 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java @@ -30,6 +30,7 @@ import com.github.steveice10.opennbt.tag.builtin.IntArrayTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.geyser.GeyserImpl; @@ -99,7 +100,7 @@ private static CompletableFuture getTextures(CompoundTag owner, UUID uui return CompletableFuture.completedFuture(texture.getValue()); } - public static BlockDefinition translateSkull(GeyserSession session, CompoundTag tag, Vector3i blockPosition, int blockState) { + public static @Nullable BlockDefinition translateSkull(GeyserSession session, CompoundTag tag, Vector3i blockPosition, int blockState) { CompoundTag owner = tag.get("SkullOwner"); if (owner == null) { session.getSkullCache().removeSkull(blockPosition); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java index bf437311dec..29a78daf33e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockInventoryTransactionTranslator.java @@ -635,16 +635,16 @@ private boolean useItem(GeyserSession session, InventoryTransactionPacket packet /** * Determine the rotation necessary to activate this transaction. - * + *

* The position between the intended click position and the player can be determined with two triangles. * First, we compute the difference of the X and Z coordinates: - * + *

* Player position (0, 0) * | * | * | * |_____________ Intended target (-3, 2) - * + *

* We then use the Pythagorean Theorem to find the direct line (hypotenuse) on the XZ plane. Finding the angle of the * triangle from there, closest to the player, gives us our yaw rotation value * Then doing the same using the new XZ distance and Y difference, we can find the direct line of sight from the diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockItemFrameDropItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockItemFrameDropItemTranslator.java index f11fd202c24..8632dc4e1f0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockItemFrameDropItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockItemFrameDropItemTranslator.java @@ -37,7 +37,7 @@ /** * Pre-1.16.210: used for both survival and creative item frame item removal - * + *

* 1.16.210: only used in creative. */ @Translator(packet = ItemFrameDropItemPacket.class) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/BedrockEntityEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/BedrockEntityEventTranslator.java index 58d5c201837..17a80aa3914 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/BedrockEntityEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/BedrockEntityEventTranslator.java @@ -60,6 +60,6 @@ public void translate(GeyserSession session, EntityEventPacket packet) { return; } } - session.getGeyser().getLogger().debug("Did not translate incoming EntityEventPacket: " + packet.toString()); + session.getGeyser().getLogger().debug("Did not translate incoming EntityEventPacket: " + packet); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java index e29570171f3..0d7f45c7dd9 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java @@ -465,7 +465,7 @@ public void buildChildren(CommandBuilderContext context, CommandNode[] allNodes) } /** - * Mitigates https://github.com/GeyserMC/Geyser/issues/3411. Not a perfect solution. + * Mitigates issue 3411. Not a perfect solution. */ private static String getEnumDataName(CommandNode node) { if (node.getProperties() instanceof ResourceProperties properties) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginDisconnectTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginDisconnectTranslator.java index 56309c0584b..daf42a68e86 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginDisconnectTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaLoginDisconnectTranslator.java @@ -83,8 +83,8 @@ private boolean testForOutdatedServer(Component disconnectReason) { return true; } else { List children = component.children(); - for (int i = 0; i < children.size(); i++) { - if (children.get(i) instanceof TextComponent child && child.content().startsWith("Outdated server!")) { + for (Component value : children) { + if (value instanceof TextComponent child && child.content().startsWith("Outdated server!")) { // Reproduced on Paper 1.17.1 return true; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java index 71cb6019ae7..344e06c969c 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java @@ -68,6 +68,7 @@ /** * Used to send all valid recipes from Java to Bedrock. + *

* Bedrock REQUIRES a CraftingDataPacket to be sent in order to craft anything. */ @Translator(packet = ClientboundUpdateRecipesPacket.class) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java index 7df6b710c09..1aa147314af 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAnimateTranslator.java @@ -56,13 +56,13 @@ public void translate(GeyserSession session, ClientboundAnimatePacket packet) { AnimatePacket animatePacket = new AnimatePacket(); animatePacket.setRuntimeEntityId(entity.getGeyserId()); switch (animation) { - case SWING_ARM: + case SWING_ARM -> { animatePacket.setAction(AnimatePacket.Action.SWING_ARM); if (entity.getEntityId() == session.getPlayerEntity().getEntityId()) { session.activateArmAnimationTicking(); } - break; - case SWING_OFFHAND: + } + case SWING_OFFHAND -> { // Use the OptionalPack to trigger the animation AnimateEntityPacket offHandPacket = new AnimateEntityPacket(); offHandPacket.setAnimation("animation.player.attack.rotations.offhand"); @@ -71,14 +71,13 @@ public void translate(GeyserSession session, ClientboundAnimatePacket packet) { offHandPacket.setStopExpression("query.any_animation_finished"); offHandPacket.setController("__runtime_controller"); offHandPacket.getRuntimeEntityIds().add(entity.getGeyserId()); - session.sendUpstreamPacket(offHandPacket); return; - case CRITICAL_HIT: - animatePacket.setAction(AnimatePacket.Action.CRITICAL_HIT); - break; - case ENCHANTMENT_CRITICAL_HIT: + } + case CRITICAL_HIT -> animatePacket.setAction(AnimatePacket.Action.CRITICAL_HIT); + case ENCHANTMENT_CRITICAL_HIT -> { animatePacket.setAction(AnimatePacket.Action.MAGIC_CRITICAL_HIT); // Unsure if this does anything + // Spawn custom particle SpawnParticleEffectPacket stringPacket = new SpawnParticleEffectPacket(); stringPacket.setIdentifier("geyseropt:enchanted_hit_multiple"); @@ -87,13 +86,12 @@ public void translate(GeyserSession session, ClientboundAnimatePacket packet) { stringPacket.setUniqueEntityId(entity.getGeyserId()); stringPacket.setMolangVariablesJson(Optional.empty()); session.sendUpstreamPacket(stringPacket); - break; - case LEAVE_BED: - animatePacket.setAction(AnimatePacket.Action.WAKE_UP); - break; - default: + } + case LEAVE_BED -> animatePacket.setAction(AnimatePacket.Action.WAKE_UP); + default -> { session.getGeyser().getLogger().debug("Unhandled java animation: " + animation); return; + } } session.sendUpstreamPacket(animatePacket); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaTakeItemEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaTakeItemEntityTranslator.java index 3b93f0df8d0..cc2b4b03010 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaTakeItemEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaTakeItemEntityTranslator.java @@ -27,7 +27,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.ClientboundTakeItemEntityPacket; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; -import org.cloudburstmc.protocol.bedrock.data.LevelEventType; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; import org.cloudburstmc.protocol.bedrock.packet.TakeItemEntityPacket; import org.geysermc.geyser.entity.type.Entity; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerCombatKillTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerCombatKillTranslator.java index 4e8bd89b370..4b0cafed375 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerCombatKillTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/player/JavaPlayerCombatKillTranslator.java @@ -28,7 +28,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerCombatKillPacket; import org.cloudburstmc.protocol.bedrock.packet.DeathInfoPacket; import net.kyori.adventure.text.Component; -import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java index fc5d69443cd..49d043c62ec 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockDestructionTranslator.java @@ -28,7 +28,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundBlockDestructionPacket; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; -import org.cloudburstmc.protocol.bedrock.data.LevelEventType; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.type.ItemMapping; diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java index 6adb053d757..11d9dbddfe3 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelParticlesTranslator.java @@ -35,6 +35,7 @@ import com.github.steveice10.mc.protocol.data.game.level.particle.positionsource.BlockPositionSource; import com.github.steveice10.mc.protocol.data.game.level.particle.positionsource.EntityPositionSource; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundLevelParticlesPacket; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; @@ -92,7 +93,7 @@ public void translate(GeyserSession session, ClientboundLevelParticlesPacket pac * @return a function to create a packet with a specified particle, in the event we need to spawn multiple particles * with different offsets. */ - private Function createParticle(GeyserSession session, Particle particle) { + private @Nullable Function createParticle(GeyserSession session, Particle particle) { switch (particle.getType()) { case BLOCK -> { int blockState = session.getBlockMappings().getBedrockBlockId(((BlockParticleData) particle.getData()).getBlockState()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/SoundTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/SoundTranslator.java index 0146c534e04..7b42790ac90 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/SoundTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/SoundTranslator.java @@ -38,7 +38,7 @@ /** * The identifier(s) that the placed block must contain * one of. Leave empty to ignore. - * + *

* Only applies to interaction handlers that are an * instance of {@link BlockSoundInteractionTranslator}. * diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/ComparatorSoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/ComparatorSoundInteractionTranslator.java index 45007836253..e77539e6ebc 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/ComparatorSoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/ComparatorSoundInteractionTranslator.java @@ -27,7 +27,6 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; -import org.cloudburstmc.protocol.bedrock.data.LevelEventType; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator; diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/DoorSoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/DoorSoundInteractionTranslator.java index 107807fe0ba..8f8ab8bf68f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/DoorSoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/DoorSoundInteractionTranslator.java @@ -27,7 +27,6 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; -import org.cloudburstmc.protocol.bedrock.data.LevelEventType; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator; diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/LeverSoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/LeverSoundInteractionTranslator.java index 08a8792e873..17b8768bcfe 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/LeverSoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/LeverSoundInteractionTranslator.java @@ -27,7 +27,6 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; -import org.cloudburstmc.protocol.bedrock.data.LevelEventType; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator; diff --git a/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java index 5f811ab4939..d93123cff80 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java @@ -201,7 +201,7 @@ public static String convertMessage(Component message) { /** * Verifies the message is valid JSON in case it's plaintext. Works around GsonComponentSerializer not using lenient mode. - * See https://wiki.vg/Chat for messages sent in lenient mode, and for a description on leniency. + * See here for messages sent in lenient mode, and for a description on leniency. * * @param message Potentially lenient JSON message * @param locale Locale to use for translation strings diff --git a/core/src/main/java/org/geysermc/geyser/util/AttributeUtils.java b/core/src/main/java/org/geysermc/geyser/util/AttributeUtils.java index 17502eae857..e1fe6e6f2fd 100644 --- a/core/src/main/java/org/geysermc/geyser/util/AttributeUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/AttributeUtils.java @@ -32,7 +32,7 @@ public class AttributeUtils { /** * Retrieve the base attribute value with all modifiers applied. - * https://minecraft.wiki/w/Attribute#Modifiers + * See here * @param attribute The attribute to calculate the total value. * @return The finished attribute with all modifiers applied. */ diff --git a/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java index 9964ed08ba7..31a2ddee9e9 100644 --- a/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/BlockEntityUtils.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.util; import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.protocol.bedrock.packet.BlockEntityDataPacket; @@ -35,7 +36,6 @@ import org.geysermc.geyser.translator.level.block.entity.BlockEntityTranslator; import org.geysermc.geyser.translator.level.block.entity.FlowerPotBlockEntityTranslator; -import javax.annotation.Nonnull; import java.util.List; import java.util.Locale; import java.util.Map; @@ -83,7 +83,7 @@ public static BlockEntityTranslator getBlockEntityTranslator(BlockEntityType typ return Registries.BLOCK_ENTITIES.get(type); } - public static void updateBlockEntity(GeyserSession session, @Nonnull NbtMap blockEntity, Vector3i position) { + public static void updateBlockEntity(GeyserSession session, @NonNull NbtMap blockEntity, Vector3i position) { BlockEntityDataPacket blockEntityPacket = new BlockEntityDataPacket(); blockEntityPacket.setBlockPosition(position); blockEntityPacket.setData(blockEntity); diff --git a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java index 23949d02037..81a67a52125 100644 --- a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.util; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.PlayerInventory; @@ -36,8 +37,6 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.collision.BlockCollision; -import javax.annotation.Nullable; - public final class BlockUtils { private static boolean correctTool(GeyserSession session, BlockMapping blockMapping, String itemToolType) { diff --git a/core/src/main/java/org/geysermc/geyser/util/CooldownUtils.java b/core/src/main/java/org/geysermc/geyser/util/CooldownUtils.java index c00e389fd21..60838686f4b 100644 --- a/core/src/main/java/org/geysermc/geyser/util/CooldownUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/CooldownUtils.java @@ -35,7 +35,7 @@ /** * Manages the sending of a cooldown indicator to the Bedrock player as there is no cooldown indicator in Bedrock. - * Much of the work here is from the wonderful folks from ViaRewind: https://github.com/ViaVersion/ViaRewind + * Much of the work here is from the wonderful folks from ViaRewind */ public class CooldownUtils { private static CooldownType DEFAULT_SHOW_COOLDOWN; diff --git a/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java b/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java index 622722e5aa2..9f7bd9e61bb 100644 --- a/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/CpuUtils.java @@ -49,7 +49,7 @@ public static String tryGetProcessorName() { /** * Much of the code here was copied from the OSHI project. This is simply stripped down to only get the CPU model. - * https://github.com/oshi/oshi/ + * See here */ private static String getLinuxProcessorName() throws Exception { List lines = Files.readAllLines(Paths.get("/proc/cpuinfo"), StandardCharsets.UTF_8); @@ -64,7 +64,7 @@ private static String getLinuxProcessorName() throws Exception { } /** - * https://stackoverflow.com/a/6327663 + * See here */ private static String getWindowsProcessorName() throws Exception { final String cpuNameCmd = "reg query \"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\" /v ProcessorNameString"; @@ -83,7 +83,7 @@ private static String getWindowsProcessorName() throws Exception { int p = result.indexOf(regstrToken); if (p == -1) { - return null; + return "unknown"; } return result.substring(p + regstrToken.length()).trim(); diff --git a/core/src/main/java/org/geysermc/geyser/util/FileUtils.java b/core/src/main/java/org/geysermc/geyser/util/FileUtils.java index 99e8f8d7d63..c8cd3105896 100644 --- a/core/src/main/java/org/geysermc/geyser/util/FileUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/FileUtils.java @@ -79,7 +79,7 @@ public static File fileOrCopiedFromResource(File file, String name, Function> getGeneratedClassesForAnnotation(Class> getGeneratedClassesForAnnotation(String input) { - try (InputStream annotatedClass = GeyserImpl.getInstance().getBootstrap().getResource(input); + try (InputStream annotatedClass = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(input); BufferedReader reader = new BufferedReader(new InputStreamReader(annotatedClass))) { return reader.lines().map(className -> { try { diff --git a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java index 0348eca1135..f1bf03d90c9 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java @@ -31,6 +31,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundPickItemPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetCreativeModeSlotPacket; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; @@ -53,6 +54,7 @@ import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.GeyserLocale; @@ -60,7 +62,6 @@ import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; import org.geysermc.geyser.translator.inventory.chest.DoubleChestInventoryTranslator; -import javax.annotation.Nullable; import java.util.Arrays; import java.util.Collections; import java.util.Objects; @@ -129,7 +130,7 @@ public static void closeInventory(GeyserSession session, int javaId, boolean con session.setOpenInventory(null); } - public static Inventory getInventory(GeyserSession session, int javaId) { + public static @Nullable Inventory getInventory(GeyserSession session, int javaId) { if (javaId == 0) { return session.getPlayerInventory(); } else { @@ -207,12 +208,13 @@ public static IntFunction createUnusableSpaceBlock(String description) } private static ItemDefinition getUnusableSpaceBlockDefinition(int protocolVersion) { + ItemMappings mappings = Registries.ITEMS.forVersion(protocolVersion); String unusableSpaceBlock = GeyserImpl.getInstance().getConfig().getUnusableSpaceBlock(); - ItemDefinition itemDefinition = Registries.ITEMS.forVersion(protocolVersion).getDefinition(unusableSpaceBlock); + ItemDefinition itemDefinition = mappings.getDefinition(unusableSpaceBlock); if (itemDefinition == null) { GeyserImpl.getInstance().getLogger().error("Invalid value " + unusableSpaceBlock + ". Resorting to barrier block."); - return Registries.ITEMS.forVersion(protocolVersion).getStoredItems().barrier().getBedrockDefinition(); + return mappings.getStoredItems().barrier().getBedrockDefinition(); } else { return itemDefinition; } @@ -284,7 +286,7 @@ public static void findOrCreateItem(GeyserSession session, ItemStack itemStack) * If it is found in another part of the inventory, move it. * If it is not found and the user is in creative mode, create the item, * overriding the current item slot if no other hotbar slots are empty, or otherwise selecting the empty slot. - * + *

* This attempts to mimic Java Edition behavior as best as it can. * @param session the Bedrock client's session * @param itemName the Java identifier of the item to search/select @@ -455,6 +457,7 @@ public static GeyserRecipe getValidRecipe(final GeyserSession session, final @Nu for (int col = firstCol; col < width + firstCol; col++) { GeyserItemStack geyserItemStack = inventoryGetter.apply(col + (row * gridDimensions) + 1); if (geyserItemStack.isEmpty()) { + //noinspection ConstantValue inventoryHasItem = itemStack == null || itemStack.getId() == 0; if (inventoryHasItem) { break crafting; @@ -476,6 +479,7 @@ public static GeyserRecipe getValidRecipe(final GeyserSession session, final @Nu return null; } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") private static boolean testShapedRecipe(final Ingredient[] ingredients, final IntFunction inventoryGetter, final int gridDimensions, final int firstRow, final int height, final int firstCol, final int width) { int ingredientIndex = 0; diff --git a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java index c528de74189..a116c5cf235 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ItemUtils.java @@ -29,12 +29,11 @@ import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.FishingRodItem; import org.geysermc.geyser.item.type.Item; -import javax.annotation.Nullable; - public class ItemUtils { public static int getEnchantmentLevel(@Nullable CompoundTag itemNBTData, String enchantmentId) { @@ -74,7 +73,7 @@ public static int getCorrectBedrockDurability(Item item, int original) { * @param itemTag the NBT tag of the item * @return the custom name of the item */ - public static String getCustomName(CompoundTag itemTag) { + public static @Nullable String getCustomName(CompoundTag itemTag) { if (itemTag != null) { if (itemTag.get("display") instanceof CompoundTag displayTag) { if (displayTag.get("Name") instanceof StringTag nameTag) { diff --git a/core/src/main/java/org/geysermc/geyser/util/JavaCodecUtil.java b/core/src/main/java/org/geysermc/geyser/util/JavaCodecUtil.java index f0b8ee6bc2a..795d4549070 100644 --- a/core/src/main/java/org/geysermc/geyser/util/JavaCodecUtil.java +++ b/core/src/main/java/org/geysermc/geyser/util/JavaCodecUtil.java @@ -28,8 +28,8 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; -import javax.annotation.Nonnull; import java.util.Iterator; public final class JavaCodecUtil { @@ -41,7 +41,7 @@ public static Iterable iterateAsTag(CompoundTag tag) { ListTag value = tag.get("value"); Iterator originalIterator = value.iterator(); return new Iterable<>() { - @Nonnull + @NonNull @Override public Iterator iterator() { return new Iterator<>() { diff --git a/core/src/main/java/org/geysermc/geyser/util/Metrics.java b/core/src/main/java/org/geysermc/geyser/util/Metrics.java index e88d5a97113..a4ef301e393 100644 --- a/core/src/main/java/org/geysermc/geyser/util/Metrics.java +++ b/core/src/main/java/org/geysermc/geyser/util/Metrics.java @@ -29,6 +29,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; import javax.net.ssl.HttpsURLConnection; @@ -48,8 +50,8 @@ /** * bStats collects some data for plugin authors. - * - * Check out https://bStats.org/ to learn more about bStats! + *

+ * Check out bStats to learn more about bStats! */ public class Metrics { @@ -140,7 +142,7 @@ private ObjectNode getPluginData() { } customCharts.add(chart); } - data.put("customCharts", customCharts); + data.set("customCharts", customCharts); return data; } @@ -233,10 +235,7 @@ private static void sendData(ObjectNode data) throws Exception { * @return The gzipped String. * @throws IOException If the compression failed. */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } + private static byte @NonNull [] compress(final @NonNull String str) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(outputStream); gzip.write(str.getBytes(StandardCharsets.UTF_8)); @@ -264,7 +263,7 @@ public static abstract class CustomChart { this.chartId = chartId; } - private ObjectNode getRequestJsonNode() { + private @Nullable ObjectNode getRequestJsonNode() { ObjectNode chart = new ObjectMapper().createObjectNode(); chart.put("chartId", chartId); try { @@ -308,7 +307,7 @@ public SimplePie(String chartId, Callable callable) { } @Override - protected ObjectNode getChartData() throws Exception { + protected @Nullable ObjectNode getChartData() throws Exception { ObjectNode data = mapper.createObjectNode(); String value = callable.call(); if (value == null || value.isEmpty()) { @@ -339,7 +338,7 @@ public AdvancedPie(String chartId, Callable> callable) { } @Override - protected ObjectNode getChartData() throws Exception { + protected @Nullable ObjectNode getChartData() throws Exception { ObjectNode data = mapper.createObjectNode(); ObjectNode values = mapper.createObjectNode(); Map map = callable.call(); @@ -383,7 +382,7 @@ public DrilldownPie(String chartId, Callable>> } @Override - public ObjectNode getChartData() throws Exception { + public @Nullable ObjectNode getChartData() throws Exception { ObjectNode data = mapper.createObjectNode(); ObjectNode values = mapper.createObjectNode(); Map> map = callable.call(); @@ -432,7 +431,7 @@ public SingleLineChart(String chartId, Callable callable) { } @Override - protected ObjectNode getChartData() throws Exception { + protected @Nullable ObjectNode getChartData() throws Exception { ObjectNode data = mapper.createObjectNode(); int value = callable.call(); if (value == 0) { @@ -445,135 +444,4 @@ protected ObjectNode getChartData() throws Exception { } - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected ObjectNode getChartData() throws Exception { - ObjectNode data = mapper.createObjectNode(); - ObjectNode values = mapper.createObjectNode(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.put(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.putPOJO("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected ObjectNode getChartData() throws Exception { - ObjectNode data = mapper.createObjectNode(); - ObjectNode values = mapper.createObjectNode(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - ArrayNode categoryValues = mapper.createArrayNode(); - categoryValues.add(entry.getValue()); - values.putPOJO(entry.getKey(), categoryValues); - } - data.putPOJO("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected ObjectNode getChartData() throws Exception { - ObjectNode data = mapper.createObjectNode(); - ObjectNode values = mapper.createObjectNode(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - ArrayNode categoryValues = mapper.createArrayNode(); - for (int categoryValue : entry.getValue()) { - categoryValues.add(categoryValue); - } - values.putPOJO(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.putPOJO("values", values); - return data; - } - - } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/util/SignUtils.java b/core/src/main/java/org/geysermc/geyser/util/SignUtils.java index fd2d98ba9bc..3a4ec4f2cd7 100644 --- a/core/src/main/java/org/geysermc/geyser/util/SignUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/SignUtils.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.util; -import org.geysermc.geyser.level.block.BlockStateValues; - /** * Provides utilities for interacting with signs. Mainly, it deals with the widths of each character. * Since Bedrock auto-wraps signs and Java does not, we have to take this into account when translating signs. diff --git a/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java b/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java index b56d9873b26..4c5f6b68fe1 100644 --- a/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/SoundUtils.java @@ -26,6 +26,7 @@ package org.geysermc.geyser.util; import com.github.steveice10.mc.protocol.data.game.level.sound.Sound; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; @@ -50,7 +51,7 @@ public final class SoundUtils { * @param sound the sound name * @return a sound event from the given sound */ - private static SoundEvent toSoundEvent(String sound) { + private static @Nullable SoundEvent toSoundEvent(String sound) { try { return SoundEvent.valueOf(sound.toUpperCase(Locale.ROOT).replace(".", "_")); } catch (Exception ex) { diff --git a/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java b/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java index c0fd10232c3..cf90a6bcdc0 100644 --- a/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java @@ -31,6 +31,7 @@ import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; @@ -38,7 +39,6 @@ import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.text.GeyserLocale; -import javax.annotation.Nonnull; import java.util.OptionalInt; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; @@ -46,7 +46,8 @@ import java.util.regex.Pattern; public final class VersionCheckUtils { - private static @Nonnull OptionalInt LATEST_BEDROCK_RELEASE = OptionalInt.empty(); + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private static @NonNull OptionalInt LATEST_BEDROCK_RELEASE = OptionalInt.empty(); private static final int SUPPORTED_JAVA_VERSION = 17; public static void checkForOutdatedFloodgate(GeyserLogger logger) { @@ -125,7 +126,7 @@ public static void checkForGeyserUpdate(Supplier recipient) }); } - public static @Nonnull OptionalInt getLatestBedrockRelease() { + public static @NonNull OptionalInt getLatestBedrockRelease() { return LATEST_BEDROCK_RELEASE; } diff --git a/core/src/main/java/org/geysermc/geyser/util/WebUtils.java b/core/src/main/java/org/geysermc/geyser/util/WebUtils.java index e4a98b3fc7b..fbcbd4a3cd7 100644 --- a/core/src/main/java/org/geysermc/geyser/util/WebUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/WebUtils.java @@ -26,9 +26,9 @@ package org.geysermc.geyser.util; import com.fasterxml.jackson.databind.JsonNode; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserImpl; -import javax.annotation.Nullable; import javax.naming.directory.Attribute; import javax.naming.directory.InitialDirContext; import java.io.*; @@ -101,7 +101,7 @@ public static void downloadFile(String reqURL, String fileLocation) { * @param reqURL URL to post to * @param postContent String data to post * @return String returned by the server - * @throws IOException + * @throws IOException If the request fails */ public static String post(String reqURL, String postContent) throws IOException { URL url = new URL(reqURL); @@ -123,7 +123,7 @@ public static String post(String reqURL, String postContent) throws IOException * * @param con The connection to get the string from * @return The body of the returned page - * @throws IOException + * @throws IOException If the request fails */ private static String connectionToString(HttpURLConnection con) throws IOException { // Send the request (we dont use this but its required for getErrorStream() to work) @@ -156,7 +156,7 @@ private static String connectionToString(HttpURLConnection con) throws IOExcepti * @param reqURL URL to post to * @param fields Form data to post * @return String returned by the server - * @throws IOException + * @throws IOException If the request fails */ public static String postForm(String reqURL, Map fields) throws IOException { URL url = new URL(reqURL); @@ -169,15 +169,14 @@ public static String postForm(String reqURL, Map fields) throws try (OutputStream out = con.getOutputStream()) { // Write the form data to the output for (Map.Entry field : fields.entrySet()) { - out.write((field.getKey() + "=" + URLEncoder.encode(field.getValue(), StandardCharsets.UTF_8.toString()) + "&").getBytes(StandardCharsets.UTF_8)); + out.write((field.getKey() + "=" + URLEncoder.encode(field.getValue(), StandardCharsets.UTF_8) + "&").getBytes(StandardCharsets.UTF_8)); } } return connectionToString(con); } - @Nullable - public static String[] findSrvRecord(GeyserImpl geyser, String remoteAddress) { + public static String @Nullable [] findSrvRecord(GeyserImpl geyser, String remoteAddress) { try { // Searches for a server address and a port from a SRV record of the specified host name InitialDirContext ctx = new InitialDirContext(); diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2BooleanMap.java b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2BooleanMap.java index 832a7bcae01..dc454552959 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2BooleanMap.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2BooleanMap.java @@ -28,7 +28,13 @@ import it.unimi.dsi.fastutil.ints.AbstractInt2BooleanMap; import it.unimi.dsi.fastutil.objects.ObjectSet; +import java.io.Serial; + public class FixedInt2BooleanMap extends AbstractInt2BooleanMap { + + @Serial + private static final long serialVersionUID = 1L; + protected boolean[] value; protected int start = -1; diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2ByteMap.java b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2ByteMap.java index ee37d612fbd..46cb2a2ca77 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2ByteMap.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2ByteMap.java @@ -29,7 +29,13 @@ import it.unimi.dsi.fastutil.ints.Int2ByteMap; import it.unimi.dsi.fastutil.objects.ObjectSet; +import java.io.Serial; + public class FixedInt2ByteMap extends AbstractInt2ByteMap { + + @Serial + private static final long serialVersionUID = 1L; + protected byte[] value; protected int start = -1; diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2IntMap.java b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2IntMap.java index f5bd89d6417..4a27d51a928 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2IntMap.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/FixedInt2IntMap.java @@ -29,10 +29,15 @@ import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.objects.ObjectSet; +import java.io.Serial; + public class FixedInt2IntMap extends AbstractInt2IntMap { protected int[] value; protected int start = -1; + @Serial + private static final long serialVersionUID = 1L; + @Override public int size() { return value.length; diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java b/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java index bafb2924c72..42d0da8033c 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/LecternHasBookMap.java @@ -32,11 +32,16 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.BlockEntityUtils; +import java.io.Serial; + /** * Map that takes advantage of its internals for fast operations on block states to determine if they are lecterns. */ public class LecternHasBookMap extends FixedInt2BooleanMap { + @Serial + private static final long serialVersionUID = 1L; + /** * Update a potential lectern within the world. This is a map method so it can use the internal fields to * optimize lectern determining. diff --git a/core/src/main/java/org/geysermc/geyser/util/collection/package-info.java b/core/src/main/java/org/geysermc/geyser/util/collection/package-info.java index e17a38877d6..46fa5df1153 100644 --- a/core/src/main/java/org/geysermc/geyser/util/collection/package-info.java +++ b/core/src/main/java/org/geysermc/geyser/util/collection/package-info.java @@ -25,7 +25,7 @@ /** * Contains useful collections for use in Geyser. - * + *

* Of note are the fixed int maps. Designed for use with block states that are positive and sequential, they do not allow keys to be * added that are not greater by one versus the previous key. Because of this, speedy operations of {@link java.util.Map#get(java.lang.Object)} * and {@link java.util.Map#containsKey(java.lang.Object)} can be performed by simply checking the bounds of the map From c0f6a2b926900bfed8e99fb4ad25c978cf98bab3 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 6 Dec 2023 08:26:20 +0100 Subject: [PATCH 10/54] Add more info to Fabric's geyser dumps (#4175) * Added onlineMode, platformName, and Minecraft version to dump - renames platformVersion to loaderVersion since that is more fitting to modded structure * rename loaderVersion back to platformVersion * address review by @Konicai * Fix geyser dump creation (regression from the syntax/annotation PR) --- .../geyser/platform/fabric/GeyserFabricDumpInfo.java | 8 +++++++- .../java/org/geysermc/geyser/text/AsteriskSerializer.java | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricDumpInfo.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricDumpInfo.java index ee986ee6216..75da9125f3f 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricDumpInfo.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricDumpInfo.java @@ -43,21 +43,27 @@ @Getter public class GeyserFabricDumpInfo extends BootstrapDumpInfo { - private String platformVersion = null; + private final String platformName; + private String platformVersion; + private final String minecraftVersion; private final EnvType environmentType; @AsteriskSerializer.Asterisk(isIp = true) private final String serverIP; private final int serverPort; + private final boolean onlineMode; private final List mods; public GeyserFabricDumpInfo(MinecraftServer server) { + this.platformName = server.getServerModName(); FabricLoader.getInstance().getModContainer("fabricloader").ifPresent(mod -> this.platformVersion = mod.getMetadata().getVersion().getFriendlyString()); + this.minecraftVersion = server.getServerVersion(); this.environmentType = FabricLoader.getInstance().getEnvironmentType(); this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp(); this.serverPort = server.getPort(); + this.onlineMode = server.usesAuthentication(); this.mods = new ArrayList<>(); for (ModContainer mod : FabricLoader.getInstance().getAllMods()) { diff --git a/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java b/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java index 702fded92f2..66b61dbff0f 100644 --- a/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java +++ b/core/src/main/java/org/geysermc/geyser/text/AsteriskSerializer.java @@ -68,6 +68,11 @@ public class AsteriskSerializer extends StdSerializer implements Context String asterisk; boolean isIp; + @SuppressWarnings("unused") // Used by Jackson for Geyser dumps + public AsteriskSerializer() { + super(Object.class); + } + public AsteriskSerializer(String asterisk, boolean isIp) { super(Object.class); this.asterisk = asterisk; From 94a1cbeb832fddd265711e798481c6cf17a691af Mon Sep 17 00:00:00 2001 From: TheFloyds4240 <80289503+TheFloyds4240@users.noreply.github.com> Date: Wed, 6 Dec 2023 03:50:16 -0500 Subject: [PATCH 11/54] Default motd and player count passthrough config values to true(#2523) * Update config.yml I will in no way be offended if this is not merged. Essentially, it makes Geyser slightly more configured at the start for plugin versions by forwarding more information about the server to Bedrock players. * remove unused --------- Co-authored-by: onebeastchris --- core/src/main/resources/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index 218e13833c6..b10c2788e5c 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -90,9 +90,9 @@ command-suggestions: true # The following three options enable "ping passthrough" - the MOTD, player count and/or protocol name gets retrieved from the Java server. # Relay the MOTD from the remote server to Bedrock players. -passthrough-motd: false +passthrough-motd: true # Relay the player count and max players from the remote server to Bedrock players. -passthrough-player-counts: false +passthrough-player-counts: true # Enable LEGACY ping passthrough. There is no need to enable this unless your MOTD or player count does not appear properly. # This option does nothing on standalone. legacy-ping-passthrough: false From 9d6dd58fd83fdec2bdfc764902348fa885b06e31 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 6 Dec 2023 22:22:21 +0100 Subject: [PATCH 12/54] Ensure executor service isn't null by accessing it via the getter (#4328) --- .../main/java/org/geysermc/geyser/skin/FakeHeadProvider.java | 2 +- core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java index 4ae30be1960..c7bd235b2fa 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java @@ -134,7 +134,7 @@ public static void loadHead(GeyserSession session, PlayerEntity entity, SkinMana session.getPlayerWithCustomHeads().add(entity.getUuid()); String texturesProperty = entity.getTexturesProperty(); - SkinProvider.EXECUTOR_SERVICE.execute(() -> { + SkinProvider.getExecutorService().execute(() -> { try { SkinProvider.SkinData mergedSkinData = MERGED_SKINS_LOADING_CACHE.get(new FakeHeadEntry(texturesProperty, fakeHeadSkinUrl, entity)); SkinManager.sendSkinPacket(session, entity, mergedSkinData); diff --git a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java index 23985c33f06..12a1e8b2b68 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java @@ -58,7 +58,7 @@ public class SkinProvider { private static final boolean ALLOW_THIRD_PARTY_CAPES = GeyserImpl.getInstance().getConfig().isAllowThirdPartyCapes(); - static ExecutorService EXECUTOR_SERVICE; + private static ExecutorService EXECUTOR_SERVICE; static final Skin EMPTY_SKIN; static final Cape EMPTY_CAPE = new Cape("", "no-cape", ByteArrays.EMPTY_ARRAY, -1, true); @@ -133,7 +133,7 @@ public class SkinProvider { WEARING_CUSTOM_SKULL_SLIM = new SkinGeometry("{\"geometry\" :{\"default\" :\"geometry.humanoid.wearingCustomSkullSlim\"}}", wearingCustomSkullSlim, false); } - private static ExecutorService getExecutorService() { + public static ExecutorService getExecutorService() { if (EXECUTOR_SERVICE == null) { EXECUTOR_SERVICE = Executors.newFixedThreadPool(ALLOW_THIRD_PARTY_CAPES ? 21 : 14); } From 39716508566431e230578ba64f2d479f47a75cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=83=E9=A3=9E=E5=A4=8F?= Date: Thu, 7 Dec 2023 16:57:30 +0800 Subject: [PATCH 13/54] Fix collision problem with glass pane and iron bars (#4302) * Fix collision problem,the wide for bedrock is 0.5 but for java is 0.5625 when only one side connect. * Fixed an issue where the collision box was abnormal at the corner when two sides of the glass panel were connected. * Merge similar methods, adjust code. * More lenient judgment; reduce redundant code to avoid repeated calls. --- .../GlassPaneAndIronBarsCollision.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/GlassPaneAndIronBarsCollision.java diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/GlassPaneAndIronBarsCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/GlassPaneAndIronBarsCollision.java new file mode 100644 index 00000000000..14439645a57 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/GlassPaneAndIronBarsCollision.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.collision; + +import lombok.EqualsAndHashCode; +import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.session.GeyserSession; + +@EqualsAndHashCode(callSuper = true) +@CollisionRemapper(regex = "glass_pane$|iron_bars$", usesParams = true, passDefaultBoxes = true) +public class GlassPaneAndIronBarsCollision extends BlockCollision { + /** + * 1 = north + * 2 = east + * 3 = south + * 4 = west + * 5 = north, east + * 6 = east, south + * 7 = south, west + * 8 = west, north + */ + private int facing; + + public GlassPaneAndIronBarsCollision(String params, BoundingBox[] defaultBoxes) { + super(defaultBoxes); + //east=true,north=true,south=true,west=true + if (params.contains("north=true") && params.contains("east=true")) { + facing = 5; + } else if (params.contains("east=true") && params.contains("south=true")) { + facing = 6; + } else if (params.contains("south=true") && params.contains("west=true")) { + facing = 7; + } else if (params.contains("west=true") && params.contains("north=true")) { + facing = 8; + } else if (params.contains("north=true")) { + facing = 1; + } else if (params.contains("east=true")) { + facing = 2; + } else if (params.contains("south=true")) { + facing = 3; + } else if (params.contains("west=true")) { + facing = 4; + } + } + + @Override + public boolean correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { + boolean result = super.correctPosition(session, x, y, z, playerCollision); + playerCollision.setSizeX(playerCollision.getSizeX() - 0.0001); + playerCollision.setSizeY(playerCollision.getSizeY() - 0.0001); + playerCollision.setSizeZ(playerCollision.getSizeZ() - 0.0001); + + if (this.checkIntersection(x, y, z, playerCollision)) { + double newMiddleX = x; + double newMiddleZ = z; + + switch (facing) { + case 1 -> newMiddleZ += 0.8625; // North + case 2 -> newMiddleX += 0.1375; // East + case 3 -> newMiddleZ += 0.1375; // South + case 4 -> newMiddleX += 0.8625; // West + case 5 -> { // North, East + newMiddleZ += 0.8625; + newMiddleX += 0.1375; + } + case 6 -> { // East, South + newMiddleX += 0.1375; + newMiddleZ += 0.1375; + } + case 7 -> { // South, West + newMiddleZ += 0.1375; + newMiddleX += 0.8625; + } + case 8 -> { // West, North + newMiddleX += 0.8625; + newMiddleZ += 0.8625; + } + } + + playerCollision.setMiddleX(newMiddleX); + playerCollision.setMiddleZ(newMiddleZ); + } + + playerCollision.setSizeX(playerCollision.getSizeX() + 0.0001); + playerCollision.setSizeY(playerCollision.getSizeY() + 0.0001); + playerCollision.setSizeZ(playerCollision.getSizeZ() + 0.0001); + return result; + } +} From 1499def4a3e4ed17c4752b9bdeb6099522463a97 Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 7 Dec 2023 20:27:25 +0100 Subject: [PATCH 14/54] Catch UnknownHostExceptions in legacy ping passthrough pings (#4331) * Catch unknownhostexception to avoid network errors when using legacy ping passthrough * Catch UnknownHostException separately, log a warning but no stacktrace --- .../org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java b/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java index 64ad2c445fa..6bbca11ca3c 100644 --- a/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java +++ b/core/src/main/java/org/geysermc/geyser/ping/GeyserLegacyPingPassthrough.java @@ -139,6 +139,9 @@ public void run() { this.geyser.getLogger().debug("Connection timeout for ping passthrough."); } catch (JsonParseException | JsonMappingException ex) { this.geyser.getLogger().error("Failed to parse json when pinging server!", ex); + } catch (UnknownHostException ex) { + // Don't reset pingInfo, as we want to keep the last known value + this.geyser.getLogger().warning("Unable to resolve remote host! Is the remote server down or invalid?"); } catch (IOException e) { this.geyser.getLogger().error("IO error while trying to use legacy ping passthrough", e); } From f1e7ef92f4d63a4f6d6cbff23022c7723647a7a9 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 11 Dec 2023 18:12:19 +0100 Subject: [PATCH 15/54] Fix issues with the ConnectionTestCommand (#4333) - Port out of bounds checking - Proper encoding of ip's to check - Don't assume "cache" response is nonnull; it is null when there's an error - Send users the error message that we get when server is unreachable --- .../defaults/ConnectionTestCommand.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java index 4cda72c9b51..ad51826c36f 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java @@ -36,6 +36,8 @@ import org.geysermc.geyser.util.LoopbackUtil; import org.geysermc.geyser.util.WebUtils; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Random; import java.util.concurrent.CompletableFuture; @@ -104,6 +106,12 @@ public void execute(@Nullable GeyserSession session, GeyserCommandSource sender, return; } + // Issue: port out of bounds + if (port <= 0 || port >= 65535) { + sender.sendMessage("The port you specified is invalid! Please specify a valid port."); + return; + } + // Issue: do the ports not line up? if (port != geyser.getConfig().getBedrock().port()) { if (fullAddress.length == 2) { @@ -161,20 +169,21 @@ public void execute(@Nullable GeyserSession session, GeyserCommandSource sender, sender.sendMessage("Testing server connection now. Please wait..."); JsonNode output; try { - output = WebUtils.getJson("https://checker.geysermc.org/ping?hostname=" + ip + "&port=" + port); + String hostname = URLEncoder.encode(ip, StandardCharsets.UTF_8); + output = WebUtils.getJson("https://checker.geysermc.org/ping?hostname=" + hostname + "&port=" + port); } finally { CONNECTION_TEST_MOTD = null; } - JsonNode cache = output.get("cache"); - String when; - if (cache.get("fromCache").asBoolean()) { - when = cache.get("secondsSince").asInt() + " seconds ago"; - } else { - when = "now"; - } - if (output.get("success").asBoolean()) { + JsonNode cache = output.get("cache"); + String when; + if (cache.get("fromCache").asBoolean()) { + when = cache.get("secondsSince").asInt() + " seconds ago"; + } else { + when = "now"; + } + JsonNode ping = output.get("ping"); JsonNode pong = ping.get("pong"); String remoteMotd = pong.get("motd").asText(); @@ -196,7 +205,11 @@ public void execute(@Nullable GeyserSession session, GeyserCommandSource sender, return; } - sender.sendMessage("Your server is likely unreachable from outside the network as of " + when + "."); + sender.sendMessage("Your server is likely unreachable from outside the network!"); + JsonNode message = output.get("message"); + if (message != null && !message.asText().isEmpty()) { + sender.sendMessage("Got the error message: " + message.asText()); + } sendLinks(sender); } catch (Exception e) { sender.sendMessage("An error occurred while trying to check your connection! Check the console for more information."); From d63a70daa9604193d78824b6fb8c2ad3f9923b14 Mon Sep 17 00:00:00 2001 From: kyrptonaught Date: Mon, 11 Dec 2023 18:20:25 -0500 Subject: [PATCH 16/54] Add support for adding custom translations. (#4047) * Add support for loading locale overwrites. Any lang files in this new folder will be appended to the main lang file when loaded. * A locale will no longer attempt to be downloaded and loaded if it already is loaded. Previously a lang file was reloaded everytime a player joins. * Switch some io bits to nio * formatting fixes * Update core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java * Rename isLocalLoaded to isLocaleLoaded * Rename overwrites to overrides * Catch separate exceptions when parsing locale file. Similar to previous implementation * Add //no-op to try/catch * Apply suggestions to fix issues that might arise with the Norwegian locale * Properly resolve override locale path for nb_no * Yeet temporary fix - addresses @Camotoy's review * Catch IOException properly --------- Co-authored-by: onebeastchris --- .../geysermc/geyser/text/MinecraftLocale.java | 120 +++++++++++------- 1 file changed, 73 insertions(+), 47 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java b/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java index fa1b322a50b..f6e37787d4c 100644 --- a/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java +++ b/core/src/main/java/org/geysermc/geyser/text/MinecraftLocale.java @@ -35,6 +35,7 @@ import java.io.*; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardOpenOption; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; @@ -44,16 +45,15 @@ public class MinecraftLocale { public static final Map> LOCALE_MAPPINGS = new HashMap<>(); - static { - // Create the locales folder - File localesFolder = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("locales").toFile(); - //noinspection ResultOfMethodCallIgnored - localesFolder.mkdir(); + private static final Path LOCALE_FOLDER = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("locales"); - // FIXME TEMPORARY + static { try { - Files.delete(localesFolder.toPath().resolve("en_us.hash")); - } catch (IOException ignored) { + // Create the locales folder + Files.createDirectories(LOCALE_FOLDER); + Files.createDirectories(LOCALE_FOLDER.resolve("overrides")); + } catch (IOException exception) { + throw new RuntimeException("Unable to create locale folders! " + exception.getMessage()); } } @@ -69,12 +69,18 @@ public static void ensureEN_US() { } /** - * Downloads a locale from Mojang if its not already loaded + * Downloads a locale from Mojang if it's not already loaded * * @param locale Locale to download and load */ public static void downloadAndLoadLocale(String locale) { locale = locale.toLowerCase(Locale.ROOT); + + if (isLocaleLoaded(locale)) { + GeyserImpl.getInstance().getLogger().debug("Locale already loaded: " + locale); + return; + } + if (locale.equals("nb_no")) { // Different locale code - https://minecraft.wiki/w/Language locale = "no_no"; @@ -99,7 +105,7 @@ public static void downloadAndLoadLocale(String locale) { } /** - * Downloads the specified locale if its not already downloaded + * Downloads the specified locale if it's not already downloaded * * @param locale Locale to download */ @@ -132,34 +138,56 @@ private static void downloadLocale(String locale) { } private static Path getPath(String locale) { - return GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("locales/" + locale + ".json"); + return LOCALE_FOLDER.resolve(locale + ".json"); } /** * Loads a locale already downloaded, if the file doesn't exist it just logs a warning * - * @param locale Locale to load + * @param locale Bedrock locale to load */ private static boolean loadLocale(String locale) { - File localeFile = GeyserImpl.getInstance().getBootstrap().getConfigFolder().resolve("locales/" + locale + ".json").toFile(); - - // Load the locale - if (localeFile.exists()) { - // Read the localefile - InputStream localeStream; - try { - localeStream = new FileInputStream(localeFile); - } catch (FileNotFoundException e) { - throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.locale.fail.file", locale, e.getMessage())); - } + String lowercaseLocale = locale.toLowerCase(Locale.ROOT); + + // Need to grab this before we change the locale - downloaded/override locales are stored under the Java locale name + Path localeFile = getPath(lowercaseLocale); + Path localeOverride = getPath("overrides/" + lowercaseLocale); + + if (lowercaseLocale.equals("no_no")) { + // Store this locale under the Bedrock locale, so we don't need to do this check over and over + lowercaseLocale = "nb_no"; + } + + Map langMap = new HashMap<>(); + if (Files.exists(localeFile) && Files.isReadable(localeFile)) { + langMap.putAll(parseLangFile(localeFile, lowercaseLocale)); + } + + // Load the locale overwrites + if (Files.exists(localeOverride) && Files.isReadable(localeOverride)) { + langMap.putAll(parseLangFile(localeOverride, lowercaseLocale)); + } + + if (!langMap.isEmpty()) { + LOCALE_MAPPINGS.put(lowercaseLocale, langMap); + return true; + } else { + return false; + } + } + /** + * Load and parse a json lang file. + * + * @param localeFile Path of locale file + * @param locale Locale to load + * @return a Map of the loaded translations + */ + public static Map parseLangFile(Path localeFile, String locale) { + // Read the localefile + try (InputStream localeStream = Files.newInputStream(localeFile, StandardOpenOption.READ)) { // Parse the file as json - JsonNode localeObj; - try { - localeObj = GeyserImpl.JSON_MAPPER.readTree(localeStream); - } catch (Exception e) { - throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.locale.fail.json", locale), e); - } + JsonNode localeObj = GeyserImpl.JSON_MAPPER.readTree(localeStream); // Parse all the locale fields Iterator> localeIterator = localeObj.fields(); @@ -168,24 +196,12 @@ private static boolean loadLocale(String locale) { Map.Entry entry = localeIterator.next(); langMap.put(entry.getKey(), entry.getValue().asText()); } - - String bedrockLocale = locale.toLowerCase(Locale.ROOT); - if (bedrockLocale.equals("no_no")) { - // Store this locale under the Bedrock locale so we don't need to do this check over and over - bedrockLocale = "nb_no"; - } - - // Insert the locale into the mappings - LOCALE_MAPPINGS.put(bedrockLocale, langMap); - - try { - localeStream.close(); - } catch (IOException e) { - throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.locale.fail.file", locale, e.getMessage())); - } - return true; - } else { - return false; + localeStream.close(); + return langMap; + } catch (FileNotFoundException e){ + throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.locale.fail.file", locale, e.getMessage())); + } catch (Exception e) { + throw new AssertionError(GeyserLocale.getLocaleStringLog("geyser.locale.fail.json", locale), e); } } @@ -226,6 +242,16 @@ public static String getLocaleString(String messageText, String locale) { return null; } + /** + * Checks if a locale has been loaded. + * + * @param locale Locale to check + * @return true if the locale has been loaded + */ + public static boolean isLocaleLoaded(String locale) { + return LOCALE_MAPPINGS.containsKey(locale.toLowerCase(Locale.ROOT)); + } + /** * Convert a byte array into a hex string * From 3d05181a1390ff43d66ed8e8b79792bf883df859 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 12 Dec 2023 22:44:13 +0100 Subject: [PATCH 17/54] Fix: Show the correct port that Geyser started on when using Geyser-Fabric on a client. (#4335) --- .../platform/fabric/mixin/client/IntegratedServerMixin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java index f11d3a1ae7d..af11174dc74 100644 --- a/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java +++ b/bootstrap/fabric/src/main/java/org/geysermc/geyser/platform/fabric/mixin/client/IntegratedServerMixin.java @@ -32,6 +32,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.GameType; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.platform.fabric.GeyserFabricMod; import org.geysermc.geyser.platform.fabric.GeyserServerPortGetter; import org.geysermc.geyser.text.GeyserLocale; @@ -62,7 +63,7 @@ private void onOpenToLan(GameType gameType, boolean cheatsAllowed, int port, Cal // Give indication that Geyser is loaded Objects.requireNonNull(this.minecraft.player); this.minecraft.player.displayClientMessage(Component.literal(GeyserLocale.getPlayerLocaleString("geyser.core.start", - this.minecraft.options.languageCode, "localhost", String.valueOf(this.publishedPort))), false); + this.minecraft.options.languageCode, "localhost", String.valueOf(GeyserImpl.getInstance().bedrockListener().port()))), false); } } From f33703929eb8c324551fe0a871d2db2491ab3f58 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Mon, 20 Nov 2023 23:24:16 -0500 Subject: [PATCH 18/54] 1.20.3: update Items class --- .../java/org/geysermc/geyser/item/Items.java | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/Items.java b/core/src/main/java/org/geysermc/geyser/item/Items.java index 303665c793f..92c446f6855 100644 --- a/core/src/main/java/org/geysermc/geyser/item/Items.java +++ b/core/src/main/java/org/geysermc/geyser/item/Items.java @@ -51,6 +51,19 @@ public final class Items { public static final Item POLISHED_DEEPSLATE = register(new BlockItem("polished_deepslate", builder())); public static final Item CALCITE = register(new BlockItem("calcite", builder())); public static final Item TUFF = register(new BlockItem("tuff", builder())); + public static final Item TUFF_SLAB = register(new BlockItem("tuff_slab", builder())); + public static final Item TUFF_STAIRS = register(new BlockItem("tuff_stairs", builder())); + public static final Item TUFF_WALL = register(new BlockItem("tuff_wall", builder())); + public static final Item CHISELED_TUFF = register(new BlockItem("chiseled_tuff", builder())); + public static final Item POLISHED_TUFF = register(new BlockItem("polished_tuff", builder())); + public static final Item POLISHED_TUFF_SLAB = register(new BlockItem("polished_tuff_slab", builder())); + public static final Item POLISHED_TUFF_STAIRS = register(new BlockItem("polished_tuff_stairs", builder())); + public static final Item POLISHED_TUFF_WALL = register(new BlockItem("polished_tuff_wall", builder())); + public static final Item TUFF_BRICKS = register(new BlockItem("tuff_bricks", builder())); + public static final Item TUFF_BRICK_SLAB = register(new BlockItem("tuff_brick_slab", builder())); + public static final Item TUFF_BRICK_STAIRS = register(new BlockItem("tuff_brick_stairs", builder())); + public static final Item TUFF_BRICK_WALL = register(new BlockItem("tuff_brick_wall", builder())); + public static final Item CHISELED_TUFF_BRICKS = register(new BlockItem("chiseled_tuff_bricks", builder())); public static final Item DRIPSTONE_BLOCK = register(new BlockItem("dripstone_block", builder())); public static final Item GRASS_BLOCK = register(new BlockItem("grass_block", builder())); public static final Item DIRT = register(new BlockItem("dirt", builder())); @@ -120,6 +133,10 @@ public final class Items { public static final Item EXPOSED_COPPER = register(new BlockItem("exposed_copper", builder())); public static final Item WEATHERED_COPPER = register(new BlockItem("weathered_copper", builder())); public static final Item OXIDIZED_COPPER = register(new BlockItem("oxidized_copper", builder())); + public static final Item CHISELED_COPPER = register(new BlockItem("chiseled_copper", builder())); + public static final Item EXPOSED_CHISELED_COPPER = register(new BlockItem("exposed_chiseled_copper", builder())); + public static final Item WEATHERED_CHISELED_COPPER = register(new BlockItem("weathered_chiseled_copper", builder())); + public static final Item OXIDIZED_CHISELED_COPPER = register(new BlockItem("oxidized_chiseled_copper", builder())); public static final Item CUT_COPPER = register(new BlockItem("cut_copper", builder())); public static final Item EXPOSED_CUT_COPPER = register(new BlockItem("exposed_cut_copper", builder())); public static final Item WEATHERED_CUT_COPPER = register(new BlockItem("weathered_cut_copper", builder())); @@ -136,6 +153,10 @@ public final class Items { public static final Item WAXED_EXPOSED_COPPER = register(new BlockItem("waxed_exposed_copper", builder())); public static final Item WAXED_WEATHERED_COPPER = register(new BlockItem("waxed_weathered_copper", builder())); public static final Item WAXED_OXIDIZED_COPPER = register(new BlockItem("waxed_oxidized_copper", builder())); + public static final Item WAXED_CHISELED_COPPER = register(new BlockItem("waxed_chiseled_copper", builder())); + public static final Item WAXED_EXPOSED_CHISELED_COPPER = register(new BlockItem("waxed_exposed_chiseled_copper", builder())); + public static final Item WAXED_WEATHERED_CHISELED_COPPER = register(new BlockItem("waxed_weathered_chiseled_copper", builder())); + public static final Item WAXED_OXIDIZED_CHISELED_COPPER = register(new BlockItem("waxed_oxidized_chiseled_copper", builder())); public static final Item WAXED_CUT_COPPER = register(new BlockItem("waxed_cut_copper", builder())); public static final Item WAXED_EXPOSED_CUT_COPPER = register(new BlockItem("waxed_exposed_cut_copper", builder())); public static final Item WAXED_WEATHERED_CUT_COPPER = register(new BlockItem("waxed_weathered_cut_copper", builder())); @@ -211,7 +232,7 @@ public final class Items { public static final Item CHISELED_SANDSTONE = register(new BlockItem("chiseled_sandstone", builder())); public static final Item CUT_SANDSTONE = register(new BlockItem("cut_sandstone", builder())); public static final Item COBWEB = register(new BlockItem("cobweb", builder())); - public static final Item GRASS = register(new BlockItem("grass", builder())); + public static final Item SHORT_GRASS = register(new BlockItem("short_grass", builder())); public static final Item FERN = register(new BlockItem("fern", builder())); public static final Item AZALEA = register(new BlockItem("azalea", builder())); public static final Item FLOWERING_AZALEA = register(new BlockItem("flowering_azalea", builder())); @@ -304,7 +325,7 @@ public final class Items { public static final Item BRICKS = register(new BlockItem("bricks", builder())); public static final Item BOOKSHELF = register(new BlockItem("bookshelf", builder())); public static final Item CHISELED_BOOKSHELF = register(new BlockItem("chiseled_bookshelf", builder())); - public static final Item DECORATED_POT = register(new DecoratedPotItem("decorated_pot", builder().stackSize(1))); + public static final Item DECORATED_POT = register(new DecoratedPotItem("decorated_pot", builder())); public static final Item MOSSY_COBBLESTONE = register(new BlockItem("mossy_cobblestone", builder())); public static final Item OBSIDIAN = register(new BlockItem("obsidian", builder())); public static final Item TORCH = register(new BlockItem("torch", builder())); @@ -738,6 +759,14 @@ public final class Items { public static final Item BAMBOO_DOOR = register(new BlockItem("bamboo_door", builder())); public static final Item CRIMSON_DOOR = register(new BlockItem("crimson_door", builder())); public static final Item WARPED_DOOR = register(new BlockItem("warped_door", builder())); + public static final Item COPPER_DOOR = register(new BlockItem("copper_door", builder())); + public static final Item EXPOSED_COPPER_DOOR = register(new BlockItem("exposed_copper_door", builder())); + public static final Item WEATHERED_COPPER_DOOR = register(new BlockItem("weathered_copper_door", builder())); + public static final Item OXIDIZED_COPPER_DOOR = register(new BlockItem("oxidized_copper_door", builder())); + public static final Item WAXED_COPPER_DOOR = register(new BlockItem("waxed_copper_door", builder())); + public static final Item WAXED_EXPOSED_COPPER_DOOR = register(new BlockItem("waxed_exposed_copper_door", builder())); + public static final Item WAXED_WEATHERED_COPPER_DOOR = register(new BlockItem("waxed_weathered_copper_door", builder())); + public static final Item WAXED_OXIDIZED_COPPER_DOOR = register(new BlockItem("waxed_oxidized_copper_door", builder())); public static final Item IRON_TRAPDOOR = register(new BlockItem("iron_trapdoor", builder())); public static final Item OAK_TRAPDOOR = register(new BlockItem("oak_trapdoor", builder())); public static final Item SPRUCE_TRAPDOOR = register(new BlockItem("spruce_trapdoor", builder())); @@ -750,6 +779,14 @@ public final class Items { public static final Item BAMBOO_TRAPDOOR = register(new BlockItem("bamboo_trapdoor", builder())); public static final Item CRIMSON_TRAPDOOR = register(new BlockItem("crimson_trapdoor", builder())); public static final Item WARPED_TRAPDOOR = register(new BlockItem("warped_trapdoor", builder())); + public static final Item COPPER_TRAPDOOR = register(new BlockItem("copper_trapdoor", builder())); + public static final Item EXPOSED_COPPER_TRAPDOOR = register(new BlockItem("exposed_copper_trapdoor", builder())); + public static final Item WEATHERED_COPPER_TRAPDOOR = register(new BlockItem("weathered_copper_trapdoor", builder())); + public static final Item OXIDIZED_COPPER_TRAPDOOR = register(new BlockItem("oxidized_copper_trapdoor", builder())); + public static final Item WAXED_COPPER_TRAPDOOR = register(new BlockItem("waxed_copper_trapdoor", builder())); + public static final Item WAXED_EXPOSED_COPPER_TRAPDOOR = register(new BlockItem("waxed_exposed_copper_trapdoor", builder())); + public static final Item WAXED_WEATHERED_COPPER_TRAPDOOR = register(new BlockItem("waxed_weathered_copper_trapdoor", builder())); + public static final Item WAXED_OXIDIZED_COPPER_TRAPDOOR = register(new BlockItem("waxed_oxidized_copper_trapdoor", builder())); public static final Item OAK_FENCE_GATE = register(new BlockItem("oak_fence_gate", builder())); public static final Item SPRUCE_FENCE_GATE = register(new BlockItem("spruce_fence_gate", builder())); public static final Item BIRCH_FENCE_GATE = register(new BlockItem("birch_fence_gate", builder())); @@ -979,6 +1016,7 @@ public final class Items { public static final Item RED_BED = register(new BlockItem("red_bed", builder().stackSize(1))); public static final Item BLACK_BED = register(new BlockItem("black_bed", builder().stackSize(1))); public static final Item COOKIE = register(new Item("cookie", builder())); + public static final Item CRAFTER = register(new BlockItem("crafter", builder())); public static final Item FILLED_MAP = register(new FilledMapItem("filled_map", builder())); public static final Item SHEARS = register(new Item("shears", builder().stackSize(1).maxDamage(238))); public static final Item MELON_SLICE = register(new Item("melon_slice", builder())); @@ -1010,6 +1048,7 @@ public final class Items { public static final Item BAT_SPAWN_EGG = register(new SpawnEggItem("bat_spawn_egg", builder())); public static final Item BEE_SPAWN_EGG = register(new SpawnEggItem("bee_spawn_egg", builder())); public static final Item BLAZE_SPAWN_EGG = register(new SpawnEggItem("blaze_spawn_egg", builder())); + public static final Item BREEZE_SPAWN_EGG = register(new SpawnEggItem("breeze_spawn_egg", builder())); public static final Item CAT_SPAWN_EGG = register(new SpawnEggItem("cat_spawn_egg", builder())); public static final Item CAMEL_SPAWN_EGG = register(new SpawnEggItem("camel_spawn_egg", builder())); public static final Item CAVE_SPIDER_SPAWN_EGG = register(new SpawnEggItem("cave_spider_spawn_egg", builder())); @@ -1293,6 +1332,24 @@ public final class Items { public static final Item SHELTER_POTTERY_SHERD = register(new Item("shelter_pottery_sherd", builder())); public static final Item SKULL_POTTERY_SHERD = register(new Item("skull_pottery_sherd", builder())); public static final Item SNORT_POTTERY_SHERD = register(new Item("snort_pottery_sherd", builder())); + public static final Item COPPER_GRATE = register(new BlockItem("copper_grate", builder())); + public static final Item EXPOSED_COPPER_GRATE = register(new BlockItem("exposed_copper_grate", builder())); + public static final Item WEATHERED_COPPER_GRATE = register(new BlockItem("weathered_copper_grate", builder())); + public static final Item OXIDIZED_COPPER_GRATE = register(new BlockItem("oxidized_copper_grate", builder())); + public static final Item WAXED_COPPER_GRATE = register(new BlockItem("waxed_copper_grate", builder())); + public static final Item WAXED_EXPOSED_COPPER_GRATE = register(new BlockItem("waxed_exposed_copper_grate", builder())); + public static final Item WAXED_WEATHERED_COPPER_GRATE = register(new BlockItem("waxed_weathered_copper_grate", builder())); + public static final Item WAXED_OXIDIZED_COPPER_GRATE = register(new BlockItem("waxed_oxidized_copper_grate", builder())); + public static final Item COPPER_BULB = register(new BlockItem("copper_bulb", builder())); + public static final Item EXPOSED_COPPER_BULB = register(new BlockItem("exposed_copper_bulb", builder())); + public static final Item WEATHERED_COPPER_BULB = register(new BlockItem("weathered_copper_bulb", builder())); + public static final Item OXIDIZED_COPPER_BULB = register(new BlockItem("oxidized_copper_bulb", builder())); + public static final Item WAXED_COPPER_BULB = register(new BlockItem("waxed_copper_bulb", builder())); + public static final Item WAXED_EXPOSED_COPPER_BULB = register(new BlockItem("waxed_exposed_copper_bulb", builder())); + public static final Item WAXED_WEATHERED_COPPER_BULB = register(new BlockItem("waxed_weathered_copper_bulb", builder())); + public static final Item WAXED_OXIDIZED_COPPER_BULB = register(new BlockItem("waxed_oxidized_copper_bulb", builder())); + public static final Item TRIAL_SPAWNER = register(new BlockItem("trial_spawner", builder())); + public static final Item TRIAL_KEY = register(new Item("trial_key", builder())); private static T register(T item) { return register(item, Registries.JAVA_ITEMS.get().size()); From 184a14d026f9ce75a8776d4da0787011f76f70ae Mon Sep 17 00:00:00 2001 From: Hasan <52300558+hasankayra04@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:10:11 +0300 Subject: [PATCH 19/54] Update versions in README and modrinth task (#4303) * Change fabric version * Update java version * Update Bedrock version also --- README.md | 2 +- bootstrap/fabric/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b878db64d30..b3471b4d7e1 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! -### Currently supporting Minecraft Bedrock 1.20.0 - 1.20.50 and Minecraft Java 1.20.2 +### Currently supporting Minecraft Bedrock 1.20.0 - 1.20.50 and Minecraft Java 1.20.3 ## Setting Up Take a look [here](https://wiki.geysermc.org/geyser/setup/) for how to set up Geyser. diff --git a/bootstrap/fabric/build.gradle.kts b/bootstrap/fabric/build.gradle.kts index 07de70f60de..83d6a48d070 100644 --- a/bootstrap/fabric/build.gradle.kts +++ b/bootstrap/fabric/build.gradle.kts @@ -119,7 +119,7 @@ modrinth { syncBodyFrom.set(rootProject.file("README.md").readText()) uploadFile.set(tasks.getByPath("remapModrinthJar")) - gameVersions.addAll("1.20.2") + gameVersions.addAll("1.20.3") loaders.add("fabric") failSilently.set(true) From a89aa4e0645153a8c85b9e1fa47fe171bf0e20be Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Sat, 25 Nov 2023 07:09:02 -0500 Subject: [PATCH 20/54] 1.20.3: compiling protocol changes --- .../geyser/level/GeyserAdvancement.java | 8 +- .../session/cache/AdvancementsCache.java | 2 +- .../DecoratedPotBlockEntityTranslator.java | 1 + .../BedrockBlockEntityDataTranslator.java | 3 +- ...avaClientboundResourcePackPushPacket.java} | 12 +-- .../JavaUpdateAdvancementsTranslator.java | 2 +- .../entity/spawn/JavaAddEntityTranslator.java | 10 +++ .../java/level/JavaBlockEventTranslator.java | 31 +++++--- .../java/level/JavaExplodeTranslator.java | 1 + .../java/level/JavaGameEventTranslator.java | 3 + .../java/level/JavaLevelEventTranslator.java | 10 ++- .../java/scoreboard/JavaResetScorePacket.java | 77 +++++++++++++++++++ .../JavaSetObjectiveTranslator.java | 1 + .../scoreboard/JavaSetScoreTranslator.java | 46 +++-------- gradle/libs.versions.toml | 4 +- 15 files changed, 147 insertions(+), 64 deletions(-) rename core/src/main/java/org/geysermc/geyser/translator/protocol/java/{JavaClientboundResourcePacksPacket.java => JavaClientboundResourcePackPushPacket.java} (85%) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaResetScorePacket.java diff --git a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java index e09cad19ce1..f51e7b2ab38 100644 --- a/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java +++ b/core/src/main/java/org/geysermc/geyser/level/GeyserAdvancement.java @@ -26,6 +26,8 @@ package org.geysermc.geyser.level; import com.github.steveice10.mc.protocol.data.game.advancement.Advancement; +import com.github.steveice10.mc.protocol.data.game.advancement.Advancement.DisplayData; +import com.github.steveice10.mc.protocol.data.game.advancement.Advancement.DisplayData.AdvancementType; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.session.cache.AdvancementsCache; import org.geysermc.geyser.text.ChatColor; @@ -61,7 +63,7 @@ public String getParentId() { return this.advancement.getParentId(); } - public Advancement.DisplayData getDisplayData() { + public DisplayData getDisplayData() { return this.advancement.getDisplayData(); } @@ -69,8 +71,8 @@ public Advancement.DisplayData getDisplayData() { * @return Purple for challenges and green for normal advancements */ public String getDisplayColor() { - Advancement.DisplayData displayData = getDisplayData(); - return displayData != null && displayData.getFrameType() == Advancement.DisplayData.FrameType.CHALLENGE ? ChatColor.LIGHT_PURPLE : ChatColor.GREEN; + DisplayData displayData = getDisplayData(); + return displayData != null && displayData.getAdvancementType() == AdvancementType.CHALLENGE ? ChatColor.LIGHT_PURPLE : ChatColor.GREEN; } public @NonNull String getRootId(AdvancementsCache advancementsCache) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java index 3562f0d4d3b..3bc661c1670 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/AdvancementsCache.java @@ -231,7 +231,7 @@ public boolean isEarned(GeyserAdvancement advancement) { } public String getColorFromAdvancementFrameType(GeyserAdvancement advancement) { - if (advancement.getDisplayData().getFrameType() == Advancement.DisplayData.FrameType.CHALLENGE) { + if (advancement.getDisplayData().getAdvancementType() == Advancement.DisplayData.AdvancementType.CHALLENGE) { return ChatColor.DARK_PURPLE; } return ChatColor.GREEN; // Used for types TASK and GOAL diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java index 1774d9c76a0..9ff864101af 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java @@ -44,6 +44,7 @@ public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) if (tag == null) { return; } + // todo 1.20.3 maybe // exact same format if (tag.get("sherds") instanceof ListTag sherds) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java index bab5e59a571..239bf9616db 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockEntityDataTranslator.java @@ -118,8 +118,9 @@ public void translate(GeyserSession session, BlockEntityDataPacket packet) { String pool = tag.getString("target_pool"); String finalState = tag.getString("final_state"); String joint = tag.getString("joint"); + // last two parameters are priority values that Bedrock doesn't have (yet?) ServerboundSetJigsawBlockPacket jigsawPacket = new ServerboundSetJigsawBlockPacket(pos, name, target, pool, - finalState, joint); + finalState, joint, 0, 0); session.sendDownstreamGamePacket(jigsawPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePacksPacket.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePackPushPacket.java similarity index 85% rename from core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePacksPacket.java rename to core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePackPushPacket.java index cc273307692..b84c7a55b4f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePacksPacket.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundResourcePackPushPacket.java @@ -26,23 +26,23 @@ package org.geysermc.geyser.translator.protocol.java; import com.github.steveice10.mc.protocol.data.game.ResourcePackStatus; -import com.github.steveice10.mc.protocol.packet.common.clientbound.ClientboundResourcePackPacket; +import com.github.steveice10.mc.protocol.packet.common.clientbound.ClientboundResourcePackPushPacket; import com.github.steveice10.mc.protocol.packet.common.serverbound.ServerboundResourcePackPacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; -@Translator(packet = ClientboundResourcePackPacket.class) -public class JavaClientboundResourcePacksPacket extends PacketTranslator { +@Translator(packet = ClientboundResourcePackPushPacket.class) +public class JavaClientboundResourcePackPushPacket extends PacketTranslator { @Override - public void translate(GeyserSession session, ClientboundResourcePackPacket packet) { + public void translate(GeyserSession session, ClientboundResourcePackPushPacket packet) { // We need to "answer" this to avoid timeout issues related to resource packs // If packs are required, we need to lie to the server that we accepted them, as we get kicked otherwise. if (packet.isRequired()) { - session.sendDownstreamPacket(new ServerboundResourcePackPacket(ResourcePackStatus.SUCCESSFULLY_LOADED)); + session.sendDownstreamPacket(new ServerboundResourcePackPacket(packet.getId(), ResourcePackStatus.SUCCESSFULLY_LOADED)); } else { - session.sendDownstreamPacket(new ServerboundResourcePackPacket(ResourcePackStatus.DECLINED)); + session.sendDownstreamPacket(new ServerboundResourcePackPacket(packet.getId(), ResourcePackStatus.DECLINED)); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java index e98e5c1ec6a..a7efdbefa9a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateAdvancementsTranslator.java @@ -81,7 +81,7 @@ public void sendAdvancementToasts(GeyserSession session, ClientboundUpdateAdvanc GeyserAdvancement advancement = session.getAdvancementsCache().getStoredAdvancements().get(advancementId); if (advancement != null && advancement.getDisplayData() != null) { if (advancement.getDisplayData().isShowToast() && session.getAdvancementsCache().isEarned(advancement)) { - String frameType = advancement.getDisplayData().getFrameType().toString().toLowerCase(Locale.ROOT); + String frameType = advancement.getDisplayData().getAdvancementType().toString().toLowerCase(Locale.ROOT); String frameTitle = advancement.getDisplayColor() + MinecraftLocale.getLocaleString("advancements.toast." + frameType, session.locale()); String advancementName = MessageTranslator.convertMessage(advancement.getDisplayData().getTitle(), session.locale()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java index ab71636507f..e058594c3d9 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/spawn/JavaAddEntityTranslator.java @@ -25,9 +25,11 @@ package org.geysermc.geyser.translator.protocol.java.entity.spawn; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; import com.github.steveice10.mc.protocol.data.game.entity.object.Direction; import com.github.steveice10.mc.protocol.data.game.entity.object.FallingBlockData; import com.github.steveice10.mc.protocol.data.game.entity.object.ProjectileData; +import com.github.steveice10.mc.protocol.data.game.entity.object.WardenData; import com.github.steveice10.mc.protocol.data.game.entity.type.EntityType; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddEntityPacket; import org.cloudburstmc.math.vector.Vector3f; @@ -114,6 +116,14 @@ public void translate(GeyserSession session, ClientboundAddEntityPacket packet) entity = definition.factory().create(session, packet.getEntityId(), session.getEntityCache().getNextEntityId().incrementAndGet(), packet.getUuid(), definition, position, motion, yaw, pitch, headYaw); } + + if (packet.getType() == EntityType.WARDEN) { + WardenData wardenData = (WardenData) packet.getData(); + if (wardenData.isEmerging()) { + entity.setPose(Pose.EMERGING); + } + } + session.getEntityCache().spawnEntity(entity); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java index 7e774175aae..49c54409b08 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java @@ -33,6 +33,7 @@ import org.cloudburstmc.protocol.bedrock.packet.BlockEntityDataPacket; import org.cloudburstmc.protocol.bedrock.packet.BlockEventPacket; import it.unimi.dsi.fastutil.objects.Object2IntMaps; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.physics.Direction; @@ -47,22 +48,25 @@ public class JavaBlockEventTranslator extends PacketTranslator 0 ? 1 : 0); + blockEventPacket.setEventData(chestValue.getViewers() > 0 ? 1 : 0); session.sendUpstreamPacket(blockEventPacket); - } else if (packet.getValue() instanceof EndGatewayValue) { + } else if (value instanceof EndGatewayValue) { blockEventPacket.setEventType(1); session.sendUpstreamPacket(blockEventPacket); - } else if (packet.getValue() instanceof NoteBlockValue) { + } else if (value instanceof NoteBlockValue) { session.getGeyser().getWorldManager().getBlockAtAsync(session, position).thenAccept(blockState -> { blockEventPacket.setEventData(BlockStateValues.getNoteblockPitch(blockState)); session.sendUpstreamPacket(blockEventPacket); }); - } else if (packet.getValue() instanceof PistonValue pistonValue) { + } else if (value instanceof PistonValue pistonValue) { PistonValueType action = (PistonValueType) packet.getType(); Direction direction = Direction.fromPistonValue(pistonValue.getDirection()); PistonCache pistonCache = session.getPistonCache(); @@ -98,13 +102,10 @@ public void translate(GeyserSession session, ClientboundBlockEventPacket packet) }); blockEntity.setAction(action); } - } else if (packet.getValue() instanceof MobSpawnerValue) { + } else if (value instanceof MobSpawnerValue) { blockEventPacket.setEventType(1); session.sendUpstreamPacket(blockEventPacket); - } else if (packet.getValue() instanceof EndGatewayValue) { - blockEventPacket.setEventType(1); - session.sendUpstreamPacket(blockEventPacket); - } else if (packet.getValue() instanceof BellValue bellValue) { + } else if (value instanceof BellValue bellValue) { // Bells - needed to show ring from other players BlockEntityDataPacket blockEntityPacket = new BlockEntityDataPacket(); blockEntityPacket.setBlockPosition(position); @@ -127,6 +128,14 @@ public void translate(GeyserSession session, ClientboundBlockEventPacket packet) blockEntityPacket.setData(builder.build()); session.sendUpstreamPacket(blockEntityPacket); + } else if (value instanceof DecoratedPotValue) { + // todo 1.20.3 + } else if (value instanceof GenericBlockValue genericValue) { + if (genericValue.getValue() != 0) { + GeyserImpl.getInstance().getLogger().warning("Nonzero generic block value: " + packet); + } + } else { + GeyserImpl.getInstance().getLogger().warning("Unhandled non-generic block event: " + packet); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java index 919e3f59627..c5dba39aedf 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaExplodeTranslator.java @@ -46,6 +46,7 @@ public class JavaExplodeTranslator extends PacketTranslator { - effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_SHOOT); + case SMOKE, WHITE_SMOKE -> { + if (levelEvent == LevelEventType.SMOKE) { + effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_SHOOT); + } else { + effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_SHOOT_WHITE_SMOKE); + } SmokeEventData smokeEventData = (SmokeEventData) packet.getData(); int data = 0; @@ -332,7 +336,7 @@ public void translate(GeyserSession session, ClientboundLevelEventPacket packet) return; } default -> { - GeyserImpl.getInstance().getLogger().debug("Unhandled level event: " + packet.getEvent()); + GeyserImpl.getInstance().getLogger().warning("Unhandled level event: " + packet.getEvent()); return; } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaResetScorePacket.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaResetScorePacket.java new file mode 100644 index 00000000000..4180377606b --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaResetScorePacket.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java.scoreboard; + +import com.github.steveice10.mc.protocol.data.game.scoreboard.ScoreboardPosition; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.scoreboard.ClientboundResetScorePacket; +import org.geysermc.geyser.scoreboard.Objective; +import org.geysermc.geyser.scoreboard.Scoreboard; +import org.geysermc.geyser.scoreboard.ScoreboardUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.WorldCache; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; + +@Translator(packet = ClientboundResetScorePacket.class) +public class JavaResetScorePacket extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundResetScorePacket packet) { + WorldCache worldCache = session.getWorldCache(); + Scoreboard scoreboard = worldCache.getScoreboard(); + int pps = worldCache.increaseAndGetScoreboardPacketsPerSecond(); + + Objective belowName = scoreboard.getObjectiveSlots().get(ScoreboardPosition.BELOW_NAME); + + if (packet.getObjective() == null) { + // No objective name means all scores are reset for that player (/scoreboard players reset PLAYERNAME) + for (Objective otherObjective : scoreboard.getObjectives()) { + otherObjective.removeScore(packet.getOwner()); + } + + // as described below + if (belowName != null) { + JavaSetScoreTranslator.setBelowName(session, belowName, packet.getOwner(), 0); + } + } else { + Objective objective = scoreboard.getObjective(packet.getObjective()); + objective.removeScore(packet.getOwner()); + + // If this is the objective that is in use to show the below name text, we need to update the player + // attached to this score. + if (objective == belowName) { + // Update the score on this player to now reflect 0 + JavaSetScoreTranslator.setBelowName(session, objective, packet.getOwner(), 0); + } + } + + // ScoreboardUpdater will handle it for us if the packets per second + // (for score and team packets) is higher than the first threshold + if (pps < ScoreboardUpdater.FIRST_SCORE_PACKETS_PER_SECOND_THRESHOLD) { + scoreboard.onUpdate(); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java index 3b009a2a526..cef94c98e67 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetObjectiveTranslator.java @@ -47,6 +47,7 @@ public class JavaSetObjectiveTranslator extends PacketTranslator { - objective.setScore(packet.getEntry(), packet.getValue()); - if (isBelowName) { - // Update the below name score on this player - setBelowName(session, objective, packet.getEntry(), packet.getValue()); - } - } - case REMOVE -> { - if (packet.getObjective().isEmpty()) { - // An empty objective name means all scores are reset for that player (/scoreboard players reset PLAYERNAME) - Objective belowName = scoreboard.getObjectiveSlots().get(ScoreboardPosition.BELOW_NAME); - if (belowName != null) { - setBelowName(session, belowName, packet.getEntry(), 0); - } - } - - if (objective != null) { - objective.removeScore(packet.getEntry()); + boolean isBelowName = objective == scoreboard.getObjectiveSlots().get(ScoreboardPosition.BELOW_NAME); - if (isBelowName) { - // Update the score on this player to now reflect 0 - setBelowName(session, objective, packet.getEntry(), 0); - } - } else { - for (Objective objective1 : scoreboard.getObjectives()) { - objective1.removeScore(packet.getEntry()); - } - } - } + objective.setScore(packet.getOwner(), packet.getValue()); + if (isBelowName) { + // Update the below name score on this player + setBelowName(session, objective, packet.getOwner(), packet.getValue()); } // ScoreboardUpdater will handle it for us if the packets per second @@ -112,8 +86,8 @@ public void translate(GeyserSession session, ClientboundSetScorePacket packet) { /** * @param objective the objective that currently resides on the below name display slot */ - private void setBelowName(GeyserSession session, Objective objective, String username, int count) { - PlayerEntity entity = getPlayerEntity(session, username); + protected static void setBelowName(GeyserSession session, Objective objective, String username, int count) { + PlayerEntity entity = getOtherPlayerEntity(session, username); if (entity == null) { return; } @@ -128,7 +102,7 @@ private void setBelowName(GeyserSession session, Objective objective, String use session.sendUpstreamPacket(entityDataPacket); } - private PlayerEntity getPlayerEntity(GeyserSession session, String username) { + private static PlayerEntity getOtherPlayerEntity(GeyserSession session, String username) { // We don't care about the session player, because... they're not going to be seeing their own score if (session.getPlayerEntity().getUsername().equals(username)) { return null; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b651ed0e319..22332880a32 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "1.20.2-1-20231101.141901-7" +mcprotocollib = "00bce42" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" @@ -87,7 +87,7 @@ guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" } mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" } -mcprotocollib = { group = "com.github.steveice10", name = "mcprotocollib", version.ref = "mcprotocollib" } +mcprotocollib = { group = "com.github.GeyserMC", name = "MCProtocolLib", version.ref = "mcprotocollib" } raknet = { group = "org.cloudburstmc.netty", name = "netty-transport-raknet", version.ref = "raknet" } terminalconsoleappender = { group = "net.minecrell", name = "terminalconsoleappender", version.ref = "terminalconsoleappender" } velocity-api = { group = "com.velocitypowered", name = "velocity-api", version.ref = "velocity" } From f38d82c19c865978c1476befd2c25293f8b7dfc7 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:37:29 -0500 Subject: [PATCH 21/54] Drop <1.20.50 --- .../geysermc/geyser/network/GameProtocol.java | 28 +- .../populator/BlockRegistryPopulator.java | 12 +- .../populator/ItemRegistryPopulator.java | 36 +- .../geyser/session/GeyserSession.java | 11 +- .../JavaClientboundRecipesTranslator.java | 5 - .../bedrock/block_palette.1_20_0.nbt | Bin 151635 -> 0 bytes .../bedrock/block_palette.1_20_10.nbt | Bin 108793 -> 0 bytes .../bedrock/block_palette.1_20_30.nbt | Bin 158190 -> 0 bytes .../bedrock/runtime_item_states.1_20_0.json | 5186 --------------- .../bedrock/runtime_item_states.1_20_10.json | 5314 ---------------- .../bedrock/runtime_item_states.1_20_30.json | 5570 ----------------- 11 files changed, 10 insertions(+), 16152 deletions(-) delete mode 100644 core/src/main/resources/bedrock/block_palette.1_20_0.nbt delete mode 100644 core/src/main/resources/bedrock/block_palette.1_20_10.nbt delete mode 100644 core/src/main/resources/bedrock/block_palette.1_20_30.nbt delete mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_20_0.json delete mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_20_10.json delete mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_20_30.json diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 11c7bc11e5e..92377909509 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -29,13 +29,8 @@ import com.github.steveice10.mc.protocol.codec.PacketCodec; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; -import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; -import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; -import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; -import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; -import org.geysermc.geyser.session.GeyserSession; import java.util.ArrayList; import java.util.List; @@ -63,18 +58,11 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v589.CODEC.toBuilder() - .minecraftVersion("1.20.0/1.20.1") - .build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v594.CODEC.toBuilder() - .minecraftVersion("1.20.10/1.20.15") - .build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v618.CODEC.toBuilder() - .minecraftVersion("1.20.30/1.20.32") - .build()); + /* SUPPORTED_BEDROCK_CODECS.add(Bedrock_v622.CODEC.toBuilder() .minecraftVersion("1.20.40/1.20.41") .build()); + */ SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } @@ -94,18 +82,6 @@ public final class GameProtocol { /* Bedrock convenience methods to gatekeep features and easily remove the check on version removal */ - public static boolean isPre1_20_10(GeyserSession session) { - return session.getUpstream().getProtocolVersion() < Bedrock_v594.CODEC.getProtocolVersion(); - } - - /** - * @param session the session to check - * @return true if the session needs an experiment for recipe unlocking - */ - public static boolean isUsingExperimentalRecipeUnlocking(GeyserSession session) { - return session.getUpstream().getProtocolVersion() == Bedrock_v594.CODEC.getProtocolVersion(); - } - /** * Gets the {@link PacketCodec} for Minecraft: Java Edition. * diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 328f61500cc..f185119ca99 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -122,17 +122,9 @@ private static void nullifyBlocksNode() { } private static void registerBedrockBlocks() { - Remapper mapper594 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE); - Remapper mapper618 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE); - Remapper mapper622 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE, BlockStateUpdater_1_20_40.INSTANCE); - Remapper mapper630 = Remapper.of(BlockStateUpdater_1_20_10.INSTANCE, BlockStateUpdater_1_20_30.INSTANCE, BlockStateUpdater_1_20_40.INSTANCE, BlockStateUpdater_1_20_50.INSTANCE); - var blockMappers = ImmutableMap., Remapper>builder() - .put(ObjectIntPair.of("1_20_0", Bedrock_v589.CODEC.getProtocolVersion()), tag -> tag) - .put(ObjectIntPair.of("1_20_10", Bedrock_v594.CODEC.getProtocolVersion()), mapper594) - .put(ObjectIntPair.of("1_20_30", Bedrock_v618.CODEC.getProtocolVersion()), mapper618) - .put(ObjectIntPair.of("1_20_40", Bedrock_v622.CODEC.getProtocolVersion()), mapper622) - .put(ObjectIntPair.of("1_20_50", Bedrock_v630.CODEC.getProtocolVersion()), mapper630) + //.put(ObjectIntPair.of("1_20_40", Bedrock_v622.CODEC.getProtocolVersion()), mapper622) + .put(ObjectIntPair.of("1_20_50", Bedrock_v630.CODEC.getProtocolVersion()), tag -> tag) .build(); // We can keep this strong as nothing should be garbage collected diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index f46a49c3a19..5aa24de1f41 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -89,34 +89,8 @@ interface Remapper { } public static void populate() { - // Forward-map 1.20 mappings to 1.20.10 - Remapper remapper594 = (item, mapping) -> { - // 1.20.10+ received parity for concrete and shulker boxes - String id = item.javaIdentifier(); - if (id.endsWith("_concrete") || id.endsWith("_shulker_box")) { - // the first underscore in "_shulker_box" accounts for ignoring "minecraft:shulker_box" - // which is mapped to "minecraft:undyed_shulker_box" - return mapping.withBedrockIdentifier(id); - } - return mapping; - }; - // 1.20 to 1.20.30 - Remapper remapper618 = (item, mapping) -> { - mapping = remapper594.remap(item, mapping); // apply 1.20.10 remapper first - - String id = item.javaIdentifier(); - if (id.endsWith("concrete_powder") || id.contains("stained_glass") || (id.endsWith("_terracotta") && !id.contains("glazed"))) { - // parity: concrete powder, stained-glass blocks and panes, and coloured terracotta - // 1. 'minecraft:terracotta' is still 'minecraft:hardened_clay' - // 2. there were no changes for glazed, but it doesn't have full parity, so ignore it. - return mapping.withBedrockIdentifier(id); - } - return mapping; - }; - + /* Remapper remapper630 = (item, mapping) -> { - mapping = remapper618.remap(item, mapping); // apply 1.20.30 remapper first - String id = item.javaIdentifier(); // 1.20.50 replaced stone & planks to individual stone types // E.g.: granite, diorite, andesite, polished variants, dark_oak_planks etc @@ -126,13 +100,11 @@ public static void populate() { return mapping; }; + */ List paletteVersions = new ArrayList<>(3); - paletteVersions.add(new PaletteVersion("1_20_0", Bedrock_v589.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_20_10", Bedrock_v594.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper594)); - paletteVersions.add(new PaletteVersion("1_20_30", Bedrock_v618.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); - paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); // NO item changes between 1.20.30 and 1.20.40 - paletteVersions.add(new PaletteVersion("1_20_50", Bedrock_v630.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper630)); + //paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); // NO item changes between 1.20.30 and 1.20.40 + paletteVersions.add(new PaletteVersion("1_20_50", Bedrock_v630.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 2f0d47b382c..265a978ffb0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -129,7 +129,6 @@ import org.geysermc.geyser.level.JavaDimension; import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.physics.CollisionManager; -import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.network.netty.LocalSession; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.BlockMappings; @@ -699,10 +698,8 @@ public void connect() { gamerulePacket.getGameRules().add(new GameRuleData<>("keepinventory", true)); // Ensure client doesn't try and do anything funky; the server handles this for us gamerulePacket.getGameRules().add(new GameRuleData<>("spawnradius", 0)); - // Recipe unlocking - only needs to be added if 1. it isn't already on via an experiment, or 2. the client is on pre 1.20.10 - if (!GameProtocol.isPre1_20_10(this) && !GameProtocol.isUsingExperimentalRecipeUnlocking(this)) { - gamerulePacket.getGameRules().add(new GameRuleData<>("recipesunlock", true)); - } + // Recipe unlocking + gamerulePacket.getGameRules().add(new GameRuleData<>("recipesunlock", true)); upstream.sendPacket(gamerulePacket); } @@ -1561,10 +1558,6 @@ private void startGame() { startGamePacket.setRewindHistorySize(0); startGamePacket.setServerAuthoritativeBlockBreaking(false); - if (GameProtocol.isUsingExperimentalRecipeUnlocking(this)) { - startGamePacket.getExperiments().add(new ExperimentData("recipe_unlocking", true)); - } - upstream.sendPacket(startGamePacket); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundRecipesTranslator.java index 1ccbcfdec2a..fbf4c6f7b54 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaClientboundRecipesTranslator.java @@ -40,11 +40,6 @@ public class JavaClientboundRecipesTranslator extends PacketTranslator { diff --git a/core/src/main/resources/bedrock/block_palette.1_20_0.nbt b/core/src/main/resources/bedrock/block_palette.1_20_0.nbt deleted file mode 100644 index 3593e53e49819a4768d0f743a79958a565cc3303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151635 zcmXt9Wn5QF69z#Vq>&boE@>pCyQI4$q#L9=q@){EKv2575tNkfmhNtN&pFrke!278 znVoqicRl}wJQ4{8`tR{?mirsk-?Ke9>4iw)fq_rGo_h5j%z7R6e1Z=T&P;{J(x@nD zNvXMPtgWfM0RDHe=ykYoj>nSUruCvlr62n3lMaH-lPyB=t(^?Bca96wsG9G!Tc0TD6}Y^H15a!hnjR1R`??DN_FaKa_h z?kR(jFw>q(nB!adh0^kmIkw5VLGgZvGU10A&zIV_tG~U9*1;;~q<7tTXVTQiPE^g8 zHCm{AF`54E#FBTp#I>K{ef#2zv&bb4cwQO*RT$=i6r8FE4%FfTymG%bENXF-D^@4<`T#;T^ zZ0IPK;R6cB=R+eG+(F^G{F~;1fp(F>d~%*GS=Ot|)UV?i1J4?OT z0a%IVBBX zHDz_=(}FCP(3=uameEG2ERXwWZcOhmFt+Cv2-(7;)Ecy@fJ#?rihyBtFwBwB2&p;H z+m8zY)#xU+xl))ff8N-sz2%K0^3gmCNSnEn%U_o{elBsn`!s;No6ioef zKVIV3{P7bD(Y$<#@B8uB+h04f#xI4)i@DuM(v@O9d_&Gm!DM!iFVQXeJ+O@@YZ@&2 zbK7P1O6&JQj8`a~`myeoXx8bN;x$?Ebors+(zy|yhRt-1!LGqw2p;hTNy>gJLAgm6 z!3bgXhceTjp{!quI6e6n7%sjoI<9@>tWU?}_cF1;vryZ?rI2kAEm8TA5S>o_`;Z#1 zA-~t>G2&?^M_=aZvpAU4Bt}`zuW+V+cDi5(;*dYw7q-_wr;J7*EzVe@ZT3{@aOAWa z_g|MhFX7l$Q>d0KSo;d27}B6b`*r!3>gN?RjF6o_0V^X%0k^H%h3!YySJGe5NbpF= z&<)e7AKdxWyNXtr2-16LemZh~U$~TCnBs$_wWd@Imn<8l6J-`j$Wk{S-@#Ln%{u5c zp>Z@ewa`AwAKcNo!gau4Uo|n(@J8V!MvmIY2~mRGq%LveB}vTgTy#1<3?H^XrvJ=> zaZq2{Uf|#8!MAP%BlL7!Vn4bmMplf1_9)WTnV)Z2^^N`>eS;Sz!1^iWv!&*ZQi$4{ zKn9mzP`*jP8rI156WIKG{!bMwxOu(Sx9$kg%5Gio*xf?uU%i^#-_lVF*NFt*6G#ocaECT6INccdP?3=8%4KmhLjIJj}4th4@ZIT#SauM!lOe`EjqX0PVIP zNfQRQmHNst;!cgEYGwXKIA*q5FJY=bOfBI#VC23qyzx*y>eju~sggEm$gR z+^#Aj|1AhK_=|asnm%g@X^(W_?q)OjGZk?{6bkdd5wC%>oY~-pkqv1i-u-B zOHQN;i40mUqU9S~_P+_Q_g;Dv1hcaZ(f;P=B7mrWoLc2`2PRCnaE30YZxkLe&3(hT(3vMR zXw9chtuEUeg5V>lHW_P?dnUE_Dqm>a?k&Y4Da;o=Kc}>eQ5%gPoxXb(zs$CM;RADh zn^5$VDX{ug!#s{NJ)7dfN#BOmKN|MUNq5J57t>qT8T=;Qt@vH6+0K8?=B3HzIEBz0 z^8pi_0fo}*V=W89WQO48K>sVX3~ z(J#OVWV*)Jv4R%$^17;A&^#nU6LD^Dv+IXJG54&BCT5U%_cG!39fZ}aH-ZpKY3FX} z#yc?hU5a?j?f#nY`&4Ge1h*za@p91+%+`%k^w;d zmWU%9-`4v!?xZ9-OtF zy#y`tJ_f4fLl&p{ow*?uj44F95WrT$H618&h(Tp%=Ix9E0MdOA!vEr0p``csIh2Rr z9R-?@{3flJ$$uvG>UXy%A+Q#`$9^y;G5PD%(S*A*j^v*ouCrZXdVo7z14d6fFiB8 zr|%3D5lDK!zv!xiObZR06gOl5M!1(sZ{~1zaq~cf^=sc`v~GJTPc`4HHihnOL%!>q zg?)!W%+{F-LLhSI=1k1qV1ov8_G?k)@PG}|^%?F>9H5+IZO@!HBv+=Y3xpZc=D+#0 z3Bny&CMfvZUlVEmYgo5m8*?^P0d_9eq3KXRwSGN#0VR9lFM0!Lel=pyo&=}_r104D z$M#NbCeUM#-AOto_3!~h*ofXlU5*f_ii{S6&xMpgH|ICRd4bu$?)UWNL%~~G{2>!8 z%(91Zt|-_t%zBAu5yFPetpVVkML}wWUEgdl4CL$c+>gj$MGJfzTUdhdGl}gKLc|k7 zL?4rOMtHjsvDM3a0@LrJfSHU#ICZ-7Ku}MNCwF8>l@@$A&g#j39#0oPTwXB$1Y3n* zu*kaipT`*p)dzjxVhWiXGNXMll;taO%`m8nZH2sWp{bQYy3m>cDn8)d!PfBQiMwXB z8A4tcjLAm<$QO>cA#hbtG}GKdYM{}V;hr7N6$nLSxLA!0(n9_`s20%sq;8ACk!Qx< z3<~GGV>Th=(`uR9q7fL^mZ&K=NEyXgQ80uMLh+LFpyQjUhAc9K7; z3MT1l;-{b%RXFIx)#_xb6O{d)Idtt`*Q^eaWY|1$`j0^WV`8>73H^b#9w;0C!H4oY znbE-l$*b*lGX1@yeQ}VwPC0pbD!x(X-_7VW{_|}Jn3g83-cuXsi18s4rtbumE!8I? z0^|oWEm?vk@W!8Z$k1& z%mWInN$>B=iq-+K_%>1hdb9uGQZHc2@TDZrX;zF*cV z#_@c4%?KaP>fSo<59QIvo@z4XgEXYI>CY7*oB^!;2rA~`>2Pd5O8gz(lWrv;T#`XB z=u>IFc)O^@kb-`*^a!rNPoO_;Z(F->*q?#^tkMsmKLZBn5q=BIv9RLQ6cpy3SYJl4 z+)O6AsI~YP{{v7<_V>S2aKHW;BQZR*yTgk}3fKYdCd(1~7lHZxdLE5hP6*4IXUiUR z_AC`~q5q2jN!>c3hPed9A10gc;$u?)<9X#4x3URUc`NFzQ5G4Po;ULsBX9p7110o` z50GEaB3#@5?*O%7BtKC95QN%L{t7h_NY~!jgdEg5UTlg~kkZ)nSuH9gD2eBhKeY@4 zp=>c_>_oY8B){|vfpHYP9!LTccid|FtXxq(0V;@nF2esp7<>^MTinsuF9+#gsmL9H zI$=qm$n*d98!8U}Z{O%am>4>Hr25IaZk{kg;bNJX1CA3YoL)i^g8g8Qq(UERvj3I9 z+%NNSXfUKSOj$u=$k6Ww{{I=ICC{XSMg+0^P?#%27KHg?Nua{%Kd1-7J1ofzP+@3# zpK->3)gr{qA9?;%0}8d^kD3l55r|KKir#xuOALY1ArS5Ve-3|G!##tBi7|&%7H~cy zg~Ra(cl|%qp-PhYz(7R`N32F4hTzr3W}fr^E5Hm9I6!FD1MXhOOYF?HUs z$AWX(P}b}0Cm;))ulA=&bMpZdQ2D3tN-aS*uBW7irVG~4mEl(7`=2;atAWXh$x0SI ztYZtK>M0-v9#j=wDXss`o7*ML1E_>!-Su7myBFt<>HoXQ+<87cDfW7V?iSdz=I?;q zK&P`r&5(&15)kLk4LM9IxmqY^Rj*q*`nrJoK*->wJeBM?bnNXay^lFJBLf3g!R<9J z`R@RD&|?5<57PU6yVV8i5>(eE|0FzJAS4;A*$?44@!}RzVNndx$jfT`GeI>p-vN#G-f(x+u(r#dKW^aw+|K|L{1d+|AnqbQ#@n700Bn8#D2-^5K8ZDnc*nyh|MrDiWN8Jd9&eN|aZtMOn8nd?uOtAg|?NaCVE87<;zbIH;AUm z=)Zc`TmJjS6T8rDFmX{HTF)<_D|V`aa*kuD%>`O5)YC=EcYXw_7{r7voCRE*rUZ_`OC z=(S|Z;ut^qOK0ZN=PAE9eTPzHVffsSeeTmlWw3=8jS#<9uA1ZTBzQYc7cT1rp~;DD z)8!tfNFiE*N!H^E$w*VJhc7=faXTbS7zE5<5j0rdCq<08_5~o;b=@1%!2e3gW2;{_ z%AyX}$z@A*Nw%P8QW_^x_zfT5FF=V-Q=*d#eBHY7;HVP6h#Iwwwo?29hp_a6H-R17 zB`lTyL5!YCWGS3f*8|P$i;m85 zy0v~65+Z_RYuj`86v=p{c};nH=?<&2Q@b}Uo}-^4 z*cI0Jkx+mhlfs4%(`|F+=zcUf3H5xgm3RRew_-Q5Jh9Pm!ri|yTFw@e>e($H zjr8++u>V;8NmZ@ga3`+k%9^Nhop2hsK(^{LW&3h`8%iPBzZ7q~``b*r#$2KM((lKs zU`O+Vxp5JeQ`wVCEZMHQwh#-v7=%Z9=A1j>W72EyqUvgIjK_$>y{X!w{B`F$C2wu= zrzuIv!`s5g_dD@^Y1Q6Cj}c|(ZD|8c=Z0Iu*A0cJ0P&0Guv$zo`KD}8cbRZPN-`M4j&(nwmV?)I7ChmUt=gPw=aTyE_9u6nK#o8<}~zeNq- zmhRH>-Se1vTVy>nD}hV)V{29RTW3p&#|rf=ru=gE1ULQr#$G*;vhzX5H9$SLz2)lN zQWdDafXnP7NEq&o98+lltec|oo}H)8J#gwAIs7dgQcrUHC=JE)Zf@sXLeeAACg0=I zWU=$kn6+f2acKDlahx`Uw)r)BjY`%0_VqrK%*az&s6IcC-=Eqy5goUQP{G0ABz!%T zIe#l~bk^p^tDA-6lyTM6Ja%$N`@w*OC`v~)c+~RxaVgR~e(S7#gDkC+j%ub_X0@lJAf;i;k*;v@G&jkY9(W?8y@p!S3 zEDi0Yd5mX&;G=YLQ~VQ!vFK%IbaOQvT57Cpqt^WjDF;#TEMC35ReUP`qpH@pBQK6U zE%Zm79epJY#oLXSQnZPDNoEeRGtSX$W+koP4zgP%r;1fd43DDlX{uDLVKo@XW&4HK z6IW133DV_pHMJ#!GzwIS@cI^Y66DFyQ+yW=FC>uWh=ZB=E0zR<%h_JoL zjf`W|bYAHodfuCFGdZ|iJ6`^8bf0A)+(wpH%24Ln?`+$( z9u4-ok)!6tn~QhxQ@TQ^IWaY!Zez@qng6c zC$bR`_ps1&5)T!E;4Y$*sc(Bs9DeO@ndYp@=@OA}M|>e+sUHEpYd?3}d9VY&XLIbL ze^1;YadLXx;`i;K1!UGN)y95v@_rV|&L}G==zu+Uq%S{tfrjDrpyD%gIssT>F?35< z_zZ9=%;npcK+&Fyed{E>$)fXbQuZpfvU46Ws_?exOmfLFzE8}|2Z`-!Z@*28kk1Hj=YGvGMS0w7L zWiK|JG&cEKvYEHE6_3AB49{WZO4_nJdq#^EM7_$BuP=b3(e*jyk_(*+skBSW%G&&D z4R67&tCc`(^cF$8lT_uz|Vpz%(SZg`SGwb`PY3>>ettB)F@Bu%7olw zGALE(>b;VDeo7Q6HJKs5=iBPwui_c*kqu^7%jIE=sHHSWI@z%}zp4qq{2Rn6&qx zW_~^YVdtW_mQm-o@zFQdVMPhX*YoE@uEtl)fQDs9yIu0nNhFKdyXw+H#3g@Uc}(hN zYmUfbu>PnKsxP1ecMWf56cq`m^f#S5#DjzYFH%4nhx5u+!6=}xbf2DpR*KECbc(2BJgccjs<$*AsEutEoZ z%|I*`u_un{_=p}B^&8!@6d)A5X8X6IwJN^Y#(XHz^T#75nhKtoH3Jr0nY@J_=rn9J zdC9Yd_Bl27&K#^b$8M;E-u4W^u-=Rlw?1QZll17c+et^%s#tilhhD=Y*!wXHx!d5l zzgZ4gS`q0lkh3@Wc>z-~*Cg&m6TRP3`FrW6rnLQ(mcCDgI zn8n>&@pMn$)MwS_&sUNq(rCs~T^xr#vC~}V!N~qQB zClT6weHiiW&#S6cDawymiTKIFo%?xgup?h31*KW_Ik%p>a?_RAMO+mNCYhD32|xB1 zrTz6WyDK96s_?i@?XE*Dd@(cf?I8Y~_2cmXyzhXhDCPN=IQsF?m8s1VH(zfu+(I_? zsnaNArQwXcj@Ma}xaL{KN@tOcXep9H?cvs^BMs?oy3|hwzUgzfZAWCHdgw4{5n>H! z-^DF|iaKvi(Ayw;jKwq7@hPOC?p0Sz5uW`-$gAaSFNeF+iAF-gY^JH13cL%*wY&^% zTTFPOm`#*UY}jx^XTEGB6ySU=BL)8IZ@2h7BLn=^A0dP|N^%F&$zv! zlm~;ntV1DOW8nD!i~UhRnlx#ko-^&8VWug<(8gNJVNpE?oP{&`+8bMD@HK)u?XSMK zz(WO6R#IKn#VkVJj4mr(t6DQ)d+A+%KOFexV2+!8Nga6cAUHTERLKUQ&Tu{XkYfzK zRM`KZ-}DO9W0=g-pk%vTSI}S@GRbNIK3;g(9w7uDI&d5kc_o6lh6RW5^T8JnnX9E^ z3Ls>J2cIKcaJv|LbOZEAgKfV|<1oGIexmKyj3m$NY@G4rM{A5o?lc(#Z?|oO_MJez zT1|@{2Si!<^_eA%br1cXRy6sNdp@*6} zSG9_W6KEMUGA{~Ok%>D?uHyV^&fB`2RP9nybXD;kbd>7LF+HJ9m?32XuQw$ z{>8o~E)9ppcww8n^@@xO&BP0D6fJ@=jt4%xoF{Gzzh%cfyium5ZWYLGr9Dx+;MzZ@ zs~W5VKlP)1;N64+f9emH@%sh-kRPZ-;K?i)64VkQQZcUtuJB!6Hbg4Hx{f>)-*N%3 z0U|Z`5-f+@J&H&r2{J{vcTW@2s}IZ9mC>wRhSIEDIgiT z*#({^6h__)$~#`+a_=fG`In8V^3IL?oLX4d2Mv)>{V?kUv`D9v*g>Lr3_e)f^m=<+ ztFa0cAHc^8_#a$OK|`qp?^B-UJlQcBEa+j)E0DI3B5;hI6R^ij+#tkk6V1&%dD6N=F5qLceERX|$V7}7+lf9APjhzqFc zR1?+}0#KmZB}-v|Xf`GSzX6tvr3gw6CepwxsyvDu$6etn6GYP{XZZsQD>ZdSc-!;> z`&*qPddGDsa~WvMdiF=-XC(nJI`jvlR_BF`F`yRKK2uP!j`W^^Yz-fEG_C z?@?C(bx|4GjCE(Y+WT83E{vLm(KwbKCEyqpDZaBR{{H-9%CNqX1HPXrd}VSY z0;G)J;D8@fuYW3ru+M zNNjHj-h(dxkkro(2Gpr+Z*7l&vLnoLH7VJYDL`3Vt9>U1U4Df>F%Ff`WOD!*_fGy= zm`>t@c{i81YZt}fx_hADJ6p6gf_dfvic-vv=fAbDyUhgX`2|OHxu|Aq&zM1Tvs^7$ zpt+Ibg`io`T&$3gHjSVJ8GmE_((2F?&>_viR-5jE@`k$Rqd_8Yfvi*?%kJ!NO>Sg( z4N>r%0$}8;MG8_du^?z}lp1@*4F~A7UpuZOE6FxO{EbIwbFmJl&)>e$ufK00UAf={ zxY9Z2tic(7!5zzba=|!k*ZW&v$NgiF3W8n$FOfP#YA_YM-vHLW2B2dpB8mW1n{^vM zfDM+vaa!Pf#utRrqB^SIQ&28bc7L@?2rlH$RZ?WCFjz_vFpAw{4bg%7xYAImGWCN1 z?{@1F#d(_$0LO(SV0&9A3o%~eXY@9cRBe(JnbBaPQEzSf znFJ+_`5Uit|19o-A*%XV>;k4U)r*}49JUg1UcLR&N-EtkEGQathTs7Bs`jTQ9h8M# z8&>ZDWO-fM$OEnMfRLHugi`YI0s-LFc4g|c1hEXwX9d2h6a$d*JVf3Ang(K648(^% z0zv;B>2&2T2)1ZfbFLWJcA^)_vy6fgj{J>V9qN2wcYN7OvjA~~Fi6FVGd2mfE=!l+WXiu zT(i9`%B6z0b6`o|>Ed6b0yZgo;{}S2fMkBZui{S1{#s0`&x_wbg8;Bref(9?!D>;m zSl9u375BjNTjLq-I-usUF&7U+DqGwz1`npvqmj`STrk)orhKQyY%fJ%Us)&qiv^Y5 z=FUV@Dmdx~P{XTLiV>gm@c~3?#mZI{l zFk6q5f5xyl?ej)~0E`n3r!06n3CMt4w;C?s2bbx;LCFw^-i5<-+Cl^lsyw@OfC8&> zWx<)!TNf5^E^0^_W@QcqY+9+ClgRvnLMthP8QcJ85Xy;bNfQ|u_{&Bs#$$S$)|}Y~ zF44(sD>oO41V71NM)2TTV<$3222Ni2wXYRFPw;>Spv%NB+7`*az6iKH94xJ2E?$5} z_hU6En^!`C;OSa3i+apG11zA_5`G0T8A_^;d+i*2>6yX${1K8(go>VkM56}F}qT;1~ zp_0b^l@dAh4+7J;U&gm_liN7MBr*m*E=#*slI;*kXduU6@xE>Zscz<~A2hA+n(Dbq}UwfIn z%U>sKNlc~>>MR`JiI3hPdsMYn?>9?peas&%zT=i{4@&B7-N_66G#8ZWv1;J;oq}Xf zL_Xrfq=FTalozI4tU2)uuHXd0@FbOouDno(T0|A|#f%?YEnORLhMH*CN4yY&=@!ov zk)vz~oxcJ4%ex||dH&gm-?Uc!1 z+j!==qn|hG|C;MNr2*evybUFfN}1q!&>P9#-((V@6{l6&iKF*yG?_9|`V@A&8LZwGJfY)yUYPclcKDGVJt}kFfrYzQW5pmTm6``pD8rA+3Yt~{yB?v_;! zAg(#pE19JMLO*d$!2FvpZaw1Ixn1LusxZpD{Wk8ItNf0XBdp47v>y-Wd2Sw@irrwb zX;RkcrMy;DgXJR+vWgR}WJI`HQ7#^qY|FZF3nvOyZ(2g+7DK<~pB)$3T+ta_>-gWf zBI6;Brb=?;H9P|9>_@iGwsU*@3%3ueEBaPfG^g4oBMA8AkyWZ*N=`VNE0o8mh7{N+ z-PY88o8X@$If>KnFDN2UJ9>B7O`Aa_7VnjS6#LGW=v@*6eOS(o$HeV|C$+#htqe7_ zT5Jp|9(^#JGowvB3lZ*{+yvSaIRbRM}&VG5mqZc9D;5*^}P z6-Ko<^N^1m&p9O{7VC#1e{rPn;gW38IG0j=7wd3zY%JS^-%)mWZmVA8tu9cA+v;k| zO}(@QVAvbGsaUc^)|)Q&hamwzxD7*Y5RN=kjfeDRa*3|3Pxl&CN0-4ihPDk zXmj0l!qf3vv?1+v&^iw<$I_yAh0s_EOhXpt`eKRo8ib$mySW?cUUg zZg5gu$D3>Re2h*_wne8vrZ$_zb?J_F;nI-f`0QwS;%4V12J)PRQP$Vfml*F)7smH0 z_JNh##U>2Yxjawl1|wYrJh~c@)lcQjyDr;FH+YN$HvKk+as{p4e*dN#H1=NelHAYsi|p^1 z%@S)@hKf#viQ~JmqYuU9Gu}_Cn#NQ$rav#vYC2d2bkWdG>bADnBLXt#wcNWiZpGyy zEfN!RT4{LPg>}fc+0VXA5bW&_rC2uze8S_-$oos4Y+xROzB72XNtWkpm4m*spOb|8 z07`A|E5y365kPH zE*i#+Hb|O}!fNH98(XsCp?AM%|HD|9v!v)zZ@Ai(n?-SV{n)k?M%Vc7O&v%o&j>dsB-LZzb>K)t3xYp z&Xt)D2^w1VQOwtPB{T#1a`60z&D?BM+t?j;Ek{cMI9u2=-sa7J;(ths)6a(2Lu!fh5n2;)c>17&>oQ2 z#9SNL-wOLqN+sy+$Y$OiIUW-S+g<bOBSyA+9#%5#)?nY`!;jp5IMpGs(2)Z6$VkaeWuIs;pgQzMFPlWD32q<^Ty2-tKyt zoz!wcVh{OpS*CcNVy(wMiMH+|QcHQ>;ftJM8?+C)?)iU3j3Zh2T3xEt|5RkpY2p_N z#c#f1BCtsdwNCnNYwwS^IX&@vr-}RnfxxVm*RTp}_UOy(H^|&pYf3hBuD`RU9g?nn z=gd_cJ?}4pmjooXf9N=66J}0~6wBiJ*?n%&;VfjnhfscGd1#wWVR?j&z{vwK|M^qP?X0%MoIUGp_P>Usee zik{A^s;2A{!8=$!0pXbJISbVvwmh|7gU$nC@rhZp&-)60e zg1RSA5|b8!QceZ4&0w@^)~1Ee03!k0Om_8tY9xqh9OfguhxLn6n`LW!E12G=9yUic zhtWh#YA`XVM{54_mg)W7Z^LKbC|8+&k&+*Wsfk-oun{o@052++Ph2)cMKFBk!S`-X zws?u7{>Jvz^oh_{8qhJ$=h|oYF8CS};|M`w+5Ly*%CO@-f$Z++89>B5#X5@0=FR}? zEpcxaIE62Wu|Kl3n+81<j@PurNrN6sxdhx(Wpb?j)zS7x`=0b9BA469C zArci)9dPye{;+jGD-|P}#g`|q;M;X!HJd!@E0kgBFxuDr8-U&(7QI#>@h`a3XV0AZ z)vXggiTUdOr-Kw2;^*Zpe~Vgxq|}If_UlS#13gnQa=Atv0;m$>&)TOa8EJ(uI&1A= zy-9o(<+xwD(A4;@EwP|X1al)J0RYAk0w~kB1b|r8uq|6|Do*22c!IV~2O=vhI?qV_ z?cqHpb0YGO{DkO}%k?F#0(A9a*((T7a$-M5l=!3jaOMD&g!}Z!b6GdZ-Uo=k#FM)& zqXxq$ATU7qr;Q4inr#22;?3fF(%x4UxL>(3T@DZ30wRb$b7Q|_nu5JWV3R;UB3g<2 zhFWomsfr70k9TFwMMU$%f7ZysXIV!W$knXn(e}|v&e}t`7GrUx#<8>B3oKpOu2aQ3 zzY30*S##EcFI2J<1dttH*cb2#n7CnQ)$8Y0)ze%$5CPo)*x*Fx+IHYO{S z;Q(3{F6`?<-Kz?guRJ7CnSW;5#qs_SKQnPRr0)>NQzpTzWhN#V6em?C!9w}bTw(uK z*%gjVOpQmt-zO{d2l0`bNKk{{x|wl=xV^M=+sq0RD%Tr(@hgrqOGJDt|5g8^JnhG) zOlq({k3SENH{JtSJi9u&r!T{_3t>HTJMIkiM|cKaHfT~#qS({beYH=Mb*d1zd1|?l z^n6hC>1R6sDMVD;hZ=5FE`LhcMIve8vjq;QC$6|KQeEv0a0{iVk7~jVvi2d zr^>{L8u-x}J)MHJg=K4hqC!p{FN^=K_K}--Pe+HGm{tpyJ!RS9wWdeK z^QVAWMA53MT=xW89+*lbN7pY4%KlBLwjH%4NBQCqOLSNzo|MLJ@uz=?;BIgkg0ljX zvY&Vemg}J7xZxXkVlS7#?r+u!{}vRB%{n1| zpOQ6h>ZnW4V`MQ$ytYx;C$C4=(IIIKSgHcWg8@-M`IGeGhV|c~*YBfYENJmMeEI1{ ze6Zv2w@96lZx=p`PsxaDw4aw$rAjvheuXi3mg&AhfurrN{IXpaF5`qw4hRb`I3n1R zG#AakJaN$Tx0fm$sBx8N3MoW~52b-M275T}^TMH+9GeOp5X_}pwd*8kJPBxiGhMTy zuIc#v?tai_zAT@c2)D`W^07;XV!QaLqImByEJ1Wsy}d`SiyfF#z+U&Jz}f#25g8PV zP^Anvj_|}#|1k;db;r-%?aF)4IHb>fC>>cWhp>b1%`hTbm0p(KSv&PynEjhfJttxP zfU@ULmP=rk4Avio{}Rh)kpbg@pcmur@sq7|<;kt@cdTw`Fgg6T`0ES}CI{xMJ45J< z__QmdCk8ez-7EV9){EZPbd4~v=mt5?@VBQ-(2R7tJmidplCV5mO}(#0CtRZP!m|7j z8AyjMW;n8N`hTayRw+?sl`?E~sQ1DOW~}0y27hj<{R@=R1*)ah5+MW6P)t1!|h z=XBKp7!g!2zVFQJ3z1^eUMU2Aa^u*<+tCJrg~w0m|j-4YkQOlxJ^J67+Nz72Tn;g>HF z6v=c z!4I=nk+89tU0vBrtq5VbHg%!V3nSg+*pZ+D$G z2`IbU?47s0HY)87)1?{3lFeFe@@0ND20ZV=|3x)wH2Pz$Kt<&Sel7ODmtA&a%tOi1 zWaz~nWg*mXTO)7gTpzXSUkDOewkWOV2Vq(QpD_j_*ORQraswJajMZw0d2%ZA9JX=W zh{X1o|MK0^VWd|GSVc$W|C@PE7eJ#+sgOEaIJvb(ki`c)Uz;D87_^U`7=!C1_1u5o z#<{ZnIzcOcvJj=}E?$V!SDfp;SORfWLK+=kU$a=WUY^1I{*un)fXS9@mG*a(TejV# z{?U6R_>dyBXqR@_ zhFcP!6bI?oN733A1*7iBPnIb@}B3?fgA_hf@F)WreM{+ z0QWQNEC@-{gtcQV2;k8zC06L@xn#j5(gc*=T~?IDBMhhBOr6}q6LMr zb*_?dKtf2!?m+y8MFd8#%;3=uG^aIYr)3DP0RMa_b+};x{+4YS_Tbw03kbZ)!kgp` zsMAX!qE#9sXk*%NWkEu4*8UuF+YrUo7LXauC#kJ)slMfZeB}48 z_A1b!O9oEzZRrM(Y*M060E+RQ>}!WbKV z2nK-ExAov`d!~Pq`((+xkj8hW-;4OxpW%f2Bn6x31I;8EBL=f5%{|q{01{22OyV{d~t6^u} zp)P_7U^t)QqoD)k@I-ULm?6Gl@FQnFSY-j|mBdiNw||C{gLZ+%^$Q2Q0(9w9h&-A=IepHnE&((DXu9?kDmd#7Vsp?Jy*aO4OOVL)+g@OUSWaTY zDrfql%Rl(xhfe2?biu`XUu83d#b9ihGFvC4?E&BkJ2s}refRb7HrT%gIfij|gy93M zumSxVdLh-PRP1f=@CJ2WmsX(a=4<6Nc~FbTyILpd?SAo%6#w>8*WnFdpuo4Qax03< z?ofg|+y=P3;C)gs>v!xp$T1v8ppMA>s4dNE2JLa|uQT`x?y;-%`*aZ|0qPkPC}TUK zNrb7_Eoqzsn!jD$9m(5IW7`1oCG&Q51F}3nN-I4T4DASl>t}(&7*fw+21c*^GLr1W zzpc&p=V=wt*1Gx|X$xP#Zh4wqHv&6kWAKFXHR!QJ)sCJ86h5v5+R+wsDBkM@E7GjJ zkO@OOCT6JVr3`=9C4|os9O<8Ud7uBBDBtm!I0dxBL26=9beeL01R88v?z``=8Bx48RPHI z_0N8}Ngz4U)9-wdk?u7034nnDDauJk1jY=2>W$G_ar(@EQOk&xkPOAh1v66;YiG7x zBnaQ`&P5C~H4qITeB=C))r52)=0#yY+JBhpJzMWO{?*xmcXvKM2tOO|{Tsd`CQ!7s z!G;lNEie{GJ2eV%7y^+4tj4GK^s2f*yMqXpzxfgC^d)xw!3L!fBjC_>u_7DHc3tWW7SPOq z25#0~a%NK~A|*~s;*A2-;3gIUb|j$hK?_>v$3JauSYXQ<`xBJH9lx21Ae_n}!T2#X z*;0WK5o)2fqyq^zZGCG(ka%d^7U6_gXRer|<}YM?kztq9s1RPr1iowwhHzH|BvM)g_a_EPZ5EiA<*PH~PN zW~He9*1sO`&*RdxnrSJ}V}WTNc7C4}f6axb{W*VD`@h>ZUNZA=GHtv z{`2W_#t|qf8Nm4x-o~~!vY1kkwG6#*kO(T|IRS|H*gK=BmP zyeLoZ1Bf^8u)MQYy8IVxy|0rinqax}7WRz|Lv=qK@I@L95sF9GhxrF+!fnF2N~ZvS z1_=~YztZ^-bRp5@=F#GmNsXYs0A3}K*Ci~B*(bBhrrx4)#Ceng2cVv$VeVBTeCOu|oNB7(PT4CH~8=F>NSZxg!?Xkd7~d(TT6p zz=k<$aL&;A2iU_P!A&~;1yDdRdIjpW3ecXd)8OY&R6ZMX|7RD*;cQ*M1#;|;7?m6t zodHD$uPA!n<&OM!Bfi+(hJx)UELh9{+AHP1J|_m1G_R?JV1sHs)GpTSx1j?oBlx#q zKZT4aG;Fsv_HiJO6ox2=!GM9lJ6|f41sc9h3OcT3C(`klX@;HV zo-^k!;0k^q`Df+e2|*5oWf}%@Isiwz@u_WDpZWz5rzgvNh?k`Q&0UJ}+|7Y`5biXW z>7Y7iol!p3$G@W%^RL$4G zRS=X8>5^8uyHQXO5NQyQ?nY_}1r|^m1f->;yID$*7MAX%8+MoOc<=K3-v8!vclX{i zGiOeG&z;%YCb7}lC-;W_a$RTV-Vudi8OC7X0oUv|i0I1soQu9c@QN-8``)VjJ5w%y%fU(m^Ep_wwDHixAl?0VDC~Q6??*>9>3BENycJQUX*=lC#`9)pf7p z^WfsZ`>9!M*U>|%LB**CbMBS-v7_TBYm2!Fj2Eet0R{9_1zV~ zU+e$LHL0?|3BesQVB>xhxbL^?0ddPP7lE45-<1 zo+?w0J-oh;`=opJUMrOW&MkP*zSQ6;1|OXG0g@w&A6WCibQ5^V8CWsBz5nK1LW)-k zYGgCRM85veHbkl8{Q8;c|9Ado3;y-K^Vy&=ivPt2r{zsNUr@hEO;G!BuVkO$zqIcg z>Y+hzGGWhv(e9qa2#LP8+8V|U4gY)axzEh;y`DXKBn~bEpL{)ZPys-Hd6*4|GLiFWf&`^ZhNWiohsU z%@<(%(NfEjEJ2Ch;&Ha&&=+(XG5|lpHDki3LCOGw9nh~%uEcQ?0IciT0#RFyK)ccyMo3HYK%(cqctVMeS{`v$%ezg`> zhMeRM=?e&htCE~AlqrGs57;ik91TD1F?^s#zR9}69{03OkIPU1lc4l1l-n*ZeB(*> z1RpG!*-(I$pwzL96&tvOlWhTSnqd28Wr7si4#3`bN+jU4Gp!*QFnh)}R4~p=Oeo>w zbCe!hN^3YRa8z$GqDMpvj~zGTpyANd>DzC)OU}WiOg^f=!}SzL8`{;7{Lu71=R>(* zr>?y5s(;UPa9dD?Bv%Vk4M~;7NG?q^rW*N^MlpndnLQ86#=Hf#z-_qL6k} zt5C=8UETV?9jI%&koF%VJ$b-G{J-;6uEibnN8DmU3+lr3zjaLCk>u-82yU!(iWQ5{ zSp5)H1kWUvT5kI}d=QNa&x7pBoBT3Rdz7E=`pccL|9#{_33}}0=|6tn1V)Qt8~IL- z)oLyx(gEHwqssBJHtR^$p4VSx{KVh=OzQud=05vGH$y6!T}27bgHb9)eG2T9*vR!D z52x$!KCDU#g64Vb{;Uxj;Qk`Btmdim7JgWeo#5jIUfs%`C^V#%&mH*{#240bKGiYK zg|CLZc<<(uIPTH-iIME_?%?hL0#QiAI$ki+F5;a&3dwh+R?Jbr&5r2(Afi?@rGK6B z_^*wdMa@KIY{%;4v49}=ZaM)g_Q&vW<6+f#jq2i8SxbDAS8(tR5jZe>ibM2B-{Sd; z=HjjHhlZ|-%)y5$I3&LXib%4=^7?XlUc{%%wQEc>E9uevX7_zdN>EYosU>(5#QO5P zdf`O;zrUX4F#D68`Zs8=!3p0xr6i!YQVZHg`$ z@WEQwHi-U??oHORf2gBzlsC}WP-Gn|*3BJuW@WOr)GNl%B=x?KJ<8o#!hM?MMG=R$`G?a3QcIkoj1& zY_W1Y>IIp7&s=JmcA`+W3QIJ0=%ZX0U! zt2wh;;Rv`$RUkfaWmKtrwNrWPWq5L4L9dtq?0YR zs71raL{*BSWxFo9Rih?lqRB3E9)%)-K1Hsjq&fAt-l4_QmN@*6mhy1+(PtM|F0pHj z0M#n26NpV<%Tp?TCv|v`He~sh0aBEZ_#lvoeGz2O6j)^vdih?AgDR@ZWX&qtKuSSf z2xs1XYQ0pXKP0x?h@*{0afZh=c1~2-2qQivtaG%sXY22i`uaA?^oGchpdSznly zIY$5uNo#4ufaY6KfaEIfLY%tCmMTPXbx-=90DH}>wpr#WUIFK;nQ0WJAxlM~;Cr{5 z`Nxu8svAE=!;e^ZKT0k7msE&eCvttDE35a*^gZ3ngfK)V^NzNG5txieV8VMTRU?X&-$W$`y#1& z&f6&A)vKa_X7`8>J8__~9k!#$yFv@^f~kP$O9vipUpswP$^80%vj3~dw{m<=xH!0t zM`|6z7n#n+o!D*;sIKuZ7Md3QA9JPQ;Hr&rHl}^(!_V;NyW4bfv(osvuGT@U^FF%k-y#}Z zXAlCzJI!46R*R4Yn_n~D15#G5XY4k=U>6Z(S49cLqcYV;B$B!Pfl^*M1`-e0N!wmH zL2lfYRR@+qlU{r0NA;rReF@vTHo!x-nqM1N{cq-Wj9& z9wX$&mc_?VJ@&gT?=t3Z3Aw`H1Vdr(jf(#q6RB3k(Q$cy+J-J}G_wd7WqH=$kGTJ4 zUz&|{K=G0HJW*25;QeqnPOVM*+n3KX@i%G|<0YAamRa;hrqh@d?u@{zEsFPp zecM4U&V*Ydo;i}RqkEYtFudpc+9}UL-5}ENb%r;?*C0IBAYQG6% zp+);!nOqnrDCnw;-X;s?UFx`1$!Rw#*Lg(Ry1BFB#jcYgnb8B+R%`uUZ!BBgbM&Jn zyd*0SPLgJBnKa<(s$G}l97l4qmbe-|CR2PQX1H;IW}N%ga+C8aWKpbK4GlhIhcJluwb0oD6itCB4cgfdHxr~aYvw5g{ z*Cn}(CbX!uP#K^E&`oWrgRPHn8ESBAba@jb?MNi%fnEq zk2e=o>E&ycf&w+t(XR#;?A&#guX1#2u3;kUs~7*-7M4@!^?lb{5$@Ex-uAhCO-TkF zx==Glt&!qB%lEfZM4aJwQ)g1^PNpNSUQigGm*{$7Enrv#jVVKu)HCz}b@v-ze$ah1 z{bt=Ibn2s(M0BLNT~cYwB5#YW@*f+9SeCQ3e+wkOvBHRBQVRNoWKaD!x>KwD> zu^TF(l@9H?XHw$QCIJSle(yI2a^JD}!ya5hL5FLftof?!8Ax1hge>&s^pIJ6VA{Zn zFPD3}YhCs98|}m74Y{#^TcJ(CM&)#_`3qoh>$miNoa{Sx4DW7B&`uTIDmH_7j(x<` z`m7A2;T@;_Dtz&f=C)&^Ix@#Nl9suIMz3U?ty*B6U$prJCiQ+X0=h3*qNk1&7)JOi z=m-cLzNfVIXw8oP2Ap=W{W;ZK%Cly-69fz$6Z=J+NT`luc`9)H0iW$FoxUD3cH28qo(3OlovECokQ=C}E&C));x@2v)Va&3oWL?d0D7-r^3oqVT^z zY-G0M&uhOsc169*JKlqc(5~>cqx>+mo`Jr4>6ToeF}46Mv-k}(=Imh^B#M7y=SGHB z^)JVsx%~1NqBhcsWWXC&T~FycQ~&#Q)`p*_qDE81)phZ}`a><%YwCh@<-w^n;D)th zH+t?W-$mYwFYsq08CIr`(k(4AIP-u{`1$t+yiuRH4Pit8kF2dO-6>4f7TIL2rC6yn z_!C52qEXb*=Jfohd;gNT%YVo4&Y!_p2#{{KSzkYN2bC@&-$Y@(T}^oM^8>raNgoCA ziZ^pN_PV?6W2<+LSWjuMEA0G=pB*tX(6WVqBU@AUmwdnBM@??IfBeCqnIADyKw_z! z!={xsQ}WKEZ0EnX`mwT%JUk5}^?n|hbS)?uyYK-=u}7D^REp|~z!x9F+#II)d9ds_ zkUI2T1!$ZqL+5Hs#3#omx!K6vIsQ}^UX8 zQug)uF=}1$tpAtBPN&LCkPq~ir}nDGHwQlk@m@9zW(gSo!8V42#8tpf{)V`*4)8Mf zsS>;efO+8jB3%9IJ)q~G60jGB_91m|MPFQ_cYIWC*m7e=i z{dB}P4kx_(Jj;-z9OTxIZY;K2wEC9L$ku$yezl1P|DBgt;@{Aoww5P?Y$|=9nRSvC zughPw-VD{B(N?+Js)X@S`mmpFdp8;=L>aHx9P{oG} z>y`Tpjo&3&e_vvEdlu9l29#wIHz1;?tP{!g&0Mp*$*42bDNEG{pX#R`t+QzX`v5kT zrE@(vZFz>t`4fPXyD4#w2VsXSQlp){8o!g_@PLC~z{~w^1rAA%fYYZfPdT09?{^67 zN|TimO(%HpML0YYYT!=f^ zR+~~7{Ziq_dUL_62{dqbov1Yg643e|&+TjV{s>^keKO~)HNPPmhY{>BeJXR4hH7k8 zShc$qf0;=!293B{C}wysN5isFuSs`sM##k@1nYbnR)X!V=9kqZK)i%Xeg(0+dGz|$ zHaobr`V2|hlIeMV1bWQN7otR&J)4bO1aUtT{L*&gf} zlY~bNMqxd;GMMp~=g)c6ew!p*F{h#VpaEx4umC0rH27ePx6UoO4=j!lbJC(3Xi)So z3~wj@q^a6rRR^n9xeb_qSVXqT`h1$o^V##Nvt4P+e?qK7OqMV)S)oNtp0Xqf6=$@3 z^~6ByD?Qdikr(;<5<#H7@=QWpePCCiu}X{hh3X#-;#<$=IgR3{g+v(P{DZr97!Y1< zlA7*lDPpm6pf!#W!#P4B7%}m+xEg!@QWK0Qb4;>v{gVqQKen*zKbXDSNHQrOP>er3E+k6X>NQ zX69>6L-wUzALw7Fh>Y3uX>astYvs!I3%F>}yHPE5X>0u|2%HiuZeyEDC~cC7ee7fy zL94+OQQFk*f=#yQ092sA-|cX?r>`{B^*HC9f^o}0kl)dUnmhK8(LbsY4HtXw<9eEzZg0axcbTMq_*X?I1%F2dFUwZzPKrMD zRxddJK)y(s0$CQ|#$r~)3No{7q^C*qdiz531Nj@KDt3awl5Y2ODO<@#g9Hk2*-=kF zzp@c;&alU$1JJc2AwRZ*Rg9>C<1Ptzj8Gn;oLdthQJj440eQHUlNMKQ|(p9ipW>x*jMqew(Rs zwQ8C<6SQ%hD|u@{R^d<4^(Q5DazFe1VJVMsaQjOOI|vkmTggMnVO-2bz1Z?2gq=%UdV5;o(ajvsXn1ir z7}P|zK~8r%EyCvTWw+5AyvuIU>mstylCCGSQ%lAkT}L{!(o@{ES4oCP*9nxcbXJ{D zzq63;RlE)->i>9-)75q2b2%vx*tL;l^b20U%U(PY$W=xxg8bUUgV_8{_J|4~52jpeXO zu*qaKbc9vi)@IPI#!=lfc-AM}FS#(FyJT$14j1-pCdHapV>&H8(E(=_c(L6*90 zO5R@T*JuzlUBya>;$BYkiyyx1IMFFLJwkf}19E*+9m5QJliexJ9OKlS5qN2t4yM4e zLD?hg^BQdoOWxmbrWI>p!8p|T_eLbv-&*Jh2P|hDDS^M;Rqdv>5#;PQD(fYiSc}KH z!-P6Af$#CZg)M!p_WGP$NBlPKz>0D|d)R|^rrG7f+UVJ(DkIXWuJPZ1+@hZO-_hrO z!Vd*#IdSmPdb&4;J?-ACj&yu6wV8Kf^#;!@E^@Xvt!@M*?S43lJHLWF)@9{&H%YK* zX43R!#lcUR@Kh-PtXNl4M~taeE*eF$)U<}QxxX%&Lg_bOf~5;3k{M51AzU!$kFYy&=Og~tiy4j!t%$E**YF)Tmyx@41f6Ayn3>N9IzLo&^3@w3 zm{i`N&EGV0N|%NX%&fGnjO~d-K%k4qjRw9SZ_Lwk{JVO(j!q5``>WzBbAyMN|6&-g z7r2*kP7hB`kR}H`MHzb*)15^3c>uMg{o#|o5hkAy-*J65zk3T2qhqx~|kPps2 z4Nz#Qs5hpUx1PW5;qnk|+e)WBTC)VFRMBE= zX`uf9{oM1;CFSI^lOpg+Jo(eWYsmGv z@O8lLkg2Gevq@i88)D2uWuUM0!Pne`W77?IdB;B zX1Z==^h4`weF@x0BcW{4(urN0Ng&tdNZ?|%@5({-U8es4Tgu&GYI{*$GzHBYv8yZ0 z&(3z6v|9+OSH1;ZnNn60dys(3F_5+=EzzC!h4ig^=-utMr2jP(&DYO2=x#PM4S9eD zmA>i2x8%~JzEj5y`V9JfisgKE!zpqtDRxsU-QsJVB?R1~ZNrd8-Q=oF`u2GIE@zap zB0M@YI-p*rUdB^e?NV9+^2M>uQ!VMi9UW_QdpmjCokI{ z>w0XKQlcp@Ny&2-hfhe#rnhh`4&2d_A?f#ju!KWLEiqI%q1@vvmw)H<5%|f9Zfo}Y z!q3DLc42m+$kj$2JD_D%88W9K4k|K|_Z`@EAZhyip(O;J)XwX?M(xXvAXANQ=U87* zAaKXnE=r?BstMy0N+N?>p+(R@=0dZ()b;ZF`k$pqmdIpf=`#5Oed$m^rtV&lWCMAjQezfIDsbvj$` zM5y@9WF}jIZYv9v{k4Jp>3(s1SN^Z3>{iA1$ApC0n}25uTPvYh9YalO#X~=J< z_r<~8W+4N13X&M=F8BKadXa)5X3#7nXZ{Oa`h}R+WAa&d?j$qTDwU7i(rWTQg-EV< z7&`y%5-kx=&q%g!-lb*QE6p2z=ZNQN9~g@i^Y$zh%w^(Jjazg^?@3ifV@Vr@ADyvM z-NqqW-#6M}m{Zz#il5nhAfyP}at!TJ7tGR&fLz(8;NZsU6(A5FYZPhB$*LgI+B*rP z6x|gNRuA7ybc)x*Fpzd0H0&KC9P#wT2QH66^x5-ZL-t{>kh!Oob)zIH9}Wz5MfJ=+ zh=XwtA!oFi!MNJnBtBj%^!N3O^zVk`r^vU^oO=1WHv7$CZ$wJBJV$BbZWd+s5as8SyxA4xa`~;G>J1fh%pQN z>aoB7u8xj1HQ%4MP#P5sPI+Ok*y#G_87@pV!Gx^`hGjm(VpUk>(_UhKna%9jnr+f{ z41YP~l4O`!hFe?HXLqpb9D*Cn?dv+qhp3FPXTe3zp&y*uWIAI=5KZ$76#Cs29pO;1 zc@q8C@0VYGprL!>$*93Chy9IB;$mJ<{+CNH7WY`Cr=2xLQwN%(>KCt-ktVDF z(8(;0HH{va%zp;a?D(7+x^+i=X3x@5twP~RkgPDfWK7#Se7hT^`kdhprcP@jWlC2= zyRv|Fz9hAK)%%ATmRlu6ys|7x`&qZy$|R-jxIRzl*) zVGz}x4TGNYSUy)*G+}EA<-#uif+L?)e}j+`jkO3~z8QgRGMiKDdA3DDd>S0-06|ib zh$}nC;OAp+AfWun;?vL@_eX>@I z^Hm7%9>N9>JDwruNz+x6MsiE9z$ijBsdm88{JFX(UDR|WFIu0yCmrpS*E5tRXpxfO zyhJn$C`|-b@g9FJOxS{DuWD)nhCqqx_R1=Olc#e`mcu2ydv>+ zJY})JVM*BSVq9do^rGMK!DlppDf!cbE1K-e} zh1E=VnPPEL53iJ=VE_B#=1E{(toC^YmDvhPFXnUN40#0b^p^83q3n2^@;c`>ZANUu zC98^zCHqV>tHr*7ftgVy9Uw0KDOquXDcP;aqztVKeHM9Yn^0EjY2ww(f*E@IMWr-b zbUd?^?N-`sF&NV(sH{UYa2$f)`b$77z|#^{EQ=ET%6GX0UDe{+KKHeh=}F@oYkG!W zH4f*uU*M+mt35?SVh`YQ>*v=Fk}X*#y_A{0Cr$k-66by7-RHl$qAuwQEyUPw+y;cn zg#$`yXSEq&OYmX2Y$8uXL2fAlJc<>l5fUSrz}&}i?x5O06LHfMt?+aC43VzWctIx( zELPz;X$CoQg0a}`NC&=MX+7Sbf0VFkQYDzsY6#SqpN2>~eTSQVTy{B{Qp17EX*Fy% z2H60DU^!iK)%SBs0)l9JB}l@LqmxXEm zl2$R-H6XFW0v%Y!$CB0THGon$eXhMIb8WqL8dwvUQ6*Sr^<_V29D76M ztJCGpAM-T~9cfeL9p;k|7Q5iAM%a* zDa23iSatN1bo*h&1pf7zkvFU2R)1`i&Qdlpm~4>{&OjE%xtMJj!=G;bULJREIzRsc zjH(EpW(Q$lH(vzfF2cKW*Kru$>Hg_*OV+H40WcX5|iaSB0u@XJ8tO?mq)@rO`C=7-cpv>tJbkD6`=~Rwg1lK)!J{ z|1PgzuK3C2m3jZPv!#w6-EAQkRftm;tFeHic8ZcV#mxa_78duY*SeH7r3qNr*7k@}Ur~G6WPz7z3&T_l!%sIb5gucci+kJD{bjmW z=2akFYFja$K)B1-DJlt!Rk&Du=af>0J7v(G+-bdHH+Uw-1m_5{b_$P<0hFQTrTiD* z{I@;p+yg`Y$sV^}ne0*1eKm9X?m-Q ztEJkQyP8v&c!vJN3GqVjn?)FD?g#ffXa(H8eP@((zG`&KO}QfHY0*B+sFY7%Ssj~L z@6h6+Wbi$mAa-GOtW6hKtn&+0&AZKk9$71p7QYSxYx1gA<>Q*jU{q8QLko_R0TcqF z(al=_%VAAC%CI-r-5gt-Ui~XR$E@tOo8F#tFS@kExrYM--n@FLd_Dcc7_4_~GS0@CO%W6vfG`-^K71JY>F41RH0o=zdOSL@Hy zY3gH>23*P&D|wE)o00#kS78An(gdp=l`}8x>2`#}z_{{x=T|O3)x&6sRle?g9goKK z(->e)x68H@5DMMVuivkp`Sg%~jbt1=pnj@U*Udt7(%|qWcXWC3+P(MrBB9{&Ga+2V zwWqu1rV>wVU?O#MS}paafK6}S-f<&OiY>J{oS%W(-X$nsQuylqlv zcdXDwr+rYo3Gug->-N79N{WU@WAv%b&?y5nz{RmhZ?}-FR=(Lyk!XfvNZZru#ZMtx zH6bx6Jr{%cb_PFr8%G;O_UzZxit8^Z@iI-hu* zgZYrGMV7@D9+J;|Rs>kQAxX(Cza>ysU9rwF?`GzqVDwRH`F_E4XaWMOb4Wp|vGg#- zYFO?SSZye-oUabsMd#Y0)g7fFbMIRH9|HDkUxG>l{w0yOWPi%WG6Ia!kmA|GOCW}3 zZ$3-N%lice^n=BOD(0nH>p9anCIu|UB4Wk;a0q#Sj7lq)52Sxi3&#d0)z{vl z+z<$WSnl-muHOOyP`o0^%S7VTH{)xI4s^L4lk}GEcJ$}qhR7bW9TSP!47E|VG|5z08 zME~@=#Sp>O+aSsADV~24oD*r1f@~10CTR%&HAt1vTlwgtBITw|y^aWmBU8~)rG{;R zZ*wLie)48Go46KQeb&{y-N$9EC6Nx9#lwzes)p#2VNlsAT}gTvyx`==l-+i~PGVP$ z_Uwz@0-Wb$?*~aQ|FJIH05V|TTvT2QE%9k)^-u|LkO4Amp&_)@8#$jSQgzDRRh1)5 zoylag)ZPTFqcud;43GT-A)h!hu^nspwH8qa^~8p99D}@7RUg!6Vf)EOgEHG)g2A`T z*ULLgQdM&J|D+A>xPw1pmeZ9;w22Bu)j)~YkzV+zVZBFGbkL8Op}b{BR?JD;cNQ`0 z`zOaPm|Fp5>6^zVHjTCg^R&VAz&NxuE_*yqef@qTD17lzBe(s@R(+*OsU{+?C+5xg zdY2UPy{K4B7GCnY&4&OP3SM)c%eknRp6n)bPjar8ulQt90V%isN#$+Ni^eDuy7>(Y z2GoRR7BzW`2@#I0xy9$v;p3UjuN6}^Pu&&s4XE#x8j0;@-gUc?UgiBY)^a56i0Q8A z!=`iZ4H;yxJ`CDs-Dx}TS>972PT%?Y_c2Nt$Qk8*R79Y`b-UnE*G16RT&++QQ zU7|sIpgi|61`jUHsLXkdH3q<}uf7BcXf^dc7pLeX&kU#t?B9;N)-r zd85&M*D9~%S#QM(*pHBwc#pttdU;OkyNdu9RQkM<@rY5xh?O_F(5Fz0TeKC6hwMPeG zcf()fIX}ZFz_WN2jRir>24Xl{U!2d{*i&|rmsjj1a|?z4>K2ZeE_S7q1oE9IZX2Cf z>&luq-(E>BjC7ykp=`&@*@i~rH(GhhrryO_Bl~Cv#&?HZoSwPu8?l1k(!X&lDL^t*YwdyehIsDb=-Wj&SVgQznQ3JP?|mp4fSlM*F(U19Bh zkX?t7t7mvxRC)9(DFo(19! zT0G7Ce*EzZR4|%pPluGK`Tncp zDhXFz)bu_WJwy1ZqoaaRY&UQ3`z)pJ51gb1$8h;^+iTm*=6=sFK6N4%JQ?a$bsb4e z+oPJy!%ouQ`UaleU5xmTpp%R7>cCDuh!Mw9Mb`W=iy9CFLc=%Cn;OMGS{0yC0N;Qb zkry2^`#5rFei8oe-;4`{he+#1b|vGm4GgoNi>U~x`sFOP@H1IIMTdYpLKNgkP!LFt zzyXq#x&sCzjK%$PeZa9; zo(4hV2*5ZNs}O^zgvI}EKYUbYeWsG!^DLNbvz9DKm9z-LI-l+kx+mvRuiUAwWb6Y7 zG7Uqj3Jm+7DD7UP4E1v?53r%~9&wK62nQ7Cfcgv85LDr|*m<29=Es<9Av_LWG!g14 zOv8-HrgX!AtjWjHpc#D1(0BX1e=d~d28MB^4rBo4N?l6zN85i=JC8A7db^j+S3Po%ASt4> zaNnE+?MIZqxfNsSK01_E{U!1k3`ET` zQOS9~^dhh&VDsOzdI1fQZZ(E;0q|+@>H|WfNsCIDyz_cNa;fqZldd+Se7kP`lBt1@ zFH)eDf3T#;oqz~PCP6*6yu@Z0aWj>6gKlRpSa$>1Ht`XZ~! zYY%#ec**+}L@!SW3>Ki^0uS=90VFBeBiUWDLNV3F84>kuA({CvuV8*W`-I&%Ox3XT z-z&>bKyvLFx`wOS6iz1$WHiDhj`{9LI!7S4UC69nk^)OfBM00ll~|u3B_P*Y3($2d zMoy#-VWZZq?LW1!H^_E>5-q9BuHmkR7AKL@Aw0NTm*@PMr%w^*TXQdB08uv zM(le-unT=H@2Qjn(QD>$yua?p-aX)Ctpyk$OX+@~U3sxD&yP$1gX}g-6{Kl(0J3z9 zDUfYpp_1KKagW#*otH7?)jqj#WF6K$lcwmzieBJz;y~G$v&AYnJ^)VlfAT{!z@$W4 zUi}yvNR)-4RksQ6Z>+jD-@Hg{<|Eam97wXDCXSv2F4+L8JTF@OOnJx`D@) z6r1sYc^D&nza|RFTNa%{)3MP|9V!XLiQfX6iS2}ia1vHNYoEP|<^+s`kG~*Iq&p^r%QXq}B@qyk z#7o4U1skG5k~S*0nEspkW5b$?-+grE62Je4$=Zy5G2CM^|K*NbnkAlYmDUsGo98G@ zrl>Lm4?=mJ;;l|LVI&~M^qSl1JA+76R8s7>VAT#}GTu;uvGhv7=lDNAK9IGisp@O{ zD_-o%%@raLc-Eyx?GWX_Xn#2Sxv0Af<@kEzx{Yg4lx)H5dg~mRTZT;Inxy{p{PU-T zvQj0pL1ZYu)9Pexnjk)R;FjguEbp#ujB-45=5KRdiShk`JchQxP!` zHKwT;U(4S^b`UC6Md)3Hv7-o?;4FzDfa*Rjn;hv+07*BS??HNaD$4OdX+1OlN65~b z3LOx##ZTDgO`Mq{=32CM&a=u!E{)aK#Kd8npN((IUsO?Nv=(%D-V?IxvGqTp0Er>- z_c%j@qex7&q-0ZU|HWY&XZ)DC_z2ai6&i|6QTg_u&t>(>jL)rnwrvi!q(=k^x8%47 zaG~6d^joP9>jL5)08xibZS6$j081q_+=BXR1Ve$-;txBmp&tN`h(xLfb+g0lGN@t- zTKuTEbiDP#(*Y{tKSqu9ymNTn4`G&Y*vr?kk9Wu=j7I_3kp#?=jGVd9?RNL_(wXa6 zz=+&1dyR>jKhK6xk=$%N8Z@1U@eaKE;H~qO273a=erTxOm_#KG5Hfzyo>Djt;B4e~ zJ-9+67`70;kJ}2<7@$!Kv#`&Wi<82-c_QkZ$SIG6jub39zJHbiC_)zR zA3+Ob*_!8eN#?WAHEP!Eo`sQJtQu^sWjx~)CNRp+I0lm8W?A5{OIRwTrUDr@Rsbof z{Ca_xztAWabnG+ig*Cl8cy8P~`vyx4s=mcopFeV|k2&^sOV6iaKIAu{_W3E<%SpN2 zUbg1^)w)kGnRh+E@Jq*J*0p5;#)X?9Vm#`Jf@JkuG;KmCNM?-id;&nSKrq&R<3$~f zj0gP{$fS6}0!7KL&ZjL0?kU-GPilBHA-{<6m<&9ybB7-7+w7dlSbZZo{_yI$$?qqgR5?PDRT4$X)O2ieZaif|%%JHk zg4JJ9m~4BDy5>&*pUc+8;F|w8fZHOXil!Y=g&xlyB%$$Dt?F-LD3WES?52Y@=tvM( zpxmL70w8q=M;<#ku{l*0q5%Rr@OLCSW1Yj-5c*y5or&gPEaZF@0!04xMkAfo*ELdqWn%toZjMh$xaC_`ez-wq{30g+R7mfRo| z5P=&kzVze!lKy=QhCCqFLOcVMR)2ZuW$}v^!7f!Gj%|c;syC4lh*MW}a5s1s-~g4F zhJZm#JQQ#Dtno{Ej524Xl*~O1&h~>(>fRy~2fMptJRRb3F-aMtu-RBdo1%S z5)R2r+@Eku13<(oqm||>r+gdc!u}0ADyiX4HIHFLB{i#EWqV*0DI;gzV27C|&;d0V zy4I7vFQxJr7t>12sVE$hG1c>URrbwpcO?lv&BD`E#mO~(C7M4C5%wzaibi%fPpA}U z*SMjdufMCj67b#=JmBSGOm#S1qGV2pT3g4I7xdokxwtYL7(VL}*ZCNXf@Hj|>7w`9 zZWzw$*r(MuslHA(NqQ*1(#o;i{RZV%cI#==o}`929$IC|^U{Xbl=VpuHT)z*Jw2UB zSTD=q&EV?wMrdu`fwu%PkW8#8|Hhd^1Mt|zREww*kV~AMH~vL7$w1zVO4+ImJO#jZ zB<7@;8wM(yxeB3~1x$zaf$PEzncN(Z-1=W~b^+B{W+U%yY!sO4sgq1j5#a*3`Z6<1 zz{qV~vNiz6rtZ!QpP+Kvq}J#wS>by|r{i_xQ%x%a(5-9P#nFQ-AiwoA^kv4G1EP)i zR^uufphUYbrkJD|1elIy>#O6SEQ<&_jm-67LKIr(y~?zHh>A4KnN20{BaOYAvgaB< z{%N0oujTZV9T+CLwNcT6$LrLNK4G7y*IN%oc@*ii>;p=$jC8;=?P@qWh5tV{aKAwd zfTU=on3iOi?HL&U9_>+mz@`SW+bPkApJAx%cJ)ldufn32v|Ok(v7bs4U{Pkirm-t6 z6?*7`{ykG|EJ9HNJ@skGOag#9tZoaF&U^zD!8=O4Pt^oa1SvLG^|$s^CUKhv!m9t{ zVvc8mLu7Edk3EGwr8C;=k;bUpRC>I*huoeayHA{pQ}8h$LZ7iemm4uvi0$EzZ^*nJ zpcp5CXtH5*(&0rF@zr!L{XPqx#?!$M2za+%oJRdQS8IW7&@e{%x20lZ zdO?+1Kw@=T`2xI;McA2w?cb53w>xfH2*=SM`H+JD@i3>EjB_j$58HLb^}{J+j64Dt z=4iEYc8^6_g_+8@nbA*<&+Rt8c)Zxr*q@Mb}ZWVXtpJ(i%_pbZYPP>3$oV91N_)SOX92AAh0{gWh#d+w2;0}6 z)OgUBnN3SSbKwe&WOO)`6tAM~VPQy-X!tk$7!`CP&IKxO6_a(NOv|-cY{Y;9ao-}R z-f!1x0-!*wVg$dm!3Si39ZJ>8BG3(BYxESB5*;i=g5H@reaHBRE21$shsotH7(?C( zd$(7euvP#XA$6mWHj0XUjitTAMme?p4OogFdIvIj+I!iF0iL~=itJkMg&7Ti-0 zHEpgOcTbQ9P^CSSXfEbMRcR$PgkC=21Rz*HJoW^L{3!gn75^Hcd`BBXL+R>aGC;u; z@>u2p@S=VGD*u@x%1R(N2%t15E0N?-T6AcHCJj{WF$H!$-!t@QvQAo3`9o^J+Z@pH zaLq<5R%sGha44NmwyS_7P)r0z+wjX>m6Fv}PgTRB&L}8DOZMX)cjll9ac%BW8uqBX zgqtn1NE~IZqMsd&EU4S}l+n%1a*_k~dfDtzoj^AWgWR>bb(AkKCCsgr&|=wX9?kFK z($Q@X4FGr^ilp-E{LLG2(0ckb$pn>)sN`p}<&W_Hjot9t^p=|C*4C==21 z?@2Qn3XsC`f4l^$JA&Tt*UFI7eCF|+4Yc`ULXp5fjR2)58o*uk8IK1PxZX+t3@*N$ zJVpB|=h}C(_$*B;houhhrobn)8?6FB=4v`GeFRa++%6z$=nFtbT{E9L+fC^i`SE*0F!J%$$UkohGl{2x)@ z9gp?*{{JqOj7Vi=C6%%>vMGutAuB6nWo2)7l9`c&>?CB9&5dN0bsO34TiNTrjoY5T zb6)v;fB&7w>wdk?xz2U2b6wZDuIF`b`Boqbop0vsKwyIxS3G|+iewtbLwDy0af{Go z$Xqa8SO>9$K-r(Ma+Bsyy+HtM)OvW20iHn?8#euy8{U^h4%_EzX)B7J?l+v{l=)&! z0#$wjw^xZQ?=QO#?rm~=?+roxtNam`=3o5l9A}t0>P_-A^V+$!r<#7ydswUMI+db+ zj8>*X+b)V@3J}39)&65~5)eUKvs2es0s|Um%8pMa({thZ6r(Fr#vvS9@Iy#OD_}X~ zeF?31MYCa=ubuaf;UoR@&GF^~b)jc7KRs)|Oi{tmC`#K)kOPKB;{!6JjzS#A1EVLd zLC|zG$H-hS1g7J_`K$bW=tFF5Mqj3eK19AUYU?<@~(Q> zzfA^#QTYWzB{Uv{*iWCjwdZ!N-rU<~pSqu>)3`JaPKa4I*zcExTtD+(x45%^q9e6- z802Q+(Z45-Bo+h(UO|ms{&55vki}8d;%g`!xN;^@!&Z<_*_rYm9{}0{RB9dYTG8E# z#NZygp8_iHSIoN17soLQ*^4TXWx*YJtKxj#AULYo`dC2x#wqN?;I}mu3GKvWAR%R6 zw!S!yGkC)wKHiOa!swfb??{X8wNH+cn*I{qT$m?o1?$-oaiM`cY^X}npN-Fpibm2U zMS8po9~4p2PDN=Dut$~Tqqnk->W|l1Q}&?$SS+so;d_09+M=?H8m3i_zr9_1T=Yz@ z+d#{S`^_do6YNB(U+anNe{MJ?WAfcdCM@pF`&ZK5KaHatQPh|j-A+GIQEc@n1%>K) zFsqSI35ZpK|$3xXBCUr}SoA z$iqq9oVzRKHc&mTGBCLl$;N%4E*kNf^PoN4^MOHHn-GwW8A1yQjtf|=b8M29Ww6w4I8z-v-bXKJp3P!58=hZnE^hqEU}AOA|ABBv1sFezGCYK z%!oZEd%AekqtjC={hO4bxqDiw_g2?QLcDFQAlpFt-=}v3E2Ll*76E$VbKyleuZBt1W!mxSKgVFMT zdA2Y6oG>jT+4Kv|05dAYjZ=O5O-WPZ*L%SkBtfN;j8FD_UE<1;iYD|f^!KOUo`l9M zW+ADzLM|m)mOP)v?e*1Uhl?>SRo|h50SfoRh019nCUFLq?Q${K2`fSK9hoC1LsEfU zOs=!CPyxB9z^|xs+3MOAUw=r;dP;ba+oNirzDPy<8rp1QpVR_GG=w|@XmU%0w-scd^{-=9opE{RM5#!wa9Q1 z%Eh%?9fp4-y5-os9pWU*BffTyYB)=ibO2{$E!RQl)o`bu%=XPmKala0vyDm%XvyFg z+x|)JrP5H+GZf^AaZe*UJnf_BGB|kti^F>LXE6WcywC6N-u@!#Lgwt3aXoKU$}gY) zW=4u&H8@Rgbz1*aGUy_pTX+?;#u)s!YiP`#gsmEpaa>)~^}P~)YdRu*yKT#Cwe0Hn zFMRfy-?+B~`6l<7pAy=gb~8`&XKrK*SB44noAK5dFtOb2o8RaQb?UbH;<3V=_&H`Q zAlp;q!{zYeeinO-VnzCk(th8#DVC$k#v}7AYT;f!O7d&&-+u2bej0vPjjM1mjbaKb zXt=(xR^T`L#O8hD8HLXIaI?|eHys@KwLZz7c~oWmGPBEpRZmsw&bw-TyT7XsX2cxx zo9DJ>L@L7y`iB>IjeMyt&94=_r|B(bDrA|$nP{XY0d_tOw=po7?9gTo4by8PYJwQ|a+IlL170U3}9_t<=QMjG5!CdVk3Mfb^8!gm4@QIyv-QWp7!$O+DP9d$(@{y~I z{ja&P){Gsd#6mHk>bI>gv(Wp_D(&zS|gFGU%Kfw)LoPQ5WAL=`-AM;^#QAk(>5lb2V$ZZo&a1g-+ znA&>L10~+U_J&o(P4+cACGB*c(6k@a7dZFHiejL~E%cv1ZVm^VRgi6XDXwL90~}=x zZRksEATF?V!!{w?G3GH)hx&;0Ym4 zs`aLHa31+@bd?rn+q|=WGei*yjAOtcsovfxhbNM<*ukqJ@I=Bf-Pq$@7CbM!QToeD zy(7Tb90Wd>dU2QnfEJK3Y3>QD^m7bHrM-0^^pW-eUtZn2(Mf~pCCA0q3_Taz8$RQa z$>g|x)rw{gMQ|qJu8GaCN701|KaUk9-rG4g(j?Fx!1Gm~e&kN)6gS@`74fm8)G*hX?8WR`u^|b3^VFH~b7hkX(+W;EFZ_DAv+?8(WrKmhi zyhFw)39tn2b3AL&uYo1;wm3-rI3w8Pr~i3jV+y9|hcCP0jzW#`J4ME!&N?Kc4xhkG zF>>eeOrk-ts`zg(esL%LMyu%gk-JZ3^fbz9jzEpkW%{TLYK$cAPfw*@G8?AQ2gT7H zC2(-Bnx-n-^gL>C*7ev-jcG2h`{LzIoKLqMxP3dR8Rcz61A^d*Y`Uealc!`NegD*) zxZPeC%|7hu*zP&Rwq+*vRXWSC(hiCQe}7?M%e8eV5=k(Z53jh73ZU zNqpI}^7$1BTtBX48QwJ6(olhxGK})EmAjE8#L;v|ijp4Q2IreQ_#O&o1nMc1W$Xl9 zPs@bG19IqG7>5!S++sp-RNH}Ak!Q_ZLJl@u7 zi=?zj8vz>Pc3TzA@Fd4#!%UJN<84j>@AsEZ9Tb` z;n%WEx6algU;j>If6789ZBeBt5;)}|8Qsr)G-!%9H%t4^!w|-Z!_M~>h#fuXytwZM z0Ok#xdNv}*p86A(s%bME{nBYnT?ub%%2J#_mST5dbEwkiQvbDL_43d?y0r0ggTR~I z)xsy-gGZCmzIKIK$@N{`5N^-)bDU|m14RxgTqD=i8aE(7(6(47b5+m68D!~kYlb@y zUN!q96y_B`Y>(lNp4>BgWi8WPC2sM}2xnmLlqo0v6I-K$_`l&l| ziGe;WmvOFCbl5tLhy2zOeVZx0Q`(l)HU4Bc^JURz{})18ZdeTXivEA{2l|$l_=r^ENjWX#`yEC zY)FP1L*UnivZa#D4;_?a%>X;`F;>S|SD`fhmwfA#n#Aq*Y`~2SrygeT10k)gcPk|V zNJuMYe*KP7{o_aat5Z$S;GvaCR3^ibUKr5vNI$24tsM#qe^kvg=uJl&JUy50$O-AV z;_`8BA|zM-hFiywNpUS(YK*^){q*rY0VJ+vt1O=9XnI-}xEuYFYU7nQ>=1LsHs0rE zIq3;=CTvV}dDRz-$!Tus7Zo?_!^2Ac($&=NOw@wzS7tWh8b>RbGLdg82|mILaz}ZI zahG2K(Qu9PZtsDju{(CT|2Y&51+IOWUC= z?1@l!?QT|Unm?gR6sz4L$Do`?Sj@qJvp;!DZiiU%6o`j%=krG{R`f>iD?{_U_m*I+ z)BDqO>oy`A_}KC*Fkip%;&kmbm`jT--sQA_&6L&}MK$Fm^NcEwimYv3X13r#GG zv4d8HwLAL<;*4TqCC4R!b^9gc#Ar{h6JWKnA@0Enqg*4u)@xd3F#z@ci12Z({4mai z9w!7}D+Vxx%#Jdm<-iNAukD?s z1RjT*V!uEXlMje6JtXesiLkw@IyvOov~%wouu67>-L6NI#4pUDx1EyQ7Eeb>I@rS_ ziVb?1%Ybvt95|z8WIf$Jz!}AQ$#=YgxGRIorRpjq)WyH(thN=$smNlHGVPpCWq+jC zD#azsz=9L{9kpvLL#K58xmKTEGkbmlx*f{nJzQnS5x0YcNjZ@Wx}tqSwrr%pFl`5X z;eOJgH)am}jw;O#Yhc?b_OznoxteY4i&H472ZBA!>HzvHY3p{U3=FuH#jUORJ73K6 z?H|>hTW1DAjcIEtUiVNC>vG$pm9c=aE>FGBKC}gfU&U%irWN$Sj%_#dmsU9pb=j(x zCb!&@r_?@X;>|t7{nN`ZTd}ree>V)=`!!0-2BR8VtJmC& z;JFp&u0a+R?}t<&d}zP;#HOzP-JQ+}qC)?F6=$uSBBxK{zo4Gb4!bP?9ErhepftAZ zn=Af>y7J!)MjAs{PrTW94h(f2c-st}i;|y5A+fH{%eI5teEtyJbApYY8df5ZI2>5+Pr|C z_iPtA#P^iR1*8MB#)UTb!+I3xg>a)S>$|uXMV5duk#b#6!6OO-9e;DOjTvNmX_JcE zB66WI8D$-LGHLD(^J(EPPpVZ`Ndttl-%hQKDRn3)X_44a;bK#n=9JfTohQA=@d>0_ z_f6EktHXdBO505+!{$P%aX+;_`EFn+NWK3hRm}YkVqKmZb4d{})`eUC>uYWWl!a{6 z+F&4(d6#lqG=ebVfL=8|B=0`l!}q^fSE(_!#Gv4hq_vl4A9{%2={ifPjM*@8azNNI zqTl^VmLTvre)UkkvD$?L>geVDwi1JH| zq;f&1*KnNm93bF^+vBu9nJ}7BGkN#-T@d?pm~)m???^Ta1V`Q-mkkTlhvY@iHUBi< zlGcVkMy_>r977;9H(&F66inp@r2!*+r?__h zyIsNdiz^j3Mg3!a2FM9E3^MXgAqOTu9fln4e5p!yQ;dzO1@KX=_IBmv}JhE={SOI2N`>8szy#lXbXy*J_?tgd< zY=~68vI(BwdWGdvjeXPU5VH?Cxl8JojYgl4tqy17P5IS!Jz4bsTTN!eWswOu8f`mK zKMH|xo+~%}TCb=BsrNkPty!3Q_criee+diP zcKU6OE`wMS_&0%?jsS5Io(5owt|JKnfDN_#RAOEP9Mh%o@I621`?P ztQo)Vy)RG#r72l*oWB2;G`y=(x0 zhm+{)K@D+U9pdxJicJwtE|E5ApmW~LJr_WC zhIX^-BYgl+6l68?Zi%S?3FzBjgg>$zlIp}UP}%Xzf+CkAd+8o;vb?TfY5EVLa4ji- zOMm(|m1}|zMCPBkrUxlr;A4!>U5XOP+m^3-OuN5_y_n`JFj)7F)_Zb4rw#%`ZRm^q z*EMM&1x>3AF4N@D>vRyi;Xw|)&c909dY~+Ze9=}ml^-Gj@Aa_$D{$mTUpA+J(Qwhw z!EDEaD3zZKmlL zMs;8(r{vZ*KAibgB1@Nb78LbSkM4YREK|3+`g)t-?cqlcC1P>HyW%|K-QT!nISNbE z-#havAMY;;->Xem@TYmG$3)L51FMzhw`wedV6~D9*0*$SU1cStW{bc&P;Tf1L0S0{ zC?X>iiTr80;gb-M(W^Y|2`+)-hsWUN_($#sQJR|8&Ic`GRn=3Rf%E( za`6_m|KS9v*2EIIqtpQV~R@$l3KrjhP66JDdpkT7K z^#3W5OHSUH6hD=A_RR*}K_A!R^a`j?art#?xDr$t&f+m+ft!INBCh6n`8AA?iK6EQY`bB|~V-;ISLohh%`}Dmw11bTU-_itALf zyc$IRv3jp-@PRzVn=+kZ{lh9pn;0o)3;fN8ipePR_qQjpde8OMpR> z^Yy%?>5BI*egLh5R;ArhhgKxnK|1pg#8p<|CBX?DPYN4L0ooyj{mrcc9xj9b#yEj^ z?4)Kb_yWwZRLhMOF(@9a%0%2Na42z&#*V7X+^SOs33l(~mOg+db2?pF|ByZ^-$bw> z!r8TpNX5{v*iL0AX<++<0R$1w)DGKjg9<~g#%Zb{)f3R?Tw>N#x9P8gKBq^h)@S<< zbn@V2(mbMD4I`k<6m)tyD}`SE;ACRU=JO3+@C0GW#RkTk* zmy_|C{^1Qlf9POzafni>Z?(W`%g9;}g1=qKZ>vb<^$K+|=yuXS^y*}S$<_FpM1SaG zcuRIM{IAl{`bh2*8^K2CV@#Uf;Rk4e8x^%`6j2-t4B-6gIaKs{vB2r)6^xTe4--7T zvScgHqxwS@16NxuG-rX?SqpKTCe>p`U|fV4cPlz@7>Fp7loGjKe41v$&bh)CtO&s_ zt5*b(0$d$~Y>#u-bp*oImK**L!ll-+#!CuoQGOf` zKm!!Fyr)yJ<%P4aA7ZSTO0B=PTo2qef5S*ftg=x-%z9wqcp#{L<>;X}SK~|uwT8CM z9hO%R5<1hUUIS~Dyzvc9cVX>oxQ28lN`|quVzwP?@O7lyHyNBqI5UTSAQ|^%|Arss zSW72Ag8>cmV*qFPqbl9e&Ibs^?qL6QNP^~Ogc~21=#dFn{d(t~_4X}zSnY9+x8#~` z1#vE=Nc=IHBtD%jTA;vB7?>7a=MX#{@dtNN&)NRtOP2p$#GZP?ct%E+u*1!c*B@SaVjN2tb(l#JoS_w;*803@yAy0s%V@)E;TS zg@B!=_Vwo5K!-aoN1b`IlcAn7epsqP%{cg?F0s!TLnrKC1 zP7QG}m|gvD5Ym1Q0dNJf4-ybdB58sZgOh~Hvjp|+@%t8?da4{E!S>O^A4 z66}3x9KG6kV`XPl-eB4v$b{#1JgZqD@HjnhyYPIsIx3Ndt07; z4xLqKuCtn=r+co?5LFG2dWlc=Lwu4< zg4KHI&eovLG-jj6uF&N|>&beLP#w!a()U+^>ZT79^^CD$OZUYLi|j2iL(N~&x}M_$ zM8TzUO$iSG%2idS8z&fS`(qafxeub1Zvjwn)r0QT2N8ypRl}{E0H=4Zi}g>HXm-L0 z1j-j4v!Ghh&m#$tqBJ7=FYlMf9K7`}@6?;s;D_t57OfSxYjEs~E~Q{+NSXfxyiP z)U8taQlS21G^m;R9wmhJS&zM0L~c$f%$~*pSPhA%6=wgwVrjuy;9umqihhuZX`})e z^1%{5HUzJAzb@{6a<-`=N65>nGd}mr91Jsnmq8V8lQp8zd-|?@l$?&ADAxz&*<&}H zfia3!;)z642QAD?vAA?F~ ztvT_r#5ag$|FL7zp1OLC*BK;Tt4c69CV(P;32u;y>R>R2dP9C~<0^IpDY*2YDn0~k z1)H>RVV_5V@KSyL9Zi)=aei5V)KTu32?ZsP3+GCcFdmhL^^dP5_40KYgY#;mZPSt! zfJ`xr&pL<^>P%^VZ${-)R|1fX!$?}w%mA!k8|^HtI;?J#oszb?1gjfGo7n1IPj^?^ zS>f{bJ`i623aj&b^GL?DUL~aUr)fO; z!(QD4fC5C8d3?h#0=u^2NUhpY2Sek1WZ_NC0IK6Q_jPs{o^4oFzj}HBSaM`-X7YpC zua+>=+MGM?P6MG^j&)xDLR|DF*G3p1bSpXED=+td(5*+zntu^wMk`wDEG0x{+%0#-25C>Y655=XWJB1kpndRaA4csWP$flJ zt`Y-GM23~#{k3*UP;<+UVFzO2`*c+-{L$?bOl4aO||7{!UU4 zlP3H7q?@6bZpi>9#u^?TuJS>zwwI*QWsu0 z@8u{JSl(Fc{Nla^3@%MGX{b(42!{3x;DF?St>NS;j zDvucGF@bYa6UmvwLb z<;~5N45Dt4;v_OaX+5gR{Jlv6kvqfuZeI_vT;6UCzbIf> z9K*VDYC@@?_fd`GcA+Uur70(Q6KEjRGg~^>2SnH$Ba`oMq|rd+j;6xmN&_6eJzD>f zI#uq0b!^Uw39|R-sW0cL!KT0C-Mv@H3;j=}<9sr8Fu>)_>7RKR;G%h8rJnS4v+kXU zJ~}L>Cm35g$M0tA(~ZR=s-xN8HUpd+Puq^#Vc5a8 zt#9tj)i@UiZrd;vFQR?}@ZzqoKRJ;(0(av_(zD(Vv2fqB^<)pw!Ap7a)iDzE5X;qy zmCZlIa)pQDzO2yjd4to5i;Gg4{k#&4amjq``eB14OuD|kYw22rZU>I&s`f9`rtZ4K zIG+G7=rPcey?U)U#yRJmm!q^`*Hamk zaA;FP*rzXb$9ZxX6hB+ps|+ABX`9(HZ`EtK8(=}Svv!`pA&7I8V`A9VAna47UbL{q zVily;#0g%WmLM;t5*|Qj{negC!C&I}yME@{%QDcQNYm5yc>8@={<=2oM=@*&L0uF6 z^FzwIR;0ORy6Q6|P&AVL*m3~YPGF43()jl!oeV^U+Yq7x+~!UzhXlhPbJ z&LF@YPPgX>aHs72Z`B?A2|6>|xU17%RUkq5`AWW)M;;r@vyy2v4Ee&E#$Q;&p-~ni zDP3u_>8Le~elA|m9J0g8=_+O~I)x1Z5H0UY*EOyeD6aVNXKMo%VHrQ5U}$M?`=G-W z%K;9!+o4n%*1BGg#^K0dri5ry>wP@;VqE6_YD9|<5r#ck6Bh4+L&3|>?zu8TU?EPA z_PehrK!G6A=4miPf#5XK@ADpySrcA+RQ*|P?!=hHLurMf%psJ>lt5?{odoNi{>~f0 zu+-n&%?r~$u(*VFoc4$t8wQk{5r|ql$7Pcoes2&kY{)eV_?i!T$6%!zb7A7YC|B;1 zsyfS#JO!EAR}YqKQV{WU)!L|HfmQM-eTOkM2<;1ZZt+JTU4*Sds}J`-jp|#Ay2Xyk z$`0|z{U^_9TE{FJ)p2`50R*^G*L1iOhnr3X-d(C=kNLmCMycxT!@@@XxES~UzESKw z-0rxL#(&$v7aZhI5HqH3DbW0ONnZa5u}bU(g0r ztg$(=rL3yEIrB7O6DLNVr}4KqfTPN=ht7@>xJAlEQEwo7HOv$K?UUIOVF~;R5LR(WZ_dG3?4dz_Y%RTEu%F{5d7S8kdzp?j) zgXAtVmh-Skt=u-*ZHV9hg&zQptM-bPz?u_JjPG6@)E~RKf=??zEP2b!*e>W?-{fS>ol*;)Qx}Pfu&Rl@lyF z@p2n|R|8JLn;j~}MwbM^xn)CR=FN4IAPI7{S(c>T59{>wjz2ml^)ls#6JRiuubA+m zJMmRHs5{w_i;5XSRs0Knd21Nsv|;dTbisjJ8V0{67t=Lp`!Z!BI|(49%6OvX6>`1T==PZ`ugA$s z43$;&_TtAbf-!?LNci6sU-(q2uZLHBHM{q%g8W6dF}A2G7UVjoaBSbKthOC9D(Om(&R$HBR)=hv>{P~K0F3|J1kN5rTl_Ftk9R1b zb1U5(^9YHK<{D#DYH+0n$0S&a zfvtPPs(tXKrC$){U8VYeXZ#C+#h)Qgo`4}R{_UE9hcE=z`doM5JPd(7C(+1Cc-#y_ zVA(l@GA3}h!njX1{w%z516??e6@o_=gKy%WrI50D&2v?6VcHdE(kcm3Tai+8Q#1Kc zx#!DDOu56tg3pp4PW~_U49&~Tet0Z|{?#mv z_c}oW!p#TrYn|EC<+~+0solw-b;*$)rS$_aja~aTQa5-`kph8&93T&2;khN2x4tI}Jq|UQ1RM$U zIGFmiW~gCB>)!gZ<*oX6wE9^uIiqykmm&dV_$T`YC(v75o_HMhzni@}utEeMkc8iy z+;vfg@C;TV;tiy15nVUBWp+&aY37p5MP?V)QLF z;>Kpt5nD+l(ovz2u?2NS&5&1Aiw7mRQtQ9b3Sq5D;?o7)pZj^+TwAx1uvcMY4ZKpT zrYP!s>S5Tcx!OVQe_^kI!jf)jt%|{SAkduqo?kHJnW=kS3?5$Ru9zc z9Q7yDzhorTo`E)HId!~44%(DPX(yTa^}iAqv7AwwHXtDCrnvrKf|U367Z+b;`XLzM zD64O&um;D+&AgXJ7RKQCSko*y<#iNBIC=>=62R-2Sq!Qm{I77)OTX;yDOkApbImD6 z4rEaDf6jkvS#AJ0?i0$R`|&N+<(pk6Ii#k(d0{_61dmbSBNLcy{mj3gbblu%p#F(^ z-GFO;wGPDZu(?9yRYZ_D(F;7SMe%`f9ZB?i}~#L4%ZYOT0L36mh%y4k)j^59m_Np8-c_N1R>bz#jKFzti^38)kLs4mE(}!9a zoQmDveI>?r%CmBBv-chn2z`2$n? z&?adg>&+}Q;=PM1;m|lEr0|+8d2@Vp>A>w&$4YNsuTXdP_QJ>LMf)v+_EK%Ko|HD) z`x;kb?NYN@#@?b?nZx2p$LJ`&+18mL!-^Vj#&-)WHS+J@ZB4fC={aT#9B7fJq-j=C zW}R$ov16z=Skx~6E>^N)Yuh8zAZJt0)6)w}GBV<^eXJ>v(Q4U38Xw2M<&@mlGuDGk z#Hvm8dp!+o%y6A&(zo5Bo<2+vR%xh5xiS`#R2_39E(un>Pt}wa+pp&?w45f67nnG+Gd4f} zNK}q=T$q~1TgFXvzv;YuuzG()+MBrn+nzVk*Kx#R|8G>o);NE}Ui)`@Ts&_fKCQ*~1*g`3+`U6Qnme`>KSCls&Dzn|>TUN+@Ig}pq1AH@bfRhBxUiU7^@gZcm)AL>O_?}; z9aQY^?a*o~F8+65|qTL9>>rrdZ0?_)c4G z%~*ZdTXiq)+s))>xot+wW6t^-`vuX)V1Y9OX3BlPccH&K~?9S!Tv3&hkF{%8mexUz))^+(Ils8Kx+ zr`HBrJN=qc#yw}$N6EY33l53oYz@c@`Bxq;wjwQl%T-OM6ErN`4|4{lw_9+OVYF8? zbie06zY3_&sjV>@?X;0W9`2g1xhtQ5v%q;+-+6$vY+|KWPa^~^25H5HA!H;!f8-Pn zS{)6H6I(L>8#_|}u6h*m`*dISP6X28=dsf`9J_ox!9AIg8BpQ6_L?!1ftlOrV2zeP z^V^?uNcS0J*eCwTM?%)ivOf{h)nucVOkP5^8B-_p2|>0kCzbG3gO3*uwu6bu^O=N*Cmz0O?zZbHFdxowf92PWCRyRA1FlJ+-vhrW=Y_g9A6YB~ub{H5Gj{2U(g1!Jr z&(|LEBgBa<;O#{J&0NaNO%Q42eH7S`LR#L}d5vG3XbvvFl2>p{R%I>sG-T`M&t*+p zq@RKL$1CQ@n>7h9KV%67&cMZ5jHcgjLMC)WrzrzWC~%`+Goh?~VH08d$oy`$D$+`j zHrP=9w-n-gy#YweYIwUy8sSi_p6X{dux7hJ;;ttrJUNs&rJ`D0OJq!aZEmx(NGnOI zAoPEu)AG}{w;-ca>Fqo+dzo|h*_hHcK6vflVoa~&BoW#-J2ML|{u^9CK1lr^L3qc6 zmVYe|o5@7bA_IKi@tpfVz7v)@82_HNI2|N8ked|wl34Wwh+{lVZtU~mq;b&W&5 zmlM~zb&waz_ulccBXsUcd@KIn;1p=K_2yt~uYy^$79_yFqxT6H?B(cGnPZBpiR3@3NVTWK?v-nzsg zBD=$vM|_R6h|ew3=O~Sk-)nPdzRXplxTiI>@?3w%%mx8kkJ)zV9kg;13=AvA?(ZZf{nHX_R+j1|#Zg3V9!;x*yl341qoYPJJ1xuB5BXtt z^DhMz#wb?HuI}BCBGRvGZZjE>{eMIM@+l4YH(GvI&si`UxbJ~iGr_j0W)&G)*VTTf z_a7141hq5Bq?6Xuv{aE6>*=*w9z+21ui_j3YV#m`;Coq9^}q2w*ZnfG%DDfL9^Yuq zEr{&Y57jAI9Tzk@@(XmAyXy+Yq~4ksHDVNhFM}07jlN@BVZ>IZNrDhoUJ;HFKt`)^ zFeMG}NWY@txjYrwju0g!s1QK)uk~l(vAXh%ws`Fi`^JNCbWzyb&pZ2K53U9VzW&NE zkQfgBsz|GxZ{a9+E1|OL?ttC^`0FBUBEwbZvd_S&*15?#Sk(GGaZ$*uW3h3AEjj;3 z!bYM8!ECB&>){{5doAs{p4y{l!mU48oH&yE>;fOBMMcsp4S~}J%!Oq0WIy1K2OUy> zC6OP!|Ndq_`m|2vj%`x2_=D4(y^`qyzZ9*hbmC*^}nSNtVMePZlu0Lq=6m#u#pq zA+x-LPcjyFLz>qMS+2S63!Ro76}h8$lUponhJ6|5ak=o@Yd9n;+N}RF?0gsB%E{y6 z0_JNv7oE?0IJWzpu;w%}I8NL2b_FtZ+ye7nkXjlt`0JQFLHM!Mh5LQTYB90aG;K>< z1v3zGa)^@(f(&AtHE01pzI@UpKSsIJYGiU8PEdEMM@s}QrhXpPrzKwY6Jxym%|_C< zkeLMJPP4MZHJmi-!`{Bh{fxHyl3R1A-Qtw$YW|-KNrm%xRyb}#s@AETU^%)2a;h;d zgDHMa_)Szmb>739+zf#f`Fs(8g6~}JRAX1Nf1HC$s8#X|MGrq+kagHN0vo#SE`!_f zCs)rrl72W>yHsqUCTQe*p1#nbwLp3Yb{{&gM{yPk+Lo=Q4Kfa^^Il;`)3;5{mnMyb zm@>eSR_U6k1Ck@TuhdtW8{D|s>m?L1V+M7%&~nua0&uST0!^9Ru;G1>Gb;i|=eb6s z6#%)EedUC~l~1$2M$Y`ea~_>UIsjpK{sNfVaKReCr>UoW?zy)S0sF*jIK5O4?ba? z=(+IfkU=Fy@i%~QQa0oVPcg|s_R-U8x%$HQ7cm@lS(ZkiSND9^rToRvHuaVxbC54yUMdq%iQ20+uIN)QV7>!Bd2VO66r&?L3vIe zVV#qsNr47AGVri&Vo1sPRxt3I{xX`e?>;*ifpl3`d-_=}A~UD+6ShfO{i47;=R?YF z9GlM$MuwP860VoH-VQ1DEPbS%qc)2?7N?-CJA8~bSG&}g=?Ev17=Khx5J-sD9n7r} zLCm{BM28Y7$JH%$C!3VT?uMzPI5kwE6;iw?~N5(#&U zjpmDWTVzue5iAaAFrv@@tJQ0R%%UXBvEh)0q}85N*+ZdVjO;1XaaRNImC7Az7EvWV zTWm0tIuHGvTp%wz4YB&U2zL#Nq*4paT5dA`_8{xqz7CZLPqHi1{N6{X$Vz1$U;ohN zIWbnkvCV_XS)*v0DBL|py`M?Pk$pXXpOF*UPmVEM0bnzSak<|e`5`{W4mShALHE8P z=7Y~>U$3av^c$duK6>R2a;%&}_G`84b&cGkh-P-$6zq#T4V#`BP74Z%w3n;VbHWDN z`kp9HnK0C%`tQ1A$8>j9kU(}J$y+cyIahPJ;U?OB;1by5kXmgT={=ewxqrTX4rpK#j&VR} z>yXSds_r7fPmGDb8{+4C3=U93EA>cHXkD0n&%zpNdaB9Ntr7ToK`@j~?se z&FIr4c2lA*K*s=He5}??IPd{F27Xh^y?4w~BpS-&y1{5${Nd*jNojM)_;<4zwK&ru z2aPiBQx_?1Wf@+3yEwtu-*Q#n<^|3>?=juYHe0cnc+A@nJ z0nxZ0Wp5Y)ck&CHvl_rs9tj#Yi!@ZPLfAU&n6%yfX7gUH!y{RB$)vjr`!QPM@WS$9$E^wNc`(k3kcQ0 zmrrSlgxi*J3%V>eyyCle)P0^-!kF?#dlbVF;W~0Xx#_1qOEIE(tenqX$y_!E9@L$E zLus2Rx2aHC1se4%G9GwT$4N$9wB&Bq0w+B=BQ8vG_X4-3w9%A2Z@k@#nqEVjsHA;G zMuSsBTfpD`RjUkzHqWAVoLqPjhp7x@{w}AEB6vmT{XPzrac|R;(d?o52By4WNqpa5 zRR5N3=T}-)Uxn%M%Wtp>dgI*7P@l&0R;qlI~CM z&hzL0o{bFRDzvBSo{O^gdt&o@bJK-~<8FamW~8MU>5ti-@&yzZR{Mgjp{0(Q}aJM_2tg!cUv=q|K<<}DT~9xIUHbv4VQSaE9#m0?iM-(1DN&S&x1TDfl5l zs?3}b`S7_-AT@l_AuY9j2I+H+ok)JB@`yDJU?kglY%u(=c9hX895z~qqIZ#*z4d$W z;2k7+;jQgMWD->r%r6w=L_giRNa_&n65faWdNxgg?h>40tK0+A%dqi{(5C_^759km z$ww$HF5`Ls#^z?#?L6sryDDE~+WGnvOZL8vIUjtth63|ljo&rqeekVtoDX(=+H9oN zQYR(QPlq-me`|8B-$So&7Xv;jR+@O$QR>t$4CggsNpwfMsL+k8Qcd|uN{m+%i?m|w zb2(`90!7P=uJcbm(=S@##4$%V)_@_fA&iTFlwy^MXZnSxmy)oDoR2m1w)nS=4Ikzo z{;@lSJJ0bp^jbgeO(`?(Dc{?OYox@n9r@+HHtn2;;vcbd&V<`w?rC7|6H(So$h-=b z+?Lmev?w2me>|lpwY)B@%>$YnZr=67lBU;1CZE+XFHzWrCpGqcu&lO0NBICIc-*0y z`g2~C1u}uyvg)&fXwO4_&8U|gN{JLsYpJSQ@k+xR3MUCoYa^C*db zG&p|S9STYb5R~!zF&U7@6(A&sE^6RW0Iza#uGL8vwHrAB=Iz^aqKlS!Ou^$jtjETC zFBA+U+6yG(O=Tes!+-|8X2D|-aCtc*2(Bd$c+$bEzRAwtvuTVAr6-@+Y?+ej^Rm8O z2ILH6E4hk<^Yno?MB}IS0zeNG3RF`qNsYRY4aDUUm!%hJ+LVvQKlYH))@9!_E4(== zq1ovmrjM6>OU6Y?l>OVkEJdef^|%6er_4Ya>_M>?2Ptn``ktEjBill+KF!tRrqrJ3 zg`&OpchN*A*d$iiQ)eSWHsn{Og%FF@zat06RK(W~2K1S2kK-RLt&YBG>$#lf0a$aw zlxaS?4B>1hceXXs$lEelL!@yuZ=e-4Qr7|CK%Ko-8X?_(UUs>IV;T0*j0MMED8G?9 z(M^&D%{?d*!F&(#Y*A$MbQjH#0HIOYp^mM;Vf#xC?rw+CWX}(9&*U=;KBIuICC!|v zd8bed!7(VV$}b&G+S{ETT_lY#yF~iVaz{U4g}_eEi$@s- z2(Q=#%c^D00ujzQIPshnJM%*X?wsAn?uz%3o*0HG5uPP-Q)dCy!0<6KzM=xGMA#7O zrR>3d5VRqsJR37;+Uy!`GlJq?@veXOrV%f`Vn7`bb3H(t`AuJ^7npx zyJ5b<-^5nryO_29v0N`WH_5ZEF8pAtD<7QtxzM%64z@bd+`}{D;>2OoGi|<`@^JDQ zqtgdbkk`#w>aHHv2%n-Q7?;+C-L`FSPWgDn{lT*k;cT>rZJUNu5z2aI%a|{uFfo@L zysLPT@tG76!*NYNu+!lJwuU}^iWYhT`*NrN%g~X9h#!6G#&{wbGII`vauc9ZVF!a= z22JFUhg;+M|ACDTzG|BrdQI^+ac~N9L8tcVYnL0y>S!eJ_-Oimhg_EI#X2PZ<3gfP z?Re01OluFSe!&y#F9fzaGP2jNi|F&$llGb3xsCKHxt6#hPv44SmtL@fxqVCwjXB-` z_8weF<|p&%^iZr=)hjOP=L$nEjg;@4LdOB`l*!b|x^8;;#R24qX|4=2#@Hw0z<;d zS0x9`ZHs++EyzBzmhI<$0L4>1!sP~36jNy>=p|2n?Ojo^k1PfWLx{yQBaQ9=8{`>Y zmXx?Cj=6zQrzYQ*zz)?y9f!2}w(Uy+jCl{k;h^FN3_(ngG%B6#O`s=`LD@>9Y>>^N z$M3DB3Pz}OC=T}>`Bj6muaZk-y4?pGgG8juVe!e{V=Nb5$RJui7 zzPAS_NQqI3e8PL+8#6b)h8-mdp6SV&+=}F$R@=I!k!&0Ev(N^ z1FE_6*6On*O(8KjX~G$tOE=(F`MMfcADhwVfV%>;K|hAh)odJj#?AX8czU^YthTN$XJC)jRyh)`rJKFg5p=aN z-N7lUDT?#W3W)qKL^|-o^)2c!`5^%3G{U)Pcl>a4T&V5e#1tch)>XU=PFn=|*m*W- z+$-`e(x>_QXgg$15l{2>6hcS*3RzM!KSE~Wr+F_K|Rn zh8s)uZ^4xu*2OL%`Z~EnqT=e|;55f^e{!!w-U=8BP% zV#m%z(T%xj7a*^8NaX@w4~UHJ;%A}gal8fWp;w0%7g*-f2060pt~c8VDXrMMzF3Da zq4Dj>Q;2>S{YGRzT=gE>!X`=iM(~AteO2*^e{;_(im6j4M+BI;7yAIQu|6WWZAA8S zpu}N^|`C-B#h!XBd`$C1#qP^sV9zubA z-zoH^VfmI5B5?SgJETb09ezDM0|6$_sHo;&m1!W#sMewHauJTtv)g?rc}ap+8(MVFQUoZ*F1zD zu2ak5kO1OP;QyoQs^hwNp1zXOAkqR#N_UrZhjh1qbazNeNvAYQNP~1sOLvzv(ji^X z-TD3f@%*>1xtX1v+1Z)>9Pc^$+|9$F6y&iz1*8)wot;I%`a;XHB0e1BzU&68H->F# zKwVT9lqRn(yNW%aTH6v9{PY2u(lM{xU2p*uKMSNRRe)Sbc-wCWcmc}j9gAKnP@c(4 zK5vEw&9lGnKv54Be;4-^2B6>=U6j7jntTPFJmcXeYTzk&?N~qyEZ!yub4hgS-0vwj zsBp0P$qYcTQC!3K+lM*>^pk$$$t(Q~DlpILdWb6g^S9YbVwCHGBp8OI&EL;}pDz`Q z=A>EJkZR$*TX%CWcfdPCMgy0BY7ZX`cSJ7StmIH+8u58w-z`# zhK3LB&U?^h`c93D@Sn%$d}Zip^ySe2-Bot%q~$@|T0@}BC1WCiU1Th{x};VD|GFfg zqQJ7QES$VJ+NXrdX3>!ua9aT;Jw2Y`22HodzrF_|9J;@VGfuTHOhDD`+lXGz0v}Yp z3ZgD@PnIYV%nGVR&7qA#rnFOs;%&3IVf+dm23)zmt|!?t0WDaow6bbYfdGff*4hBP zdrcm+&w+m0zo(9&3jm7WWh(U3OQHyb?^}ZZs^?S zskfb{fHDcQcEI*jA83%d@0kx0Xa&jR)&&C;su*7kc<8%zOrXV^3oS+b&vqufi0zDS zP)g_nQ}5ZEb+8~OHY}|BOeBGRa=l+PC4=ne^1_RBkEkmERCHR~k$uBhUIyM-qWx+< z(bO~tSHSO)vG4&L04+3#nFddxop)LtZ-pX--7tF>3C(X>9b9}Pkd`k8s9BpH-(RSF2#C}eb>E9rVbyZ1{(U2$ zz0JZ?tlKgWt)aCSG@{t-8`U;*IsGAEYW(M`mNtcNNODV?7w6r@pjWDJS{(FL*NsB~6+otve7qNF$0=5m@;5o8#MSXkUM-LsQh}Xj-+r#D*2~6*wwn0NLCu&5*G4gBdyqEL51}u3VW0Vszv{)v9gTYRm$>eZQ!0n8!zLNFo9$JwD@+dXfzG~w z7rfZdi1)M^5S1;=F+H_ECs#@D5S+OlUCwT1;Ljh}S+qnC&S-p#BU;gqi`+51!?4Sf z`S7eJ+)s}8@%AyV2Ps1FiMQENI2t~Ks=IXms$$-yE->0l=$xrux>NXm%t;es=bi1~ zmeaA2|I#EkB8)hLo=I@!9h`-yW&CcFCvYemScfA2w)S*Ez+n2C}2Y<-e!zo-Ep7XlN^2I6{ zmcg~?E$C9bNTF+_k|hF|oHi@xCrm3_r+;NWe)e535+;)=qwqrG4HjWIXMrhv(IW&C zm)0g#V*QyHfz7D4BKh>kNM?EO2NWRvbsRz1Z5O(mV-Xn2v^A=4RQI7DTHOpLS6Pt~pKtzY_BuWOXd z+Am$jnI+=@6npO1qQqG^zaq99f`#2u+ z0AlCvZN7hTfWh_EW&ibNTu<4O^`ykPWw9M@)W;p40M(~GGt7Za z<}L?FHn&Jvh=R%Y!^QIGK9h%|z<+ZX8J)*9+ZH6Wvr8m<$l!I+S-QSo_3OktikzS$3B~KUrB3`uTr5{>Tvm|eDC|T znH1fosT@u%&k)-mABmIoTWRI(e{5rZE)PU{WaJ34#8G$Ej#Ni6_()pj=t-s2>`a&u z-KLCQ*JNpWMXUPui%cFWGThTNG+TG|?2qUVsoC`js{L;VwGI;vkZ>k2bCoUgdJJG$ zj-m=rgtJo!u#E{NL+2Hrns?9SKTCWYg=7?XpNN28BVnc{>;KhEDzr$g2=;fqkb8B3 zl8FlT*Jr_z*7Xjuf;ogA68Ky?3_fNrk(!M^dod}Vry4B7(W)HSCNe+6t%;))xm@hwlb>z9%Q%*a?4}IxP+b@P!wYcp_nXg{g&>Xj_lcJ8M%^{t zeKE}_bBmc*%)7$C(8T?Gycmr`v?VcCHg2L>X@r|leZm)rLv-QxI0^NuWtX#&02y3)84z6w`} zix=XyQ9pEU2SRj^x0-J!3KVmBAo+p;#2WLNg%H(GiVI@JqlfpUxYRwv$+=N-*c-%k z4g{uGDvPhDicOdMT9r)MEvkF6M)B8HWL8!Af6E94RhZdEPZOO{py{}IPyY>R#QBhn zKRwlf;PQiwYrCE_mTGb3YEH+qp+f^Vm-SjlVDH=T(;x)sFv zknv`FX36dII?cAdR$=mG-SgmCbhHsuLfnmF3M^?&Ax`NBc zK2c6zGOu-L?AWd-iW>ry5rJfb*(fZ$R$fK?X1hS?#RCRgc|w&63FF1De(OaEz7Gh6 z4)Y)GL|;E*6oi|UTkC`kJvsBf$@|_ii^{xRkicDwmiBb(@y@tT(TMG5C9~J>P4Zb( zdtLgy$5TR1*mP~i#^Wn~U|?Jp`9Kgj^rRrQINZBA0vM$0AoKbBH2bJB66)*9R7vpr zg|plD5DtJh+*WA&f;jD|f;5JBV&CT>L)WBlhFFN!2;AZse$5*q*q`Esyk!TM+(tS) z;$GG8PvYwwk>(;ZE4*mocwNY+Qehbo(x<_DhtcDxXchb_8sO(atMj^_MCpPKfI z;*(AXl=3<}S<1+F26Y?9lA^&UVJx~2JR$DQG8CnEJ5lI! zJH>@b-yzMJ7U+I?OwU%MF>UR6c&371PWbqE(=((tK5+Nq#L2^}*xJu`^eUq0NnyLe zAM9*S*Sf^g6QQXmOo~b#d}QvfCyz+caIFjuT5noE-~6oC*m*ob7ZjYfp(7TF;Hos8 zee2easm7WSyX)5+W>saADjqVrChsgj!w|-!OkwRdnsXfuBX&%`+!|7I_EM6B>a&}D zN5YrL9Zc=!FmjQzLkWPy<>2;*ruYv?vLV(;OZhtUsA~9^*Ts5FtjpRD>lUuh`BO!L zrMmZBqGxcwb0SY(N5%v!6D}5Nhv4etn+=+G?ml~N3e3oSi6_Y_C5ES-I+kUI&-`%n zRE&Qq@5JMHO8iVMLJg1gIc9@V-f)S08I_J@_KZNzCxV$3hE>je#smRiajZMm@~~So zhs#ZIYqM6^_{=O?@5zP0NB*j_6LwlHj+NcsX=Tc_W`q(2RU~uU`|F^R4jgK|_QT>- zUhFe``}Vu3)^rB(pC7HZ=#u6xai5bXnzJW+SDj)#h2848Vd4=H`}whCxMEdLi+AGX*uv|L$7M}8VmOa|Gc81 zx9=C{1G6SyovG(J20sp^4^hG24>|66)>v^`g#>qG!_mbUMp7lhC)$+^eBoy0)M?f` zXXO6-_Q2+;}eD~1?8fn ze<^|syBvC$l?Hj1%LM90Af7r~O-&Avb(yW&OCxJk#{I;jnx^s{-wOpio|V zF|*Ae9>{}S+P5l!fWEbu3Bw2rDotx$=^cSPoDnL*yGOa#QU79kty;`}bw%{;gBq*L zslJohI0{N!x$Pi>#oH7jg(w1fg?diEOBU14!^jy1)wg>!jjysE$HlvZ&6-H)IIZiJ zE=cKsn@j=_Yeuitty9JtY7@eN8;xw6Blinl;6{|>{XTI^@G~&*e7~IJf}w7$xpwY( z`Q-s9dmm;Z1|rR<9|5LNoKNMdu!%JTEg?W->GC{*G~l?lZSQ+De)S~DYfk^?S&a42b&r_6)uYR$=s%2L7XQ2 zvAC4)t-430=I@BH(LD}y#Jx@dS(NWQ_^QW#?sOTQCoI12K2ZoOl`Lz z=2)Qko^`x&moW?9yFbgb8=+1S#l!RD13wO{E1v&7+Iv@V;`ulbFt|WoDjF1pbSt!_ z`JOb#q{G)Yzi>%sC#6E@=z?ZkdMCxcebcCnRRG|@(=OZWn-&8|{+nA!(bFQmK`3-l z{jtTtz%$i!J!F_vI-ule1jCp)pQ&CKWJHI%TOi zdj+V2k1L<^iUQ^EKde;_Y!DZ0hQc(hs1=`avY7ejQm=@on zJjZQwQ4Qrje%)+2n&%_Z<&Uw<0IRQyNrvt{E1~P{tPMPS+H`vt?FBxYA{H0Y#RHzj zL=j>MDgn<{dG@!C4PUSQMBED6JL?Dzg(Zz!?^hrKCciRFf9JXM5_lG}nqV}Lj|^O} zpKN2yHOT;SIb659)7{{lji2O6({^{{MkHBA9IvQ)q}Q@9dOH^l@-HHQ6LQH=Tj_W< z@gZPsF(c;MQ@n_aR;VtZ=QQWqqqzA=URify1fg@yCvJXUS)c5)b7x4jv z4P8kcxPs6T*h&qX;&q5JS`}XdQXFi1g^8b81iS2pDV8(ULZFhP<%&FF5ND;YzW>e( zoGIPqCeR6zlTSk!0|%OQtr|Ko+D7r7#^-%GY!K+EbX^gGc&(lOp|XSUK~5;v8W7ZG zZm)$2gdrJ+c;>HoVN26lt0?jhtb2NZv-6j!Qb~e?{g!Y05d5{Ih&dkz!bEC&3`0;Z zYd#xE0F`Ex?74RCm0keBe>8e~1t8c}@U6m}Foe_kMOqFaRmn*iGvq-ETTKgR=tuQj zSpkP3c!GThcs5z9EezT)Yh{t70a=ytFe3`Bq_@Y01k^jsK$ivJg>ubj5&s;i#(_{9 zF1zuiUbzBd4N-B(dee|_u*01^#fDP(cbO%nwK$<@Pqme$Ot8o*j zWETSLUnylyYf`5{SaF1VPm_aF2nM(-E07AE)A7AMRj3(&1^dWYtpb8pHsV$ZLbyaK zq2+1-X^q;o?TJ?gggD@*A+yKMOCz2jXcp|@C*3kerr1aSI5hb=Hn8fR>6f?6c+ zQKNx80Cob@OCBH2L-9QLy#a`4C`z8SNz6dG_T-05NedMSC!`DhW=!KP8|v>~)~d+^ z_!B_eh6&Xkx|h8>}W`{D-TY zDmK%E97IhY*3PQ}K_JT+57e{3EkxvlH_nKJmb>S5AWGAQ&VKM1@!&v_;i0(j zpYfcx2EI=RaMHlIJM{dD|IhrGdi!;LY^dP$zn`l7uiFAvzmgB6Ro-pTl&}Rueougj z@PrH{e4kM<{12N7WQ7JOBC_zKGypViMYw)k^ZKWe_;2XY!Lg}a)HMHxRxkKWdn5w} z9NRLwDip{D-C6%by-RvF8DT*!00vi!bIH&tv7P0D8e+<7&27!VGqSH*D+IPH7=IYj z(p3BaVZcWe1zUg;1$GwHFBg?Stt7e)vQN|#F(LeR*OIShO*4egW@KFFh1TzaW7Yy8 zhjCz|O#W%b@U}{e1-06>W}P#DIjW4ay^;tVv^qbi;ehH(!a}<|WuQf7>Fd(~5203w zf&9i+C?PgD-E}!~7=Z}#q}dmRP|e{(EqC&Vtg$+_z=Nh+UV)ED0nz8~3zT?ZC&Up> zR_Qdfut*gR!~Z%VR+3w~coT;~r2OJ5W`SuH2(Vu7Ugzos>`;-J~nPAi^7sO=&ed3UxL9_?yJ4v(wV7j11r9Bs# zYETv4Gb`tVDkvV_o6z$F2oPUZ-uLN0$h`aEo?%JizowKw7`P_?;r$gGy=(uqHl?yz zQ-G^-En2jO0|tF2F3kVw)nBR7uV}28AlekzC2>A-O4;XrgIe>m{ZaP&d zDPRWy{McPq)BtoB+G*N@a+3^e2;v{*b3?NC7a!W-)L%0L&^5%iln?4j|uqyW!FWdZY6Cc&__@oiW1%ZZ;LZdhK0}v zVxz!~s<#t0fEa^ksynnJp;a?p{(wy~VS|=XSRPT)>e~hEm5Z%Y_@fVKgzm{C>VMkx zi~Efa-h!<(m@9(JNLI+yaUBrXr?7c=@NFk~O=asa?gr{%86!n>YFYx*b9y z+LXX%qv`U)df=J_bfOJSqwUc^of*2hUT=U(3uGcTq1Vz|z^5jGtBY2?Qy`RdL&Rap zA%91FyRNXr0XqpiI61!WKy@SS?^zESR0OIP9cG~$Mn(&I7IcSvEvxMYojUV02@+_4 zf?S(zj~n4%e>%sZN&Ocrc*c98KSV%<+~1>mtwBdFUaU=@0+iq@tAk+ZNyVl~2{JC2 zxec}mR>Q@iK7ymB#!jf&X0NSJ9r6KYr!R0%0QxiHn^$SOlc%Wq`tBZ{opeA>jqe~Ca=*oy0Ax-ogC<~_lQKmNr)9_X2p~(cu zU-=riq}=mEG#AafuaKy8o8<_!C!^?1m6_w9Xr-S(6L_on7QVc1HKe$!4qdhv5HW6` zrU)HA;{HOIKMu8d@Sf(V70L8@*q458}{06*pSpR|fZ7+GLlkDiB_76H5 zAE?zW%Z4ow?E7=rekTbQRx|%x(t98gLbo+MHKUSvdC(IMl}>aO3eiyAdx~MHe0*pA>Tvm5?q3_3 z=LZ#ba2k@-6GmL9EPJykdX!*K0HTAfHP^NR|C$J5u57cy*P$Kj%WNTpG8z?um5D$e z)WuD*Ktt)2uyG1+#y7S?P#P%$s7+ zSO*L;@2AQM{^epI? zb>7N&B;QZNaPc}bAE{R#R>y)$S^XvFM**c=50_)oYc24(32p`maB_KoJfl;-^(LfE zvuThMl)}{|VbN-?`TrX(Nr1{(!+dz>NZZ7j zOz)x1*`Kv0OJPFe_0;YQPoJ3KD^gl=#Av+B%RpZj5AneE znL41*cTT}e{EDNwln_;lEEIVICHb` z9kP$7D|d6TDxAK*)n7lk>___ixMbDYdWj?XD)`e8YExPwVdx9OR%UAh%{TZo?A|(| zwv#3}$`)5e_GY%d-BLNLULqR{Nlq~$X)P4&AGmP<9?|-HM~}~co56Mp0)wUB zyVg^#z@Yp0nw19}Ag+Gwc+>0!h|>x0pM98#73sY6Pw`yE1F#Lr{)lWLSrW)-D{$I= z6(i=)Jym8Zg$wu+rBU_n>~;*bLPZ$Wf-E>Z*RuqL5elQJd~@3I6$&S)o7h)h=1$RV zA{XjnmpoK8B=BhFO!jdomrdp24wWu`i20(1!g#kP5{TN03cLsIiA5mr*0{1iJ9uKs zD!qHUKM-2p`5~sA--~Cr^%DZYU{&2?*F~N%!dZ#+u=APxFLe5Ag;@#NwbvCbP*3L2F|bs3M)iN%n{E5vmM2r8&A9gck!vZ&;f=)~ z-n8R3_`;|}sWK4n!(9(&ncyiJqd;J`kEfMQC1q2=%)1z2eTKtHW^Hn~QF}l2E`n9&Jn=?&qS?;NgWC{5+kj(EjPPJij+Ot>*NFC z`108rtErOp^h}{B3JJ$YqCOqUGbE{$3itulKKPnC$LL#)b*}{N3`{l4XH&Gf$X}KX zoAXcVDAg5Cgp9nmW!$YQ>-s;OX#7om73kM-MBz4ND88l^-xR9-O}6=&h3Cw+%8$@R z=P)UGx0chbEcVeoS5Lq7EPISw`Joi{(F5EC{XNgph!5E-HfTM5u=0=Rw);B(Jt=j$ zW+ANDU0zX&pO!3ZB8EeEzcwQ8be<^Fsmr#>f|b-$dhlh=5XZ^d_Hueg>N94ETRuaC-Wab#dyY~TGUGPsz@^|!5?b)DNS z78-xs27uwk<9j%yVV7(R|43%h*^Xy+Qc@IS%5aUlo>9!lbFa=n-bxcUJkVoh{*xtE{}; z^NZ}ZSrvjxG2dM48>Gqw#-x5G2ZJd|!0A+Hf}29PSWPEi|JaMM8RBBNm+;Ni? zN&a*F3*$rf0t3eqJ?ifQ9exzkq{<0y%W_ClRK2*jAa%-G#*KREn-ioALmR)E zjkEsh(W9hdlS|J1SX|!a(`)5z4YvuA5gqR)27ME4?HzYn8#}knOW%36M%8rgH9EKW z3mb=QfjsPrlTQP4H0*_4}xE!^-MrZ*_hQfRCN0?s&>Z`YC-E zFpjNIN_^qXVfUdFK6GkTBvJX;=3cUZe^TQl=tT?i(YM0#b)>mFqg8YCh$Zh6vBwJE ziul=5JjHXhftRuqnM+7-yz(wR1hWNN0L66%b|Um7FDkbgEcFlRkh>b+VKprq@0k>( zlOOt1WN+YH;L9w+N&oDTbQ?F#6=;*aR(fvG?Np}qGydYQLVfM!oR`=>JVSzS-5a;f za_)$hgs|}wT%xSG3(L1qthp_JQ)-1`?IFj|pm6q#a4gqXXNX*@+qT(4`^Y2ryEdv13mAwnP#OLl_~$ByK+ z>q58k^&lJ35?<56*S@>!NENftCHFDs<$=CGkA4EgiZy3%#?K%9IEY7TG3u3yI8U_F zm5l4$wwGACs2xN&d^-H+10l7IoHIRYa)6G?12v8@W4~}|`q)Qas=8Uy-_K>&5zQ<| zBQ9Pt;z&kah2MoJT76Jl3$nURg8h@47Yw-D<&)Kc-@h35$+%Z20P@Lq*VNL$36WkM zORtG=2HbFgcr5u{V(p>bH?HgA6E|u)KU54Vv6YT82L;7_h7^8I;|;mEd;wxZ{?Mni zw-pyWtoJ)JYNw-_BS;1ALkA&x*#bF$udV#bh7xdZmcA|ucuiJW0ihfbDU?+AY)!i+ zlzcg0er|s0?cz5~hb|q9+h}6O(hnm$%0}CRiu;y>LY!$AK?)W5q{G)!0%(65-y3`k zj~vbi(x@)S`E`&ybhh1IN9+xQdHphHZyEDmR?ax=Zpl_${1GNulh$sQ*{5pO22Xyg zPR{N|1q_HY1GY;~YS;Dd=Qp%jRnyO#4vcAh%HFy$%~x@^cO6bk8Q=lgw>|aYRBiAW zs2;e9Ws{q8+v8v&yG_AYJ7fn=Y7iqUZMgxI$lO+9>RO~H5WUCkES4TLjVDmIu|5w^^-?7 zfoZ$6mf&Af&o$X?^lFoTNlibYQB3}-Cob{BfBS+;VzXN$E|)RcQoTu6%#?Fcsm2Qeq^CyL2iQ z%9)pVlgaa_GHe8yX9z#0QKZ}pucE!;lu)oj=7-*|v4OZoc{ z84XPpc_03n0+=dgc{?Q!PduHk=X_qpNOLI@u!XTA99EZJUgG!&e_tl!^xhJjE%IS< zX>!GSDMF1@r^ZbdZr}k=u8bLEuw%AZ*kB8Swl~aGZ0Hk1oa8;kQE?J7?mqoYtH~@xlEb6vK z{_tJMH90CrTTvGE^G!LCTvbFVA5+T)8KXP$x3To$k^Oh?c{UbiJAuDA`{=iLHtI^R zJC|TC`;32;$zoVs?b`mNn=`tr)*~x}CX-0kz=ygvX(x1ED4ibcA6#p8lKx>;oNko+ ze)_`=ZEibZB>!BG=_HY}OsV?oM61qTIwd7@oY3D{w6CgswN`yV zv}m_kmA(!*7c83;8|8}=n>Gn;oZ_lef zbRNk(-UlVOyN}Q>{P3FoWXpBhSMtC>g37m*=PfX>w9Wdi1B)dY zCvxbFLi$%#>}3kyCY`GV1sVEahO1V1A|4jv*6=1l{|}gTDST&1^&bl2SPq7VUG9?@ zIN+l(euMtdP*^8(iLP47P;Qz(!(Zu-5W+yp`^2!6jKsLZ+1avgxy=M;bD2mDDz>I! zG(Sl@&DdcsOIU1#mgXNBT)x(=4VCLg(D zA|1>SzM}4^n*~ZIXy0?%vP_=IeU76mJSGT9%W4x&tvCO&pD;X!zpYrBGOkEG!&=q* zZl{Ngj%BSQ9ltf_LjQC9@l&?0+EY$oApP8S>E?xmZoMvZqwG34zQd|a`{b}dxlxxq zB6Z6iZ&q(;8i}CJ^mh~HwfW9XD=xwbR{v}TyDdr z@g3L#>IXC;@1n3~kTOs7Dw)|N7Uhn2#-qQW<2z)mIvtA%UBnR=v(l!!Mq8~E=H~ry ziG7mrxn#$A0kEmm2dSmgu`dIE5L0#Qe*N_L5;D@C;jXt$aqx}?HeN>?L1UY^-#dtUJ|V+c;P>N;z*wf6Em6MpK!V-RP~eJ5@}&fLAC#R^$%GbO9YYR7ysO!PDs zL5>-M=r)>H=w~H1j5>6!BTRxE%+ihP_PwyrN>#8g1&gf2B;JTM8D7ny`vl1-Q<5-P zZM6jnil~IBo7Rqq|HVq>t-cqv@ym%Goy<`y_4MVxc_vS+O{B&{2R##@E>#ESRN^n< z9=ww?4NB!v739kWR`6Q8)H1dk&=PvFrj@`Ii-kO<%`u`8^Xpl#1&Pa#)Rc5*6cS}K zh1u>hT&i}@QpR7Buhl-pl`n7WFElQQC#ihbw3ip>yjZZ$F>Y_Ti#&&w+tv`}{NGTRF6$ zgdZgLa0Qi-3pi3wyKHWUbprw^YM7+`scScyodeEhyR+)#{V6094sceF42U!4{zi)kmJ(;WVl)5nX=R?1?DiG>e~Ez9tPX;Ec%^o%rbZ z^*b6|!*d%VhWz;yHO;2#57bffZ=a7a@SQ~za>n#NN)8v16{3mFsm+)KeYb@5x30Tj z=2=~4*qul;QN!b=grTf-Q|_yl5!hx#8vI4%A@AmwX-#su`Flb(Y{pf(k%&n}nxj$G zHa*(PqttaA#jX5maHUl~kvI&GF?OSaHc!MRX7`0pz~^sLMQVNCFCGXJ`42C0TPX=H z^mI(0+kY2a=zvdNphOrnQvs8$7R`1;BIDBYg3y!$9aPYN^CuaYD@JTj@lXCWDR;z?I{d zdkpxjgZyTT64rc6zuHX)475nfz6>1#u7Bvy_KjTKRd1KoTc)H42E2)j7EM zzzh=NO0tpx4hB>lpz?CW(ht zGE+#*$#0~%p_StLv@SXWC#mV5cN5Roac+o4;_{O8W1=;z4fLtAc9iS~%k;D+-#NeG zRwtiNbipDU#%h(;m>4_2(`okAr13AMsHh@n!N&F zsihKZ>_Yyymjy_lo&F~7C1@v#Yz;JM*%;-$3jQ$KRmOyCWS`4U%-6i3Z^m+nIB3+D zQn=JzPa5;>mU7|`&Gh}pZ`7Bv6Ps^KZlChtGP)Gg_uPM6zZg#W_1bt5<5#7Tln!>C zn^xrO{s)alQke~@Q=V)gHMnJAg!NmEA5R#8b|mnx5%*bk&+`uV_^rw~TNs{)e;M%l z)2IP-upu=$Yfd=<9c;RD8qLv(Qg23&>}Fm)mXqbYU1>vrN36ys6pw4fn&h?=!;4k= z{jA7=vBF>KjXm5H5}GCBbL5x8IJX{Z&ynDxvWtRoIK)N#$u0I|@ZuFa1~Rvf)k(a# zmqaMj27BFk<{p)D@SK&j#em!zd4AT!6dx20Kcle}6_Qp$=!y43$NfZl1RFPMin?r@ z(3zECfDt|Y!jaVJ%SmBd3cpfxqxzIYSRbtTpZtYOf8*1)?;9O2=Y{1m6Sf?P5K07J zQ(+8dr5{|N;lv|uMc+oFQFm|nUw?ZkxcbSE|GDdZ!?o*WBz#vLo_R_4w!AwWOdbw}2cxFfV*OpC2YLui}W=yD}>N zZ;dv-T5j{%Vwr=|dkueC)f{W}IEW&ui#E8VT*N?d z4z4dZ^46;5by+6MDof&PDZ1!l>WEvv3v~rc@d|d|So)k-9IK^-X0|Z`ECJqf@^li9*@|t6jb%RZsL1nFrH=N| z*OXt{#koQbZ~MG#!UDC=1|c9KWaaw@|t@JY#^mf7l3*&WKj;4}a^dbM0F?(#X+;$Ex zo%F^NvGD$L<(iPk@O8_#Nz}E^!c0{_N7g}&&^WK`OV1lx|=37s!rh#aTust7`t*x+K!K zc`ishxXD$^Vigo^nbb!&z|R)8tCPRJ5OLe1^(H))j)ON(_NZ-(r!~kk-WM6y+-4m~Xr*A>^QZ*u z5Y?WU3?T#6Ar<$)6)YukdJ8ON=m3GYiGOI75pL0MjY$1KZG;c3AT~3}I?`axq>^7x z0ttl!a>t^CnENCOMqea^D1n}m;kxCY>fj?{9kL}wu-}6+?2dl?qv1$H%m8CISlCd| zNk;=w)90*=3d-4_N_YA`E6oDqApu=DQq!|l5GbeEF8WT(VE>BS&hd9|a6XPj@0vo8 z$?! z7F-hUy3$ClnIYNdq zQQgFK@6u<#cRGV{x;$_g$ck?UI7B(0k-PxD$XG~lJVasf{XU$3Mg&1yb4{M#l~J?h zrqV?CsN2{dmh?FJLmCiiO}GFLzV-WXnn^iQU?v9EUZfoffS2K*NVQloX5kK^`=(W zyGv2wGC!>ZUK6;kA#PIOA|0Cj#m8iBfG_A->RbrJ?uwT@99ooc=|M!^qrkl14qd@Bh|;lPI4u9`zlkYFr8*Z2(;_98My#G~huDgeQ$)K9dITx@huP;UC$ zUsjOk;pF=?{CoV0ZS72lJUUR^)w^?fS8UX2&gzrwUzd-61|VZQS>M4uCDSQLYo`Ezji>-C>^Af+@m-;0J8b1(<(EJPI) z8kO4SzYK<5TSf8G)calX{Vj7yS#tlPu`8?z^a1!^Ac@o%Z)%hu9Po1Rcsp_gtD z{QOI_Ll{s;Bs;-jhIEg*P(A1~d$J%g{`H`GE1py--vSOL# z>sPv_d{Mv5GpCn7#xEQb1Mh^=khvSs$aQ>9ti$6Mm>sX9DU;SWI6pT#Ih^f+Ps&|@ zS6kF|MjOK!f$}fSVJ6?3ZO~Nm^RqZUce5t-i)55yI#>G;fYaxNKL6{Eo`BZ1iZBqeZjG^y^%mWxZPSQnq6(I;(tZk#_oiZEc?ac-0X366L~V)8}0q z$mK%8{x?JOav=2^X>Z8zG9}3M<4~;;H~1F*w(>jyp92^)TyUW_FihY7SlyAF0}vox zjRv~9fz46!IreRaLX60VCrKUm0lFNWx^i1b{xvPN{Gp{;g0XaVh!zo*3tsGnjCNt=u3& zi6Wn3WPhj`b=0~?Aqd~Ru6B0s9i;eln~t#occ#7IW7U_L0lF2OOtQR;{XW-_uO~Ey z`l|c4C!B)tgD7<-#YF2WKbx;=tIrWvX-ZUnMa2HmI0D2x-W?7O&|SSSGnk*YwhUH$ zdbTz()58>8P$B)AsmFTW89xhVOZ*Q^^vEh8|7*Rqm>ife!maUb{81TVS<}pqjQ~L( z`t)k)*}YSBc$!>6)*9W!#cSNK#7No)aVDRR=sye;9hEPq7BM?gaS)S=RPkQZ@9(bi zkn3UrgdVpc1I?I<=fkbU*CU}S&y0qUb9FPLM4zGD*1iiqihX8ev|{TxY;+oid7h}; zAEIFANc~Cv)JNAwDVy`{mvpaKpK-;4>tD`}dGn^vO$%n=2=0vj4tP;zi`Aj2@1VVM z@B4clvBs`fI`)ObM|lOEHa(xt)J%Tl;`XX5x1A%7(iI4QGBk zH3~UpYyalRE0zbWm;mH}w{+&8O0X#~6Vh2~%2NK1r>l<3qUqWq0@BhAN;gP1C;|e~ z-5?-c(p@4AN_Tf7-60_@t#o&H^X;zB`~7!*GpElrXXf5}!=t7~uIp6rwbC#*P^j7LwcKY}nW)dLN9W`m^5?@*rM~~y>>6xr@pM+Rd#|7N<=&-HTR%#W-3_p z>FK++otY2d)U&#_IuT;b1R6b0RO<4B8%AbhhsDsAA4^J^N?SOMtw^rx6D^W0aYEd@ zb)_RU7A5hMbpp5xlh3^U-42huDuCxQk<Cm1 z!7ergcRxMNUH@*92%Hv#10I8#4NYZ6(BnZVP1Duhjq~k1<>Fo`G1f!3ME2NLiRCJ8`_lMM`1W5q zY_w8Ek|(##!wKPkh_|cX@RcGhd}lK>7wD$09Hm=(l6@#YJ+;M6shp{3<_9Ag9AD0d zC_^qOR%A}Jh$6OG@vSI4?~%;a1O`uK{KA_M8?I7;QMrN@1D3y{$^H-yS6#ztdOnvC zTdV6pcJIKt`v4cGiIuhD-hV;h$22J#|K^4^JImwcsmDUE#PVIM{YKJaS7O7bKlGMp z2l7nL<(dLqh!O?n)_=G}y_;RHs2$Yi ze|dU)@yDW9kS?>m?0)dKeK>7qd)mGHniIDa?a@+aCDQFYFja+WFXdQF!4>koZeS4q zcNrfQ_8-4IZBy0nm`Ijyuyl5s6yN$XnXV`PK8TUmN7g(j*%3kPUiz4LN$Qr*?J#+J z^`0nA<9kTd#w>8V+=ruSF0qJZ(QXB{pvT+5v#9dj9sYQWE6Xuo^~t=VWoYPDL;@?WcqqP-qd5f2 z>h1GUtQb|>T?|b*mtouK@BO*F=KVsB7M9xMtl69$1Z%h{b)MWU*7KU`h-4j+NG^nj z)rq<>qF)vRp=bE?uyGp{TC*c03kr(4pba_8c%l!8Z-`8yJ~Y?n@utQ(Id#*=-N zGQO*Xqws~DucD&;#6$+5W-x@`exB3BHV8%e(rd(TLK9M94Bx4sRkn^L_Jl=j=JmvVkn#e7oNfa!Ev&%QMfB zGOG<~@2KaxF>^_X=B9Lhd_;?JLJ3HZ9ghD3=;vBXVL8D9c{Q@VK1rDM+KLG857XF# zJa`MW41f=rN6qxAXrSK67NSc+P>uSM*Et>NW^^&N2OuQR<2JY&NxT1N>2vw#mQT4j zXv2<9j^Be0Q+e`s7sg)N#7ad)olvX~NJ^bdI>7L>AtfcRNpB#j-aI_$B)nq?RL+mS zd3JXjK0eWPqxXsj>ph3nDR%H54*Q^6@5eK&;6IG^K}{&Zj-upTBg8AFi=-0YgP7O? z|L}TrC{lhL7<`qsb-Ygmt7~8`aJ+yOFNF$IbX9L#ZI@hUFs z63(+O-Sb#p0#Lb5v2{P7zsF^}9Js27i z+GbOOZ|)p(`8aJq-oy?%BQ2F;)(>jncDluYR6Vk32!DfOm~YR23hJEey%1Lbd~G>Io60i^L+SJ~=UUHx_j%P<-t?TjlJD2-OLK^9O9nK0o^ zP#RIK7*nD2W1h(6Lz<9BaCL!V{lF-}E>oXN23?3qwBt5K?D`FNiccm7nqe~M^g7-P^?wGd{qE27kJ#2x}ll? zC12Pz{*nPIpD>#Q4(OE2r%m&HD5_;?^C=)3&x0cCJs-M#)YdrCu6D1tqai;V#cuE* zuUO>nd3-_j))ftgG@yp7CI8~oe>l4@_XdL53!}02mc8)@xysmWf!9%hT=yqd^N=bu z1guRcvF=_Z&XB=NycS^~ixo8ZYK)c5fN20F#jZBUkfR$ee$aYAbE&c?14o)o=FzAi zVx;2$Kx~J72mX+ZANd%k&ld#c z?ri&|ORA8bo&q0=y4X)P43C5ZS>5HBt$IP*=%}ZAP`2W|y!YuriM>f9x~VcE-)rCz zk+Wh~3n&i0x~Uo+wI>OUa8 zZ?<2(vx4*=8VFX(jv@~N4{M$#Y$`#hAi6E>?AN7Z^$zGLp}S&G{VET69H15G0eM^z zQe4T_3-|;RT#oAE9tcyu#0xx+dSA=g+iyk>nz}e<{MD(;_;lr0GtnZnMi5BaRG`LG z)wF?b48miRTD%V^cbd`}yx=bybllcN%oozQk`+JHkbr1e;} zMOFm;7x=N~RKm^;rCyAJ!C;*OCjofuDOtKvfBzp@*RNzu4OQvm9V+g{M~oMnE%d0DT}qIRqJK_})mXR|M%d>_|eGOpci@`~Bm z@>>P_J3)ince%0-LfywL8%34fV;D_+XeO40cc%u&HE2X%aYHB|N6zw{mI@lHao)Ut^0Sto;G4$+xTxNdt^kZ@a&QlP9A7>pyD-Kj%fa!@J_*4kR-6p$R z7Yg=@+W3<0{y!h0+B!Mz!-%YK#r4l!DX$q^g0dq^BOv9Gu^v90P85B59il0=%r~e| zcAcfVS0D!?9Lp=%xT4p}mtGA|I+9Nz+C<&q2y|Vh;7&ok(uTxg5K3@73#*F&B-`1A zyjx8q`G7>aa;R{u&i&y#D6QLkmj$&N4;iZ&Xq$~=8S<|YjimI3(?kEL=FA8R-<_pu z@j~g}@W*7_EBDFYat$gTE=UgtgIW0dk#tIu5%Pfg=ZWFEB{}FevBH|bl$tIy+>Nf? z&bKcf)#ev?wG$z$PLM2lqIUG6_d4DN+UVNiB*LLBAy63qYt4!b$f$n$>KC-nSl2xu zAm0KBpI!{=!9CtYq{uG@khxmdS-9tLw#DXGtkdkQE$Y*o8>33}}@)sV(sR+2LykL`5)(5 zA;apkwr`;w{I2;nF%>Gtoc$^?1gf!eg?xyAOGvNs2O?A+YrauD;LDw$;*W%MpY-^hPbs7oqBdo zAu?Wbf?OC3G-c?3XX;Nl7@VE|LVD#eCs^BACG{pFY;a!NFp5ky!VEO5hjUT`JPl6+ z6sWFKG2h}fm_zm51OM~VU`YPdIs&xXWnC)Y3pedDV0?vOu_NOjELeZ+@DVwMnFA*$`Tj{|#_* zQCriomT|4X=w_HSXtHkN&Q4MJYRmW46{|1LtE z^h5N!XL4~L+?f`Q& zu5Ki%=`^4w^F7MaC{XBN8RILb6BbwvmgFBVc1!#~`8v+S?dAZea~f@UCjGZ{$zf}L zncReodWw6-LmWYk(E--sAY2yk;v6L9!DN&(&yvhF<5tC@|L z(AK$B{FX!lSaiTSHuloJ#6|`};@*r+1eBXweq=Q$b0Z^nosFB~(AMpK_^d=Q0CcIO zDd5W*bchml+v}boVgU0|pJn#<7LvaHJ4*=?m0E?T>bx>wbzOQ*1`PMW9CQJKLvsD3_Jz0lA7yO7&sx+NU5txU`e@_+1aBrlkbAsh*%vPiN zJuD8bB0RWMvrPUyC#G3~w#7$6G>&PVF%&ET*>-e-9{~ zzN1s(Jbjp)DDuO>OqE*2`c|g;u=vRM`Z?ULzHx>kPSLZKG#x2~P!?;9q`M-YlL+^} zTrX({a^U;VcOzWMTYuy#=8nR(+p8RJR6ZZ;YqNOSGUM5!b(}loNYD8q&a*8i{m@GJ zbvm`QE>AAf<_$xM>NT1?-53U3WJ{GxlGodLe2MO=>-*w-A+E>8-kX96^F;BLQu*s= zgqKHFRX@zegamT5-V|FO#KY$aHUC}=WLV=17T+kIER10bmWob8e&Sn@>Et$RC+cC1 zTB4od&!Lj>N6+{1I`kcl+Aqq!$Y_h|?Sh1)KM2J&eTUjB$#YXm9|SeH)CxY79jk0d z{#p{r)qc?6aMcfF&$=5~=5QT+GO}f%x@vlo0GpP0d0-{B{F;;5D^I1ZHG&#FEL~Dz z)6n#!{fdCh`{OGaQhed$M&SHd87Y)n8-uCZNuhfL+}v-Hd)N zKsb)Fk|z$kIR#A3?H!$eAJ6u+TeY!c6c!}J=N{Q?QpJkziD|b`t zUbrnfhz^)bpqIW-6~M_>o@r=#TXx?vR`BiS*+U|;yTw|cH^)J@R;t?hSoBUMYbQg~ zwrIq8XpG{```Ffyv(<5~BT$Ge2M>{9oXUwAL`(mE>lnIas!C;azocDE>oKkjtk zx~}|P&`vBi>DTh^*!@@+REV%^vp}GcmEczKkjEhE*EQjPKHXxwkZ*S0`F5HwEu3h= zNA$3~27kKxr;hu=r2AR0dsD5`;-8S8CF@CRUO%@~xEk_&7CH(mSOOSWgoQj*cKlCs zHBOZ+{5%!&MvKle#v?SnMw%Y$@~#f`{^s8OpcE-Pizi@zUYbkS7DK>;KV;PtBVz=Q z_Vpoa)U}Nj7GXA+a%WWi_0k7+ij8VJgyGk)2!;oy$x73SzW%SduXYOF47PV9X#Kr+ zfXRV3kRrC%%kFGshc&Ss@?|SyX18VC$O+Ba1)0@6Tw~qdqxuPKaFI>&u>pFlbG&_z zLGjt9x+%m@ODL^wo)Kh{rK=;Rc3b`u>~5lYVN)S_#6yxc6^Wx`qss!t)R6tV4hDk> zzK5`nWs7wtXJ0=MbkF^j3f)HKVh?GER|s550L)EOICszdV@ew523375Q__}m^B)TP zIJ{cLLY zw5ijlvB_#(XuI@2F*!l{-k7*UiE~C!;8aB)TiHYXP4qQ=1>e9lJx&5Z=nkW3 z=hZopdadjpZNECsBVIhgR+RayL-Ux+{8GC(+6Cb@DisB$A5W@$K0F&`_weMpG|)E2 zAXOKAkth@xa9v!-V7H55@;S-uSjAhS)q1+_W>dVI`+`7!*R@K&d@NTf7CHZQmwu_{ z0ficz1=RzgSrB7OYF}UHLekPA8TTY%Y@2xA{rwyI`&|*4AE>jTL;ALB4e3SLNd9Iw zhX&pVCOBNM9_XUD{kYkz3AvA?JBM>~ILR=rf%K04URkUO`H!R%xl+}@TZ<20J&yFb z-Cy~9y7ewXvmQ$9UrKN?2@p@c(@qsHq9!Q#dB4z1u{eV25Di?Ht{e9}>Gq~wX)m*v z`ALEdj675itWw{;uwzT&+~2YL6-pk_Ar@jlF(u#STbaFOJemkz9M}B}e5`LdA?jAv zgR99OyacYD=Uo5 zbZ1jme&bKsiZBcpLjT<2s_8CCT=|W9;NjEDOAM74vWvnS{09t0FH>sTXe(M%3;a|? zSeJialw~1l!ge4?;BsKA{DyxngcxGRT%^xc|5JlAGpWGu@A82|FF}nMPIW+bOsA++ zD18DfGYKh?${Xd56kFq~FF$+={G4px)O){IP=MR_&6p0mQgQPuHLvMgH5jVte7L=O zDyiukigz+K=3eVOS~KJwP`&m?l;q{)mDC-MV(Ir@3izqL4B=mYNh(g}=I*_S4-363 zl(UImDw6yDMr5Mo;L*<~FC!~(U|IUO*o z6o>bMB&N3QSF}6_@0|&WS%nB=k;V@jhdl{vj+HVowR`zUq?+ zw~@Y6+5cScNVb^@WlTiyIw_T3%K8=M>YKA#^O5^q+#mwC%R+?^`41znmx=si4>7-@ z;Cze<88|WD#W6mo96%|2d}Aaj;ga%`Ps--<#%DTjwACNaLppX4R`!Ft^myuP9~z19 zHqz9KKG^%)YE8_k6|P=flz=&55t?JwX9JW%bY%1nJ#@5;MsBn7@bD9}Z8^t&UCIF* z4LB-eBEhth`7$CqT4^nsKfOy6gMA0$?UJ52SM=gh!87YMnmyHCx3wZe(Qefqe^wt5 zSnAN*zAnun<746E?M(^{GXldBween(vjiW)ds`kWeyYw4i}>)nl!U`tnY?Tl6wX$* z0!Ny>eKlYpf-l{I8RE&@NO?Citp7>ipvsl$cH9a6>D+rU-{I<1-zU>_jT7!56Hygi zArq*Gv+vZ46(r`bGEDFQF>8S`@{ufikh{+88iv!99~S1|-ZFJ@3{(_VgV&P1kMgX( zIBj?jaPGOSC%wj&DZf8lM}k3>ge$1qo$}y}3L;Ef-S9x&B;^GBUu)T4EL|M7GzdW> z@uwfS0c&Og)`1L@mVgn&gS4X^(5mymapAQYVAZQt zN39!Xpp(0-wm)@2;?{7b%L8nyFyUZjX=^m_h+4unZF~s!sdI%mODyId#L3yJ1mOJ>F;cw$EbGko%`Ga%Qd`^at zkz&iUW>PRltKBUQ$hF2;0xmz$$Ay&d+(7#N5JcXVJw(5RJhAwA?G0J86fgb+Dyp-7 zJrV~Ix6PG#5HT=n$OM#IutRbxGg1~xm&B*bcqq%CifCFPrn`AQM2Hx#!|((HIoOGh zpbhMS+c5E=n@_^M3;V%H&MFMsHLqpF)c@w0?=`_o>s(g^duU~(!L*P=5dU8OS3xoJ z`QXSCJBgHOMxe+7fjzIRE0u8Dz#GimMbVz8i4OWUCGG{GgkMmzW4j4wPXf?RN zlGP7<4tvMD$_(bj>Tuss23!c2<;~$g8pQsoca;kSoz&L2oTY6Ldj`tv$4tgSj#~&i z>pm&oE>jZEVSUSTNmh|1%G)VRS$Fp7qoC94O#q@8c>~o2lXhI9!1cZrs14B*#ByLLE?-+Wt9uUp>8TdO$GuX+F!aD_5;XpO{v9x zKIqK8EJ;`%NF2i^XKQ2Au?qWl>|9sR{V#S{^Z8kE$ciRc%9~k&_kPRWSF~WRckkuk zXrQEL7~%IH^Fc{SnIf$PE5gn7aBBcfmhB0|XuE+%wQq|~lE6tdgF~-02zSH|PuJmD zA;}HWN%_wSNP{E#tUf5Mp`X=4z_^K?aSh%ea+eZYvF8=|$G!Fm3oUCWqfdLV`@ttAPYAiT=D${XT2%V zVMqx#J3M)I;H6lZH|mn*ty9sL2FG7Zm2Qr!jKad-j*Cm zwe0Pps{-}Qz5`s4li#`g{h=;>K4wO%6$n{Y)%jrx^_Uh*yw8DPxzLnR-|}X?i%R!J zaDJC4LE9k$lG6^u+A%T3|01l@?b7ywC)J+reawKOzET}Q@Gg=AbBDk<9tR-z=r_;e zY`F6sfb!?IL}Jxqe-p$&J(mvweUVTzOdM5FVEgnP3~S#@aL^yL-N;GE1C$SN+e18# z{TUTLlWn5jAyWb&Q>ZxchvJ+ z>i4!}IN{LAz#{M9BQpqsxC>-?Hv4GM|NFgrJD^?q1opVvPPg5B{gIdq;l%54m^RQ9 zjKTAI+awEGfyIX0j1VEg$j|DycSRz$#lm$*D06<&y)oT!`cu7E~_j_;`XCQQQm7OOHjI`IewJxtg zXFd1w?n(?uZRG*Q{}O~j%KJa7DH3&);B?)lT)rkqa7*;PjIs6u+>r!^pwk*ng3J`$&<%Kt|Ac%YBtC4_9lZXUoJ_anTCU5rz)D}ltjduY|fDU6M z{uGPR{|DV|H|Ln-9!YR5lnIU@t@{Cgf1!9t#9-ED|F^8F4*4x0FkP}V1$;Ku2K%_S zo2s$G#R|0H7UNj!i-C0XF3?fjc6 zdZ)#BH(r6glq!D&UKujFABlhtwcJ$VRR(C)@!C+!KblMW5Y>-bkyx25@p4$(Dy(IV z(RRE9_a`Q=OHwH$deCy&^_R_k2%pXaEVT2$f6pi{)MlODseq}xowp|M|6C1qK9gSS zMQ{z3sRb*o0|eqh{l;H#;NVse5eBT#^s*uEzYVs@BA5GLxPX`8MH$chK^1i!6}6tA zgmnSqD`Bu^=lszK|3xd5^mhyTg>XLS{DjId4iJD}q?S#|eVB}TGVL*y0v+1w{zT-( zLPk%;M46$TGx2r+9aF$Rj2xT`iqe8M0j*x6Z0PX9wNOk4m0zt3H9t)y?MdC+$#Him zStUxNQBcf=-RHhgs61UH%>$&6RaSM}>$Md~t)cfb*-UT~WPzuZZ$yMLF8iL|yPx2( z>j2r*2NMO_eV6O34{pr49)Rt+U`6Ah4j|jPf#5< zCHCZ*8L>d**XlS$yQ#W9oy*&RRfCR9(^oD3j%L8i68iBny|7SW4rcFbS)f|{PSr>S ziGw+Y`~Px$u)P~G3ysy%ub)Txp?zlEC628qQ>V9HXsdt279d48x?}VvCrv*Vg|G;j z_4W0s@OatR#WJoZ3Z!vfhwn!Wf=)i!nkeM<7`|8^^7R;0pS2D;!4>gxtP$|USZDIR zYpm~Nd*{mVvdzpv5-zKm^IN*0*`})9y3F;={TU6>^sD}#PQtmv{rK-({~XYK(5QZ) zKw5hn%W0!65)-)Z_4f-h4aT}blinHa1#6ao<>jdb*_=Nu`mE>LZ<71&SngGe%j|xV z=b|99egKY8&`HHSdP8j{8OS_C#NPB0FhEAwP{9ojgkWSRgBHuncq*B|f&IL*REn}@ zUcDxp^O9X<(1|7?g|c^mx>hBUwr)@zw~Kr@u{>f>A8}H3%pN8$xwYC>pSD{qJ6a~A--bT zy_wCWRp&8GQki-Z?iWX&_X%*>-9y>D=7V9%#9y7 zlGLPKds7kSD6Eaa;>S4g+4!YL;bIb12+dac_ph)Wq|wR380EM%pT$nlpY%miH3_~b z4-;BeqFH~Mc%%7^1FX$-0;n95LS`I8O@U!)JD2_80Q-E6z(*Dtq zxG+8SirbrnpKs3SO;N^Ay$-JqUp5<+1Urf@t8tU9+^-Q85qFc96T4)EBTPxPEoN(d zq9bbxrYHK!Sj>njg&yNpcD3dWZ(mKm&oTI18ceqbBRVBqLf2}JFMrQk(9L_Sg3vBk zBYPU-R#b~sdr9QD$f3fimXs8IYmu9oLxgR~QM5+3bdj`V6(Q4&#l4Pq`B39r?6UId zZlz_SEh31}B6KIff9wJCQ!R>r`T zqv@#iOWi*=*qYU%cKnf@X{MuS-4r833qiR1@*d%C`!4~JY{py;EmVM5X_+bse-r9N zd*C_vKn{vXT$=BXW|4#h>f&?ZG0kLNg{%(v0Rw2qoV94@zkwNNZk^f}z)XF5Q9GpL zx+m7g7u3GwQz;E{xMMezEe;FAtsl7O{q9#jzVq&GQ6bd(?{B_5erek~L5wp6x>)b$ zl#RAEAIPK49sAIg>5TKJdA%RMXy#7l67#TDzNYKCX3$irU|t$I%(zKdeHvxtW>Q;>$DZdZp61T4 z@obybcTz349rimcuB$LrEw^Jfxz%mV7ARKZQER|+-l_;)PW+pWkMnb;`IbqZO@I@t zeCeF9w`TZ+b9mdze?TTF5wKIWwmu_p5Wl{gGO)0AP*rPuO}|Nh)vNIdSv@T|c+=)U zv{ul>^)t0@-|S+&rr_>0Z+-_aWt_|RbB5Hat&m8ZtSYZkdsl6-rXz8Uwy_4Oht=dV z>Yr5{$Bbpeu+z&Za^qbL^-dGYr;K{5DGwX1M+?J@dh01vm%rF|KSLo)7ah5L0Ml@o z*Lx33kd}Whj=Ns9-BQ|3kd_y$df+-GA!KxZvr%2ERW7<~a*njgcx8Wyy86Q{+@4n} zv2#JK$}PY?wn?u{#aSaQHTaViL-b9IG2pajNBMNK4#mJUPk!Cd&eje6fEuq!pN?MS zT`UxEnwH*75|nJzK?V+e7i;RICRA51mXPJbMALO^`v=wJ65Yj=sZW=4lZ-%KO*$mz zoJdk8Em8*lCVBl<83L-@u*IR>U zxE`dR@1~3|6-^)6_TR(~Yn(;&iz5F^cG_#F)GDuB``9^aD;b736SFK0?PNL@{t5vZ zpvY4foX2iWy?DY?rp z(c9G~-E7{_{Rxa|Q(Z0?Iz=pNX!SIG`Jy?u(mhK;kX9Y6c0|B@=xlUNxOrA*jY>!h zrZ#SFd+?+WN;lJiU6vXEvNFHJa>b$W^@b#u2i#G%6&S$nV_+vcb2u!~+nghM#m%i3 z4`KVfpRB7NQM@YG-eqoSPO~IOpF@jJq7Qjir)B8qgN#6ElTwc>=1(lnW2Dy2pW((D ztv$T=`@8!E+#0R@ywYB|-5Xd`bNz;D;z-lRNn+}}UXz6K4k(oBlH3rst+2>yFh4bj`zlrKo zs?FN+$ayp-A93#9Rr0ITRc=iJC=V}GfoDJ_Y@y#|yq-vWv5`o;W3b-H*M6(}Dc}@K!wNPW|=G)|` zCzh3{xTsMqaTw0Rb9Jy5hY+{x>89>6Rqjw0btoA$`}2qq$UTvzj_lA8hYWC&P+x74 zK4{&0_o%i`4k+|fj<(zQ^z>cQKE1p6XmH@P9xP+< zHQy{N)_pmUGS0roNUDLiRK|QdVLj~i3eMf^V4Nv}Rbh=Sn#pXF9res#b91JY?72$S zB67x&;dfQFmE9NGAE6FI5wFhO2enk-)m>=`P)pS^k7$mDIt*s$4B=qxzGB5l^DY%d~d!^m7Ax%=B!0DZz$NraGPZ~@#3mrf;TKzNo;xw$>rLo`4iM_k8_gepP_!+3rA4iw6t5Qdq-zqX$lYe3}0$7d%h4vfiwhc(<- zN+OmrXJ!55fnGz$LLWxwJCgFdrbz@9zGtwj!n(JhqdmdQv+1oB$Ro9w3}o~fxY(gficmEigbY8HS#Lf%jte>w#BvM z)VF1*?;rf@-tJ%(Oj3uOY?uakkPU>NzkE2-UKYVB#lL*`Kj|2z=JF-n_p&?C>7N z@AGxzF?ngEXaOM_&g_Wh_tI=7B6mK)m%1%- zRCG~a-%%@B;PjberfR>swTeYamBe$xb19&%=7a5iJVem_g5z!0hhU9@O_qJZ8(-tG ztLo7%a{am}z3L9Z-8w=)G|I=frn`d87CvwKdqs?w|xydrz@0};~u?r6Y0Vm@-Fyl?#XIqHXVd}Wuw3K3QvG8IDcBy>=L;)OY~mO9AzP( z6=FJ!zxcb|-@ZnJH9Yy;UU*YJlpiHV7%O7>Im4r>jO5;Mq~^W-%;N3AbOnOaPB zILrGCje&OLcDpBN2p--|4w$g(y>?F`PRP{a(ew>2L`#t?_S_7Sky(5+$ylw=5Sai< zm*%&*-2xk9GmKkH`^Jtcx`qqvL?evVtZbFK3(Uj~%xNcY5gRK;))XoSn;>g~?}^eb zoT_f&Nrdmo`0lecMA47O^7Xs#NfT4|!ZfzkSZ&g)tj93q&ctZ{Mg_?kp@rKr1YMZXfs97sRQCPb)07yUE%% z<{R}9C|B;eJ+}9Ce;}TE!ozR2M+qzw+)rQ~+LHTb$r)qPlkV{tl{YbgV3HpB@op+3 z0`NqNVO_Qs#*(2r=t_L}xd6vBOyF$*zqK(~du~1q zc--*VQ&;u9SNKd*IPlu+hoCs=!f(~15SdndfbXi!}r?VP?dYI3PZ2FaBYCu(JSQW>m zeml|V8%y2FIOtz^{`AzH`P~A-`|<}~ri$_loD(4tH<qbFjFwPeHarPLRjs=I{lyp0XYDC5OS^+pd=KM?fGx*of!r()gPlYf(^%M& zR|u}sj6?WK9KezAKGe@^%XcZU$Ukn3iGv95#0Z+=VAC3mK{gCcv9G$x~4= z%mei1RenkSc*jRfeg;>tX1~aG^pw^KZg;ls6fiBnhxjz2RcshXWE_si(zZJ(_gBMH z)5a&g$m&bQJ;S(E{d5?a%=ptqlunJb3K7B2nI6A!tB|tGd&S&rR=2}*iEaRRlm{1v z$D&8u6QDG`Fg(Pzi-|}k0Ky_*ZDST&y%CKNu(wl!UVC zo1q!1k14o3lf;4s&uX45dBD^KCj9uu5~ztM|I3*O`8ulL{7Gs)iP0;^1Md-H>#qGj z#PA6=p0c=#G>?~q%bg+KAI~-(k+1#OvaeDOOmfd|+rF{9uRf{MtZm>1@MdJTZes5-RORdw;4|l= z_q4GL2e4LD5h^sU8!&)AHVIomLaLvR^Plb($keWBFd7h+LqxTwpN&& zx58N3K>=D-1r3k&X}XM-Uowp!N~@JL{yY~OxV;y$-X8?}6k7nYecQV89Uhzf!-rqk z%q4g0vnd0;BG(E#>EjQ&*LZy0?Z_gCPloY+H(w;}09a&|60{=2Ik^9BAVZ@&P_7?^mx699v{>zLXyiF6^sH=}Hiv+R_NmVVjm_x(tLEoUKmrvc&^Mq!$53@a=u4yK|-C($0WZ;tR?6N<9 zA{hKyOZ8AIZJb@D^L6;U3g+vYf=RY;N{x2@)Xn6iwcmvkeZrYHSTQ2yt@i1LA9oU; z3ZAAd2aN5AO(m(!y1LaE7P?)JZ547T26Sm?$l0HU?XPfoF1Lb z!RZJ6f=i?}!iZedf%*MA4b-?=0)a!F8}*lQwYBPW;%ec3TYK7Rkuh3HXUumx z>ZmbVF=Wg;9Gy6+&rI1qadGvsXS5=!&(GaE`>Ha8WsPp8lwN|lDeA27Bo;nNVsWsIyL3cuk9=%Dcf)r~ zkG#s)eQ_t!ZNg583B@_SA|Cs319?0vs+u*_e-OM3N4)Cnyof!eZ5n!Lp8Q&@_@j56!wl@$mDEb@qjEa2N*flBK7Vam1DUfyOrT9kzh6a)y$9OubYF( z^GGEhK-E?O!=@*h=TXiwnI|cWZNOuBl7d+}JsWO&X;GALy78gN_JD&zE%8IXLZQR9 z)1qqMy+;AFkDGZJsm1LvxccDc(`STI&|Xfw8ffRj(9`=LC9i|wx zPZvA*TM#w8)<|zByJJ>xhxl39W7o^kE`6<=GEEG+Bz#N7^hhRRT7b~FtusA8Kqeji zH2lRi_AP%-2+kuz-nUzXElS{C+xjkvqBE6WQI8C)E#>ri)Eh`YW$9N2JMLBrJ6uo_ zu$qt6Ua*NjG*a@G1+ckPbI*zBk)`RX4Z)lNqo6*%4Q|}2ycI)p_`GRWW zefnx0AWF;k;(pGvYmLU#kCN#670U0 z`0Ci4=`~c@lX!=c$R);cz5O|yOGhDs^H@8Rt)WM)dzL8)zFG_TX)<*ic|WxA`<3tU z5vR?4p~HLql&y<&CMLGvLOVN5T-%zb;7^h__ZK)Bz>k$2?*&7#ZQ#dBq5G?80l_G& zz|iN^t6=1xVn^0Z{Y1Kbhh`b z=Cj5@&!yE)B;t4|Fu zq|Qw?`31(J+D4f$q`F6oc5p2cm7dX@O;HlDeJdh9bqs#4_&}J5A{BtQ#Y20Vt2m7K zBvTJ|ou$jg6TC*>7F(pg8*64X7)7PhDKWM2?L>`EQMG_m(e*~jqbbIFlB_c!Y3=Sb zUNJSsBD4OkK(8YUGvU*_B{v#LI(lCX@n^Y3t;cw=?E(~jjodmW!BYC)G2ZM;byJ5* z=_g|N(m%|8o~wN#F*$R*VPQAx*FmUqHjr3v1%pXz-mK>{i~F+Un_U3Q`;DGZkK2C-+EjX5l?b>)8Yh*zJDoF-rn}7i9~bBbv_;~Xs_4M5=yg| z_58ftCMSEHR~QBVX-u}PV2&&=^Z8F_UXH`m=fL{oByD{hr3DDAwB>JxI3cWes;}MU z7Q$&ekD9t$GQL~8b=JvQ#Q#kzji=Y<7@}rQEPuzKl1F;{!uZXxfv>4^2u}svoGl8o zI0iy(=&S^M6L9l(>AIxCE;2rkI5V5j?*~3f@ckw8(UO65EBIZqmE7)N|Fv^3m}q+c z*&%e8>olaH>9a@2-Mri_Lk=Ckl>=M2_)hlNcFtp=bSWl@xo+dVp=j}pPKCp9Pw3=IBeVQ|jsFmmWA937&|F9fbc6po!Z zQh-+?#2Gag0>BFpr9=H;FK~c|T})0WKRk$`_UOOrYLFEKc^J#^cqPH>818kmo1^+{ zCyB+X&UK3ZuX#GGPCqe%S3!CgE{NWOEWn*vTKNG4N_X#dtY-Bld1|HZkSWZkf}|x! z?SXsS>veMo>!j@PDD>FXd`(&JVaL zpQM+?rW|BZy8Xr05^(-Hwzruejopm`LH5MZAxgf1StROnSpTo{%vTa^JM+tYdGqs4 z7r2MAIYPoR@Frv`@N@zl*)&7%Q@&k{8V&`*HPg-9llNvn?tSHcfVG_S)pH|a>cNdD zwKN_-;pqLwp5~NuM?#nY z&*M721eoGsx&GRCunf1YGV}`mzOToxHiGH0I=_{et2DROKL>M+#;pf04@^}tJ}Qub zLgeUZL8AVBzf2Z9Boxp_Z&qk0{!xLNOTkuFMOm@z02Xs2ZOQlw zs-6>$4z|~%Q_^)s>Q>f~VeRgjO)J1Wh)Jc_dPvbo`+;Mb_13{^RLp?w1fyYiOXoEw zSLI~p-2H%{434AZuCf6gKb&&M0$t!OJCOSE&k=^dyD~NA?%bpfi?9BmPrC_+6?jpp z%pH`wWPHe!y_A{FxhwuZuD&}E>+b#E2xV4?Yzf&bdzK`Gr|i8#va)a42_Y*XTO@mB z@3ON;_TI|gWPRV~)aUod@A>DsI`4C?eXeud@7I0Z58~|Ed%s~7luBA9jZzd+ZCl%t zc3KhmvR8L-3O_5uE-4wH)~M~aB3LnGR_FAL8>Q$i0vX5dy{hRNfC~1;tyRl|8gcc~WT6 zY80Cnf%9Cmj%!%3n12U@p!i1jBr>12w{0}H>=rWA*i*Ed)6T1thBncCU_Y_cIdtc8 zMi~La@Ut?1h6#gB(lkLca&uO>lJ#CuAvFfYsYI`Uj2C{YvHD*sr)e$DW0H>!Q$|{v z=-0W(A|yR|t=|6V@|Za=&72J*gOb5^~gN$`byvB<-oeszB;hwu$wXnm^~y#Xp`8|Nc`u zp!(QPE|Sn-BrCKn#pjg{Z!1=g?RxUlRWI`g162BQa@OyE$bRvs>hqt=YHa>c6p-37 zpVep@{RGQDtVtyRk2`X=E73QDFvctuGefCaB_LR!wfot0dIn9bXzOhJPCpe}gqMn` zsr^DS{tu6<@#rlV=e-4%g*Oe^gx0LeZpNdR`B5_(bhes#a~L0vHkpp#7wRqKh~_`k z_RoB}A9j2Fq{KU|_?WL<-ZjP1Ta{ixne6hK@HMLf=Ks!J47fwhj+>by8X#D&a&RN%-W zZiu=`!%xxusa0h3TuuWQd7sSc-5Um^o&#@%vj+kTaO>^aIX+*$j*J{?W*+PlBgB6nXbmGpo=IvMynOKaD0?fo{l#L655m%xU3S+-kFAdN z^tXNC^w=UYw8`y8#HmAv4DlATUDU*aS^O~v`hkE$t#I;5Cq2USFkt{))+HEGVJl&z z-X$1e8n0Zl86b;HFOagUHfRRw;c=}0(dG)+MCI)0ORS1^&uNnEUHQ-Ab!koT>zUau z@wC0rnULfg;+k>e=`z0?2PRmESr^A~qNV9KY1x(Kwo;dBGID+_%reScdp!`~OuRfq zB6GQ$Tw6RzTZV*QNG_9~zgGz%xH8WtTD1{^^!b)!O5~mUFZT?}^97O-;u}}6$T~;R zRjPS~`LMm~GM5QgNe^vu5QYq{uKOMKPu|ST)UG!2>!)7+zWpjgTVXZ$)}??I56iV* z?8vI9!*^5t4-w8+C5aE|A1XiZ9%SPfM*g(b#KFfsINPn1`}{MJIj2_p(G{!%3yo}T ztMoS*Znb!6^#y5fFix7&30eurD4W|<6M48Y-XTLKru%!skx1V+O)UejAMEmXxYdm% zHh#u?h8n0FKggI(B6|9ye}a`ZS2e@kF#K5lE^q0(;jXo(UbjYjNLa|yKWFaHn67$i zUEDHeCnRSqlg;_qKjTf$yEyUs4EbV|d#*m}B|5h3Ls{zT4&T#^e#FL2Qz$BJ&w$W6Tt4dkIrgmc z>xV7{E&Ump1qZ3~#%Jik8JokiN^YU`v#ze|l4xI&P28_Szp+?)+5IJH z+?K(S!5at2T-_+=ogp2qpzhtyYBi@4iV3V}LRkMpcYS%6)S4eFbxP;0TCYqDNrh54b!kPBC9amSWK^%uJy z8eu0JqEPdgMGt3=`J}V-92w*XXd~Yzd+c&d7w3@Q^d(>u(OX0vh)$VPjv^33%Bv0A zYY)IbmMCMZ)#p(MZpc4=sj0;c3%75t5!Lhv@M0U(pS*fIKT7MGZ2fHfiq5)Q;QVMZ z3i(I8SH<$EYp6N%w#4|Og7@s__VM$h)8I+<-Q&JVt<6zRoB%(n4RL|}QO17vrlZ7m z9*6SDiu2agfq5tmf$-?t$cxcFSHSG7uRaRu<9SbJ4E&6w5}EE zT;JXHQi(3!P5oy>&>BmYr^KLoQp0N>7OwbjpryDu7!lPfd`pc9(2w-GK!uy+D221$P9M6=+c$OGuezDp zb}4u~9!FV!{d>{L9mZH&c_Vj>XJdN;7&pze4`a%-n5yoSWao6`D3j=sQ2gw2b~1m< ziEI69(Rh@zPv+CjS_@Lg{~Vt@zqdXm@l%1B`%_=8piOIi>zAM}a_AiUa-IpQ6Kq^e zHL+&M9sc3zGIca7a;fLg<%&^6Zi;2s1JE@p8g>0;qnpuOJ;;7Rn6Bh6>$jf^K%vHM}-VH-1(F?)wN1|zg#TP(!#irr%gUu<?53`{cQC+xxvv(R9&~|k`9wQ&T@Sz7!nQsQ9;S*hX zd=Wl^C3`c8;$!WMr7e{y>YZUjDo)qS53`l8SvU+znxFXN5PbRY>Ox9c_$%sl+1TsX zRPC@u;BVyj1WZ(PNUNRQlcxq^qG?JG~>8(@xxCV$pc*dwDkfC(W^!kGFQa!|4%1 zb>=@FGoEMxDzb&zB2PwyxcRJ_--Hz*C>N-T3<(i}TI^u!g>O1R@oTZ_=`y}(flh+! zhu_j95aQ}}$+{#mgdpBI&rhaOpftmiqexRlL?zG{v^cH%r4#T4)HrRfB6{rxB%q9= zh>$tggvEb!Us0f3x-Kkq9LXQ;OrPTMb2o!J+Sw?@!}_%XDLe9$@*X*6&2gGzGTsNr zW5)`{7GzjsF*Kwc0qJ`9`Ew*fJhTecLcK{&E2q5d>({s5Hbzhr7a{o9gM}1KzQPg( zjP-P!q>YAtPOK7*wrQ%Seolh&X&ik6-}H5i;pe-PyNQT49-}ZDx1HNg$CN#JeAIH}HFS#Ir>MKVi0HstsjgH5;A6ON`RnZxi)H4;$@QyP-Q{>@a=FqVEsiTr~`m^S6V4%an z;mVH>vn^_F`I$3C7PKPG-$j!5-`x^ap^ZD)l&&@94Sdfvn_b5d8$W`b`Qhu!!236D zsk|gtJ93^Bd-7S4?}Mj>XHMarezTkMo5=~&G9(te`02aqv|?AX@{KI$W0dFIaNiZZ7w;#p5j z$u2%lnKQNG?MGl|oxL~Es$vy>X2ddX@Op6!E!OrSZEcmy`q#@c&3jj*t_f&0iF)OcivkPtYSBFf*NI{1V!{Lv&mc3iQn0YFwUaM+bqwIU)`oB{UuLt-a=7#Jv zoY!^_kEpMdes&=w$tSUV6ix6*OG+^HR!qsL*vBfR$rf}nAKay_#>g7EL5T2mr~SOJi|UP{xIat(~Y^N z>9@%&YUn*m{$pSU6_r6QHdJRH#biQ7sgWU1E>wB0VcTN2k5^tFx)XQG|J1ZaD5u+9 zEbJui-8}E+(L^MA#%t{CQIvW|kjlNXCzY72ytAs<)3UqE<*C0^!&~>J!d*!capw}O zu5P`>%6P52n6XEr+?PeCRL>mpuy95dyU)>losW>yg`r|%z(90h_aULu;m_~(6q^`^ z!J;~jpU|Us4K{z%vJbAzD9+marm1``rFDMJhBok7$wymtDqOj6qaY76^E^-5_Gw@S z$(`DBY{IS3Qx!#BZWSY+4eFotq6FMiQW}mOeZkly<|#VP+pda>1lw4z)JFTRsLrvZ zNpaoO(BUfW`Z->m=v))_a()Ek#0@h`9qH~>PG+yrH{rUUbZQtj5XyxYmT|K1?EZYx zgwvZ~eTvr>;_u6*9_iL|?EjGI7t_kSav*n{HC?TJTo5(?SgO^9+0vfik&{T4vi!xd zxv2ZAaYtpb6}ua-x3j^zVs79At7y5+ioh|7z!5QrxAi}9SpptdMF=+qh6KCcyH(an zHRoaCOocSyd>q1@^wC^YU3JS93*9av)O-oHE*m=0h=J`nbH;>>_vze`7FtxC;?qc@ zPNYq6_=yS9&9k8sHCNWX>;XHKVJ(kwz=nW%Q(W4xA6;@SsrKLgkI8y$@X@*rQx(E| zsfGB&YSM?46fiyASYuKE-O5nI3sIme7{**;7xO=fx{C)%u=AbW`_#&tNFQn=v7(dS z*&aAee3eifYS=n8<^ek!bH=)TC4=4UmKKtZL9?&z8|E5dom{VPP1W1K65V%$I<5eT zLMhhM+)(tr$0oTnZ+egxl{wup_^>scbWCm>(%x6|rgE;$*K}&Y_0({s4|dht-d&ge z+Zy%awrefaAw!H)12)s7DgM+fi1=msVG+ zDh~-!GxY?dLH08SO`|Jkum2h;_Nyci_Sth5)waJ1w67U)=2RzYSVkK5o~ZLvHGr0Z z$zyfTX)yI8CQ)-lwZji#lh+Wgi!s=4yPi{$7sgLwZSR&hh`Yq(xY=FEOR!}XakP=8 zm|gj2d(9``0aqfz(h%6Z)K}+~E+kGKvKGF&DuJvls~vid!~yB)sl)#XQ76K8M&VB_ zAsGy0M0M(KXb5q)(iGIomc2js7MPB-PQ8FFE`{vwEmz^AWR&Iun%d_x z_hA4Z0 z;BeGhuI>sstTZY8Z5pa_aa$MZgtvz5k5~M-Y^+Bh9)H${N@2bSF@$-+mccFtFZ>35 z!R9HtfAEVBXf0MdttkAr+w+nK#V!XEY$nKA?|2Mao-R-yj#eX0vXPF{S~XU%IbBV< zOZ`5~*Ko!g^a#Pko(R?z3!_(Vhr3mQ~mZFU7_j#cQTTrqaoN{=d_9Sd%ALPjFvuD|^um#2rT zk^YddouIf5-cNiDxB+r2V5nj`wAxq=Nf2=m_w8Uy1ZX%qM@$; ze+{O?in-X~7OGdm%SZD0>ecd7Lvh&WJKEENHx^iKv)%iJ0k|r6_h%98EiHaqsY(pv zpS=#(Oa9jtn=Mgi1c?3uaGw&hU!(k@zNB4 zNwI&d!tTz;NT*MJSc(mVP5d%%;{%T>WY+L=sgXVbNL%gSqLwBye!!CzCiAzBq02rS z)K0)CS2hwMr3lU=cHYH-F5BdsutIvHB7PD?PO2QZAj^j65T>xOLxmE|eYddx3=?}` z>&Rpl{_CsmNkD{<)%>@zfALKiap6!`g)Oc{#a^huE|u!Jb^cNGs-W}Xn%?i5>O`;| z__@S(qa1Yo_^FceKZ8*^TQS%$t_vF+?4Zf=RPVy|p<^-7OVP%TKRL{a7dBuNlc>NO z`eg!xIfJQEju;`9u|mK7u0kj`6ZSXes^uqRi;RKUWVuMDc{~ZTu6b#r;rBg+((#;&y3SD86_RW;tani7d{+x5g_a4>^JcP;_LrEpsx9rf zKIcdfzb{GWK}JboEJYKOSbsD|GIhE+k=-J7fg8Uc^v*VhxEB}Ocy#`J^zw5oWzyO% z;Xh|F(btf{Iq!^0Tkv$QO4i97d5UQ_I4)UegG0JvV3cN)wT!wB9$ph?C1Ok=g?e|E zz0lO6??pC)7fNsu3q8+}j&N`<uOOuL>86{P+Ftxy(`jHOVkn7}T1M3knCZF1rK z!yJuZmOn@jVVBWo8h+mD+*haDr?2LuhBt#o%gX_#$3TbeFwbeht3dE_Fl#7N3Ta_b zQoxAGZ12gXlGi>JYwt{ApsGIt19G79hw<(QaK3<+k|SLTDSp#NyhJI(--SoIK0is$ zkXF@=F-!VVQf%aJ)wn2Qn87R}Du0v25Yz2~nT{aEX%R%tXo0$?{STzr3`xa_w$FGK zin{xXj}Uz=`7JG>!>pyh>LD88H|fxpS}Fr>L}Y7~k-(G~YW@l&KHh3b-(kzdfdBRi zX5wR$s7M}xS%Zo>MtOgEova8RBD&!>9avWD(*wd{lP2Y59fms6bJ*Oe=e62;%N)|u zSIphX#|K!9QjXsJ1)OQu9Jy)(4RsbQ_kbqsFLERyG18Rjk+w>haHa+Em1UI3{T&wyfm4#n{V>D1F_7p(GMz*?f$cok};^^cb8HQbP zntjof55?Q^bBw>aJB(Hz|*yjh=(F^>!m-33TEk0_$jcJ_h}hrexqO zGL#D}4mg^vBGY7eb>jl*B<{0GVe(J4U5)9#0)36ADi@Im649lm@X~72T_`t; zYDzPsABJT-y2jVZI1VtYIO@{)-*C*r^T`V|5@kSxE5Bm1ja!ID|?9uAT*89_86HV^dH920;N%OaBtq)1%polo?=!NBIh z(F3EN4?ZKz&-sV`6d}dwk*?!UmE3Jey1!U<#WgP?e;a~{{Jb>S6a^Y)C|R&|I=Wx2 zD*=Kp`bV@sV3jPSG92QqzNL!%yu;pxC8?D@CAKOr#fHjWv2JPQVv~fGK$JG|`&cD>ZqiB z>*`h@Udp2d-PLRwVGVSlYMo;eYGh)D?|jS>DG! zXx3&SfrpEVrAb~3F7Qz6^8ROdew2F_7pa?o6YN=Y;B&@*&KkeJsRRQdJS_Q*q7OQi zqnN)rjvoYB%SiYMmgNI3a3XEi?qFID-3DaNPCOHGHYBmWdUU$gif;~V(=AwM!*#jB zbJgJ0HohglI`B%x+y}NH`AuyiY<{9G zi8^C6jL@WGB$VZ3%xetgdpBv-?r9F%00oPxdM>X{7R`tZw~7hz^Mnd58yNe_=MnVY zB#Aa>Rb#DvV&bEKcJq?OLix)tYT>4QLCgJr>O=9~FWQEqg|vUZ9CTL1R9Vjy*fZ?a zw-6EJ6O_x#71F}aS|3KrTLxK6in@tv z6zf|YyVRc(J}__<9llqyBGAm#GwEpjuzdM!{VYKQH7^rTf2LPPuU?iyoTKYBp<$=o zQ?XKc@$hiCjgy`J-kMEC&h@x8Zbrvj|wzh^PMai8n@wnp(wYPm5 z4ZfknWXy>JZu3m-A zstG!YS>)qS13D6Xv5YBW;aeFiMnjZ?@==eo@CMHR9B@20VlBOwHGjt1-RVel>os=$ zN8jS9azK1ZBdBw^jSwZ}!l$c-X`{>>!}=7Wf56Yb9_+pB*a5%fD&9Vrc?tYztl|qd z9cuHBLU;Q|gims&sJ>>0TmC%9R=C@NrfD?vrtKYT-V^gj|EUi&U#RfbF8<1%K3-^u zF(UY4RuG8$Ecx<(i81<7Pkf%<#@I7@x)|`jj+c_shoV&f(Vup@-b3b)DFuZ1Z&sdR z2N_AZwMffH7yr2cA0vu_zxFdAtk@)3e{zuW4j$!!nQtIzcgXy+LbBC|Q%Qg0qp zk#)jaZr8ucUpM$3lkZr64y&oXpXnM`jD@4mm2X1h=|egE6qWawh%_kI*BGRFi^g~q zWQZsTUw_Hk`SfMwo||_HwLew-bJCKtXb*zDVfj`pj;osaP zZc=Z&n?yW^@pGJ{-bo5^k>I_2>$3F*ZC$BX!`zO;ZkDX{wU*>ntxfWI5mWs5lc?WR zIil&zT^!>)OegQ&QHfshihj*uRMP%HQ1ZI-6c*aPfzq!KT*G1mH5V%vRWzYTxjY`3 zgrsPMt|CJd{5Yg&oE>F}H5RO_Xu2P*kKNTsSiOnSo~w(RU1F7DMfIOJUx3U%<3(Qc1KWU`Wh)6 zf$nz{}>)%m@+-}_O^MsLoj+v}G!+4U-PTd!H8jfFv6E-R%Y_2`JFF2#fE!L?l@uwxcmjHXImxgUB5)h%y zJNQhWDDgX^>ZXL{?+cQDl&s(JdI*Shs%gU8pD4G~$!V6B75irwu{%N@yK65yvj@Gg z;pQ$Nu+(@92o22-m_TSuV8Cc5`M|q3HihoKlF3|j$Xb77Exk$i3%M0+Jclk$TIBzj zyQA3q)$f6Dhxwt;j6nF4^fX+kPIWbdWkfFlN(Uc7`JNE!+Z0axY-)7BT@g$M4ArmL zA9n{vx#$0JuaWRutYe~CN;_B#MHWXpJBzCOy|MWgZ-V+LyWut&2b6QU>zWMhlboQq z1V!95t!0Bg@GhRepa;@}4U{V%ARgl2bwBaN)R{*NB~TLUtbORrt^^zrwkNs-39fkO z`F$4lL!oW%^2|!rd*Gom=`YV%L@K2z>fL&GYLmW=}vn+iJ`p#5^waQAWhjE66~ zpvX42i}2(%c5R2J*xf8jd6u2VGe2hm&TSWG{;!G4pN z$RQ`q2j#ZME-1Opo$Q+TTM^NO;I3GwL)c`4XltAO3GsB&(&BfNxtr#O*PKz(vgK6*(Q3`E64(;q|F+g$FX1nRW3C*>awR` zPH7oOS0gLQ*eyd`IAazC?$i}MFHl3E`W+tsiFHP)*fizbGpxK86mWbR`u-P^b2YL4 z0j~B*k7`5|qjf%^K1%bJH0S6USCRz;Al2a3gHd<_?Wn{W~QT ze;9kY^md5g)Z=}y5uzz*md1zUMt((##NPai!F$Y;-`SGm}Lpve>PL-HQm zY~N{;7$o@VqT;aKZAV`ptx|_=V`N0-geca5Bt9gD65~veZr83cyA(V=))8D50Yqiv z_I;E`kkkc1+o{FCS1mY}(387{5E%!wyku2IhtXh1kkMW^T>&za;?BjUTyOiFQ-&W~ z`d{||d()vg_~v%^@Rhx3@6N#_4l%j=f~Xf4^t-rG_*{aQ{@6+_y|!g20Q<;nVB}a3 zF$mM)@JYtj9}>W((yG9c1#a!NM{?dhzuGP(@jH zXC4ixB9WM$k8C1t?&UxhaiqFz{X8Fc_caKfU-SnCt@Yo^L&^#_H%^l6ND?42dZup_ zC|_HtM~{^?Tc1vb+&YtwNv}-KWSs?c%EmnGfkH~Pcbn7+D3|2| z9F$+`sUTGsiJtV5j%Dk7q6rCNesRX}68qFB4YWzAR2yZU2{OrSStos~I~%6jrW;YS zDDj?D4i$^HZ)T%{JV~qyIB53#4V1v zd)}2Dsv)ah(6XCrwmn^_Ji_;EHSAU*+!;%4RH%888y5sLO9SF0k#Ov_e|{9)eH+%@ zoM7V~XEt(*^}K+ysFH?}iqq`n8z5}`V^tZ>+ven4g?le?hZ+$L=M~9jV8L@Ol1OQ8 z@<;Pr{r5(ygx?g3Kva&UP8~e!7WvXw;3gcl&3UI`3um1cYq(K^jS;G?Nnx9q3}jV~ zND0rsN5RO9M+LJZYYB+!UErxfc{I~07$0FF?LaiVX~*cqdPHr?Mjnsc;vV=C4fi9(%tN@TG<5NuXGM!gHeLFiUq2g}4D zYh81-WfY90nA4Mgg7c@H=JbIt5*T+^BA~z2^78&CcAxcE9JGVYNo0O9xD^ET)TndL z3QRn1>kw>&2}Bh3r4i=Cz|&~~=%7O^`)9X6WN^NgH2#z7da+E5s{9Uk=*me{l7o;F zcDb&i!=mW0bqhJn!NZAuCtEETp1q@5L*xv$yg2R-#%8ZZiX8bz1J@$~m`Zxnhjz#v z55Kc?Iyo2SREL@Vdmm6G%d@B#kjseSx}<^L_(A3Wgra69qk!VVOX`by(1Na9wtuEN zbnCb9L-T_>Ci9Uy$k6#NcY)&Sf3UWbZHbkI1I`-byln97SZ;H8jGRv7A4PTb-z;0V zL94P4KOFyCs*K{rL+;6^NY*TCY)-<(f+r&Lmw~bQ{e>j|jICL=-1`q0yT&UM=)$Ri zRJT3+Ux_SYa7Ubf7D*$q%z*7~pDGu52hukC+Svud(W)C&&(9L`r50r5K7#-v%i$lAcTL3wm6NOWw=>MPuzl8Pm^}ei zH=>}p8jrMPm{|E;ujXCVVI}6rJ^go7xwcOXppuk;^1C7S#oBP@!SCaL7m^yYcX&w# zKA^JlT=Y<)>Rv!IH;DR{;WiKGHj05}{<bOXqC>{P^is|9g=IOoy^e51|5`FK(U-7vIZ5(8 zFmU2R+e<8r7oO1`SwyJ)zt@!(rPTu@?~=y6;_F1K_+gfLcPg7lH9=L;V`*tn5ipet zCRNe?-N;1QcD$HD#Q5})!}W{|WSOF0yazNXJ1hc~G>F8@YN)eEqIuT~CZTBMgE<(9 z!ck?{UBVtrS#Znn1X=12ZpQ&c|#jZKd)dtmvw4qBtRA&jQ1LAJX!T zjh;mZqpoqCu9QBRc)KMSDwM~;Y12efC_kr^PB{0_5$)QrxaA>lCBxWmT`Nm0p=DFZ z<>~nd#YzT96c+dnyrsNW*IFB;qm_58d>r@nEX=#D&hFZ7)4^ek||6n41$ks3a?vl#l zgXZwg>kQv@UpX7Od9vR=`MlUapStQG_wJd>J%b~ZR$zo7XYKFm`j1VIxMOOR{bRzy z?(&ycn`e+p>bKITp9O#ZiZ6#R!Z`j8Bl^w4K+IJhs!pF&*MOmGJXG%WSPXyuyd@{B ztL8OQ(GDW#WW1~~cQn#+%irPBtoymEWvQ`1sbjEC@=6*hwo~Slj8gYo*}a#H zMgIR!)=FrjEFDR?w1wUdu?;p5&B?5yr&hWo$2G8yp$%4-Tb!^j1b>M*VZOs}!<0C+ z!|eFQz~jc{q0bJ)27RwbJ3F81zOW{>+76BG%BZ{Y4lnwbZ6SB%J=<7*ESVMGg)0OL z*A?FX4wLP?fmrZ zo}j3_Et>PO=~3+hR^DxnPkKk#2_}M`uADdVRYORc$M)XiV`q1CGcSwX_Vr;c$$M*{ ze3$&>fxTJVij2x_-y)vclK2BnUh;rQ4~ouA~{>VmN`^O%VTVsB)u_Cz9s zj}^I=ecvN>^Ho zGuuZz>q8j<)X%$wOkSt-1};&#)r+{Yf2D<1}Z&(%Zwq%r7ffxdrWGDD-KOfd`AhZVi3(Gr8IKi#R5G5hAD4 zoB#XD)tBn(b350uL@p(i^1rL$L#J-IDfLs_%alaq4W4(V+CrzH<7ExBCwbEmj~w6r zL`(JfPLk70KY{jOb;{sInsf!`+a>eqPU(P0m~`%V;<2HGv*>gfN{hn>J%ZNREp) zWCI@I(LJl}UzZAaghO}QU19Se;1LmB=WHp>CutP=TN`H9>4yPrXmll0=>;j$&n{j4 zE{>Zl6VP@^!{_43=LZ38_;i1qH;<^PZ{c}smRZXivAt!B&&j7zXON|Ouz_M5vhVQv z6dBOAhaJ`TysQ(CgGhj}gmKAm*(jFeT*CC4+t}0m*^jR{lmrF1^c{tkwU=+IT;mc+ zu*$>zsDg_Srd>O@%D!aON(EoAR#j$Y0(P^p?nxIT?(4y9avk9^vW(X;c;wvS1E z?cTBW>%RQk#+p>MFYHykSO4&;!QMpm*@GpAfer$uQr+Fv%{Sc6`n@SJZSOeI%|c#&liFO0NtgfD zRCd@u)gh?ge(CYM0#w>vrKik>#_tqpyCpa*Fqp7E4qiOxW5s+o!4_6K~PZt_+sfGI6Uk0tKQqthD_xI{UTow6RTuCyzk?+>&Y z>15sUmyJ>!{9)ilC1h(mh^oL2{Mhp;$Ok1;w8J0q_V_f5{O$Od=ojf*OAZ;v0L<}% z@3ygoEi1P1^gx93qbB!mRs1H2_@yS~4RU;Y#GAmd^^uqF!Q0+pE^_f;Ko|^3+=a-P zY)i2uh-{c}>KKA=tJ%7_*pb)jPj4p*Nq?)v1g|BJ%xTXc_Tx0&wo(?1R0K?{^MKcd zp%Q}K@I~^)?)Jb<4DH!)$GIW{|4axH$PQ`ofUhQyLiZ@--bzO&u^ z&6$mWZk{qFqBOQS93Z^s6ccX)YA5TFrVd|&Um;v4g_>-QXSBjOUEiIwkvXlOiMe9! zmNd)EiJr+Tx}0fH39Yl(h9L`y+QTLFSP$a=4|Hknn-1*8yW8*uYMxjHuX zfkG_s%au9fv8be^SuMc zRI;m=4Z*8$UuE0WbwPZak1r}X>2H$Pw`+kwrgk2lFn|ygMfT9-)-r*W>YFw8abQ6~ z^640qneoQ?GLi&YkxCQg(v-RUufVja-!W_ufa6)ZhdZQC4Ac#)SkQtFGRUs{Ee36` z|20C6SQ_m(=QJ5)l*qC$fZ(&LOS`RLm_3&)HO)?$#7OXGCU42XsM9}Wq$3Fy7;i`J~U4*hD0|7knape<0L%}l|tH1Xz zpc9$JCVs{Ow+5(DM#F6vHlbPtcgqHU^`H)-g^G;rJf_NwZ&iV_13 z-C4&%@&8ab;RKam;7&fJWhnfe4uKK$XVF5i7|4oG8>?wt22hWaljI5r>dCNO4RE@T zF!bvpm0%(mQi6~LUE#aZazIV1{P8U&sHR=srRd~vfLG8x)9$u`yIsMrBmQrIZr9oB zzkdy)!NuxK+A*yN7&`4MZW<*nAs9yVzySkSU#H&>f#Uf~#6JVT)QmgRMF=bi0x22W zhns%y0vLv|(`pYh^rWZv70WfI-uebJe&j|7vT7|QrpEdSPy{T?p-BL;98 zqQ91$t3mGAMfg}2wm<-d-O^1QQ@9bdwi`7GKLJ$8M$(!3^Z$W>%EwO(^8lQs@QI*l z)mJdJBES5mWq}+pf^}#SL$eeYCP=kJpXOjIB%6n9R{xovZ}Bmp^dSVkcxAaVg#+~p zrVP*^1FYK;UrlT;0o{|vwohIHr;7c094+!MMe40xC|4gt+zZtt3t2QK^4BPCJl|Ae zi*aHI^jv+}x`8j?Nh^?%1&b0M&CNH9`YZrmli_hp@NfCrA5&)JH_*x7W-L_tI|(4D z8m!xOWekQKK(+w>Pzc<}7WxI%2s8tI8i zzVz;}Yf!U$9-5n_eNz;D7oiOBRiz|AUwv>f^ea~ya> zoeS$FzvbDTgaV|z>(;+>qNIj=Hmi&(q1xvw-yXt5dh`&m^5+l8J0<}FG2o~r;j3n-BZMw;Gz^MB4e#!jss2;jT>r!d?siY^Kl2#y>9Zb@ zT;c(^!da&E7;f>tYS9WvtY*7NBAX~Tb(y}q$ab9$tPm^MtWf}39j!PR8qXB@jQ044)ms_pI3(Q~)i{tQOZ zbI7QfA3WEsTk-|qE1#oZ_=jbHKot%T;R8a*tT43Uj1GXBD+Y&cZo*_7Y-}#d4ud$& z4zV6;X|N}vYR?d4I0Rwt&teWkZ`@FEto`TTsWN7)|DjHohJJ}csJ053AOIfIpU)Xw z?O=l;uJD|iBiX<)q8p;_3|n-BnK@Ce{YwL?_uN1aqI}(7^xlG7*141P&7wEJ>6TNh zIudqhML_uJi|%u>zk)^QYqPLq5b&v;O#N{ZG)+G2wWi<|un#<3$;=NR)=$BO#!V5J zF>o#xvZ&IAFciEl5|_#g>*=hHFhpib)SG%)0*9Rr&h9>jo=d$y^#!Vysjys&5D-^N zRbk#TCI``O)pzx(KZ1NV=c>HaF{ua7$b+Iz1+ZGob-pPGtk!hP9MnWckh9o9bmeVf z6lCd{bb}Jq`0edaX@w9hFEvNY)~W$dy+o(@htSDZ=47M@j1z$GDwG#>Bf$zgzoZ-` z=wjvX8px(4MgV^U%hW6$P?dPMykvN;DL*j({PIRHIE7D~fAPEndXkCWh=diXXB^q% zrvUF7KYp)ztywz_8l)21CIasmII`?5*{R5w(R@lln=_Kqh>Wm{@)6NQc(7>_D^VFM4)7}L;Cz{{wgf5bGI72zcyK{BxrItx9}VL3@*mi-3ab`U4L zXKnkYb=4yt1sF{$ZKnlzEzw_3U4f3o+@VN@!4RE}HkqVg0H=No}Vuw z9{@Bx`74>CrIGiw2j9?DsJ#$zkD=2V~Z&d68_^_CA zhRGlRl6p7Eyf`9*nM-@tz6TS+?_{%K=QRRXMGsshQ+9&oJ;&U(*RFO6LV(mbtQ*7c2!OXceT`!@tR64y zIlBTCDkwgRLU$ehy^@%7AOuUk!W6F(@(AL8GY&D?HLO6y4;7Rr)!_x-?K$EX668cI z%(|0Xv2hKgOWm&fquY>J(4<+l5d@dcqlI5uzo1f8DP@|66Yxq#-4g%zPsD1`IF+qa zbGjkj?yvANk=*sZSm@tfhfTd817LKwKYD);04$1zC$>hRT{@w!IDi|91X}&Fz=)>D zKuD3Wr69;5-X+AbUWqlKZifg zDT?L4gj+_%jnu!%ynflxb~)uq{Mw8KZ|mk+^IJ?E)|FTn!5kr5b5!f&^DQ5SP@c!> zyx=n}={KFzR`~K;%_3S;h96nly1NO_S-U=`&d$mB)+}A1v4~2pNQ3g`&ZvLD6O6_J zZl}Rp)wvjg)IwRd8&7=fe8kVO1u|9TO|(AXPw)NivBkIDozat%3B&(#@Z~52 zC7;K1x2M_I)Vj;MmB+=!rcDd{!VgM83qd{>4QIg@sr8OnB|gcOZ3@OdNmy3cO}N2D zvF4*+&f+dt^Sn^9s$#C|)^_Umsb4QnxY)p??0713H4vC!aXp7VDQp z6CIns$fIqVYKeb^asnN#oUB~C zy7LxKvVq9>P-X^MBmuIR2sgnPSP+@@!7ZuHh@mGBZoH|5VM$te)K7!Rb@78C(ygtH zU&QNbhuI)9ZP{u2{zPCf2V!Bnf-~;oqO#)7-2LxXoS;{?k_Mv`PMnDnpn0dTrBe+u}N*ZbDNQ2}x! zzlRzoCgO!H4y+s48bKIAr%aq$k_92o#}Zmv1Y#?n?Mj9RpXsv=!e_Z3gTqq57wLjD zvl6;%0s`82q;6$LB^q}&>fG!u-K?3G8bRS$k zAZASddx|T5KU2|}8jy~#wm8#m&{!|#tEVuCbKIl~`H>@7UWd9>0sv;Q_gI`MAcMV# z8)JM%+(bVxSR(c#n$CTP{FsEp=yB>3{|;(b)pyBoECvM8nM{|o-y$u?Mh z17OtjRo=+b0UAoff*($cy8nW&hB`i_`vXG*1(Rj9kko8x$%mS(8-TpOthpuCILekB z1x{SCeS^j(oz)5?!Sf?6Uoe)aS4q47umul(N@$m{&5qeP%Zz!ja14!Ji;Gm0Q1V?a zW%Qe;M&G#&#pgCU4us2y`^3vFeBB}a3R_DIJ$l6-RcKbL-l|*MXf`$!^&5@i)GNqs5Dc!y`uEthtkQ($XZQB4y2tMnv@^Z^XuaB z?Ko5vR?{Cj5Fq;aDBZU9kIra5Ah@j3ye)4Rk#eND)tGwT_D-@OnykA1qfsY}u^>=Ty4^!ABpj%vD!U$m(DBje}Co%IVfdc+!aY7NJh)t$SrPqht^LLs7f)+@Q&r-)QmAv64;K*H`ViwT-{z+7>Sq2u^T(pDw6eurDIIDx4ym=5s4W7 z6eig_X18V-^{8uHEb6(u;5fq)v7Y4iU>WrYjzK~i)%>u>yL2pzp3DWm$J;$)@}~b} zV7tm3uF1@_gPC^sk>sp>R}C8&>VFs=OZNrt=9lnEgjm|!Y%#%Xv?i(-2MJtNSZsU` z5{U4fE+Z14DVKx00`G0WR_T1E!Jb4qT~>|$t@9{XtHhH@Yfty{(emY4 z-tO8P#gAhj8U%R@s5r+#;~yqxr-tk6{l-7*#zdHGD}lT1*tfo5aikX4Jkj6icPx;L zj_z36x3FM{r4l z0yq;l^{$8w*L6o{IM{5cC*e9X9N1qZX9=N995#khIGG1JI@3}sZ6oKRG=6A2GAKBQ@>f`-MngOwea<WZRBatUqk61uw;^l0iGstEo)3kxZ!G@&%g)^kN>os&Zj4>)YSrT?KyTsPV3Hw`R znO4;S1~(^s);<|Tg+6tZ{*PP+s7UXp)sj7Qo=xbbuN;gjEaP8k;lf>D1<=dudDz;9 z1SSRVcg8i)f70D*-q-9O@t$o7qJ{jVN2-TjXH#StmtPjEc6u&N z%OnQF;|$k3VL&O!=>}meq3Su?=5OxZO_QU$Mt=i%4-h7 zLVL5+>TK9gEQN{;`zf@|3BRzWJ12>j(qvb46qkD=ZWdt#FjS~!m#Fsf*Jc(=3g-U7 zj9jzt+rYdiboc5|nmp9Eza_;OY}d~-X14beZTOB_`#TvmzbD$@uo`hu3kOi=)D1>a zlLPpZ8FyNIp6+Ii0Iqqt_1PJi1B(qAYm#@$+tKG*-geZwD^YmZJ1FCax|pK>k{J1<*q$i>WqGw?Bnq{U0W$Wb>t zER%m*JzIRR)18!B;eUw>68PQ zmc@@AqGl!!VjfrGjlf|MKxWRlig?YXLXnAd%fA~v_21oH>h4zyf8iWt^UlabgU3>`O(}L!l``cNKd=dEWzo0 z)b4U-{Pc9bmabO%@%8TCpgy{wJ5gZJj|IE+_?h>58@l$!t0E8p@TY39dv7&6a7U+Q zdVAOnnTW=-e!&i5L}fM->+eHjC= zuP>i>sgNT8fDBi5*AXKCh`d*{AEE^SZ&z*iRXG5#c6G8Ezybj61|Jf0Zs4~BIS)RU z6#)PcEMu$&ewu?db_GNfVrHSt_iT%5R7cAllM>s=0)uWtuzF6mOjwGmD2Lw^3FaC~^GidUB`AR5Vx)r>IscTT$hdioeaG-NHBc)=jV z;Pi+W$jITsRu5#54GUvPQNm#3?n^KAp>nsU{M@0)9m-AZ|~3+G~)?@z<`% z1Rx$){@FO#Ie=07>i5DbAcg6V`1?RyoCrNTQCzAZa3381sMIiPgP5CY=bu5I_#PbL zlY?l5JTuWi;b3^)N{t0k5cBH{fQ{>T=5_-a*MhaK@(=#cKw@uku}x?%#PjE~Qe~t@ zk*|p_ZQPn){!9e@;~FPx;D@F|sjq4C#MdoNuiB4?#+3csWnJnP=&v`ngpG3x_dDht zRGo-XGTk8j*0jOMyq^+AkKT4zyI-Dipm6{7;e6a9QzMaL{;x7Yf6 zL+E*U);W<;0TEx`@2rWHMg8w9D=4a~)LeiO4K&A!3Lz2Sm+y`*1j^*J%HGeDBYOph zItCf8(z<%~LdU`7Y=Sv#uUXbTB)Vc(Rc8+IUR{MVA*gbH^sD8R znN9n%!|`M>d+1XVzq1o~xC7f5vPTwn%~d0A!!{6Z>=P$Y{tNingU>7Qs7_+=yFolM6xRPArcp!Zw?vzNKQQ{m-`Utrk*}jLJtvdb@g1Z{!_1fTd+}B;LrEaiJchvc= z@21jzn_mk;MMx^}g83u(*K7*_;!`_2QR)DHC2}X`TRL7Ix=6Z=J4MTdAs=>&%aPT+ zvO)+wXG_)xOB7Z@&yAcKu67In_zBa>7DVds&08U#Whb)t7dCQRH$9#XcPI!jHd>@X zVf_=K;(E$?PzI?@%XHJs`;}72T zp)4GSO=$MP=5Exy{%aE7>u>Ic?iwz)Inc)1Daaa$WQ`;i)lGLtOv*HOR8r-i@}I6tVdl)Mqzl4Z zi{>nuzBUM3*(9FcwZEODp;_c#KUs)%@kzi&<>ZhG`cWn+*Sb^+Q?MyKmuZlE1rVy= zUY+BGDQq*pp7j=l0hlLR)>YnlTDDNH$+kaSHQKnb?_sQPQ;Vs5rpGd z;d^UVxu-orch!#470@_WXjvBwqT$@;y!1!LALi}zMP(($MJ26cJf7w=<^i!GhRVEx zXuQcb<4-@Bei99PA!Li@hfL9)b4e z7;f1n82L-eAuZ2_aqX`r;CspFP312ZJwYR%D;R`KB3q#^?tm|ZtyvuJgynq>PrDsk zAxq%DKH3i`{hRJ_9Kx5Q`Si3HCrlS`+_E*JDO{&R_Rm;|Shiw{7T5RvP7!-yL>BOh zW)@SxC@$vj_ZfFBnye@nJewPoJHgSy`?zN#EtGOwFN=mU(Dd5}v%J4t&4ipp3<9OH z!df+1C<%lUwZ_nrMod1=97qX>ziM-zRG9Vlgw3EzUjLc5Ci`H+ey;a~qnL{riDs{T zX-3^REl|k%eN~y1)Cu|Qbv7EwF&A+X@BY;glBlSrDx53Fp@7thZPrKw7*Te0~drS?dJ(9Z>FV3Zn#T_-TVCj<)4NY{4EN_WRoIaQ7GQ@PPd2OtsEZp<= zO`F(sLjh|hzvn)(0^j39%ot~gs++~&9-)4oe6dq-Pf=PfhJoq1tspbL#jMEJw#A| z>MKlZhD3#Jbn)x21*`XzxIH)v)V&m~T>{1NN+R~OUgCMS$n*}j_sEDX?&5vasq2De zwSVo`6C!Y``lfg~?pnNEML#?&znQMukYG^Yx4P8FMvq*~@k2@l{62CPThI=jhdgK) zg{U-I<1J74-S}n5c*YH)Z3yaC<@-hr#w{%xt+t_Gpl8ck*TsNY+E>G^=P$Rci1snn zt@mv(?MYlYxx=+RZ9#`-eCjq~wC;@A1K*!2aGRZ9FJ*nwrCWfj9|jY*fUeML#QVJ% zGep)h63OO~Q-v6FV9E;FLv|Jy}a zl-+ItH;3ukVb&1Yb&Toh+CeQaps#g84zxb{efO)T_^q5$>Ut6{wSQYhb`%%on$I=n zR?|3+#tNwEUsT`_?Q7hh*Z;((lJh(M^6;!{kE-YSK`9fgKv0pQY)Nh}=DI1AYBdY| zjP0t@)ld7zoxZP=HOWCP6xloG$be9Zq@R~t4-HD9LNOj*Ha{0kvrX%K4X zt~SF?r5F}`h<@RfbT)U0+D0P;6_d>dWv|5v_@^kpZ8x^h9MA6M>P78RiQk!hY+J z0WA8exN;d1{*TDa_?|ulkGaXj#yt10t7#6{Ob`?2pg*(RyEuyK#d*ko*s05j z#raXq5Rc;SOe_8}tmPT}yJ}{okFra>2avItQ*O9q<^Et@ko zhv6dH_4*tyI_}Hnh4od7;}Lr<5qD7@jx838*XCBgXkdziGGZGYqu7wRnG^Z;C(>Nxdq#$nO5_zFp}FqwUzx?Nrh2{~b6gomW3K&r6sjn0EWV6Rx3zQJPbnRIv5ol`2Z zfP;avI3MrH9wj90oi6$C)#?MCk4G;z?M^9LJrA}Uj+_F`u&6JU(me_ABIm+bVInLGFw*4)7z1WQAS!|BM;y&U@to=JO= zOPh(E+?K}S(I?{|31g=I8=BKEw!;6Kp*@NOnwf!TG-I@DFM2Tm;7wjL)}{pjkz!BT zkAlK!J#{)v@nY#hg1D)h5d;{662G7v3esI%%|F;#!ZJ!~52GOTWoWrTnsXq59{NN^ zosJ*^4~R~GGhpD86GcX-y)-n+pxB{Kr9eYrHadROJQH1}-M2 zs&7DR9=t7l-I?V`!@aou7O-t@bv)yobvcjl&6RBT%f}$;62-pW-xipNCM8S3vx$+g z#*sxgf21cTI(jDP4^~9Du#?z%4ai_6MWM(y^!P<6b94OSE~8Q01d&Z+T{SgS$}0u9 zupIk|GHJOG&fleM$0%+l(kskTrtXdM}_ ztsErwf$qI)&ua|7k*udA?^%J9JF)fpv;dXUG1kF*FJ#S0XT>?ruhzD3L0GSw5XQ}k zo3K0D?gw&3Doyux>~lYyh-cgs82T12`AKr##m`>8LD9;gO4Uy%^n8r7VDZT}@+mM4 zY5Z)m&mhNyNs%)0)5{^@Bdq!E?w4jE;02f1#)nMQ^a)+m)O$<1w#pbo;0^uWeU&=k zC74~QsA!fqG2nuNUh27~zu8^$%==Q0EW8*J0E%qN*B}hw=X4-lQD7g?)g4W%Fm!qM ziHtGb?4s@70)){_NzRJ{2~6W3Gbab$b4lJDN{p)VpK!}Blpi?KNpf}Ks+yz5iL;Qo z-SMM$V%Y4GQr+9NahkWkO0sxR;g?v6BBA>Wi+12R-}|YPJol@=)!*8Zjh4T{=Wz=M zi(4rG(2Uhsp@c-5O`1W9lTceFr%s$C`k9G3SV9u|%CvO0BJ-~>Lsa%~dRg6couTb7 zZ#-rvdN{d10!9UztQzz-S=(K*i7RS3`-_dtVg>0Rxr^e9Gipg;Ai-~g@G|4iCLZ)-~roDJE_nA^(BcrM;r9lOw zbf9QV>pcuj#AiCNx;PGLr)BlN%?GkA394u0Q+wsxv73g?cQwxuPrN zW9qeR&(i@%%*OVf>gw5*EpfM-%&Ua7RxE3E!9}7=BAH;q-??;?>nP{KcjsjoIPr1; z@b7fIvzpBm3*RxoVdLWI@Tfs7)4XvNowZw^qQH#%FCEA2rRbp3HbkU`ySa1zT|ZBc zD$%%htcG>DWZxH5Tohit4NNqm2Off+xy>IPd!Tf6vGbTW-Jt|lvfV8pCSh8m*LD1A zZpN{(>R@C!SHVFO*iAVyYp}+ zlxU|Y{L*}#B{$Gqg1X8m4Zc)O;n-@c{rmV#sY>suy&Vm*j*nYAm$7GRZF5Md;$|;! zquR@eO6hVi7QySQOyUZa>c7nD!_-ZWIDOoob>0=@R7P*7>SR_o7Te|F$(y3{rzc(| zmu1yEo5ZnA ztyj@PNwIF+3Iopa)m%&#{$Oh5R3ylj?q^(Epz~_$$8R;ROd4;tYvE!PrcM9 z$AfI^uKAkj(enW&`5G59hnCaM?Woiz@`|Hf7g9b-f;zt68G#p>@_^gEC>4FsrhXL2 zCeglqOa3jVzs4E-dXL6tVvU{89VG+dad%U}o!e93+xoa5^a(yxCT5<(b}!nq?}AcS zo8=<$Q(u9v+r??D2D2x85{8fjj(%)rSB4z@$37h64q!-*cja3B9*u#%tM^c5Q=y}U zBl_!_#swwnR2UNy8Ga`~GV$avB?ls*qFd!d&g|M{Dv_%xllHYdJ87MyQ%P~hMI*Bk zboscjl&2hY#L8uqX6QD+imjD2T&h(3Q7?gCZ#@OmjmFcRC|PKUoY8T^tRyYQn^lU> ziT^uwuFfYRc0QNCzm@ho=T4pQ7r9vI99!i6u3C;;C^7|UmOS4iMh70b;Ih=69NiL6 zLD>;^t|?wf7S164yUkiqUPQN-=$=T^D-J|V^fehxc3C+@9=i3I_}q;x;$erY?^mxK zrf9~zHTCe#EJU}N{_(se@vpF~Oit=DyQCy^ZS7@YOGM1CSXDEHGQpUHNz_iBVz*`~ zIDi;`22U=p1k`1l?lo&uj!sOmRP)?kT_$j;f58h0Ti*DOuAz$3%9wUS^SqrVYbY}( z;&o??6!Ms^w%3cP)Ak1ThW-_(kSMf(9J?)U79x0C;MO?FJV`H}U1>1sb7+<=2A;|6 zpd?I$(`6NqGqqi(wF%H_vm`ZJSE$?rhmLmhBwvEOH@^pP&Q<=CEiq8$jclVPaBT_4yOyu3Vl>*T&zpflv%&RrPX>G%j%F!yQ+WX50dKeW0(9kq+^7qus- zygh$7{rRl@_Ix9{J`q>M?^*QMuT|Kp@_2$6J)W(jA4=39dZ*$K%HP|wYI!s0aN%{! zKZG#l~UV9bzTs*3-DQ378@XmDXg5 zwXQA=u?4C}iLPse_?gNG)y`~vmh(;x)dh-AJGni3tU+{dwqvHD(b-Yq-?JupX)qg` zIpW!(i(On%4>=PgaKvUg(adY_sNzMUOKmW{k4=oJ0G>Hp*Ar|Q5S>XhhT28k;4x(k z&wYBIe!qSOm(HA=S)eegK#Pbg(NjZ!1j!#m$O5`ACH2!m64ZZkAx)^EKQ1XHNKmgA zLjGi-8^<9jVu6gLvSsPge&VU`m&znPB0MJ0rVz|WCp{u6#w3d*oPwWpLRk}8E)vMc z$~__pcF*IG$j2f*BE|kqEOp^ue@9;7nDF$x`JfnCbdKB$wUDp!mi^*|@VF7WnjRs;rCe1ry{ev!zpIYz zY?zLyL(14fXJDbY+m40uJ~3SSDtx({O>;?-Akig-bRp4fSqTKZqk#NLl|Rp@#}v=@ zO%6JejUpxQmYnH|yr?O7J(Iv9&J4QfF&KBtnKRZ5dVuREj^s*Rv>D8RJKPg2++nO4 zOi|NM-q(Y+Xb{~`W-rYGxnw@^8Qxqa>voyEPq~M9h}%x;5_z9Uk8pz(t!CmSNW^B@ zJ++^{g?7d|hIV9yYD6X`=ugw66Wjh3=(xc!%%6CBfYw-^#3`Zqa<3XR>_6zk*G2Xh z<+(SiNFonKmdQ^6qu{2HHSmAwpi$;m7s^AoRrC|WCSc8cO_v}6QX@*j5i#uOKYT4- zjhJ1&VfqDBKuAPS&fh~r%|1BzDd0Mo&=7tf`5QRUvG7sh&_?qcI3-;D3eKcc@Ub_j zPAaqyZwhcEiuiESr_XN%$RegBuFYPrnQD5dGB{^@6?gnKJ*3*y$0@&u#PWb-6F!zr zqvcM%kG(;{3y%mWlFEC1!eYx>29V$;q@)ua8rC)Nqotyd~fL6Sy|exj+c?`?44>%}&skXHL!e4OMaYnO$N z0}0SmwJ_wWEjvRLfpp^QJKvgJ0o}?Fujdoo+8(Hvy>^bDwV)*${Brd9&0wU7$08M~ zAurs-FQJOlqsV9p#23@8gEH)Jmiv<;HUtR@2aewTv)3E7x75HDt8JnF)`{7h%5svh zMF0v^#T_ZLPi(P;DN~89_=0C%Y0W?C+&;Kky7_~E`dxI=vrX?Ow`PVgVKoh1dJr!@tChawmQ z43xk5$jW_FVmbr+iLciZ+tpJ;69?^W2^Ms_E>vL`ZGS>Lm6NegghW0=D$T^Td%S@0 zbpOj|QzQ@W|IS%AtvS zRox2Pr4yx!j@NNi(MafqcVtFVjJkdy#62ACIdd{@c3DbKaa5CuXeN!Cts$BDqG0S^ zx&Ne8Zg5>wH z!3|?$dFMB#^9y6ikNviIbvI=5pY#CE)6wQ2$-l6Zew=2HTMvTDOI-7P_LGYTRX0Qf z6?0kQugV$S^FIW4mAeKVFq@Zhc_RRl-g2JZhwr64KdTHTGb_0=>ncq1M-hJ}golKs zlWFs3ZziKR4gMf&B&JZztCe!6eUmNuYpd#`hv-b_Ns{nm3{Ep97`krYd*7dv$>M?QaSVaMQD?*Eu{WD%|8sLOTEcQ{NWi&K2nfOpxOx#xpKh9Ws zhnU%cPqCAQ%Ed{jJ>xlHNPIBEk+ZKTco&qG`S(J1H^5HaZDRAsTk1f$ewJ~Bc-dU# zjz~^tnTwbZ@mLrjcltHF=kM993uUnGlhr|oT+IQgi!Pgk(rg`8zLLBK!iNOz2z_jdpJA=A= zULE}p^2X1x?7()OyO*7&>0KsdzQ~}PnIvfIFP8bZ4V|`1SGA1!JpL-sfe zo&V?m0?ROn&o*RjXtLXS_mFX>z4Y+L;jx>RypUYOAc81DAk`@Zxn(HGD=BdnrI79; zMZ-OK7UoAfri0qJ`b*KuQbSAExI!LQe8$XXz9#ceLPawTJ){~Y1Uf%$X~efLe5bE# zvv{I}2$@!;Ppd&Z{l@I;nJ#Wv0l<*P0^S+Qd&7+y+Jv($S?KEX1?4ql=5XR>(!%G; z?fjdM)u%p2tm?H=d6TK=B}RVOd4h!#5>OHOXddxWbQncJ*}BQSQpk|?Q3XFULoN*O+{=AxpLv}An5F^-G>5#rAQ#MUWdO%NsrDM59 zbEp6n&xR`@1CL}8CV>-K04Fp(B5T$yfPS`Gj!9*8pZ%0p-bf7q)lbFwHb#nz%HOyd z>nyMo7iZ7^l^nscQd!|N+@LlPzl*P<9cM%0Kn{^uLNtBjX(NG-uj3u}E=n8!9A5`D zF3rVT{h7*2RFzMLF8a^p=%>GHO(U4T5=$TOjgxUIMoPWhZ%6575o*O@t>)Sn1Drzt zqQ_|q=Ce7wD(LR!D&&>*1fd#5Z{B@e<`kn+ko+B9tNBF5g$yT}koZO$`MA06%gSf_ zs!fE5sCuSiNiZLzf(X%kuR1kW&yEOutr`K&wZ5YhV#}b&Y0Q}e_(Han%sgXC7o*8= zU)>LkV+LD}mz{HkFcumluQ5*f&NTg-m+PH>%5=%rmFlEZZuT*PnMc7AK~%N!UoWQy z@Z=VNk_1!Bpwk zr9_35-1?{hJ2-Jqq#)IG%-k&!MurdFi*fF{&lZ3Es5BG~Rvqo}%`)f?K%gzWjbAjv^%h5L8_` z<&Vfo^^RJ%>V>*#r|{kKEd}N3IJ+p!`l^UpA6_;KhZ_yyRLBy3c3;^gG zWm^kmtpotY>SI}kw6mpcvJ97C@4{gy>4GjsF1{u<{#G~3FPvk<&e(oYLbLO_pDbdu zIremif&+bNvREwJ@9C9io;5u-w%-gR`l5plC-$}LdTo4334Y24ZqOQ+)t%d?dbZu? zLwz9HC-qBma{>zZFOvu*#y?JEP*$Jq?ob{A#$Y!f&%KHHHJC293-K`-s$2eAVsAu1 zK#h{*I`}W@cKFsr;8#?f?tKo}ahA$-bBWUH@U7ZtT^|8uWc z5_4j(0c@#Cu>kg5pMx=3VRw*3fJ{me#mxrS?p8j-;Ha?U`sowWWAIHbr^zNs zd|~|NyBrdRdZ`WILN8B8bC{L*aoz%h`imTBgU5r0C>aU~f>{E&-R1|A#4KB~yml>( z`($KNmA4C2420{U))blY4Sm0@*Nqhw7rUwsTwC);B%f6^RcX{n-Y1H#e~?={wmB+Z zz>w<#|CKnqCJlr3YN}UGnsQhXA?m%QO@_Iy-N0~m9K4affk$E`rgcbuT6rXv&clHV zf4zm{zm9PiiQH&0Rwi1VhoPm*eZyff2AZXt749$0sNtitOLZc;BK`s?l65C|RHO-w zBW!1FiU3K1_pZ+Edw}F?=Y-QhQj9JQtF!u#hc>&?qrczN5%C+Oue#JpW(OjEEc?#% zV{cJPM$O+ll+8HQ;j^laOuzf_7WF)}*G%&xDoN9g_TTlC^h?vv_$KkI{I|PO^-`Ct z2^A?wW(2p#j+)VX3+$Bj$YM*@FcWdimNOSetg#x>kE7o+KZjn>dBUE5MaN#e>Qf~mFU)JyC){Q*+-q)gzMki z9#2w~bcqsn`^kRn#hzfidhx__}Q{j3~7#KP+y zdq)fKr<}4^`b2($jU=svC0|w`u7O{oB%koJOa7Q#;dC^; zm5M6fC$tUH$P0%GgA()X4u{+G?4j*o7B|6n%iQt0ykQu1FTb6d$@P3-ip9ogo5^aC zory&~t3tXA8O!Ty7hQ8WMbiNbs^0zQpBBn^0>mF{M8uA>Tg3wPf|H6`(gKAsjRT4b zw(tp2f=T!XjPUaOP9CfaR_js17kz%5#ZPxuqT$#Cq)SA(*~RpRCVjItyE6gpu17rQ&L*0*e9g1o*+wN*BQe!SZ|t28 zJavsm&OacBT<}&yL9&IAuC>EUW=$|`nzD5&0jjWi6ogE@R1IScn<49;(_cY)rTgOYs$fbz;`d8&v{Oyq2p?*Jr+xc!wQZqWeAs)`@ENU(jm#s9?`iEB1 z)nlB{1(%ViWX#KUrHQk7Tv$-_%eHLGw`*Twv}Ch`Jc|FA%?xHImQ_3ymcH; z7lcrmTY2MI{I1b{($p@F+Z*t&M z6aY0lI_Krg($@(wWPUmO>65K(N9fa|XxvDPePzqx zt+!RG7HIRrqoLzO3EI}sH_fO81dt4sPbb#@cD}z@ErXp;U*V0UqYQxzCm^vs7jL#A zS3aB^9U13&)1y`hyU2pdJhQc_Ve;JX*kdQ2$!8+qI)4aP+t3U^!sAfGU(3?<;&WW* zahojI9JwF&W9Q=YGAqvBcdT=Bx4mFv9TB(ghLiFpIMC-C_|dFt*kqHJscz)Sb9mP> zdVle^IHN14FdBw4fT!L%Yq2nT!~xcAH9u*lFq+mLmh-;O#z(O~fivJ)O>UczYFm>t zK$B!yO-Qg8xl**v%PwpwQKkQ zePRbPD;=O}-Iqs%`5f^BR<}QIwP6>Opk(31EYCM9+ zh=>eSt3>(I{vN}Db@?|&j)Halqf@>m0m=BH$?E|&XyHlu2?abhM}Ai!D%e}O%h1O$ zjru>Olzb(ZfF&G+HuH9REMVho!m9fvJ}7{^FZVub2JdS1W3nB`1O<^3X*@B4 z45sadBT3z427w!rDa0CLV61_r%l~6_mPul0bCW>nF-WM#0Q6WckdVI>hSD&AkcJid z5{65^q(G@^B#Mf$nq>mX(lKu)r2Y!RURGO=#heU)#f}gMQH%9sIv>X%d@PEvJm~}F z31embr)B6E2o!~#C;6WRIB|Ex|FbKz=~SdHS|3zLCf{+#z60*>*&crF{QN)nrwpV? zmP8Ce<3qGF#7m_{Ah7-iPhctVGzc(eXz*5`jvTBE2~FEmO0d^fH_CH*5_>_-6I2Xp zgg*qFw^Km1i0|BrP#tgrc1J0!tv^x|92#$g+J3}3FsNr>AsQFWh|4Jz7E4Eh@DW^1 z-tq4jYUw~=qvI4xKiwGEU9Zp|BFYlrD9uR_#H_@Cedtqc_Y4dSk4f!D*cd~PPXA{D zGB;e#pt)}5)FjaJko}*PEHGXVbrxqtUqBh z1L^`dy5b9Wl%>pQ&nqT!<5=>uaEsQCZ_8cok~+9%z2uk-Pt2r_qab4Vhp}WcfSF<| zKtPP4#SSDQX`TRz*v3uU1Rh+=5BQOBV3FivB_z~e$!`06`w?%xl#znUnvR5Dyk|)% z7~v6_v$V5f8C;y{9zF5kqPLDsx=aAg!p4c*uKv-1WRPTX#MEy93u1p6xmB8gV6Se& zAEX!+#N-GX2CzYr-rmoC;HkTtWS<9=7;ZGeHEuxZZ@?~+q4OHN9WhWRIG&r~4h7rI zKLi&+cWfaE!g}U7uoAD9+keYg`b%2P%lY}q;M;aSJ+2LS!ry6Mx}$)d3iCZ$0i61X zaZPlY5=dd_r>F1p@mGtN#lj)jh0)82Be2s5{5IiW)lkGwj?c>>Aj1}%tM;IPICjH$ z{lX=3tqlMnA4Kk}yurM8u|lCh=i?w`=jBQJRbPS|oz6Eb zb5ZU5!=Nt9$LkrvykmP&zra1mnL1lQSppo8K8!bYa6ldeqgHZ&fPk#Fzer(^E_(qJ zh>C{-^D7k;T=rFNtOdbAP}(21Wqb@3Ji!rwavB3BBM^R)AvXOg`1Jp|ZXYCy6ay0s zln!CFR(e2x9m)?-NqBjTeceP5#RZO=q7s8M-d}xN(*AxS15{;%_PLou)cN^YSwZ-p8JrLL@2V-=0LE%uh4|F}%zz@kOF9$l!HC49+c)7vtlj%i z-N8`B4=a57I1aPGmJOmFX6#K6s#CK7C5FeambO}6U*9L3#^Ix=C~=!@4}_cD5u?)o zA}JLX>MZK~WexCK&G~}66lej9;L`7G{t8SqaA@GjxQV&#tw7>5z31!<;g$erV|ENr zCgt>i*n>*=LEaPXe}+VIw*>v7$F=+RC9x#r`0_u;v$)uSH3#f$2HjEgN(>XoX1*P^ zQBakGW)QvYEXu_V1Y*CkUSBj`BO7RZ)p!;k=mB81+9!UXH2_A0(^Ra?Z3{V9u7GSl zE%&~r02V~>T)<1DivBMtmytDb(OO4fEp5z|u+>8j;OWOo?M(tskj=`X?{VaBa8?w5 zjtZys`C?qd^lG>(axz(?gDX8koIl!2G*r^(BkXourzjlI?>Gq0K3rIWSKDON|y!jiQ!&^~~JFsiIv=(bFP z?u9W4F`d`85LlXlCd+JlO9b-7(5`@-`#&X_9LbsgW2QGxY$pfXbDw0<-}ZAPj~^DQ z`i-*037i7D7~VUuR~qwZj}jnxn%T#shP1rk(i+tfe+~i}rbeO24-OI{h3hFUNL=;K zBeJ1OE|~08fw_)XFt6v#s-@>LNcNZX4zY;X8138wTU+|E6BT`d^a|f5AuQ& z`RbRr2GklTS=;yq%1Geljn5jZEgIy(g7qV;VP@MVz;p1s!6p*|EL+>|b2&J)Yaa3g zssDwnOv3s77jR5u6iQ3~Te8~14Di58Hi?{Xz%iDwY(x2PyQ|!UsYU~|FA_=azL`&} zU{mQ;w}OB)gFC^l;Egqy_Yc-aKjI;H>Hc{dp8;N+N42i!g@IAfI@RLTA!vvp0B(66 zU&ByiR=UB>=~SQh20Ym=Yu!;az}i=S-lmFxvsJgLXXs%MDC*zbS%0hodqoc=7;Odr z-&(A}0llE73vO&w;yckdv_Pj4Nl2I=sdEQgdRDGt&j#df!=F#sd&?Ga!8!)is;Yew z+4~oR!Mgzu7VcRfHo*E>(A|Fl)_|fFh5}v{2gpRDwZ_>&GG+eFdM^2c%XlOgk@>&Y zBjVfuE^$u=nIdR#6uNfmNGxOwz)MDpNt-qx59sS^d|vUF)5&1&Qcc004|IsYd3dxY zaQH2!oKs=IHT?E8+F#xU4k3TYdtql$@G{!?e^q@|KwUl4F7EE`u0@NxyA=20Rw(Z7 zQrwGMaVcKh-QA%$6ew1le{J6HT%5bv$upBlCX-BLWiQuwWxcnH@Z_rwC{hA%T}#0g zeOFbTb_MOPTMDGp`jS1UFqGlQ7vE;UzQDXDz8C%XG?J%h0KE0CLkIR5KeN8&9!%L}2iIx4k(G zjp4iBO6-51J1jvj|M`yMdX75e4U)3JZ zHSu4$%oXR#AmsBy)11!#_>FQZaDpr6GT!Hw-^IlV2C4v9Dm5cmN2f^t5-blHs*~LnC?o>Sher0T_K5HGOk6atc=raaYQqnS@69;SFgol- znF)$Y4v+YABo+y0K$Eto(bX`|yB59?&(Cv(D)0K{TsNV;&#cUPoT7`kW-6a#yDPZlvJ|E|zzz|90b+ zx|37^63uu~T+h#a{--{Z@Zm-ZsII)7(o?Gcbs3m{p6^|N35$g0eG-?JOso3O+Zla$ zTy?PoEF|Mj4eXGIA6_YJ`}sTr9DjVWAev`Zp9NievrDpz#5EMl@MH@MFLI zK^6%rd*q^1Z_e{LnN=7PEh3FyuoTvMWCkx%*bWl2ZX#_q3-$JBvTKmXOB^B5?@hblmX_w>I^T<;rMA`4WJ`Cr>RibNKqw8*w!vJpkm-IK6~)j}dv23RuT zDJ_ne2`+48#6&I!7!=m-9%ZL8Avg&xU&)BGSn1FbT;M%2J!)rh6I^6Hu8-1lffRa= zh&lITPKnv#z?(*K=OM~O7RVyjUkb#LGHp!pN|$j6l2isLG7cJ?))6vo0`Z$3)hkA(jUc{h`St;Y!djWk-s0Z@1I6))$m3I<<===RTd-q@#eoSl*(Io1 z7D)XrfDO9H`NG93PNt1JzNxvPa6zamRSw|syrNzr++7A?r+JxfFgml)OXs@C|40_(KF3qM7!+=5nZ ziLambr%aIX$k;TAefF`0giVT}sDl*w$emr#-_)l|wVMF)mw1Tov{%K)SS@nsfSOlA zJ5q9B-yRk06WX11EEX6EB;C(n@|eI*{0EW7?D}(HCq4lTRZmqKNHG@4@3>_EHt>fa z^@#=L0se3(xmE84Nd&Ms1T0LhYY9LQ5)V)7z7&vxyexCA4eZ~C!(K%(Vu=DNXgq&d z6G-X71Z1Xvd25a0&S4NN+O9ro{Dp!P*&nyWmfQss43wi!v!0E^8olkxpJBjOd-0Jg zdCNU3A#0WwLduhoTNU_QnbwwjV0niQ{YaO>D+t|+n^p;wS4tKa)`E zQc89ho_z!yGbo9&qzbKJ(t~{u((jDt0edGy)zLp*Q<8*P`+|!u#|-99J-GH z>rfqa@hVqqV(YRDR=(M@XoFVh*0{K-{OBrJSx`IOo)x!g4}k16lc2KxErT8VGTOM8 z<#W=*@Z{P51Pc%ak5#ivQ~(pQ?}vkaLx33ZQM)}u2Z&IGwgit%Kn$AEw>JEtQj$vl zCKh@6k5jA$%eU+`TM5rFf=gXq6m>F8nDD+Xx-Y=RF~@fzY>>oj+jGRg9}%_;?CvXt1=ygozQaxktkc{T6%Yb($>Lg{2u*9-wU@wZ|B);{ESqbI8keV;{p zb~^bRJeIV2{vmJgEt(?DI<%9oQH+ZF&M<33=HaG$^Sh-i4@IZaxb4_av(#19idv4T z#1Fls%AOu^z+u>ktZP#46%#zA+rcbKGODdX9sfq1`d>y@q{IP^j+VmsKYkLfpC z|FX=vu_#^gfgDw{MV3=;ukM>>PScxzhy#zOnGoC`Dn16+ZnT5U|>Fd8=D& z`Q3p_^%9tffchd$yi0>9mi#IhAa1i$xMYVz13KL;RG#TswnZ) z*L1#ckwVzoivmI}nx<)NDh`8aptRam443J!*m zu8H6TzHDU7H~J1Mhpn4W%Rjc{9=9Q5>IoIRZ*#`f%&UJZ6uX~*lxkaR)`^D?WMBpF zpPVtdCvi3x)(K?xI5E4W_T`c`l++1?^*AZIrTUg=2}+oHG6nDRoiW8Z&|Qd|@<#PI z*}J8tr9?Iq)Cqj+aT0V()qB_=l{EDf2;OfyV^T(TkbM~ads`PvYM?2Y=L@>^0u2iO$P^WKWVzFPU2{S`7du-$&ItH9BLjRNx zPS9}HhFI)5SEiYtG=bONd_FllO6tRKq!+mF2^8gJ0#9q{m1bN$tc4QLq|9m0w?&cf zPU75=L{X!(IfarvA4N2rTNgvZfX;ICRyL$#-M3mo{*~E!0{hR;49&5yaty+ppvup> z1p8R)L<-mPq1y<{M*P!bKba;>`E1-p2UFGAy6usrl+Sf8in8acM|H;l;46^wL428-Exqx}bQD z01IZrsWSK-4aHPr(o3buaN}QsX_-5!lw&{v90p3QhNcVZ0w;&H*^Eup@mNhvHT}|p z-$Z&X7;zu)Udc_9sXg0?qSN387o%-SX?{}&q2F5c|I_h^G$vXRf-61?-i$akEIUk} zT{uD^rkgX2FUo%8w97qu>x!G1V1}(yD}E!CW8OfFZDP}~M<4EupsQz%pKX4%cuH zb?55;laV+9E2bkWJ%n{$ zz2lEg1)D@Y=)yIUkOw=2jmCx6mj)4qLJQjOSp}(F%RwLvO_OaMAv5@QQiX@UK_@e>0FP8G~e3YpTZ6Bw|<^d0JjlV0u2UU zqB$Vf8HA2T7RztPrq|mNN;=llBDL1PffO&hOmfrX#a^Tr9`WZ;S7D%}mOTPp_D4J3=o*XP0kXA3*dP z%n4dR*96sS)_fBXVh)Ffj+v^}t3c%Pzz&&mOs5i=s37wRBdD0x0>GB{{TCSfkQ?p@ zj7n54-V5pH)tNGaoK-K?EGpQ>H^1PyGvdxq-$MO*s1q%9rT1s)T&*o}%ho39F>zJJ zv|(hqbUn`OfEz|K#Q7@aKY2d?sSsdH;1gpQ-Hp)Qa8To$+oYfS`qG&Dl7xih$!hJw!KwaP@%d)iV`ir_d$t`pJ+!otL z7e(A->dGBk6oZOCLm9676U)-192tD%a152nH<`7G*9B2|E9Bw0wF8 zh?P987h4Hlx>brBXYa485XPu-#M~D{1o1ayF8V zh^C4+XQnr=o`%eyXFR|DzMl=s=n?vI0M^-H%w3!Nv5wbB_XDK<ZlcSBWnbop@ZV?y2m{CYax1C`x1D^%8j9eFk?Kw!m7=H)t%XL{o4EH zt{rHMq=>p1AA=1yIK79+NMZsV#OCsOsfRHm@H|Zm$xl~J5s_;44RO=^I2+&Nid&Nm zPaGE3K4uUB%Jk^R#w4P4V7-14%SSsB0=Vq-xQ_g%ZFTLQwIM&7hN%i5eW4b9cp%nvda zH{BK8jBDe@(IT zYWL>n6vA|*@?I&MLF5$rE$3!^8c}W5uamm?v>$wzh;A7_Zmu*j07`+}m{1xSiQtgo zw)8z*_t;g4pMZ<7(>|ff;TijOHp&?-XVu)kZNftU((qjIRp^Z=y?4x0|<7-FYIQ6wHeztxA_hS!KhmKK(K1;HE zxZJ+Qu{+Fnq&JE5zmk$a^+g}M%3$E^x%8?YMA2#`kGQGY;Dq50?9llnNhhXIgP`?7 zI!kLb_F#JwnZ;^){}$hi4iDh;4E@nD@I$Lyrl3kQ?10|LYfyN?V<7Y3v-_*-Vw(7E z+u-tC{3wiyxTgX!%e{~=!3C=9Yw1)0VY~|zsXU2L`^i>_Jh$!nj;u$$l(V0pMU zF4r6@8f-FP9=|Gb#Z~54FH4NZ(#;=Mmix(ij>dcxMg%c=YoPq=figVcY3l*u5S=_c zz(AOILVe;*c$EfNF z8jA3MrBmDei=RlmQ0?Xy_|xV>0D5I}qpDX0Ku`Lbn8Q;8DYu<=#vL;N8}f4^tzaKe zNc6oH#vnCixFZZ&q&X!idH66S*?DqKS`<+)bf+>Y_a9=Xh;}fFw)QvZJ+y~y#^9ac zf&}rsa4qWIAP35DILAP?9DDx2 z+PnrptzWC$JQSLPJo2it=>!twt6C(e?jZ2+>0V`@Okn+(`0t#Rt$rXyW`Fe;JP6|K z_dT``Ncdqfk31S~O*%2!XknaXPi@U|7oFl{zN(5^rN+ECHTX%&({Ap~!V79G9eeox zROkFr?-UChL6Az|g^Um@I5fPv>eH@tSB;0Ul`jAO8+#!M4&JJTRv?yYfb@|eN28OlW@d2Jo;_0;{nv@rE31fDm9O7^|Gu7Ay^n0||9ZGf3r}`{F@*T+ zg@J~xzk6?(u$V;G@2lUT&X9b^j%H~ydrpaPqskCUkRVsxY}e4l^Zbg4Zxq}-okkIu z(FpkUzYx-IMw_VFe9tRcewpiu%B~eLi#3D(&y&(utiZ07;Iz|B)}ar?-c`aeZOkCC zcNAuQcty0a1 z{=qL|KTi`kOWl9OyQ|(O$$3rAU$G!;Iisv{vVl@qIE?#76WXJDvoK#R5XC)lLqAei zD@NNWqi?LP^{og$Q^x+-fjqS-Rp(3eO7VSPVI)0^H36=#&Z+RE4~weTv3as_s4PUaJulI9j@nx?_7(|%($4W zg}fn)7v8q`PY3gpsrsrkZnkjh`pRL8=K`#OBDJ(h;s%B97V*RL?ONqVt7XYHRWg$- z36jJoa>t&p>$~l9eXVsifJ1%EE&H4A~neVeDTn0H)#;++Dg+41DR_%--FLp*VFyHYT`7}x(vKSlI?RB zf`qT&W_e2hoy-z|3^O>Mfn7yW+tZ!?RiC2(k{b_?BU7Wg#v>HnahM|qg;mQqIFQYG z{Ieah-G>hrYQePg129SZ3Wp}}Z9~ZhIjSX0lDOR~`x)qx7)iA~X01yUcAN-=3aKdD zO;2?0`#D1>Ilv#k&P~Cj&-$C(IP>gmHSO7yQT=vCmMgU14VbU~0}hT=HugFqe$wht zm~}Z)9H{aC$j*@P>qDu5l$}(T;^!%G8TB>6q_K z!NLA$HfZohh-S`pCF3sF+&ygY#*b$1b~%GZ*xo^4;l{Y*I1wJH#J2Y4b|-=$lCy-B zJ;UPol)&j0Z0*>n(oHk_#Y%m!P!yuX_obZ`=sy*v!$LF{kU$ zu2aCK%dt69NySf2d*(m;il$z?02>NE|MfW?!Q5%O!cU(V)HbB%0=AAEfNeWV=OiY1 z@CJrvjwxJWI;60}TEPKO(<$%t4jXGWeY4*z)7;Bxg>5{1@WuiFC7nFBsLlZ(6ZVOE ztl>>hw^Fu_6hIQhozoM(R=IWSri%`9@Ubpa_&8s#bf}dAs7#`xf99sFGwCQ6>=RdP zEC?R@0fR1ZfMPu#JzrReV~8}Wg#vSOK0j0QNKq@o?1Mpg zu{ex^bEUGW7Zjj%++VpBa6`@#X;5c~PydrS3eapB77uvtOn5)z2XCwZ#bDbct)h20 zONKrGHqW7H80|IDIaEza9JaxS!1PzDTEAK==x zgnw4Xa9hIYYVpA!t5_UDiszt&Z6g#=b%-b5(Fm1b&L9J*Pp88SG2jO0gP{803)M#|Aq)-pK#UKBue(!M+Of6Av3r8wtGYA^tln-C_=T^>VGkEWD{LAIO z_5^d-fG{HV3uobUMbkD4pp+g<&Ha8Jg1MCUjBIY93^~&_c2M!I)mq{BoF#(q#UEg! z#N@FVfNE9rSQ}&vC|?dJpBf~4B}8_OJd;&@mDA&5kSczlCXoavO%JM>%l-_-IcJIb zd-dzb1m$PbUwh3m|I7qEUCvKzIke8x40-Xk@Kr2yf+3OJkLr`B+-KrkV6(h zdyn=pJdWFg#4;^G=&;{xTz#75=p18wP)P@@ipc2Q7KVkvM;Z}72gxq zP9&M2Ek_GJrkqc@vTe7#49MCJn4Y90bN9COdB%@8X*{RhK8&-o{zBOF`O5NPi7e?j zD%&buCT9^>ih;nUL9nBnshQzVGuLXvh}s~zBY(DBqFYGfL0F|m&pG8xndL+6eVUSu z&;oRf@KeguK{&AGl-sd9da*`#@`BiUthBs_H;-smKF-(p`i56ivXZ_M{bEi~Ch+@n zeWSz)|r2VC_hup(J$!Ib3 z!MJzPVVDxaZGgb5N>Tg<9i0BazhVXItAt2M8DXW%4@wC3^%DbQzN?4;gE67X)$b8P z6l9^c<3WrOln@kqtsOTcClLWi_LyO+ooFv=YJ5)POf$Le*%^B1kHCpWe2hE+K}POh z*4X-$H7gCx4#H5D%EXCY7za^cL#90z!*{V@I@Ed1um`caa5~hRWP@eAB?8!)@tJof zk+qJya#DL^L?$e;vbv+~C#M*=(BZxoFnlY;_g56h9L}9*S@XmWK_}AlGRLb4`rv{{ z)Ly-(fi`G2eW=U(M-BWp$2z}i`kW}Gu}>KHonRpVp1NF3VK06sq@Ni_8HdxH3#AyZ zko~3A*VtD_osMa2bsE6U3orMxo&V067b6nJqz$(xYRXEkHdK;p!oZX?E}NF;LvYa6 zsgWlXQ{yJA*S_=@e9y49kpMQN$t{G7UhLZ?KEPBJ>go5$Lj}+8yL6egOVrx&VV~c@ zv7$5mIIvAJB%{EnCA8Hv*z6pVhZ@TK(>%}W5n109gqFTT9c0S9ucaVhNWrrxRHNJy zl?L~%kuF+28Mm_rg8zY&>z7t!iQMU1g5PRoE@wq-hyKqGKZoxV>4=02ABofs+7XB_ z)x8WzvacCFOw!tYL!9!&#{0GFYEJLEyYN`^Vx}~(HEVZP!aP6c{%57@PC%{KNTJSe zaBHV8r!yF7v7)zZHW%d?qj-{5QK9rj&=|8peIL`|HjWD<(Z*GVr!DU3k~a4 zT2DxAUE$5=FZ5Bj;2nq?NGnzB+N_E63dv3xgTfP@VSZR=R6Z!a#rg@}zV(_%-C;wi z1d$TinWgT(JN*tmeswfEM*Kc>4vvD79u9%pMzymYkTFVGaz$dutKIoltzCJeNksHP z$OhZm0|6E`236U0q7U@hiH|JYX==uA#p6?9=Un9bYy2q%>4XM8QeQQ#@|8O#rVA7K zW4pgi){uWg%GTa)m>nm-zu@VTm;BK#ee)dr)|i0Gsv+d*EQD&Kvzc!9P}I0B4tw6G z)!v-rRQmR(x_|?MqGqaOg;mxeh2>_(x>3&5yBLBaEk+o(d|oY9%E)pV_yifh%ivo$ z6w0O==Hb6yafon-R^2h!UGhN47Q;_xZ~|105A(yv>OPC|8{YBC4Wm+3J zt^by-_{YX~0Qg>hvdx@?-a}@4S?9KFTpj?QF{F`xWP<4Xs3!ft&pE}%DsI5 zBH4ck({?eYb(|=} z-OJIQ`q_TrChPEE$Zu)#>fe6>|DSUe^z%#4CLqOwSK!5u7m(6U%Zi;R9-^xfCVXiJbqfb<^9=TZ}qx))RU8AG82l0C&y6PUq1vOIumm@CY2#@i5y6C zeSXLQg#QI$JCh_p#3>W%SA`@;n+tls?tO8^XxaAg;kvaJd?&OnT-8BDJGXNjCcM6* zz^08$5g3TTA)fxFVNsnNr1ej@uHs)Qq;*c0KJQ=hW{kyPzDqh-X=U)WCRdN-;NV_+ z%fmr|(H`xZ?~L00g+xd@<$9Dap2@)p^kpP&$rM^luP>>!gOJvDbY=)f#UFlKV2rsT zHWjC-^P!g}XaBp4r`n%_-d7k32KI&?!>t;`>hw!zUVo=N>h~S20b?1YX#9r_qEHqh zbm6gYPhn!XD6usr^Mu+y$GvP<^lbOo2nIabMN#l>SO&^^7pt=3cEI1%=zRNi(4P^j zAxLn$ZG=5o-||mS4mUN~q@G5c72Bnh_hZU!y7(iTf8oXO`YbE>kyd6Dl5(k$Il7!A zLDgncCko;?(cD{@T-k_YM63?^s(*p%Ny97t+hFH z`T`aus5&Su!cA>)DZecgAqI6zk*k{)v`@h*aNEQ>3HO{oe`1? zb!%d`@etR@N1!@lhnD3w6v6?pOvlUepZw&AC3Xd5lo1cZ5hf0gMl}7fDr4WmX(*@72Gry`qA+$L zIq?GrVO0k@u!}0wYg58F7K2{iZSlj+Ss+Xjb5JI4BKktD+E`oA6bV|F^@j8ox{nv> zyG|et7mmR?L0=#dK%eL2rd{DHeQtLzyP_IxH^g5!$D$l_Z!Vc6ga=%a zYP!qc!2gn*+)xA)p}|mPL&1%@A2FgHLeb{tS%v=_8ZFr<0;ketE3LlF=oP$CAYDpZ z83(;#w-z}!wh(_P7OOE6I_r3!L;NmG3|B#ht2a^_f2{>f+f#Rq-{+RYU@nen4|1!@ z@PPOftWFA5ck5vipqXl<_6TSH3fIpKTYfoP)Vm~IvE7?P-2dW3AQ6Fki4C`9dioJ# z7s}_>U-z{J)w6B2uZUN4@&=9~M zeH!!qOAj@HlJ%^$wY^nwLB7Mj?%BDENM2Fue=(o4LtQQVwd^5_IizKKi@!1JASkcY zfe`b5e(~?S5pNC}X&xM;E~x;$1zR-G$wpu};p-aqbG$=Zz+}1eex0cr2Sp`QV^$YT zUq}}Q7u|ztX*gmK+e=2F)~1Aps65qx`jbiK=hwKA zkjivNY?zCSQ(M3r^&`w*!|C>ONmZvM?Y?4+bys^?g8N^u69LHDDGk zlVRV2Zf7;0fC~0?`YkIcaz+~cP!rjo@Qv@&gz<{6C>J2TimAbBnk^ZPbh`q<8?_V| zM(iX_M&faRE}*68p*}O1u^UADXA;Z1>2q5Tbm(iFNI~kc|0`ITKJ`rk;{dpnpWD%I zsV!4_h>O%}yA$>EYEiN`Bk8z`Da#aN!G~=c% zT~=8mb8dC=ab`Ox66QUaoR@j}*selM9A1Bn-PM~zvFfy`vxV5oyt^DLuEIIKUvvpr zBHyY+_^mgGPD1VbaU{-RVqN6=yjKUIlPf#mAoQ|LG=odHlE}%kLVgJrMscYt^K&DU zN+Ih*r&_4?Xf&P9!Dl~Ps8Y3T<)KPg(lZ;xH{DAURq zv;N`^n)C{9#4n`0Z!d?BE0Ie1Tt63C6=(h6Bh)@Exo=aTYBNj+jt~ zM&NBQ6ZVnpNkp|a-W$)Jnfn}Gh~`lxv(|e8%uYe7&szDS&ZtfmACZ1*I4*hruv92T z>yyVPuR`$AW7bc3!>lU()pjU8z{}?YCqKGPS=U@1OlmVf&XwzwsLEm!l&v0dcCTnr zrP4o#U}W%_PJBu2YSU`*zzkM+1=m5(3uDy^)vRVfQ|IH4?Lymmez^udl_{)$Lck+wm$<1oX8*=2d zGRv%02tz{ea{a_0Q<^rtR{4Yz^ut)gWs1_j)!>sWM%&^~(O7;e&1v@0%+Dvfr_uGF z^0C2p9u1{)|1#QHYImP*qx!b!_wfqw^Gh(KF$QmY{~8EKy{@pOPlL9AuR>T<^wiV< zZj?CAX1^_p!v7G zCH6(Ea+$7^0lzX;^_tf1Z3QeXNE_MV_;j4eguYqo2*21MjnepNa|IjeAo@Z>6&U^I z+IVoQ)9(TcY5wfxTYPi#rvH3;m8x8+hi|sQq46So@r9aQHBXHkone9Lqa5LP_k17g z6X(MC{Rz@`f95 zhsaHxqu&Qo7vjG6=W1vT;|xakQZ6n*N_8J=rn;IA%v{uOy@MhBY_1W7}0dBybmJF0QrhoQKc#{^&PF^FW?@_|(hJ zKhXz|QK3M-R?U)JM)T{l3)eq?B2vMG-tzgfav40rbN{saT-ieNnV!!T&xrn`x1V$=iYa6MMf0;zu z_p9F-*{arkg~?MV$~R)g$Z?;9GP%on8SFh8t~TeUVSY61ppQ|qR`>(xI9(Du!@rb3 z-k#G%dtwcUFOA;_*DFkpkfcXIxI$0#)9NLig`Lxr0Kk_p&Y`HcoIe{T&7nMQZ5#-I zX4(_FkoI|;ZK_Icp~dBCW{41P6Uqi&^--+2wV(t_md`i+CV$gZU|OA97Ik#YOetVt zc&_?GpsU=N?6KPJtGC3=; z=2wVU^X092DD&c%RazK+)}*e#TZyv2fkc^sk!73aRqkj0RpT~~64MqrQc~U#QlF7~ z!tWQzLPwk#NT|==u$FTI@lV%h3uYc*l1S73`+W~4M(p|l6mV7sj?S%mSoka=iSS2{ z3nZ8JGGVasW)K9ZF-q1Q=&i8#kK@tSBejivoJk~UNr3y1#vk8b!9tU7AC@v#$%T>#)#a8JUe z>4RQA>B)9}@k-i((BID+{EtIhv*$J*%xJar}I`C%+j?D?*ox=_eA_H=JXxA z#t(DNfLIA@+JC6mq!1ThNCX22@_)D#WTzsL=7Hj=ua|A4(j$)GnRX)oMsCCnqA=@a zdNr~78JQtLfnB-rT+`ZnXwB3gl`08}L0$8;A9C+Nft^XqQu_uQ5E@jm!`&USN(_3z z>zP=!aZ1UBA=WO0<}9?IChS1?nD;E$_Smum;W@*4`v%ktKX%MYz&ZByknE9BmB}~^ zCrdhqg7k3P!`2!{Rw}CZgn-iU`AC<$CHDlRfen+OSQxBIKbSrHcg-JJ%s}g-Lp8AA zeXO{q0<1!XIlb3=q!MilSWA{B@2|-2^FLR39qJthSWgPAI0|3^bJEinA6*5sbW>2R zlf_I85CH2**79WAA^`@`z);%wqnnF{yIl@nAs4<*WttFDK_yWCk4`)c)=?vbzj?Kj ztPgS-p*IorXBto&yIV4=1F;)*N}r4X8r;Q=V^Q!RKRKrd4t|7A*F%^RYq3LB>qdOv4WaU39Oh-hJO&g`IgFnNzMiuWisZS9U1v|^0`az8 zXb;7g6Nqxe5cN&EDenHd=XCYA zTjCBVpt3Dxd<8nnmW}AoFOc|%CH}(h7FRa;4qb6(_uE^jITVpv{y@%XSKMCWWR?SYLqsFSg` ztfchRRt=7AV5=v6u4!Ikv#Y*x@&wu-#(QU5CJZrN0^DB8&T{1m>VN(a;WAN5)dy=; z53VR?r>XcU6A2gO8!Si9#k&e(sS3+cLDBLmdZ4ytXwQAfg9AE_7LGvp#1&;f{QZeo z>`>n$CddS$zLTcRAUDS^xc0?OsQcWji8rY6mq7&N570{wUG0FUb=FUFI1Tx{`$GdV zy$axo#*7H6z02f)1@sh;s2|Uy27`{bewA7BL|z}iOyl4VUv_u7tACt;bRVxePuu~= zViUx1LrGD zg~jv(DoB_#bP61BqFE8Fe(vP`HJJW~G>8if3N6AT`)>z^g^}=IA8dBsCaR<`4IFK6 z;rQ8cWLxCK@@2Wa<9ERIv3vgBZNACC5^W~#ges@LCE)P1x8`Z~HtGS|Yw_ME>w6L4 zlXPn!^QGE^zE)8vyK5>ageBRj&vdEp9gjvuveY&pP!~NQCer0igq3a-!XJZ&PyxG8 zDz3Konn0t_5KdF|H?vt%1M(EP^GDlq)@2WoVaT@}Ls^HW*3ynpiM3Klv7mDgE5K?S_901&kXt zOjvGo9-&B}Wre|&pubEQD&TBoTR1=^A?&zza;R`#N~t{_HxsQNYPFv}+-%|Q9DB=` zc;>ASLJI@qa}-{lVwh}c&L6TqXu6<)MQGY)sF#nAr2FGMc_X2Ph03oV+erT&1X?FO z5>uI_gj5i@=yWJaMj$#aKweM&3j@}(3+z>efb?5F zJ}^iQLbE;Lq>#OjNikjNE-6T;+vRZlR}1F~VX(E>ACA#x_fu|LxdcBDCiaK1#zq(_*=BA;Y{ z7=95LUf-lvRX9c;yWsQ>Bw>LN!UXmrRC0#C%{5eC752SRJf%+&3q!%zm9#iRebdSAxP{U^CbcqrldHU?Ucbdm<{&BAAYXpUKmqw*1-;j zMnwD=vaIxn)mkOsSus2g;4igWqCs~+LUc)gfi8N?{gyhGF*Jc9x*89SHADoij->N$ zIt&?u?tbX&+D)4P7>?7UM(1JU`Y{f5<%#1MfIUXX`S=S6!gBkjk4}gblfgE#ab+3y zuz51pa~VqFV3iu-XQLVctQ!bQjFhZy^(pGqDzNd%fqU(f?AfCPRKLS-7=x6Er3M@o z5p7*gJ|Icq*yj>vd!_2<&wCW8H-~JUIwDp@D+%JZ2b=nKAxjFn+$l`7n@1y`c)pd7 zrC?Y;A_Q%Wt~ehn%ZY!#IMvc*Txt5F6l}iKmFg=IC?r?>L8T0Rr2nk)V-WF3Z?~ndUwI*UIz3Zg+JggoihVA1*d2`V2^F46*iNJ-+@GX<|`-7-6$w zyHuasdfYm@np*ivwnEGI=}U~KUMhh33|DQcw=!_O*H04yj6mgm_h#$QN z_6aC3n;~~E?tU$a(R@Me@4Bd(L&<1?M0?xSZiHt4D(%6w-l^zdw%fWx6Zk_G*KAiw z#OL2EOLCTf*Y|HJ>7TjI14P$fYFeZ!Qp-L)?yKa)UF^3NOy;H2na|C0!o8`D4o(EjZ#v=p+OLlj;)}8(v7kKk(QE1Y7^4k z&3@OKyubV9-hbep56@n6KI0j4j4@+x*IEarXq;={zw7@pz1}<<-fb5%8hf-={~!57 zg_h#6C#6*D>^2FdbfW2W33s|InoUbB9+pK@&{5ub-W)~2YvH0_dSq(qN%i;N=5)Hz zqNMK<@~FM<=)5U&>m;L-4V55~P>w_nAVn9n`1BL+bal}+2CA5v-+98&yJpG|8Tw!3 z&&r{sh5ocs8S048?Ac$)fm3uzqtLs;Zpqo;G0~TJd$)FfTg++~CFSobJ@Q#We^{te z$;JHYTFzWjyHmoxhOQDQVWw4C_=5J^iE(A2>9=Tbw*GH-5_`Xj{tq@@3d;SbpZ?F_ zr0bMFF)7nFKgCHuk6&TL#H<#al9T;uG5Fvf{+JBwb2gH~{X7H-o`MC%rPXJaB$}~N zf4kKgIvM&BBIEZYwZ00E3L-;kFNw$j2Wb z#=A2CHEKv3AMghd@$N{@%pFydHs)xZPpj|D8{T_gh#!8w5M;%i_B(27FUm7P%2793;*Pc7ow0N*ZmX+VJvb}t3;aHtnx40cm=a*sQLT{9I@!HH zB-3J++KVi0l)CtYO4iG6Z7!=q*ITMfWtl4f7w>Saw?B7E7rEynJ9&-O?Szq7?2oc> z5OxcJd(um3O1J+q7wF?^Z}+;#DosAIm1t*mrZ&i|uo!ZRqSMe_x;8h$TJZ9k8*9fZ zz3ilN`F(6+v8cjcjFz_?aQ9lmu*92M!I77}?U!vbBd>dRq9=X=`~$GVpmztk6ZbOd zrPQ3LCyZ^9T@s9L>FV1VNdDtu&16*co<464?<>VHF&TZ3WH2x@=?}# zWw9qF#rAIlIn}0ky)JfI3)?4_hn<|zQo{X6odD3a!E%HEJ!Kd{_+CE7lCY+@n8DdiznSxq0w#5Nw( zA^9)D>Dc<-!*zz2Eu!ZvY0QTj5*Bm;xKjn(o=?=UvM=p}Qe?;pL&~$I@4npeVdZSh zi@VRg=P`UdI{2+h-qhS5TjinYXpEAfil3f^rzkmDT+6qV)^!WETy-P|Nt}B{sv}z- zGYO%fL#jnYEHQ&?kaX~YP_UowIx!Li0LoS8>AQgFj%D0 zTj_d-`cUsPB8&SAGtKID3%lkSv@(`A#Q0Y^I--iWK z-49Lw6o^j({PoaOU!pq7q3VKrf^{+wYTcpW5^HF`-4L$znq~wQQ30K-4!QGsM0H+BL z9~RQWZ!Y<9Z0`*Oi+Lonn^VQ=3*)ph%T{AWcC6UQ55p_R#{zGB7Nu7Sxi@h%PX8_P zub$;XQo5W-n!kwdCQ?G1tfr*xH-UKgi&!D8dCR`^5Py-MNR@HD>)q)e{6)fi21``b z=Y4Wy3=GJMzUh7G=_cJ9`&;1GHQw7F{k79z;HLHTO+u`K)yAZ6RL0L33C;#}Dy4Y4 z5n?@NrOl~(`{p)Qh2Kq7qw~<&NkUa6Y~~Jcf6;OnCFhn#?w>s_%2g1)PH|8>8%x-w zLAZLor#rIDcJRNv(H5S8XuC@d{mKpNokM{hX)W~reM8HCiofp|8bR1!ncMO9gQXo` zJRNuY04DdHhG{S;h9$ zklyCEu@WI!5LVz!DIz!+C?aL2#+zhU0=2Cf5aefBrw4zc>jZ|>BqZgcRvvREyY=?B z3QnSeXfm1XIg|4p?i7nemdY>=`-?q8K0BM{oILkykRJO^gX($p*eFa9@l@uFnOLOD zEoy8jwLPr(%x`Zj?E7O9-(nxf=JPKR{z1@Z90qxrz`Z!9;|5KVGZx68B9zO*%#m@z zwU}68-Dk0k!1k6_OGArP^{mwGsIla94%iTOoy1l*{cxijzB0F6^Me3Xl`VEoK<0NJefkwtA6{L}604dR;Zh z;I1QL7^86=Zp6*`0zAWUP`DjEcLo~RI55E;QWdPU^YoWtQ_k^2fVY1cYPDn^n}Y@k zKrI-(Y0Qgew9cskiklbNHD@2=0$K$iH$Zz}Dglh}&5O8fw9fB<20cJ2fS3STU_=I& z>V7EY3WzM#-R25N1sDo25#U>ZnUGOAm#GR|l*WfJmaxFNqdtcQ5(b?%h4!H&Om6Cls=+Cjf5%32y6#;6L6$QqV0S+<1c-SCuCXl$_T|nFh#8qvX!eE7;I3P#> z5y09it+&VPN+#x~G_LLF22cLaT#IOU)pR-WREtA1CT{nvtQB5rx6`BedZD5bLWc`e z^qf6>aJb!o*QPPpmrCF~SpnS?=0zR0TJ&Hy6@b$Q92gaYt%m z^;OjzAR{Bn)={9t1H{@D0#iD0O$U`plCo6{3?v4Qemp=M0on*$Pe7i0DO+m*?RE9d z0BA`-*MaLg$P+f@|NDyr`mQ(wrqK6>f)Zt`8c=)zUmyPglmpldkQG{AKO^blz>*XI zD>eWhUdqRAU@3Egy@67y%YPCeX11 zT{74kW?+*BPyj*%5Tk(51A#OK0o~Pj>VU2RfuO)94ZsFE6F?kY5$$kl2oiS@8|2 znm(?6#3bq^8GDyI@l(znt5@j;V;ZX~2G4dWeGr~jQ1}v#vDGXEnMUI(&p=#0!H{*R zv9WhEe;l%=O8Vbx2{XaWv@8=wLaeIwM5NCp?*mPf4|##>5gBnCgZpFhKhi#0Ob6 zf}58giSF^_9D5W-a-dz0^`IzL( zRMrpM%Z(+bd@4bHIr)i?Ndcbod8MyDiYCq~D_H-&V@4l7HKwZHoZ(9EiA*dFJKGdr z=g|E%u(g53Yfd2JB~DoP73xOZhwQpl$3*{`i`9@;r%0_+-Zb|g8{J5PY#W_x%1M(h zJ?g3wOZQ7AoC-s}1Wq|Su-~~@^UMZa8-*bvep81X+XDTvrN5c*TOReh+RT*qifw&g z(1^addff#v+a5)SHWVt^(IHb$CXj7mFpOPpR+ubXh&ZW@kgTFFyGG^qenpygM3#!g zOLR&}zQyG65ebP~`HHlm#1wDbNXQ@t*^VoZ@bd`*i2VF(_^sx?9`+mo6TP3$l+dLU@~N6V0XoYV z<@{X(ZD@en{7#5#WPoD)-b)I7WPOjNhdxZdYj8jx)3K(F(xU!n;;%1uS0+aL*OE0+ z0Z^acY3_Z{g#uj|pSK!yjf)=mW4~`e53ET>>|Z3CqMD%I{Zqo*{^&2GUR*0@0`(2e z%BaAV0|t%LOSO_MoPi^=*Zu(jm4FcMT?3kSm2T{F$q$a9W2Ya`n)#sAd}(#>Nfx`u z$w(&3+sVMJerUJb8S#Nq6Rp5!eOjzZB4S5A>{|37J^OO>&xb#i+9O9k8!VE6?wvbI z$S-k}<%181HRazA2g#oXit+RP{Y4eN!C%|q)xjrc){lM5@(1>$a$495qbuuI%)tjU zici^deSg0Fj012bWfMc}{kOYQ*PYoEaO<$cL{+{KbVE1G#=Didgm^E^fy|JFrf1f1c=HQlGYM&EAif?~rAl_>gLDzLM8RHdg#Y3Wk zM|dI^w2vCa)Va*pji>n{x6;yFH@taNFCA6Quc~4?;mt-%z;+gG?VLP#U(Ozp`b zw5}CqZfkJ-QK+6nH$H%Mq&=;{X0UwKx_Q5h^sw`OY+_~Hpj+Vw|FC+YYJPpPqFqj2 zvUpdW!?l8D8ifCk^EFM~wfSKy=(qW}l z-*p}I4@^QcQyr?p%KKOnzYLt0s=C`@{ z^{e?sh3$gh;m2HCCDxTZ9r^1Ai82%#Y?u%E5^q_Brj{)uu#fzf$o*4tGCfNZL09MqW4^sGvdM{HD9)vG<**JdFmvNzPVU*2D3)M>UsOt0_t;L_}< zdT?s78%og|`AUzhS3D?-C42ko*xMt+>N6`suf0?8{w=66cUJ~~EkTYU?|wJY3x+%i zfRZrU>UR<`No)31zGuR}zX&yMGT0gbgy>bN2kqtoPu9do0rr^(=-cZ>x8&Mirg?L{ z^Cus$Zp3alKWP<9|DLe-G9ar@-%^NPc_P$m#OG{YfMsN&0U_#XobLL z)PCOT+$?hLiMQcLjx-iRpCFZv@+zeZZaxkAgGYE;T_Vj@v40SWp|)*RRwG&l6Xx&fKPGZBeqD2we!S&69UBH|VcV%5~h z2-^iQ1AISGqH%0sC1{4g>=-yBNO?Hr_jDD*;nv6bPX?mt> zRz&2Vo+;qxuqG1}a=s%ko?569a^ZG?{n441i00Yrp3ecNTs5|LO6PwNRUW+5!PKhQ zy2E9GGH0An6;7HTi|)3h3ov^~a;5>@U_t3VX=&(!ZjyLWke6+VLbqPjZz!z$LMGEi zUn1(qAm)Zq)Yws4JO9JBhCV4zZlS}A#j>tNW1(X;9!+N%^&PH6ElgO3Y`ME_;pc-^KWY5&SF0lCMx8h3v-j4TGf1w|zA^JcQ&+N{A?b>j$CM9yx(Q!#l;`@Q)p^B}c zdSNz)q#0A@{gpP~2BxCG(=G{ww76w+l^vTw>I32@M;^v;BF!AVD`*oV{|r6HKpJJT zBb^De>o$Z&xZ24MD;5Q3EcLclvsJ#xA(tTO5eE(eLWWhQxssR`o?i|VZm)_YMhKA^ z(Y{lk*FFum7TvQCwexUuN!eGb{86jZ>)zW-W!KwUzj9~EyQO{s;08cB=U-1V3lk#0CMdLJvLMFCJXT zJWKTG)ZP=&^PQIT{rB5MW?=s`p!{Wn$tMM)RUORo$X#G#EF064yGq+M+eCU|Z($o6Q*W;fNA^x!c1d*l@aq5c}U{{iUN1pQs|3b;n5 z`@r5G^qYbHK6wRhs2|v0hx=P);eNpmc?B9HQ+!}A2l}6Y{%&~%qiQ6zGaUIy1w0BX zV3o-zHpX@>KET0II{_B>w0x{xY1Kh5Um^> zJon2NTCsrXS76#5cFWk*(K$Pt%*fQy92Qhp!Xq2~g{xAeuKmiUE7}Q!Q4Pk)2C`mx z1*&S~*fgwO2gUaUGRf5Z<=;tE2|&;b1XLimzw!!V)yNbJcmz){6LnyODQE;J2T;z| zEFcg7;nhS&F*^E`fvF#ZrXCsxt_Xq8?f?&tbJ&1RSOK z5GRFI>O z7FeA&z?UJc6daUqWv)i%0|ynLdi@|PYBGxd{_f7{gNQRgR-owJqFRC>d;%IEdQRZ_ zs_2~@JYmora|5+Dkb!{2r{r7jRwKom;h;0@;Y=67_!W<}@u37NzzUH7GGidiii|pd z3JUEoC_XR)#$cxT?`a7J^9k^m!=5- zEr^UNbM$dbhYM5-9Vy19lVCAZrsj{m;S<;dYA-Mubs*6P96X{{UD2(;hbi!Z0AiGU ztD>XN&KtO)50+~Zh!|U4JI1mrIvfPv3}hs*Y$rc5>h0fMi&R+P4YrdMSZY~!wFI;H z1hT-;nqcTWFtj@vMSAH%t1$3k0DORn^`4e*#i~YnH^Jc}!CKS>GnD*T+Y#DS0w8NW z5I_MCi$I>r7FyTfhQ${U0GQrFA+0hABU2=p|{o=s`6MiJ@xV`+Q>BOpKl;3*l1dC4dypzKCL zgARBCr|ogCd}}pS*m~IQG05>8WYb(V(zGE8-l=}?5mhBz@-X2T(PY0!)#&9CT#X5hpqRv&aH1MX^s3>KgD zaj0M2WzkeaBV1Y3+CwD|W7f6mpXTM(?63 zrSp$+o*iKLNnE!gKe6&)raj0*TYoF(Pu)!(4Jm)*S8*U`=68Nb?jLa;!-9ey&QnL~ z=&QXRjmLABuiiaez2j~k+o3!CG*f~9H_6}M?Yy?}6aONNaiWbgSl#2b{+X)BUtf`t zVtseHJ*$bu(%+q5uO?$yySqh3wUU!$H574p5ZK9d>ocYU%I*HWOFUltO;!1?4@kmj zwp8U)q0dg})5waJxY#%SW^Q>UMmq0sL-0XN%fFi7lq^MyTZRuG3xrEp>JLputZdx1WwtmK z@1}`JX&`)glO-3Cn6V?s?i$D|(adi1CNX1{RQQi-uWKaDKgbeSYRtS>wgulUMVMGn zj$tw8Qwo2olI;q%!)#$f`SkoW;`GvONoUOizw1wbF3YFkT%I23Udb3CWGmN@gF#6v zR~S0?!DW_wo!cV({TU!P+6Fk zEoP4Mb83$yt)XIdElWclW5(fNozzdKk7;W!)KD^ML*e6hmr^~$b2;-~7tacbe0( z?S)xCbriaGFcqqt{AVb|s8P8sqJfGu>uFrb^+Bvzx;#2g76}t&OLKQWsQJAHFuT;?=*^vf~Y(jg&2Fd=wpa-ZPzk<|Mt{bVk)< zkV91C)LYZvpdMFJ6!RIsv46AXC`yk1?Cj8HsgCTW;_?XjCn;JS-4h29zP06AluH8T zoyd}LHT3d^yY&6$e*4IMI_t5kn`4WEXUXIQ;?D>EG3{%jr04f+-R8~IM8`LS^F>Nr zB>xfeh3{j?ZH~Ej_&x8)G$b^*hA+|iN}z}yXN>TB#fs^pN1GNulHa{cP(K<_l~Y1C z9OYh4$rZ$6lOC8cShp6@zqXux%_)@~C)xT>yYN5Vgs41J^Z@1vB-|uCS_V!^YiaWPIFHOyZG)lap_4uh^u6x#s9e*kED1^AvifiTZB#xPy-B*W|HEOe?ny#?l)lXyjQTcRWZh}q@aeU1@eLPG znxiLqQ$76ijEj{uf2}8*Gd)G?Vthje8*Gx@E;Q=WgiY^sdS`Qt{ff5!8CueJwqJgZ z*cXiJKCxKI+EJGk|JItubb)_|x@wwN?A6{Hf}!JNy(#sl&Eox8I&tecQAw%lCHqtH zg^=*edr`q5oDe<=X}`D^^(({{!dw!@{Xwp8%u)+^TG}e!Et)x8kGvZY25Xh>fkKS= zZ>>=iwBko9fh&9sJ^MVlONAaZX3m^dY59SMhEEm~uc#j$>S5^9CTx(pY*7&ZXxtvZ$Opff2us7VCB6Nw-<}ukd_F|bIcBse z--|OJGo8PuSnd-;x=Q_ZQBd`(<uZX7g0_-p4gEUZWEuXm%RGyby$x>Nj;ZG*mc1WEEL|6t{~E=d`X)*5 zs#MoK!U@iDtYc!!nbPIe44jU|DvuSriI`Z4pHOs>RAO5Gkiir$tUEX~|1>LN$jcEc z+kk=YKPo>TG@&N)j{?)bp_s+yX@Wd~hkTR{=l`}ehg+L3U71r=+XpRX-y@~@E+bQt zly%b3@vjnHPFeZdzY?IS+LK2cW;I)?J}*qY`f)jkRfzhn*0FM`$!Qd*RW5X)>4xhX zhIOq2Up!%x;+-lQ-NOEp9%D^u6Kyau;*vG>9);PPbnRLy#?l`Q;!_USVjRp4dhxhz z1?F9+89&@>?`ZCh&YgYyJIB^YV9fmdqT{0Ro#VwL6c+z`SVc8hk15}9qnoTW;NPX$ zFCWTXltYUeuIpEL$dta<)N`%mwU4ndtO$*JeHh`!Bg|`7H;p@AGs6v4!1VaC%(b%B zD&EAjqBQP$%>^~|nS-whVHeL!QSDgVG8VwNCUo8T`2%XGG06op&T~?9aN`clP?mfC zz9+Q%6myaV1ejQ()#i)qnhwWMn_2Y?ZiK%%U_A;Xamk4}BAwBI^KzwniHJFRI^#@& z^-jW-2xgu>F9Vw7D-8nHpaZ5AX|~vZUMIcAEc_hTArEr!{3~D{x=f|L@S||!_$ddI zGv;w7>2sPvO7g_Ai$8Owe@L_h7^IMNC7xF>FtpoD4ydd z@C5q(D=W}};wghe(BCMUfE$r;aK}TIqXoy$W`yCgZhs%$)Pv%o1;K^37wbcfWDp#$ z%Tzg3tP*y(K4Oe@Hc)*~QE+{>kRF3kGB+BM;RPn+z4lG#I!iCsvDVMi_%n1u`=&t| z=g&S+a4Hv*3Jc9QW;Y6%zM~s`)?+DrG0*wo;$3c!-{3tYKYj)m?|h-`OlO^Yy9UJ9 zZZujjMmA%Hv4*`FsFl^esq4lm8?Omx_0M

}MpM_Ol2%?AgZxxOU5nWxm?$+<#2q@%Oh!M0gIdmbu|&ytPm!slAT-#|SVx zBNQ;h3z(&{vu6-v1~d5E;|tt}bZXV4#-pk|tf?2Q9zmgQFKwOj)V9iG(O>Vcto}8cl=Ue`OOZ z&2LSqdY5-t(;1mYv*WF-FLp;3{*H%=8cl_(EtX`QH9hsOJ#ZRiCy;3qon%y>P58Q> zp5BP$NW8SwEtOe}^FJ-b5Lo^1Z4b`Kmz|Q6`AFCDfd5wYjNgr3{jffki%#d;z%Z5$c5RaFtm${sP=i>0JW zT#~8I!2J;EDf;p=*3S6f$#~M{QH?x&b~ipzl#ej~`cgG@vpJ!C&x`h2@i(|hZ8M~>t&h2z3vLde;+QQZlf7GpmD z=sh&_s%wh+*^wk_`D><(JdRCVXTqwY>Fm-=n3~X(8_IZ4m;YKy*2;qQDWnJ_5xq6 z#8*TzC4Z-EsVDYu_}ZQg=h=%lKEj<1w9Uwszn^o3-r+kp_2QZ9LkGO+p4^#VBb3NG^(KWP zK5wF5JhSt}NKW&_=OjoffMNiN015zPGEeMSB9=-lRV~GtM!+cj2H-n@5dc$4Rmoj( zq(eaC1Hc%7832P}JS5YNd_>r!M5>ER*@W?nr-`K&u!NxFHryfpSf4#g97~h6kn~P4 zFHQkg^o%O#f27Z@kEO{8cNgFk$kP!vX#odmu;W+~*dr|*Ej=)aV<{wUr4J?x(Fs;? zeGi*x022|oV;dhRlS)-TxZ-4~z>Y@&TLH$)!G%Y)1lN|h1@heCGxMM^4~W0O1unoy zfGQz6*)ek4ouI)D@GC%jfGYrLAS1r;8DZc<0(2Pwyz+O|^Bpo`2%p&l!|ef6s0)ht z2Eb5&3Xsu*@R?{p`+zQXfL{Rm!O0y9{o?5llG|PYT@(Nl0qOu81}Fk~Vhx{h0G@7u zE)ReQ00{uTO*tVA%TYGQYrqvY!{j`+>Gs3Tn1SB*BNcC|dA_JNgN2Gp6$m2pqqAwi z(%9Yrgcl$Lesw4R#BCr0I)0$56Wn8W4c=;k3DX#$6978stq{oJktOU<<_%0Bv0$Ay zH=zFmG?6)=f$kg!5IKN=UMz&%GBv|)1L(ncxL`a^FdhN~5fK>7!a(0hy#Qks7PQii14ZwwqPU#AWDG4OH80s1G*9rVPhK{;pI(07y)AI zif9J}1|XCGfdE9{mEr~<^ZxJUxulV1NYS9};8PMcR_U1m1hUa*K zOc$3ae1;HSo32V=Ba^}Veliu_<(uG`@M13{J)sY-1DkpZtZqhNuL5ngf;+)y!2SZ*V}P|U`-?}bl5@R{m9xZBVZenNJfw>(KxKgPFvdY=9&~1jalo;(Lupbrr4z$Q23)Iy zxO$+o4>x?K2Q>Hq!3VC3z;zM0c7lwcQ_Bf7B0)%=01p9z+HJ=|n;$y0G(Z;{h}ae& z6+j^neJB+70x^;oZXoFZN&>_N_H#5XL}<2O<<`f%km_4j9P-5LbIO z88|cpMUi3xv=E@XKpN(0PFxqOOWd1c<8yd_f>vpi~W4p<@7t>_7*- zbPj(jfW!l?5;q655*UvO9O9;7;Ao`=Zm*VrCa8!^Bp}Fb8bUtJT&f2re3fTo)Kp40 zB`b&syU;3PQQOJ&b(C2Cu2eI~8}K@F?me=4NBJJD^6_|7TC+xVE)?U_Z!n9olvq=^O1CE`>|sqhsBjoCOQK9N-B5x9FvJ? ziR^_0MWc9DLk#=MWOsR9wzr4wv33fI{Xaw$(vvRtE~1Z4;>sy`gOsH*38O@z+`wk_d&T zpUX_eB8JVK?gYNhsnTY*?nqSZ!c(Zk+S#4HYdAfw|7M{`2*-dlBJ`Ka+(ErPap8Pm zllz_0g3FihHu*eTe7qPFCmsB}{3mPH15;dSSDnt7ZfAtOZokA1pH~0Gb3O81BMYrE z$HmSY=QBn+4>WE#LH;ndpP22J)vU4)^30?TpKdi|irI7@G<%K6oIQ~2(~!BROL7Rk zn>kXUq;cr-IvxF;@zk~vvG|Z_=yS)iS!bwf*eQ znswSZ$Dgx2%^b1_6I^1X_jbq)eCgjE=U6fcp;JkP-m`9baT=nbw(}tU(x+XgDR;5KFMLND+kz4QwVSwv&+%%}O z+*cGLdQP4eKi&_&_lUU6f0|qzUG|(M<2O$oYjWVW{#0_b*Fd{jLWSRfU6fWlPWYg; z*hLs^PrxxzV|e5A>4&p@A~cJoTkG3EzSPkaS*--B!srOIYWn{0=wqEOl07$)MrR2N z4E{N>+%r3ULSy;!kylJ4B#pxG%Zgj-NBwu_-sDD91*NWd?QD0~COt+A=eN%Pm42oD zcap;B!z-z0Oef(P0;k2Ph=tVwCi2SXIwJ|mCtK_8GckWpIngO)x#ds9vkt3Q&?Mh9 zDLE0bPOX=ncdLmQ&up8=PPWGysoVJ9v|kRN1{jrbRa>BK{2Mzh(ar$P0owaF68L8i zjs+T^Tz1C-jbKFUqg zkKzpuv|c=QU=?|3lH=mHk=~NUBrqDv+gq`*uiSj*nBE{wqgcVejZzBQm-$vMO;m^& z3miT7Z{#1v?(V~}J5}km&cHOGZ$5a{D;|p1k`u2#(%FCd(#EX5Rxk9DE_v=(Ogk0y zniYYh?)y>a4OUvBgZ^O0#EXUlRbI-CmS`Co|p=MWe>+IPM+qaIM? zFC&*A#>ZmC81ML^%aR;|xgw*PWnsN6}Ad;V|16-OAg0_&!!La@NY0U%ylZ~U#=aF>o+?TGM8LE zTN`N@^~}ks@Mj3yGIxIUs;s1W+i&1)Z1JH7HKXp2e&|(+@Hj!49}}Y(opFqZ9p&XU{9!e5O{r+c zW38JTmh5)ovUHUtp&u0l`OH_=e7m&H3?kEpUfAUv)(}@QZ?xa>V|ZplW_Z?WRUwBmQ24U(tFGMSy@iIZr=(4S>PZ7bQ{-q&bEIs{kOd9eA z&@vCxrL}+l7W9?w9{=6*(!j=tiQjxB#l$Smd1da_ISz?K`}&#kuMbqZb4n`u_iaX% zjQqTWjgq=a8ynsvS|0l0|NY%caa=~46#MspV0qU>-v{*s_SZnN#N8TLg5%4@oT(x!SL$%|C2aaQ_o@@U?FaLe;l#YGH+gmjs<${S zHd6dinKeZ%Y7-6Npj4V84Wt52r>2;?v48jKeI{TJXFzmhy}`RPkh{hCd?DolVztOu z=4}a0mO9Gp*MMMMz?*jdOIPQ!AdvEZNROlNmlH%urLVe+ndZv6WHKfK@*}D&4=?VP zOkK`S9yeRxVXW9w@?OUzUTQm2C}gPEQhL2cNW4^y4N_iUtix*gzVQ$)hHr<_(Hrra z2Y29%5sPKfvKbSmx8cxB_Q%zkd*8-&=u6ow<@v4)LC*9d;VR{r))BOP-x(I7jQe|% zvQ&KC&AFb#>L8^)&UZtRcxi-*-Et=-Q`39>DJ0Gr@-% zhF~%tyG#+xO&;C{b9*Pwgb-@v08P91S^yL?6E7T^Os^$XhM+r3UQa-gQUHT-xYKWG2$OMuy^ zkn(&M;WpR@s*0E|ihdN69#9Og%yX%@DN>8c{XKSgjlHb*RETh!5Fm!vnAvg}-J_U^ zfOvRzFDzV4h#@;4;7?7;QxftgkODk0oD<3y(b^! zuY?r%+bA=72>E*p{27**;95)`-Tl1vV1KC9vUFL0*Kf#V3hXNMErOE#-*^#kchVjt{j^q$UgH zTLbcCjGMX!*|mcBeCs_g!rdmez@9>Fl}*UROkBPJt2wfUAAQ&P^eNaJ|1s8`G}o>W zfxXRiIMT}0rXDE&^Ebf}(s%GT@1S*VuNnLd*q|%RtK|cCf#{`9f$guoPToudo#^u%zv(${|J*csW&?(XK&#&KS-1`zHMHc_cEN91;0kh zt5!5*Hmj4NIOXnS#rNh!;xJ!+uiB@-T>F*?^%SW$Lnmj)NyB^vy=px}W_AA&j%MAR zRQulS!Hj?8zUj)qheX`uZH|=Blu5*CkxNVJh>`NN`HfbZikd%&H|vZr{=si&+HCYB zl9EWQMH77l{`c|^BVUHw9?RT=-hciUPj6Px;nSn65deKmDQi3|=rCBh>xC~fS(~sI z);x*PX|QnDOV)k*Rf;6Dgo{BZ1CtR?qZ7N=@js*`KnH+JkkQxk23T zUWFapaW{i?-eTi)+I^H#>-~n8mo>iQ)@a(RwD#|Kcl=AG_o={(#XQ-~Ie$m;K39K} zv^gES{&!|-R{kNA&%2Qu6E41PM*bg%C5RNm?meglf34s$%I>+Y_&?1rVj{#tPru6Q zeq0qe&(q7g$ddlUNkcdOzc-pIOhaal5sMKnI7wWWwi0u6Szm}-(Nao&&CL|q#}4i- zVp2}GqtFVm$6@UPG~sCkC9}`fc^D*k|FNI>H@0pE6YSq^>^>P^{ky+DF3XZ-sx3tu zp~GI0)$n=gwq{7OOK#w)o&;k0>&nWGa{XapyY#EaJr8}-oxTLFk7}6Z#b*1@@9V5^ zjn`RQ#*Z}2%wn@IX7-1NSm&Jtwa{4%g?(q*Hr)h)9gQA#eLlPgf`Q$s z+a~FZrs#SF1(tW+ueqJ>Ep2BlF_c*pUUte@`>hO=UAmmoUA|~OV)kkMv|TByeouj6 z-?ri-0jlna(s}E>xk^_SMTQ-{!HCWjT?g_qMDc3z1ufr2sWOY?KJvyAQ{{zI&+3H> z4dP=OP0Xu-k*j;vmES4%>ih-668oxBWY(hv@5B_hp4*$nm`}apTNEG@l-|rZnP{Lk z?mf3O!{@iXtP*IuYbzu@^+oNO$>|0cWt5FXo?Gb7ORu7g#&it@71K7O=it2nMhF+nU%vS9Vlnqv4LrEie@S z@W&%B1~1^Hf|Ytt(kYI$1nYi>@k0giq+7?(OAZA&cJoKoCrhIkOWG?;)1phw;i7@H zUt6b-=g-0r`y*EVTTfLa^G4!TWqtFU->b@E=iN+Dl~u~if{-&$^nvyt1zMw z_)*FIS8bh6T~2=U*fIzEts9(P0|m>!UN7(;Juf_!G5;PE|3O|4gAIQTlRMHGDYlEu zAfICYIMW%$Sg3ahH6Gk}H`5tuiWEDA8ufsY?xwm#W>ESol+JWU2Oz~T>oX`X0E1De zce6f&{5sG)M2g*l8vg<2cA*|2)Q|&=c}AY7?qW!l=~MjVH^H2|BbE=UcRUSah?{~r z1r*)0CcP#36jfxK5-4&E;+&D0lxxw?n-Zujz5AdBwWamXna&sj{Wuq>K^FxxbZ%KQ zkfsf2=qeaz;Rev8yJpQn4Gv}4TYCB7?FGidk=H6^snPI9~MPanUBbMmy=fE(*9Z?H5q9v_Z8_|Z11zsA-|4#v`pGx_Y$Q#q!Ng_ngK zn=Ky&cPqsrmojjRXy+fPvN5FR3BI9eO21f@ z4#}v)yWTV<&_KU_+)W%f!pvZg;sXvfYlgytm_pCDtrWj66^~Zgyub?mGt>F@-Kg^z z)Cd8!w`Z)g8cmDTx()l&e!Y*Oy~ivh zvxtQkj$2Z@^F)=!(+ob08=ATq^F>{rMJePwIgG9u3JUUrK=_Zw zHhw^cydV(hmrzwP#o!zdNc=_IR3YqN5strh#E1%#aZ}>JfsFdB>%xH?fItYQe`t?J zskr5U_!HWlhoJbOS014F@9d9z!2XTEiZglutvJZPD7;YTpdUlIPIEA ze+4D#r3$ZoFP}9Q*#8u!GWDW-9|!4*$Y-=~hZzY0TY>=|qL4vr+;VXGG!&Ikww?Wv za+uUdp(-(6o0`PYZST2Lr987PMx>|9o?Yv3P?YN(3fYjl5}(>~yU*D|^B$8eKm;}fMW zWg%V*aT%ktx%Ez(ywt7EI3+`UnpK@cJ3NYVsZYa??(#d_)>mMm55w{;^eGLN7Z1TX z@Kz&ULlyF26=*a*WUHiE@#=$q7VwV!Z6vH)OdZfUeXd!Ex7g*7JTSM?n4cP$BY0$?c)f?rQ0`-=y*Xa;DNa^ioYnW93Jkls}6rn%O z^@Oee*qjA=#5{JaxfBs+ir%H)*=yQCbdoe)qeuUx-@$_#T_lYis<*$6RBC@|lzN9R z|19;P*x#8Rri41jy+Y~by|rN42lWnvgARj%{3LJX*UGb`Uj7al91ke1zw8wF=jR@_ z>FOa)5-~zY2>sErgZ)1K#+9~e2hU-di`ERyt;~mCIB4RqSPj(&5YYclYS4%F?PloP zDBU-|*weFeR`kivZ6a(XGd%5KP3?B@7NOM3J-T1766VpA8Jt|md$$mOlN^~L7ev%M zL$P*C7T>hz6Ejoqj0m{y`}FZz@AEGnH^T50?{VkjW7`a!I5ZzPm(M<2$s1z(b?JSN zf#q3W$V!Q`hf348=!4hO9e)M|FGxyuBG_oYM%>7@L6CEa6bg<0{57lok{}F0%_V}g zE^gX>cKu6OO^*n5fcwXx?bz=(n>C3(&`yht{t1(7_FbfnlDLO-DgG29*NnYLt15BN z&#w4Wj9jzQBJH@l-SL>QoFpMZL61n~(x2_f?_q@Ww9=5YKiJ4#JS=wjtRf`o;KcgZ zV579oyyQ8De|KL7BVR4<>G#1sEU|~9;t%9q$@cN`II*3B16KBHf2#i}$;cwvx4%U@ z^t&r(wyknB5K*%-cD>>6O34@OwfTTdx9PF6S)nvLo4_6VHtb9B4QbYM!;iZ;;_x^DWM8|6jEDEwW1 zFPW!-?#8mq-v+wS1tx%Ivki1DU+!uC*isDIQ8}FA;yT&&7rUh%1Y71m!9cyWc*Zv6 zmGiTbWUEfgDoSU2ic6e5>e!ha@suB>zRyb@V@vwQ8rf#V{HdD0*N8dUlYRuk!#mSP z%qfIYi$=_;vED~~?^HSY&-mV{+nS>J-aVlbz0Oapp~r~L|L(CE2OdAMx|cK&|2qvL zT{3>+Cz>~m#aBbJlZE){74mCbsbc2_lxp#m+*Wv}LUVrZlWqOdvO10SoaN%VPVPF( zC3-#4ZIn=cTL1^^*muW7LV$^t79yF>yK+S<14(Jta=aGGRBug zKg4BO^Z5kiz|!qm7B4m@WIFE>lM;+5YJ^f2JxS0x+Wq1&rQDv%X4Fn z9Yau~ThSP5bi`P$KcvF8wVZ~Oer;VxQ~9is>e@R~T(V?VXU^nF>eev!gg}_w^98~b zJ~jwH@GU@?Rs<}KcxURg9IN9u>$IL%Q^57*_y+a3RzGX;$~kt_oU7|;T&B7oSNsb5 z(R>ldCk7Kq7m@Gl|HfYzbXvdn-74Zp$;9ohNwe~FTWJ{nER@<3P|#^}>l0cx;ZO0s zo5t$mbtK}hBAx3R=1s%$71;6EdI`N*uQ-g=WqrA4era)%`|{5J(h4~w+5Dwtd`JN> z0mA3GQC_oLLT8}J*j$jQBcXO%Xbuj;=U_agCJB8co>IJod;^}+Ckbs_s@Uw8DLnl2 zH}V< z3OcF?J6Z$-m2zHiXB?jVvrg-d8|9IA@4E+i=k6K02Zemo-u{<=Jv#q>7JX>G;SWxw zph%UYe_VIdyftH4$db1@wd`WwZ**$ulk#}GlV^N}?YO>#a4PkGjfY7au9;3P#}~uf z|G1=t6LjPS$U+$C}o$OhCQQrY)Mpv z3faoao{`8N4-zsO68+A(`o4a@*YBU}zRx+=x$bjc_jTUqdY|)n8U8Xs{?tCPXw0fM zYoF$L!-W_%K4;9@IBlAZ3Kyd$zn~VfXA~-&vt7NB8*c4J;Zag9t;jESGdKL68>0y- zi18Pq79}?tJ5-Q;D&~>;?a6; zr$p!GQvCCfX~v&#&9k}VwWx2EXsZxb1@Yw=scdstj3tApyINr*^tkLU^l<0xMm?Iy zLSdsv4H??{cyPx=hiABlbU)*kV`7-^{w4_Gc?iw^R)hs2QcWOfehv!|q%@E`CZ&Zj zf);|<95hRWa1c8_z(MTDii3Djzs4hTOyn#M;-Tj03d)Y0itv69Dp!@Ut8Ec?SF}`V!55cHN)c01(0e5MH5KyDd24NnQvIT)YCGqe6lS8!9MxMdqPG zQh%aPSHt%6&HeWXQSI#72pZnKnE0ZA;z#E_f(GZ2i3J7L#+mEu)$BKTmZJcGEdY8? zf%HQF+%Uak4#6#1sTs-XBSac){5dQ>v<1VNNb1=UjbU2KANDUb@LFAI zw0X~4d!=*!Juml{ceahZJ#$Tyjl7TN>Mu9(zMgBFY2uxjtG(LH%lIYdF2CAAQ+LD0 z2bueBkQSQ_E_$nDusGG=5OR{Do@|~>P0Dv z%Wv09doC>+lho`5v`Wh52z93AebX*%9Ut-t z^ljeS!(UdKA}-FNb{igZ)P5o}p`ve^;Xr#oYVY{{uYLTBF)7$q#2U5BvVXgo+qwh& zDHsNfS1}OCDcG~GUtuYBp`2Fj&VVuo+QdVHftk;)<=m!Kdo`eqzeG_PcCQ`nG75iN zt#txNpsg@0b{}&PY&^QIPAv6ez1{ojrp;%@L1z^P9ruMg7Rtg@ha>p{2@As~T~wOC z%3o|?Q7O#S63rKgPgQR#eeBG~Q0}6_u%K<-$dXk^dxy(}x&1PYQoca4pmG$^K(3<4 z%vFVYAsc-BH9v}9?eL%y2IK)lkXn`eYB2-m)%BTrWx4|woJ6}#>zxA#B1@mNk@y4 zLdaBn)`XbI^qNGiDOa9kNs>DMyRYrMVnQ?GGmOhS6Nk!_PaG!r5Eyh5y3@6$#3TD3 zX(^vW8KYXNp~yR^qGs5X zk@;UkpYyDMoSGnRWE7HiM=J_9-N6R_tSBY5!#U&g4kRf$r(GVF6>`eOa()Xd@7kv3 z97wyfqn;O7a3-1&QB@a5dv`y9zV)~-DvWWo4x>W1O9U#+a&-2gLi@Eh)i=Ga>5hGM zAO+7TlTjf+_iW9BOga%=V;s7v+`|tt-=zqFt-fz??7Br!q~R4sQci}Z)2jtJH)Hk6Ew=V+<5qT)?OA_pBzUPU#NeSV!!|`lQVCLA62nGp}hbXJFcQmLC%$yy{38PipULM&RsKw#sak5}9DP)$8 zj*Gz1#*Go8EmcI9$emc>`Jz-=!eg?kR9WPwbD~SA^ZwOxm(Y+!o5D%PxuHf35oPJk z_q8ssZc9Hx3bCWkM4FI4EZi&mj~bUjoUni~^KwfCJPv@fw={D+w4Q zW?XI{e|9rzB7dgxPa_;jddiHFi4%Ic7(<2KWEGTIcwII==APS{xxxqtAu8^X+j?Y;#uCASbb;6nR9HQLG7CA0 z0&#>5nT4?><`$ffr2aYAs0GdJ45>imL{dor$SfoiJixgg;M||!+$G5APU~am`U+s@ z`tpnhW_J0$2%uH#Hp|1#{T=W=Fxeu$#5euc(bEMS`o5Z1YK?ZTCHm0kbH{fMn>(|- zdU4o!OvrWpZtd+{Dza9|mbr?6W%nm1mTq62xoV`lH)h>9roDuD#9ZarXpE^7OS7-u zbfrW++MMs*7+JOV6CDc3u@6a*6IXH+EOg4Z{b=&vOPTqEo_h8 zG9!X{rhUXuU;y*|25)EhVFnwfGptc+s@W7)5iDHBKmsW>&{2=G-qz zj#F&EaqeAUrmldjAdX8}S{%C;;N<)s#3Zz(FwkaK;AO5y39X1$9}F=J_i9nHM&12j zjzN0v2=?)s5f0!r!-l}jZQt$Y6*~RUGPj#~M*>a~4m1JTI24ca0@GcqYmdSw#R4Fs z$k>DOhDUp>=M`9kZKWaom|sT8h_(1#Xpi|vIjn$kNH`&Wa(ezBLKQJKDmf~IR9Y4tnWu0Mu{JW*vZ;P*vSi>8aZ9! zp+u#G7p3wN!N57_ti>lO#yL8^zNh4tz1tZ@`()B?Ws;(s14suokd79wqh<1n3M_Im zU*2&)!4ONMg)@i`PteRypurfCeHJfqp-n%g1Vlav$i*RQ~v%FO1CiNoX6alevh=G(o@htCaaCv?Sk&WH9yMR&@bD)N2ZBz4zjATbu zm|JjUm_?wfF^=}WJVI34@oT8i#nC!|3LP$OsIcu|0ZI!}_1lawJxe__6qs3>A^?&H zv*i>(*A#A?L8L$iAp^ObdpXV^X7=E~CTl|m5ygn^XGDN54@kTr;}4<} z+f(Pa5c8;aP20c(qIG>ICJ>}DW_(GY9l``cpYUWIsdf{U*AereC{LJ0JuZt!PhiU8 zM%|1Eh&uUf4({LKTZ=9+oi=FZBame2gc z2l1vv3pd`BXiu%&LfaP=pZ1i>OM9$h%CUF}BZLSUBg9ba)mlo5ay`g|OD!Q2z73h0 zGTxOi6T*I$1E7`T!G4x|fipEPWzc*EnOY*`$qBx!QHraj;Ad*^^Mh-rW?woiKid)Z z6d=Mo3FyYO2*QJxa&;dNsc0<(QX$vag*G2rR#AtEuF7|?EfEge5-%h$?i0K%A;pWgB}%67wnT{$ z-oRKAz>IDr4l}wDCd}wYOfaMKeH5~!y1ah>y+`t}R|#4;Y#E~N`ib+H zX6$-c{axWuvV#zPK2NF>l}>5w?P?=Haa@!2ATzdv%=m2?u{6tPne*i1U%~xBTFPsp!Dy2r+k!KgfkgGb zaiX3#wt42&1Yj!OTO@x_F9_ zy4a}Z!96;W!D65u#Xvn|fqEPS>Y)qN!w#rNI8cvVpdQJ985KBv`=ErW#|J}9Jw9k* z(CAIhGas(K;T@f7vIf-SnJ7??O`slgoj^UdL1M8>3?~+1A$cfcNUlM^utK$W9OWdt z?F0-_Mj=*Lir7j9TgRt7LUf0BC2HRmsSgfTg;Y$H8ZUX7kX?L-yy7^(v1vEL1e+a{ zXp^En2!K2C9NuP|gsdZS8f73!%bIwrLgyUbs$lxR%wypMZ_#)d_h4Hwy$N$0IX|-W z@x?dJOZ6BbC?WVONxpr)%$>238hEI6xri%Vn51qi6n+#*e@;sR zL;H5^_eAdG9c(FO%7opo%-llV>1=)@S`dDxt)b=mDd(kT+vjI*jgA*Pd| za+d`+_gh3MZrpNtqKL?Yz@d?h%%+Fo9YRjQHlU)WOIqSa%rz7jaU49m~Dm__VD{kGv zG=sSZSs)uRh|7$?J$Pi0)+LSQ@5Qb64C{b;?0Jux-LICRhK$7KkNt#bor89Wz{nLQ zYz$5_$eu?mP4=a<>OmBQ?l0W+&^}cP$V$A$CJuy7MgbE#83Rn{++rbjzRZhAT!$bI z?Dpq0XaP+A(2FV;fqyAA2vqgWzH3)W0e-PKW*pY$$ z>jZCe%KQ(+E}pn@wjF@})+ zkX8KD#JR=KP$b2EwjwD(4{3!K+Vm8V*6KslSeaf31*`QBz^!0uh^%kknl7CP5l_JqzqJun??!5$|t$HA%p{6 zg=iymWlXNI7Zuu8iKu`U7C?w_K#0752yx*oc5amjc5Wp%NLcbJ`7i`m5-N`R z>l|j?n@{kr@wypK;MP?z7_a6YKx}YE$_7Px*Ag*ps3p+5Gu8A@jYEry*zX5*ap63x ztieZFHONl;EeVY6XXM@!d6NB?JBZw*A6~?dM4p3O1yZcd0_p83;q`{^COcGK3toOb z!#&QtyzUm`JNWW|drU}Job&9X)$kv@fB|P=i$c3nNiF7z@MuP6SCQenjLc6(tczU+ zL|K9HE(3R2*wK)Ej_y5Wh4D^B`7P=b>+MHJFP1^oH}9DKe)YYWHsC{gS%Jl&$J^1?1;yN+ z%U>K=Lu~h%pe`rwv26@ePO#N}?kC*u(ue%mDggt5eJKWu!Za+!74aSrn;_n-h=5&r zRUGurA5E}>BMoXFWX?v!;YdEAk0bfoGaShS|2Ep9>K`PRP=%yM_205qG|U&uT+X*B z%ej2Q<$9|TuXs(Bs0mAZ_RjZ2qZ7$x?&KWTft32BTunP#MJJ?t^h#S z14*@Mxiog{-2VAO>DTA>l;?!-2_a|AuznWAdqHnlm%0ot-`ofCA(Hkt&te~IGh!d# zG_K9aoc;RvzLMJUq!&R-YU7EIFZ=KJYv|z!{&m_Lk9_?1({tOhq3&{@@-z= zgj&v6zkxGF&!#MmcG-bj2Lt(^#agN<&Uvxe|D_iY!wuM?Jsno|yRARE56$56BKxm?&~YdeQ`&-y~~8dq44Hq{a{ zr;$vuW=6}~iAEZ{)HMp?=#4VLn(fAQ8JXWw9%0X-Wd(WGEf#xr<}!FzP~vTs?Hkv! zBR_Pr{wzpJGNh8XO8R?ux|MH?UNB^8W83+*Dw{7+T=15Uj*f)e(AJNnB-4(^>qvDx zMQ8o9!&PqC;91n;i5sE8so;4iSuPfJe9*pr4tGo|3&58Q+JA>jv;efMaIVA(c(GcK zH;lC)XV9`i_wnl}`Cv|I1xz6cV@S@wj{_MkD=3hOSvZi(&I8xmOX8PulK3_o+E84X zP2|a>EU`y%XV4j14k_L9eWMWHf8@i~UzsEO4_vM3puJ&blE?_{oU+AgBmKFbh~N*6h8 zFk0BM>7l7F7JVE+gYv4h5-N!3y~H@N%HxI#%6cfzpnb9`VTcM6tti8weC-wV3L!|E zofm=&MsHonEj%ya++yu6hKSY202crhUK$u{z07cK;iZCei`5*+EhHhgn1|d#6E=(4 zuOj!S8MPppA$3KrY~ZL*E9-Lq%4(ZegZaaFqK2YVg~ybpt5;*yVUyU_3Y0@?99uH@ z1<71pqo3}rB3Z0A3Bny4Y0j<(Br zxBF!Sr}oW<sGm;2u7}J$3{4Py_Cv2izka zagR9m?-vmF2n6mS986E5B1^%Z<`V2_o`F40{|U@J{9W*#<`((JBqPIS9X|G0CpDrY z(hrBDG5eUDbem#ao+>==8X7=@!uZjSaJs-R$UTp_@pfi*BzCi*2;Mw?*n}6ntk)=0 z(@F&Lk%ztfEEUK{6_5`FARh)mJ~V)QB;s?AKz#1u{*QbJ1Nj*KM?T=(Lz^DRhc}Rq zo^T)^BS1dB1NnF=3glxG$j4kKq!!yo&_?L(T|#jDd=GYb?g8yM40}QPb0`6`O~8qn zII)OU&A<%vZYyy`>|lwrIBgTx#F+)#QM}*wq5$t{vSs2u%>!B!we1z#osctpJF1vW9=5&TX^hClq=mPO%ByRNR_|E?#qR+3Fa++=PW7ks zvHgjs$ELzw58Q2v5e~D{lGVx=$jJML6nTIYpCOz049Oc4@Vf;-iUmN5gOI$P%)x2i z&9ivP(}v{jCM0iPA$d!D5y7ve*cOr*=f2kAV~;^nXNp#RA=iVGq$XP-%suS0 zAIa}Ar9dP8p&Xhr^ElC~nQnbU}nf ziOCL~pEQyMI#9DGBT7qFsCfV7Y7ZeGRq;7e;$eL3(F>`X_%tSMvY0m8#KUg9Jy5#i znkdjyt)X?28B@AO*p0UZ?xFktxCb|Ik6E6dm_m>q4F5&kfv9^Jla87c&1H155i8Ta zfceR^dlDuc?Q9RRYKC|yW*gFO0&p^77lYY~eMk0h)Nw9F=@;rqA!`CVLehFTG~KJ= z)XoI&2$jj>v%4~V9HwRJIEc$kA&CEJh5|~Q#VBE0jk$+gBJ2pc!j2FNkwBbisu1?V z=b|Pqznnua=97<2FxC+3@a{xeJU$pL+=dTE%c5E%v;y2t6|kcNl3jRvq9ao77K)qX zggq#3q*i5ILp}Gu#t7kP0LM#?MmP@}=EEKyB7i)M5kdq4bnzkn9mOI(i5eTq!+W3Q zYWR4m&=kXTnF)pnxAX%zCB6kI@eaf$N;lS?t%mW!tUqc42OkP>@WD9&2OpOJA~-MM zqtR)DH)!%-i$4wrAOFF@N3=K`eC&jS4?Xnziq_0kW+${~A+IM47|{x+N}X`3)Cs3b zof>Gf;#g-ml47DE_;)~}7*4Jk3*g=R3vjAb3HzRv+!!P(b1+DF>9C-m2CT_O(n?i` zIBlNxYva+~k-W>BxSLs6P^UEP_K5RRjZyvUmMTgUhSubrbVL<`lfi$^EH#x2AN_Nw zrVpZHbM7P$!Qm35dqiwh=(SgRtq(dJ*}*uU$DK(3Jf$Se`82o0h|tQqY4wuoL5&y2 z4IY`>{J1}RWWMwj0?9Yzfff@2{zcV`n6DKE`qlT*2Ah5LInd0yy`=hT{XG6L*1Brt zk}5i4p&X68yPC?4ek3sCLm0h2XH{9!!E{2;l0iEP`tOfA`W|-tgyFP0DGHG z#2@B|l1IHZOXL;(;pY@vQ~31bPs8OJ%E#-;o%hhvO`l86N;PYVHh5+O9$Tm3W9TM+ zywpv>AqXWLe`H`dHiW&+A_L5#nc;{@6Sjh~@J5k#A`ava#+c`Q(8Z4KP0QOoTwCR- zcTnH`D{NQltHHsC>??HeQP-3B6#aUFM1Z|bcbi$XX_>`tjt({?hT#VlUuy6VDs=R+ z(Wd4_Zx?hHa^yquE7T?BbS2sW{k8UQYjYERg0g9YHZSA1!_Kih{yl}wefQBw3USld zOR5TN+@l_uU3-kMgZCP~^T_YwO}Rl11B=RbSK^YH9bpFPODlh&KT z;M~jGdnvCm&y_mfzb za~8X_P`>iT_4Zc_>6~M`HPMt1a=YJ)3PQUp9?`1x*@ifjJD&>-D$k%*W0~1Ehx*vi z#l59fiz6R1aUXy7g<~N&{?UlJeL{FQprgc}ya0)9RbV+Akc9z0pWvvh08>wS#!rt0SbB za+zM{uGGR3@AsaP`4ZS*`g3jS8Dr`pAH67{Ht7K$*K?QNYau=iTo) z*=ucACDh(=8I*NgRP>^9I?k;lAkQmI-U%mEv;uK*7oLc?1ia78zU@cWCtLjk&8#6BkfjVD|BRV^Y2} z3o*AZD_1+=I#SPiK1D=LH@MqSo$&oHcL^NdgSfvWAs=PT#d?fCE3fB4`%X7PTan*s z9^6M;AVz$GH_!)Z*~5zbIe4xt8&%n7vm>{=+|Uod+9Gcxsx9NzwmDtgsv>ib?9n=8 znza7#tvUHUMXJUcYJJg8fqwesW__uH8y(U}8I!M}gBUk!myW~ect`5v3~_zKu~#@W z&~dK9fKpa(v6|f|esvnn6Pq&m6;vS6+8~??G~;m_jTCB8SwTM)>mh!PM=g)Eh+Q6; zR|`#lph5y~4{B*4ehET_lvZMoN9Gqd8I#eYmyCy5DkDn*SjuBFSL0t2Ok9da7(dzw zYAqeTbSZvWVwBO?R;GF*{-uzKTk$C4NAiJ@E%RC$i`I{~wM-q(n9*n-iG%4xmp93a+MYI5lH5|*!^WXKTsior3ZbHmLUT8 zUlaU4G!Ea&$PvwzhBCw7NG-8q3iZh<`^U@BGX~L*imbIkHGJB@~YTUG0Gb&hoY#H&$q*+aALr5af z*^1Civ#{eRD#(kLK0>f!TlEzcj)`ib7NONx_TP@@TrS+y7>&&76qfKS8A$VJ{XFs4 zoN)i>63>OKYn2ve8GAcUI+=W&mYm5e5uRU>RajbRslE2ZzS_bpQ7Yx;X#R_qWQm0m zVTaZIHh&jdXsUF2Z&$pQUeb3T%YV^U!E>}!SZkHjh<>ru3WW3~JPTHzuc3lix&|UpIV)wfDDtmYI|E3O;4`di!e=O$#-CyR zJ$#1Ia`+4<^9e&O)xWO!s4SmyVkcOK-Wr=lf85&^%@J7|5x5?j#YB1~c4oC`LM)!l z>MKgHHoG-_^}UTqhg0QnX$0?J{l}H#brOIMFy_Z40S)qY%!coLU5H~do8z5-05lO>z^!nN#X^@qyj}1 zk=(xNTrJx8zAr0%S-hQBZ>-Z8wiTVXsBU?9>;=*g%KK!T+iH^h5#h^pu0DG;Qe=60 z^aD~9`Vi$%T<)87rLz?2e{mnP$Rk+Zku3-B&rU&DcK`&r$Ds5RK^B1i@Dq$Nb1(-q z>0u6h9RuZq!(D-yVITg@feR~Ws`PxF3PTejb;J?PD9SHNJ%Pyu6!#@R=J$03Trbtq zDhi)GJ(LwV(C2bwv8VPcxsu7_ip_7vq6xy$_C-1$7gD?peXQ+JR>L~iC8@<8#_yR| z8ZFMJo}&JZnzGNRC@uC3epTs>sVI`$F?-&XWNhywg&?1G|3>LkNUy)yrZM2}g zl%_C!4Hd*TTG0ZaDXzYVJQ`o)h&i+NL+P`?x0c9D*{p|mQh$i1rliYu`NADg-q&2)H0nodlwaw zH5^f)A@OT0Dx?c8&UG2^Cbg90TU1L|GL`igx0-N^c9!2nU%!@Y`R^pyTxL8#9_6g2ly(@RG%@0oJ>V&wVy6MFCmB=oQ5f0+2 zmsAzl=g-dmK%Pwq0ng`v%MHMz*{z5pv@p8i#a4F+JWg$by!(Y`8tr{$C63=k{gQ>i z;cf2N;rf#32q!VMv}nMyP{5z9J&q-5;SZ^sXhxFhz{MLfiDS5!V2GGidt97M-<)V> z*=wPv-H2fcJBX83aBGH_^4kb<%S4JUqG$+m*m!WUr|l`?Una&g+O?LdZZ>!J{{tQA zRsbEle_2ixfX++{2Ax8Ez?9V|=tRg!W)!UyIVV_4@!C79D1{c{36WU5Hj}y6QOa|L za8m^>(H*=H_vhRC0$cy{DhVjrOM0bDa$Or2+fNpYQYF5xC3f_Lwwfjid!9#l;>KIe zN_r(?;vzXIw%<}Wk1;qj z9)&(bno<5-Gg<;4TrZY&Jag)cUxNkUN7pdmP3x(Dmnt~~D#C4k+8A5fHuvC5%Z_XK z(teeUkjBVWJMqkDP$-AM1lA8`USeE5PA?=Yh!D(jY7^IosB`it@ zY`t1H=1Ss4%`fOzst*KIypk7{S*jT}jVGm+j5&(53hz8v%09m$q_Si2eeE^pLH~+Z z0tMYgqmCl&^ACqh*lCMmo~_@szCQA3wrbckK}zGi6H0oH=5&0HZ175cxqQ>wZzSgJ zl4@0~XFsf^OU;OrwX9SRp|wYM@?skf3$DKwEV$9I;BMW}VWrE_pXY$!_k=~^3OD`&I{CtAMZU2z z)PttY!_GImPOVn|`s%IFT`stKzaK7Yhk5RVdBv$+oEFUTBu!L3Y_mwszM1{<1Y<@hluNgK=`pfWrZ1IKenR33NRLa2* zkanv0gZmeF!TsC7{XgQt{aiq!c4=bwzb*jx|8RqRXAANjHXc9p$=WUg^w2p2^xOgH zkqybCC5fixf3In~UK+rAptdI%#Y%=qWNAR4Ou$nn(o3;mvEm8Fc=EBJ3&h&j933Ac zP>y^gp~8h)OCqA+AnB#7n%H+ly2t|gLB!g@J$7H4cttv?M&gOJG?DHI%)KwU6hX2R z6$8nRDI_~l570i35!n-QR!#LRy zuaQIrMW%J*+`1nhGDl3b|B)xYRg}-<6AXcCk)9*WL5XrGP^k!#HKI~RGNDfBQoQVf zQlosutO%?Tm5y>8_c-d8d8kf;W(Kjb9K-jOh_z9~VZvIKK~;`HT!07ME&*;Ax{Oks zKx!=vJBC2EH0uHIa~v?aeGE=dBw(j&Yj2?hC#e)do)LVm*@OSY#;f(fRjGUE4`zl; z9|_H1_Vl{VeG79dEy)_pxCn&;m~jOrF05gthcbwvk>B^EX#b;Ug37o!h&C31k6l53 zWkY`7(w6lbQLO!Toa5NU>8Ch@zo3ya4&-Uw6=nagQv`9~w^Bghcf{hrCSOZL$-hAd z2B|nQu>=J+#Zh+!l-0L;y+(a%Q$+nxp^egUwgQouE?zVZPKTHNcBC%+LYTN-$@`+K zfg`mf;6_y*0v+x#avs~L-8qiP{ z`*a5iFq7lOV~p{(f|m4zOE=n5b}76IUr7%5xD;|u^UZ|!rG%~RhBO)%u|rsFnPT~*`P^AV8Jp= z7mqG+HY}|OGg@5vJJIEfE9(bzp>dM}#Brtnj7pkrqJU8DT%)LT)$I(ZtZwT^C85G3 z7lbtpW_1+^lzz(z0OTy+H%Aod4re@YECwK4oN;Kkt#A7H0P^`IPEr~A0Mpd#sBk6C z9b-7cCKJ-3STCntL_1)5cGQ>{R@TJR@CN?H4g|QyaalyP0_p&_AU!@=);EaaC-ZZKU^%kj|0y z=Q>4`2c?Jw{9aesL;0VoXdeF_oU`sDD!V|6EZSSJ>G*vxtGeZ^(f8~$g5P2P9nG7A z5@(9*#tWQ!wW_T)+z)D1U)>NnX)p9u>!9j)BhR|4UP+%qo`**9i=-E@etwi_s?x15 z{WaXnPh4r4Lr+qEK~kwWaa(c!-acEl=PdoXM$fMv(owlC^F73*!lN(unneD^tA8d! zO$83<3@bZiYhThWOv?N?eBRB_PBCOT=#c6MPl@<7;Q$^dn%F5)(AjELs+D+qjcnc{ z)0bLeE01bUtUe`gspQB=+N@`fn* zPx~HK$Mr|fV|(TXSe{g1tdCo*a*=BA>ReaYcWb2~5T$(3ff8urG|OIt^kqL^{+?-@Pa8e_jYld_J` zzppjEUU8o|dLlGgLUwudM5r5k>MyS3dap>`KLt7yf8O&sK2Vxv;oNUUpJDQCpVZ+s z8qNu#V!_zq4)hlWoD;tI)=_hoMaMLRma6J*aOwRnVb73c25(Aw7dPBU;Kq9U11`k0 zDh|cs#&Bw^7l3cgLC*nco6(1&VmF=`HTu_sUYdqksz?P>J z7}uI*2^6WXU_xD&k;xjRKWCs`4L|gsMSsNt`}c~KtoYgVhwwX9w7h6=qJ%8z=C)FtW{)g+i zbg==oeRyEUzyP>3ntLrQUZlPbMz9krM)P0;nee3lKrtRY$t)xqKHDTHGJ_%?Ry>Yh zQVywTnuh4X+qghY8ukxAJWd%~NegH$IMzmaQ&*1df#r6dw7bm(+Zgp4rcAbl>eXXe zmGFn=(6R=WujsJ~0U9@Ph08WvVSH?zMSem|`xfQ>QVv`}XSE`HyZ$h)@I1ixmO`C) z2U`t3j`cKgwKO~?7i=)YbEB|EBUqBgT~glRhd+Ra?*Y>^pcjhuOsw$(3PF1SR5-B8 zugf5rL7oFCfu$z_Ta<&*pFW7qoZbP(qOq}bFewVp>#W63?R*ci1|+;KE4_Wu5eES65R1i2;X}O;$c?q!9%+M{;-V1 z1GKycG8|+uNErC&ZG1l(0up^jbRPi{oI4r@_d!?|z{@!`;ukW3SMh-1=fW^g!jLQA zz5?!j;NA!BH{gB)?svm|AH3FqBUaIwe`qdFyuWuM^e7ow=6bDh?KpaaKQDEx!ttk8 zyT)kVh8}Vr>K`1>4JEco_v-x&ybJ&3^vFc%?i&*rR)jt64}t)P#cpMy&W&8yhG9ySWIS8Wk&%re}yH%#ePtcmxy`u%Z*1 z%%^FW&B4G4s7Ht;SHFbuW!VR+PiL4&*c{%vjm?~a2^bAC*cy*x3lQ%N?^+ne{)tYg z2Y}qVi`CzPdI3};JQTQmcq<6%0SK0$-UrOUApLpP!fZwA&tUvq?u3Wa;xYY2P%Kyf z7OMFWZgeRAISKXf4*oD!TQC!jt(PG8G0-lLf&oDIzX7s|HNGU5! z5hg5$*zrVJgvqf4fxiTSzXXB51cCn(40}M}|Aa~K7beipIy@DA0>Ev+eD;Bd?|=ZW zf+6_9{T&!WHON~aw?H0(8G8&5#CIFWLm>BognGH1cz~QR94;6d*S~uh8W+rPE;`!p+|J#dLJ_*Vd)3ve6-&UeAXkp_qGg9aOPVF5iRY$+cB^M8yU`TWM4H3<_(!=F!& z>w6uGQQc_xN{Skkm}NV)@Zx$=pv?cDg{nHg$r#g)7~@c?F;l&JUE*$*3vc{yk0Q+t z57FeJ?*6iK1@5m^pKEO%J`mw`K|U|c^X##!ag4di>_KxpcLkoBDqo3>uu{-1ri$e< zuns*GKP{0f;vyMpo9J*O|D53R&iyuNM$8StsxlUTXvEgk6dsBz7aY2Jf1NJ>(A9YH zgG7a15!!lG^RN&}rH8uT8#Oj_mjezMR8mWl>9e;le6ng@&-@{4Lht@&*E7rj*xxbp z9ASy+wb{8{x{*SD;hlVMXYu0;;`{e~58U57PcRPo<7GVMP@os`XMO*a8`ITZ^-7Z} zPdR4YP4`zb4)B= z%$?GT?e-LS>(pff&Kb<7F1F4@t=0Ta^)|gcYW@+uTHCup~>cl!kz*K zwL_%j+n&-hO)NhYj=4=~ZX8OGag9SNGCi+2c@Bh~^W3~z&t=G{d7v?Ow8~p~s@>r` zhgONpe+T`7e`oIYeSXH!k0nU7W!LbV#fB`u6MvtZnAxs97HLF(l|6nr>*58+2Lo2l zLJ!xkCb#X+G|Xu0|8)7ye`z!})gSo^8-AS=SiNx~@#wB+iirjMYkTRLR`&)}*EIMZ z$#8N$KB_#+PHdB6`n`*F^(a&eXE;e*vZ{{kk}6Fw*@x>FaD8Pgu2?#>wwFLQ3aE~0 zt@q^z11i{n2N*a721KD+ZI<0jyX_~`?*Icy*g!v6yoW3P?8|VP5B&yci_gmGFkIYZ)cQ1ThP;qq3>K2$uKa9s=hpWAgW;ih)JC0UKq~8h8lLf^) z@I0sp52!Y1s{g}?4Wm^ODHg!N0mI&otNqny*;TaLxS+lf>Zze#6RW2~^-Mr@_ubHSTKteLaO+!c z{Ez~8OLnM^?~*z%cHAFcY81vq560l5{e_QqhUvHJai&#Ks7GJT`S@Q|{E%cAs|T1t zub`Qb@E6{p9TZuyq7%69Ej*7)dn@RYDlO&e+k`)RdE6>Ew6}IW9Jtp!dRt7YX39xE z(e3y;yFOVCSIclcc)Q)kF$_1N1W@WxTOjHr;3ke6%VhZcceD@#aAV0k+|%3&tDr0p zsZis_AsXl(2`XUxGpH;a!;km@io3zq5m2Yb>WdLr9W9l}Vg;xVgZd(<(_?in=;Wma zUHPFaE$%w<&j38{Cm8T}kInou=FtH6by#kI;R|t1zyInlK@GHSf+MQn;oI@U zS4Tje1}P5%u>^Srq(8`gcsO$Z;o+R#267)rDv(gmc^AJSJq(8)hWWpH7y^AG9$++h zG#G}X2E$Q<`#KmD0}MeOKXBb1W6g8sJv}Z(dyvkHwpL^n-Sz7*A#aCyShEsu?9I|RSs?B(D z4*`T5V#oCmmJ!H+6^%HMWfXAmYv68a=oWzwf~lGYxd+&2E+EBzY^akD_me>o)>-c> zhHKIlanGlC2&-414+-~~K?6b9^8seb9ki~Vt9$!EQOQ;VAMQ*HEoq(StdKj=L90mz+VF_?S0t3@{NWPQ^mhG&n0WJyv zF0ycaWdt@r0)*&8PpYr?-HYGJ65y#H415OzJ8<HK{Q)oj!i4@?k87j=*8E{|n}ZAAf(!lO-XGnolYhuy9~SP$ zesBcKGk`K)xZ3SBcGwUzZX|$VS}jc(ZEWq@an@NOmW)NoK?ghm$V52)h^uUP^B z@)?G-0E&p~pa=bfa3)X(yjg^?{DW#lkPtj0g2W!wmO7upU}s3D>x!}>G>I7 zuTN6KMlS;x!`J^@&AD|&R;t>KJQjK~vTOcpsZQg&*_SJ)#GBaZI3s-v_N?f$(CWOaUEN4&cZ@$ITd^qh@Hho?<(?wMP| zm#VI6Yn)sgW{Z-Ub=T5IPt$5tOi#<|s*;6drGjqIm^oj}{@y|$?&h_Ns zeAWRY!#A-Bj3NBJA!p}rSHB#f)H+m^TvjyRpm}JxpE&qUk@x<{FuHQ1YaO~$@ZR4_ z$L$)2hC7Mng8JTiZgUim-2L6=6d$c!AosN2?%C0nmAoVC=Lr&lLUYNQFiatEs*708 ztM6^;HfQx{?H0L*SG8whK5O!prCH(ux+k25J40S?V` zGrc2xT5mR;oN^kMP5v7xY?$87*6d?CwVSQc;^cj~7}DqHeL*5&rE-;0=9HJhS8 z5$n{#eWqT$`nJlgXOZ(G-|mi{fdP&znf|+i^>cVK7zFebWcl^acmxV(QhOXZM80VzPRVxg$4DeFYZLeEe;jL z#|Om?+I^9TIi9IRIwieyu}ZxxwO~;}GTz(S$hz8jFrz=u`1F;kHP_9Idu;T1X2sPOZymq6w-`0AC zhVe;r=JAj9EN6~QB{W7moXY#HyO|+e6rFs-pR99EEiUEHvjdR_PG6**4~$$($~o?T z?0bPet?>bx-?iiVuVabFtav_&JmYi754ayqG?eVs=BdkgCUrx?wf$L)ZMbZEZy=kX zNt4Y}_U8S4&Bl~U)ZTpwF;`b*`|JhIDi97xRi5Ze)Rf%R;M=1oHvKxL++UuMB*A!{ zi7qg=>T04C!?{ZFv#hyRv#LpPw#%AEIyp|Ng-=kVe=Tv^( zj1RKs8`nC2;PKU3k75bsLMqFFo_+0nzHVAd62adn346Pn1D0GQm$pB}$36|0kG9-b zV{P|2^5gP7lNV2^2xCvWP8&H>@(2F7a#u@QuxN%RfBZ>T8h>fX1H}#Z8lx2EK|3nK zB&rfEjY3u0HG!y#cBhH!S^IR}(ub((T1_#knxP_)ku4KvNn}g0W*S#f=g$lo6zb{d z#DDbtPlxY~Bj@t_y6PT@<)4kDjsfwR169A)2P3aiOD6qRk~G*jM-x}|PW|Jz{NbA? zx!x6PDs?)TeEanzRc$Vg(ChBVE9pO%m+N%>r|~}h7T;#)yXW0w673C+eZQX_ADo-1 zP$y;cxRy1MdM0~U*!gc(;x*Yf^vd^FFZExq68lws#(ml_IsEZbNuPry_sje8>h`bt z0(T}E9XS2AlWWB**LU3co<(Nx*H;@{RrG^5$}ZT2&hAnTE+>U865XHqB+kaGphEbf z5h?`E@}YuB*rM)G)&(gJA$q>b=UZamxisHRo$zS#J2G1J?Q1GsmlBcplh9c)5teIg zf^6~BZ=xRVX{9t**9^*~G}q7!a@c9Ei6o`DmS)iWPIGM}Da~~>gV=YP>mo^MuBRE4 zywhACNlJ4A%^>rg=4X+lG&j@?`n=QpT)TJNWgh+1o~Ydq#>38Kn&xz9Gu?93G8+}< z+R_)T9;;V>MuQ&shaE^*>d&m*;R!L zK4VJO{im1Bt(I2Tc3((bewQZ^sj)yaR8)8C_}@im(y;6ty-#p9yWqDt;o@QMOS-vv z4xV*k1tO9Xg%5i(uKw+hNE&%j_wldO7y3Gu5#?i31tCvt6?89rd8?|vY-}(w-M?jW zw)$k=N^ywEN4d+ZCf^8Fit-FgZzBHt(Qx*!(-!xLk~WpVMAc`7wacA>zFfSVk9>cc zPdgORu5ZVhCg!TwUeJ2&J)YskaI*J^uHJ8}P_w=LA34jP_nQfGTP{4_?WbR%+QhY| zAwaYg)r29B=vCYi5^U42=aM@ z6m5M}4+(IVNFCWnrS~a?fhvf9p@XV!!JY0<+UrwC_A%>yPG+DAu)EelCA>#fxSY;m z)a(0l$uG+f;&NK0X&<(~KVPeoLU%0f2(fH#+oV_RbQ0aMj|}02QTtAFgU&NzWB%QuY@|MU-J(NI*M-6b8b(@LJzWM`RB9qplR%njh23$Wgip&>i&8QH~~>RhR7|3Fvz z1mo`~Oi@x)kw_&uK==7D%XzjOuV(#4onM-DSDbzY>&TptTlr>k`s2My8#_BIi(d7( zob2nLI7W`%?0Gg$8ZJ1q_L+@-Siyfb=%i4vrCa)n(_fPJ7y7NJ)Zrw-3HdLx+l_QS zcT4=4zH9tb`J?fC^kzQ!fo@@uR^0D{+C?zYWrbGD3K=h(I=ESA3Gou3ZbZCj~RlP}%2pLyS9 zW-h&5_P6uvSg!MP!gBK>NC9Ne@z0sib{Wpn^ae5q{g9}YTh#7F6J#Rcn-jMDSs5D| zZN`RnCw6Wh+v34bwZ#wFR3W<=Uzk)?qDCu$TK7xQ*sUK+=~cC(9dpAM9j4>g`k#J` z=nEYi<+~gI`a$NaC!^PPuZ5)hCzrXl=aj6~{*~5aVEDMz?-dsE>}D{>j39UIASXzj zl&2w74l}a2y~8byoBKuTlAMaNX~pwZW`;`(6rdE?VW=EXoGgQt92cRv37L9%lNOqf zQkK|XS-EW3sC7y-;HvSxS(C2FPfy}UN*~Rfue$2;Ui9JhVtSsKuw7inY8|OJ>WhXN z{AZ(yvCB6A&Ir#zp$wnrsHeR$Wc&Cgf%X|X@peAo*P zR3IMxAu?q{kH*F7N2apq-??%Im3?lQ@EyN6ch#lZ`K5cIw57CZIc*zj@6f{GW0v|N zC#l+4nOjk>hL+r?*Q3>po?B<%sWf2pTlsyHepbPorux3i;{mO2DiKWWsXHy-Nq2ue z`fH*g)RwD;m7pu(vER3QLfMVAhE)U=SbSfhf>aHwkgmiAO|`nq{(NU;OWU&pdYg8BL(h%3X4k7e{*kk9 z((_)g605cs$Y-V5u>I9TSN^S8FgkUm^t9NUx^3+;#Z{tD@n-ukTZMEQJ+?)-4pX2WDyo{&)uhW%e?Bk2M)#IscGRv1vgr17j^)1zz;6s-Horxh;eoos5(goe2(M1|5qqFsD z4Bmmkfu7R%G%6a7$z$-@m9GS@;DY0_Ms!YyP9!JsvDGh6d;-R)f=|HUDBg1q^h9TX z#QhUYSjCeAYT(BU)Yz6B{Az(8{nUYzcKI^yp9ZI9hH#Xxj4OV?F`foGv+Pv-3a6E4 zp&E|P;P8b9lt@cS ziL}xoAV^3{H@x?~IqzBT?|kPU_||e=&pdnf?AbH-%zhU4zGj3Jq5|3ud1Hi(=rOn( z@q;t2kW?MAt6WeCiCIV>?tuT2zKBW@X%eI+Ga)qz43b31)Mi3U8YDm1cuPD9O-gow zuQ)KVRH!RSU~v}7RT5B5+CgHL8RTGK77U!IBjREsW?f)eKn`*hNjxIY=Patu3rq(# z$V9qbK_z;((Q!nB0ZLGWsnA0n7#mlk67)m^O<^)};1OIz2U$ZEp=S{DW-5M16iq|z zxB%h;-Ueg`dMgsYI63CE|Kqf5=OjT_87y z#M&$*0cW9X59vArz>`7C!LZl>jR7eEAEW4mg%0rmXdMTlFkCWpxE?TE4@lE_5P$^o zvmSU*rUnECh6f{BJ_72<5h;}M0WSbThVTeTAxA)kI08<|5u_52U}}$m3UYK2^dZ}M zggiaOCNUrb;Auec?dU9&f#7lkiOwTRkPx9b2GogTNXH&S_VE}Vmo+?uV@SuA!4zU( zI**}zj7+CZBfTBuM@i6m_|+IN_~&x%ndtJL*9O=No6xjq;(swA+}<}*ts{I9Wy=#r z1ohyh(io&~B+-73gus>`U4d3Wi;zQC?Jr;uXaUjb8bU!ZVCI3mx*Al*p?hisr8(GY zK|^HMRB$yep^Ld33tiogu;K23HV~pJk*&r+V5^R*FT)-g1#LW3d*vp&X~cjIVXFcv z5a1AY7Se?^2p|%QA<;#ZYElQn9M~EQL484JQ3z>a8SSnLu}JZW^f(OU5E>G}4G09= zz=}GJY}oI&s)V3#FpLEoQxENF3|ek;02{&^dg4PB8No?B=t&y2=!S>|OqdxUmde0J zCPfWMzC*hvftc8EwmK!icLyJpGr+Lr!2ojh8;Q&Ds3O9=LW9u%7WI)a0cXlh9D>mQ z7WEOL)qe+liXzgm|0U`pR{lHaBQfZIi~4mk{}uF+4aR5N0D%Ax78Wd49!TG}!EObT z0UfN#OxWU-kRyk!lMm^4R#Z?3xq5kMG6x#4l|o?wpGEhvFs$(|;6$9zfMP*U5M9dR zuz?dHQgs0hN(DB9%1IeW6)NBr@{$x;*6R>YdZ0UgDDR@iR>9=z8HgTSfEIu!Y%OiH z?8J z%QD3s?1J$&15_+z+B?jmX3qGqs9X%ZpV*>$n?)I4F7d|s7QypoTD&Q}ug!0TTz-;n zsE8RYIL?^hScps<$}oC4MZ77$)qE?`R#4F3kzka=zsm6g%lb{bfxje2xf5BgFM`a8 zCy6pjtF*<~wV!#^?;Y>HrqF zfZgrJ8G7>3{io}pfy-D(^YT@HBM<)%`vIs`#t76ZIcn8i5$&<-JJRE}NbERG_hxQp z&W2p8;XGl}$-C*OJ>H3T4j2E@M)Sn>Y`rSl_@HNcQ|YPVhb0eKJL`6zM^*MYPWeNcaLOd-dAIj zv7_(3K_BM2x^?K|<00*8{G6lU3KxRhy@Hu}?!x)n*c@uZKB3s0XpNmUbq2MZi*CDO z%ZnlsV{zS%@wzM9ul0^xdKoK-zwM-jR#sc?r?M8}b_rqdC2x@4Ili*fev_$M^Pi{Z z%{|__Oq?@w++Jblu)8q?k{n1i>&}~-Oos)($-V66?umGX;bC_()R|zNnPc}N!Nu;b z@KV9S?soPH!^ZC3_3FaH?pDTO#Klh|z)r$;$cfHh>v(iV*ZA3^kj$f=q`L@#V`<;3 z*H)&`>0(m?d6z=ISaMQg%Kf5`xyaJ+KNBSML9MTPyS2mYak|gb(}L~_93-0j`$m3_ zu1`MCY_$+F;+nPuEk@8ta{dS};bUGGm=`xUOL}dVNIAk`7-zzUsLX0|DC`O|^8_hp{p@A@c(#W`CUoivZ3|6jz>Uop#x)wogVbkD zeM4&%Pn)Q7R~^1*nGW)uz3R}8d~zV4t;i<>^4W=eQkq4XHM=E$QnTzeSkDM0su5Nz z=$A`X(_WYFUw(K-QAas4H`luCV{gZ!mR1(W9K})PNWuc4)9DNuihcvJueyoR&*)d( zq3CDitA{G8Y^@8~(b?e>N;s#}6YfS5jx)c^SHDWMe?V!Upc%;<&*RemuTVX{d|IK} zbj32oS0usw=<=o$Wngc%3whszrktJ0z;}=4KlqC1l5tvCRV~zRjfTMEg9~dHth6?X*?u=iq@V;*$dH1_lI<(B^n zcI}O^wBdTZq2M67xLX%r!1LMSH_4lcU($a(m=-F7xoCI1p+Cm<{WX?0KaT)96OxPj z$+;`MpDq59yq%nqX2o2d<$R4OHh@LO&OKt*HrylpEB6=#)*6KM42_1qGG0MlIlSDT z&S5{@5^liAQ{}v*fSlM@W%}vuVDy=&gzLqeV-UPprO-@FNdb! zzf^D~Y(~d9{4ti)Z9hA_kbMorrl#N`2Qsf89xygnu3gIUbFU(tCBC?QHdjgI^YcLt zMYJmEoz8pTc^=vfgCs7P7saS0s;Bfj*$?BzO{Y}a^ND0~u~s5s5 z^YbWTTklF!i}!8GaLW;Y4S(IpKa0|aj2)lpWpibubb=!ALfp7UN=XZe-L*rD@Iu^K z7PgQt9uLEN@IsDWTa4Up6y16JB3{CD(d60CJ(m9Df+%$Er8q}Q&leIOT7Y+UpDl#Q z7Jejgp*#v;4tUio4B$qLBDN8y?I0XLD7ug|A6GFuSk0Mjj)I>*?si zN{Y1{3DWTQ@Pr3l^x47$wa5(?;}?gu5ye@ss25{g8LWYKBn}p5O$KmT`#o!K!b9;L zDrv|n6}{U~a|d0?dvcnk)d6;cyiqW{3Jyy=lXP26=i^09d!vnp`dK;+Y9B#E2^3_`RhgMR0awAyJy4tFxD(hM=VCSp@XXxt#qKUCEgbViv=B@ zmt^A`JQ83LEEHMtlFfb{XMz!Y;~G(H6!|CA0?kB5w#aOW54ho(S$BLXc)W5lG!=&>24rZiY{K?G zvc{v0wfu$s4?So)=>?Waj0QTHI}P->Vd*PJS<)hkcrY}ncb2Yx!gxmpFqL6OLs5u* z%*l)x4wV=p17(ax_wSKxlqEINjN_ykG9$i-eY3OoMs0ds`;uJJFNUdShH5^!s5XD~ zjc5)+CRFo|5Nc9q5Zg0zCrTVr!&14YaQz|)4uv&ByzGsV5XwABURpCzG!LY?caE8FO z&F$?wr!=>l7hBRJ^)`2J%(_do1drT#VW&8MBx(7@>BVsWVNV=uzq3h)+x8R%E`{FL z`RZGz7TK8jNEjB4n<1^o%~{HiO6w=OVDH^PMdjjvhPPW#%A`!&nuPnkZ2 z%;+m$v<$6gMk~f%Ld7&%QPxrSf)=S@g$jG9m@R+0Rkt-pJc#G=X`6P!x&8bgUdTW3 zXJ;21ZaXm)VQ)QP6%W%qvtLe@*v#eW-i_a781+@s(r5OXl75n4{dx@Br>>J`)F;i_ zPMSSFY4+u$Sr0U;IcYXNk=QKS?~U_LcK*%tcG`8{ZYho2ovoSiP?}NQu+8cj37xh$ zsWn`;v*Z0jHBI)%Ut8NAa}Y`m8ouhCkas2YD^N+`J1`2X`{$lb?w7Q5ZHoDVM`81u zF#VmrH+2mTItS0fPQTEx_}qM|g2$r_#iLJv#m)LoI>iGXlYx!oitRb?qBF_FtDEQJ zQ}s+UIRXq+XMj^?W_UfgQ<^GB{`TvG)fICe(P zNH2Wpa=0Ig;j$@KrXSKv#{P8a_z9EQEQ#Nw;^0NaE|+&%7m1s^v!yu0c3F}ewM8|yYfSn&Io=V??(MLLS<)>;?~6x??c?TN=Dyy= z2nD=Kk^O`47F@`adpoo^g&bCVBY3M^ey_Mx%#2KNiJLyo5S@<^m049oPQ5MtZR2zu z?{PUu-%F)7v%2~p6y*}+ES@+Sfm~|Pt`;H38aG#)mh)5@_jvbx5BBCEYON^$c=y2M z1Fp~_Yh%r^e~XS;(P4dq>IivblQDZXrFS}m{k$aix3i8^9=gL;+VT>&%{xXusu@dS zE7*-fkk8nqe6uX~?9}X< zbJnrvS2@SldVhAOjqCL8S7Q+mr$sMky|v2N_t2yW>dikqT45`^_?RVQpvEr#-fiK; z+jVmmK0Rs3&B7NZrf!_Or|wx{XsXv~`{isqJ<~l$&kC%@Ic7e`SHfZ%@nQ^#*;T1c z6%9T;J(Ir->gSAYm-!|ZFCo>c6=h$4ou1qvixImSpMWzH%G`M`?$8X5B&vP1)%(6e zl-1Jxs3Gxrno`OAKg7q|(~&|qxO-)mQp^UmF7=wulRREeuzl28dGQKuq8-PQnD>2S z?GPu{J|yLRU75#i{6I2O>beGRnbtRToVbR}i@9l1Z(m;-qj`Qg&wzHjmBYIq^XXEq zl$)M%L;sD#u7xql*}enyfQ{wYG&}d?7~ej^pGI6y)<4RJ>=-KUy<^b(q}np28v1%Z zefzscuTI%IyK+(T=Pi0S?<@Qs1_whUdpgCpc(rn^l*V)5Da4R}%8HdT&j??TwACO0oG^ zSyquh5s!R^A)mo#GrwSU*b|K_2=^f@nt^}zKB}XK?TA1Y5sYh>T~Ty=Q(<*l(eYD- z6|>^@DZ9~Umq(En?^9orTp!@RHOF9)KXN8rtWmp+P0=x{!s?phHmTj{dDc<-vh`RN z`}jK_W=73Bk}?DJNUM_ntSJy|PWnG@9LWrQdv|o#{HT9;;LLfShFqo#W04A^#AROk zPTuU&!u998CaUAG4Pq#<8%A!Nt$(XVO1Sd-6282qG+$M01QQ{usK+6F!2qZ3AC-z1 zUpLZVG!c8kloQ`i$m6_^A!1Py>kSi~Iig_u3VT8rsZhbagx{>*2;WIGW8AJQjdG7n8tUuQoN)l%BY?j`ae3~!#!Qj$; ze=}z&^D@a_5(!;?n)i6`OrPUs9LY0fZq?}9KF1GM;iK68-NbP*NT@DY@ z9&d+QmHwJ*M}SvogjVWq+KB z?WerK5EpLNXYeOE()dZlpp)rztQyx1h9`VIF5kY%5S-OXW*{y$yQO}a;EC@K%2qEb zsxP-Re_Zv=zfV;hfC@6g$7G1~+=D;JDXb)?nf3r)>vp|-!Wpab~OXX}@2fOU=;M_zeQ{ zj>2O zam57A67nZz^hDHXJf$LUb?XTh+bqD1ykKtGNnuahpcNqV0q2&LcZx_`{>X=$om4Mr zDY`^TM{(s|D$@ zX~0QuFy~u$((Bstg=( zsfd<+H+n8{tJ?idFY0F$i*HJmYxDnoDT)>69W&VdJRm7Zj~~Gq&Xz^FX8nn-ZOi!I`NNW`AWZ%Zg}CF;Uzz_3Spvq z=B>m3ay1L2kk<)@g-eQ}1KLk3-zAj9)w~jV%au3eMYWzT$DAn4n}v<1TXv_w(d?V3 zgC*ai$5+D4og@;<%YPkD$n{`)IJKi5NdFN%>RmPL%ifKyc{<`MGuMdWz+LHP+X}KS0-jkMcT;VnMCa6Kj;B$1@&xw42p`nq#HtMm9>y|Ie(;=B& zb{9>fb5p;!6Sq+hMzh}L-`zS}Qv3Ln>W?n#(2w%Xj=%=Z8I&`mJO(|Kh$i5BDC%3SCs4T+NfRHCi9Q#DA#b@i~*-dYhSov)0|5cA5w& zNO>X!WmMvW6u40dg(dB@r5y#yAIgnT(sNViT-5P#Uf@)7_?)Tm8l%4DsV&WjpL{`A zIxfLN5;MQzwwGX0!z&i)mw04UnD|FVUTkC0%zet#KT#qtjDG3I{))R5%S`b6cvkdQ zr(VrOFnLlRr^nN^#k~Dz5o5UCPLhJoTb6{0U3U{DXuW6cB1~$({ocK0bEGlE&Qiag z{`)|B)s0OUb6;GKpp%iJ3%M>R%->oPV{UxJx8`O7XpQ0l6QZ=fD_^(kJ-Mr3bM(Q< zgDPIiPdu-9zhbh+=ELx|)AjX5Dd$;eXDD_RJ^;QzCpjbkEa-5Ej z*7laKd*p*WqYuq8U35D`HAD`?R;}ed3K4hc)ZF;r?Yt`fL+ti!Zkgmj;wI+TxL{`Y z^^`}>=HnrKmcn_iFMfpJS=_GLLUEv6ry?Z?LU1gstyw5#rn^X{*nKb$MR z9Mj^E>y6@PjxT<|7x`kCjOf`=j48?-T4oa{H; zXBQhTE>a&3bT0qBs+Y^YAd&GgusF=qvu|Ij%&gmEZ=7c(JYw~CoR(#Jfw+Bl&C=2E z)8EzBrS0zjv<`VTc@kfr8CI7Ld{dh;OiR>cU*Pplwt%dGx};}ibg5g`j+NR&-Ar9T z$U7^&EZjkE{d&L?mt#|P0VzZv6yhNF{uyb>#=W2UrqZ|%8p{0R7M=w5rZMbzD~d1K zDmYK4t?oDbCnQI6Q6yAOhIh!C?PyIQrXe_i`Q5rcF>b|3fqNlf057Oi#nLTTI1_wKwptY~RBrJ;>$ zyl$KG{M&PE!y}y{wp>GX4()*%uY1DZuDw%RDyUw-6lO1m_9W?4OkX{`5y(R?r&FJ7 z#ql86CTm2qmyvGXflLt3|BH@XLS3?z&;zX>#R|5VRskBLk^KhsiSO8a&za49d9mv=#EE0c&M zDQ95xtxeMx);Ebh!M*gJ8!Xz<%lJkd_33{@Z@Q4@OFCkA``gr2u)aw+I}jswX2{n@ zv*OvDqUK%h?Qf|yAB$aOcD0mD+zyVWl{QE#pSiv45zy9BZ~7~BF%nbT^&!mTSikyc zuu^lpLy7dQF?oK$=4jP{O{La&M;l3*KYTeRe{bjY_S}t$JzzOWpe!eCOrc0KRvC3{ zm!@-qDY?}tH0p1$qY+vXjnD{p9|_3r=r2MUBh{|N9`4D)kl+`6z zSGYEh?ujSk(Iu`PCe0MRME{aAuSv7&!1P##5rmQ)InP{4l1v-8V1OAawfp&YYrsZ~ zT4MOfYk3K~Qt;OxO)gJW;r@Gmm7fdrGL@<0WNn4TT6^?`bn=y%$d}dP_sEymDWiQW z0mcGLr5^HJhNjz_Vozz5DhrYNv&CZjNPX()Fj6nRG=|iZn+k20<(Zsqdg$LRHHSSQ z{&K95F=#_7x!0KG$S~>h@TG%H$p^(PJ0$KYrmFvvc4dENOiHZ zO{pcB5(0Sx0)Z)DGrf{<5zf zu1|DcdRnZCzkQV~H9@i5HSofcK>gv}MpL`9j>2YMU02=Tt|5Q74_SHXn7*vcBtCpO zFX$5G%)b3R8Cxy$X6E}}$+S3s2_yDjq@L;!s-Q*w`|VgSyYD~F#h>9OjhEs3P=q~8 zO8D2JP6QiEw7He;b424j#b0esy8v?2E^oIl0pB)$_TI6W7?sSky;JP7y%sTT;5M2(Wc=7QxvD`yU`2Fs+ zfLjYxAv|j5iBbr8`{Q4>lx7Xb4W37`Qxgek?6{@?N^HHp&z$~edbih z#HqIS(?P#awRN0+^7VB74LsAcc;(;dK3pKS$rHI5NOto{sXJGOPs!6B7d_hn6@Sdd zzF?h9vXSLUGs|PSk8bX`#w2%l{Rmr?^;?CW-S70hGX73lge1ew4tLruW{vyCOlgVU z*H0haazZMUbKKseSXKY+SH|O-Q51E}46U>jRJQT@G_Egm6XZNrd{X;_Y_2TLb)1%J z{`B&XQ&W4b%2>1se{-K_VTmM((avj}eN~ocr!GU!8M{(yzigFd$Tl-t+9^R~&t+Nn z(6HuHSv$1?y?A)3{pXbD2h|J9I*dOEMswVSv-j;1(o6I9GX?Q-4+8^_)s)fKguQ?0 zZAUp8r#ywe~hevt(%(8w`*P3--qP>AP_g) zS-LKixl@bfjHNiJZrN`qoaWU3&zp^-=}AMuyLgH&8jrZCG^erts!wYX6f6`A799i> zO$4PgI6+UV^PD|XoPI(TGYbXpP#pE;plC}}ffH4je5|!z->UK@;J(EtLEifm1)wm1 zC~y+EFVxsa`b7l68#J>8t*h#8P8-W@87c#Y7QOluy@#4r%S|#?gTrxL%tJz@ybGt> zYAW1^*!73XN_pQCM7fW=w8-NcJ0I@e{L;eU^GaMO_uVatp2Ctfg8H9E#>Fh}qI4;S z%H{t?L`gaH1XtH8=ic8Bw)D{BA`MF0yuE8H7>nQi5u>juQJ@&eVcH~B>@iO!c-wuR zQB%sk$;53wZpq@bT;R8cY*zH8-MgQ+vJ$T>RIX?~%J<(9HZ03N)XayY3MDyI-NZGH ze=FoMLlZcMby6)(|3Zg3+3bs#4)5A+EIu25?V9qO`tYYzhttardyPu}XA5jGdtpH@ zeFwIWU+fI|TXu80WeiCe_C5CXksLUyxf@a(=kMKWBz{4)PciS?hFFdBzx9Ma?>8^% z4PH@qzD####Q9yuzZX3?wAM+r1-cV$ug{6~abD(6eXe{nPAc|Jh|5xchu=utQx5CJ z7Y2Rg($(GSKCUd;F*WSJ2o;((h$eXMT+OgPTPF4Jn!9}Y%G;nh*LtF`M|Y)2mtUqm z-Fs^joI0cX#WJkU;ZEX8@tRkZ;dp<R)7=RTW{Tg}hu zij6C(sMIw;F82^I-VOed7ysFUd4n^P3qvj%r5c67muS1vR_l{L{U+TUIYlmFyh zJrjBR`a`k@J(#u|9uIS*W{=8WgeQJbxINx2JXy-SZ6@zA*-Ere%rO0vQAB}EAF2DKs4nJ9A$0Evn;G(Fqn7P| zSv8*iepI{ihT5uo{blK1Nk<`aa3*O)pjN(YN%Rmx`?Y0U#L4uZ*vr0MHzcjUd@6Gd`L7!B z0(w-DvaJjHPPX$N)of_`W!zceYVJ;Y_IOFESz_|ePCy<+S2)s<5`76fiakS2npyDm zSK%6eo8U@7)dRK(g3M~yd$092hdmCrcOQloR<=C-myx~xQ4zbtg~4`0g6k|+=ME;y zhiIS1cESVstfWSy+-GUGu1?k;BA*WIll88e=Wn!!kyA71D-7}p-P3lmj##4jvEan0 zRR3zh=>wa=SNp00z$Cz06ve-X^ZgcOuu!;QL(i!Hnfa^>J)kMllu26Hz{=2UhWw>iq@^Gjw=2A4h%s zSjNtpHbbtU?3Y8uH1zy1Z&YRU`fU=vhwF36zPxY$?Rw9Q582rbXO@S*y_x4D*^-0M zk0Z;Zy&C05E^Q%~uw6U3i>>hFE;eDfi_NVHxr+@UBO^pR2CB)Qz(<4Yfe^Ma!WcUt z4kH)nI0ZB#q&tLu{GU|f|CdxIj&jOaqJ4M%lS=&Gq%xHJwuKl$_<#RFB}TYwFVH$- zv`5>3ADnBN0YK)p#X$*o{y-3f%g9(!_i_<_AVU88Pb%@h|G^}_tp7i$#7+S~vULL9 zFLF>k=oZza2=Mo=qrD(!&k^onCJfpPW+58r$6dhR>j7FHA?jtK3aV%VipU*B$UR7I z|4AiArlbNjPzCqZA?<@$s3zCJ0NiO*1M(9NF_0|X5N2huK64G+;zSLU;qz!uH9#Qb z1qa#?0wEj0>i?h;i~kQManMt$$^Vy1jNH2B6i@&L7Qg{qsL)0VD@JxqM9($~}PmfJJ~$fXOEU=nV8XdX)Hf za0cjaz`^x6VFm;H)&tnL9zbaH0QT(|P@QYxGNf7#=OyeaSTTSPHtR8ESk37`t_ewVr0kvCzCkkm9Nu(Qi+lM29#m(7}O$iw<8*a zfOEXVg!Uu}a(}ou4!N5V5g;)EIRn862ORu?#XNz!>IOG4lE5UfBB4QqVD$ki|8FWW zGNwCV0GU~*fG}nVLWZ!{g+UJ2FUo^OQ&hl!@SnLg0{*wCkJ!RSRT7a~)3`MQIH1vg zQ;8w!BL`CcZ_t;!MzD$;Ao-tBA9)V{H|Qe~2suFV|B3oe|2OC(`!=SW43;)0EIoX5 zC+ETnegGRB=>BxD)FDpT0w@0-Xq?b~Pwp{fM;mINu!mv8n820*uKZ*K*j9zjpbF(4 zC|AH{faSjP676mWu6=Ym;RJ)pDj>;90-aV8=(LhRrl7K_42N6aO ze<2L=ggs0RuASW1s08kuu!K+O)|}wl$#mpEIUU@DdmNo$$|g`Yf$|Ai z+76~+9YL8%tIfvbJF(|g(t6JXoe%L>B{ch*_hOL9R`3;(@_y*|@NfzC<|A8T2behWDeV=7+m-8`(*>vHxOBKPrH_16Jlk~U`5yU&@LA=3aX%rtbBSe(>jKhiRhCH{ z)Gh0wXTvhdX1Xf3oIkA3O6-gO*j=x2XK2_>b^fsmJnTtsRThsXt$f!Xu@7_;cdFMt zdN%nOExcP0e)kPIaS^%XfU;I<;(>b>D)*8vKAvY6c|9Y;dQrvjhntaXPuew8$r~vx zmV|LC*fSxKrLwPQR6U)&Q+My`kNq~4q>d31j^pL(q$O$NI_jRRnn>Pl1sn#vjVL`^ zEjzQ0E5DxbwW{u?8!w+Vq1mu$Qkk1)w~=_>KmwULzxCFfA#pGN!J9(c1wG8~tK)as ze&;=O3;b|C$N51TyOJu&OC(KIS;DF;F%y~5a#ZOMCMC3DTcNupzqC;Gh%*5>Id9;i zbCb{GdOaVPowcPkBXN`Y_$@!=y!RJ}3IQs`L-o9ueO9YDnM>E~anDZKk@}-LoW|<|MqDGt64wm3+h}Lf6xD@U|ap0l9pkA zvc`N(vTNIo^&t|qaejloJBOZSM&dTE9b#RkTyq6;(S0xfN>y&vPQ>3A(^)!dm z!Y|;3cOsgVY(w5XH_-YEYpbGJN6I%yQZxSznv3i}j|mUNqeVIN&9u2R`er(+e>UF# z@SC0mdQ>=41I={iL8h}GIU_v#ZTvQx<1C>>Uv@7wqHon*(Nn`Vc&KrE^pLPN2Ncow z>e|#$L{2WB(iXa&RCGq2O4VF_#P7gt<>+JI4{K@%?c-R6{7PJ&0rmWtJmvH1b3gCn z*zkx6Ji4YWe<}a7p$sKwj(2^H#`D*z$9!bDp&V7|EjQx^i{7i~iT_~@)6LDiZBZ#E zt>0RG{j%1s$CZpKRb1nSYxcRn#JsOt#qS&4@ASU15-%+>ey1Ym8)?L<>37D55w_OO z?LsmNTCw6ee_xe}DlhlQ^Hv3`l?z1W9?sB&WKUmXtJ$o4^eqX?zV%a%J#NG9@;iev zLP7>V(T$SMQ#lRGG#BFddJRYx2tSD)@M6jE$k6X;n(*bym@KshX$aWAl5MB%lM?6< zU3-h^ZC*CZ<{0dm($v`2NUS-c_3jy;nkyr-*}CpLW{Dktnq8$lWdTQVY&EOST zo2)>lDMFHKWC9j{6Yv?HvzQJxi;;=9%l`P}?#SX)9{9mvU|IGbK6zaRew_ik7Y=?M zt1>nLnU{Pl{tX#?Vj(h%P*OSr77ZU#Iy08RGt5rKf%-~5zpt@-HR0D8Dq|~gRT&hF z*8Jd8)9?Q--CR6c_Mwh;>(An%0sh|8)7H*|)G8wk*K&%RgHn$YuHC}?{lm}jL^X3x zL67U2xfpG*N#5D9gUQIScXMHqL40?)7D zZGBFkz9;;R92ZM?BIf1={12mJ6YrCqOwx`_L>q(OcWRepE2&5{%7(O*@`Uwiz7$vt zzEnk1({@hjUh5?@GxA{WmX_E{M0gq+FBI7o_6p5SLzf<^3Sus_7H$1O}jq|!fDRVTTNw|d)k7lgGXZi}GOA$t{ zFBAkLjPPExn6kHoPKEdID>$%3zcvnEw74{+R%ZC6H*?`a&2~Jsu=9|fOOw;LZTvX4 z3-Cgpn}~z5pms(^?p6+8rQ7^>a}#2We8HRVSsz-|9=TKMrv4ons`F;7*!pBFwSW^I zm%+ikcca@>tWB=>=(eYDpA%h`e26pOY??p z$HNR78xwL-@5sJjV%u3#Q7o+G7N5?quUyY1^Yi^qRQyXwSe{9SinVW%y@8|!M)*j>VT2Svo<)z$KCm_&C_ltL9HVQxu4EQ9oPI&7a0 zRo@o|vGiX;`qgq3kgI}R0OT^LdKZZ85Hn}P_Qg?o4VdQzxe};f2Qgy( zvC}Vg7>FS1pF0d>92ScZh`H}ddh>O6a4e6+xZzSPivd;wKD;Z5b#7Y%&>av9PzI0{ z&=8OuP!*6L&<>CQPzjI|&>WB!Pzz8D&=n95P#%y2&;&(C8up~qzLj(lU9aj7aR4a+ zi2&(Q)bVUFxjBIxv*iC^bNm(Xq+Ac>Z-8}xO@Iw3A}?-eZkA&O@$C{`{`C~?s|*{p z#tk|n`fD`z%Z<^=uo6LC7@;)KvVkmSX51ph!C)dEd2AJn3 zvnnib!@VEh_^N}_mTetzU+eOu;tVpgWse#o+ff6mC!bd70i3aj1EX<2Xo6PDM<7;| zqHDF19$l+eD(KP{192!42)vp{1JT{-$d2ws9egAZII5#dcr*mW954MIiZ3&O0oaSn zuoqonFG_-#H<`b`?;%A(L>18Ppp6D=;_CnVD|2thp9M8&jd@YD`Q>mV|SA#ri|kL@3{?mcW^ z_;AQhEiV{nA6e*WOzz_cCF|5jiq37f~yT zNH9lYj|s?QK~9Cr@4>{(f#60m|I7M6i4cwWQ3tk>-z5F72@0siA`l?IO<9NvJk=tY z%`>P<^&50Ryb#@kk@b`%9H<1F5Bd8ZS@t5ZxM0UEYokkS`vojC26P>};sCM%QUVGB z5&?1p(xWH_tGt>4UFFrM0byI}z{Wu?6+jjy53FqDA^~KvQp5U2E)qZ%aM@G96Nw>O zM*Y0}OAOo;gK{O5E1}E=E=vGb1G)nq0%8Gr1Ihq40I~w60vZDT0VD^E08|C+0ptfP z0<;5M2P6Ot22=uU1LOqE0W=3(0Hg(c52yt=0w@Mp3HbkuxX;wMH0GsceLL5b>8-%R z(gzNQD!JROiH9)GK-4Te&p3Pwy8Bt*7xY}w&QG; zaX;-NUdr9;FLrAmPqnp7BNr-KEAbo`_`6-(sybGYOFXL5OJ`B>7$f0&_?AOz1&=D{ zdqmPUmeQlCmacuz^s8%Avxi@AoP1m-***W)S?ZIvT;f3$@vluom4)^_JvY!)BnsO|GZ13+FZQ8%S!c8X0&=>{tl3yqPX~n6~{R`ewvW zVagX`lt-g-T&aJR2LDN63{6*fP)7b=fkH!H)#v4zk7}v1H>6^Ywv%rvH{Q8)<{Ins zVYUp0%JmK{y}jAZpZx25cwE`FW>!yujQ@C%moX96u!C#NI|K|kWBl}>&|QPe}{zG{VUZnF^M+v z_7=oVaph){6hh{C8gWP2-gB0T3o*A}fB3ht^6Xe7RQ5@=u}ya{IhCcD^?dNXWbUd& z=7$7UbDRIXp4h|>e7sWfTTQo3u-8k=b(90C_+#&R_55Nti!k$J6E&@fqN%8Sm-&{S z;QW`ZmJ80l!e2dVni}Smx;7r0?mZP4yI}e$_l?ffRB2|O=<;sTk$sSbiP)d3h7)%h z1MptAOvpYc{73!froC(OywQhw;#+-JSo%6kTYb&X-mCV zmh+Ir$tfgi=iZo#g6*W3tJKH3z?I2r-Ph#feXc*xan!uuPT;@i=2&7yee}aDa3#5a zsd&=$qrF((j_&i(dz>|8Ps)0NR#H*%{zv=De^-^1+@wmZGAYOP@NbWB@DwANR5=xTT)tmN>=lYGA zbF)@leg!XZ*|5-=RVw}Md5O7DobvOT*Uit@p5fkQeS3F7<3Ul1X+r$5Y;O>U`RMUm zpUCIC@-G$yVvYx{@XQZxs5IuvUN54)<%Bb9I3`c|waT}4T5`r+V5q9?e90V!JI0Gq z6`x%G(SgR7dny^nWnNcyY;pLkWvj7XtUIhs-YVYsLtro&5JdZuoR?3vfF~f9^*O^O zi!HCuoA;UT(mk+MUE6NAeCTVs@P|NuEWl;pO-JR|yVa$n?4emsG5I|Nt=$|HU#rMA z^Z#gj?;KaWA;AfwsBa{rEHKgW`JNdrPw;dmAWkcOfpquLng(idH87We4Ef?D-A?yl z9eYJlR+3Ue^Mb1UBZ;Oj7v8GKB|ReLm+!6ew3A>-Qk1NKo>&*WWF;fr6rl~d@W7?D z>?sZ^w4bEbz1w%z3tRlXk{+E}zumiUgz&7_GJj`+7gCX%A#V<@?3lrrRc76pFJaDk z+y+1RW5@AYlERZ7quse(Tp?iIRb89&<+GJ->U!qRiYnea-A?;pg{F$vXG*26i`yrV z^{QmViN)MAF+wS0v(p1s@iRrfslR8b!J7n=5!)R_4{30eVBK7vSg(cmD%#M)Hqo+W zf^(M*=bD{t2X9B2govA5k}5jz!_VR)Q4Q)F6(?0)1qmW#bZVBmCOG#F>SIJx<_BhnsOW1_#_ywJJNV`{l8Tte z@x5j*+h^TcsVwSdtf#?bC*ONG<2I7npuQz{Qq@wFC+a3wTf+1#G;7y#w^ZG~;BOiA zw_dWxdhsSB_B%ly@-Q&5b@OJV=arLzIVM^TAp;BdiV;bf*`6B6r>_Yg*8=Zr#79aI z@AtubsW;a94m&|d`UZFDA8h)sSu7Ci{bYnCcXY>NX$-NE3e(TnRLsNEk2_X;q_#orp9!pDsc5|s$H8+)Zt&cw*DO|uwd(Y^ z(CI&VSY!FifOEGE=2)+#$X(2W4O4=yt{wB;5=;NQ-v!j@LiS+o+FJZXdC+kyMmS~C zdU_y=zSOJsq_YI^kpiSMN9YWBgdL)YjRNp;-x-;$yeURlcE^0TNkaT`f%P}}G_hi(i^qKWIvLB%6Ec%Z!Nmfpl#EwxwC2YO_mxYUI>ECf?h z+flG2Vu5pZG%4wWTwN!zcxM*N5d zKWb-&66s3AkJaGOY#$7VBV(b2ouNK6I=3V+5x{79Q*Lw*o zk9JH#Zkau(ye~W^-j}j*%*peSP##N}zn!9_JgYt^_QAlJecxSmY}G0%{Uh?aceyw* zk6B_Kdc;V}U6f!I7dfb>Fy9~~%#ckr(dSFQD1qf|#yZ5`L`S5}KE%((Hytj~aHdD? zvx$cORRI^={;x|2;`ZpG+L4F>ADXc<#>v^e$#Ux$Zi|-?=K5Pg7f-b(K=d zN9Gxmk)S{ldAeKzZM%)Q5zgm})H2-)39=feFqaS`Dt%qT5AK*8{qZX#agJ99-F?&C-gPIOZe1R;z7Rgr_3?5`l-+t z?X1piY&$HAhopF?22a1A(bLDaBY4gAn)TG8=L6?x#=2i;QVAwcof6Z(ThpX~7#W0S z@27Q2(Pp~POlwN37yYJ*zmC_B(N1Jj;fu!PfFoM7T7)=uyJc6v5zEB%he%Z=RE^AP z$s$#bm!ZmVZ2B=`{vM9)saN!$>}s0Sk#9UOXvdBs0fL#e6}3}6cxsq!x8PD_oD5L4 z-CmT2Ry~HQm4o3^={pH#$Lr&nFef$6rC34Lr?)r*uud($I$Sp=r*OrhyN|kg{8fAe zr)lgI9wp3j-EJvSP&E$m6&Sh9x&;S?D*>Gv49|ad;MwIZT;UY3`PR9V7O@$66>O%i zo6Dd!Rl(+<_y`$dvl(pOWEwA(EiC)G>T8SrNBX}nNK-LE7w?tJhk>3t`|P@l>vWtXc=i0a~~YB-z}9uoMZum_mfP- z(gwAdosK1g?Ti}7fzG8$h>Mdjmv6ooggjg%dc%cIb5d(j0`i3~n~C_; zC#;KWmO02U@AAN)zlo1K--#!P!e8^CcUuI;nCdHYEWen2(PJF<4=Pf9e=$|!Hc+y-Cxk>3{z$K9^0uja6Fq`13E zm29IiE>KmpZdpL#h!w92Bj8`N$U(np!6JI*vGi_|=NS2EMppCe^w5nf%WFw`Q03sU z6pmEk;PAQYZ}PSmaX!?~0asR}-+3b)?>P)_^1 zA11RLnG$Kl{t{TEo*m%1yu3F40A0_=o#G>BnskmTPnsp@iG4sUrk%>*&Gp!hnj4UP zEz3g6pYp6fx6JLu;%6S$m$sdIiGoE`M56`9fAuYe4Q{vJ*Y9BN48OxOvJ`w=I@Wi^ zwjfiM@xAQTSV;!tPaKjooR3A{l00VX{qtAKOY9Ez`(Nv6_cEI`bz@8`go352_vKvb z=QlphY1*=$&kEJ36Rqqw`!i!9I5l}qMWlq`lc2Hj`Z#W00448pReFWkCOJyx9{h^V z$9ntH$qrm}c@58{E_L&SrB4>(JI#;;_bUB)hR=BzU^5x=?9x*~{XWJ>OQD-NQtTsE zr-hD0)ag{xWgn(gI%uVBDJ>6E-dTzsEg4}hK~4`?h4p&$=~SN2K8&k$z)Ra&SRST- zJ8WHU?s)5Y?OeVNo2}3z%U*RYH6|LNr_60ZCfPMdPGxOnE-&&`H@V+GM}HpOShadL z8Z-@>+D&`XpW8lod^HN+zy0R-=K-x_@n*lPxa+Uzatf~m*eLd&>#Ssn?=JBwdQ{}- z6K!;4GuE?6PujU3SB+J_d$S11=`pr$+`Fd5iMiAx<|fS8wn5C;$#K29!GAsb*~+UY zyZjwvrzhOwil0>xv~4F zY%Ys85#nekCM9{aD6C5g7aWOkbTYPfEd=@;Kk~2{?{k=b9@kQC%(isP#XOw9k`>#gIe3ckHz5ET%W5|B;_DG8-RT2i_}Bqc?pTR^(IrKCYXIz^;Y zfkPeyM7pH=-Fx^w_r0I@-sk;i&7AM7Su=Z|nRU*dwbxpgq%qaDi2*5(y_eOpGWtaL z)cq6PQyyRaRl_xydQ)_ss4D3~oL^Y^I6q`3MnTE+t+FD)JQ|%s{6gB}c4{^i0VPD;-!S7vmIZ`A){;+NCY zm!yg*#Q~Mv^h1*y*)5G8E29>60vR@`S1cnjSU@X|JOta{@xP%&sUxD(0dx+{TG8-MglW=4?Z~?i||P{PAQ&g zSp9y3uzK=+H|o(*)k zdp}V4x#80r$p{?+%+o?#jI-yNpIS*!KVjc4z{OynJixqNgo{zW2$h(aA<2UQ-z;zX zI2Z+yp#Ij=(hNs=%XU|t79|bq`zVJ0vKY^F@nyIa_wXz2$<>a~OUp=y z+^zyT&U+JU973$cT#lrDs+i_ksZa-H+RsF9q$&IJ_}%2q!Q95ceA|hGB*gn2_Na-6 zu5B`G=eB*+qSz<;*CrI9^aCz47&<+TrLgG&dm zosu^74cN>AC%-L?K_AGUx=H;Vm%=h*2+#2Swox*|^(09j{)b*wY%=t~fqTam{{LRp zXfpJrZG#&AL+@_6f49W<=;sRY!+s?EcYjhk$J`|2OX4=1q=h05nv7X3ID@99T*H9w66yfpqSn!}vc z$>J-;BNo1QlVle2=^&BCKGkRv>+s5p0()Q49HOkwfE(dRe-a{0?$aP{Yii75b|qt6 z+7tq;_lowv6MNAjU+`748RV!dkN&vq8hG(~6R&XPIB4uuXKKb|N${ul&1Q$b4#5J7 z(-OvlWThM~uh<*|nTmr+gKuK@k~zmcTO4qS3;e^09a9(o#8u|6+rDi7lTwSMLQOV= zNTf-nlA8VB)eLEjBie_ID5I<`ZPD(xRa^C<-Ctym!l+E@ zB#)ZDTug8q8kt`HOnNQR&oWCaUhDmONu0Ut{Tg!Z#Mt=l0AZj+a9)6%&wKp!wn&k)Tj8C7w#YSogQE6dbCGMaP>GL>T*G5mpJ&>V zKA?a~{JSDWM-X4;n`7nXAvyKqxbKl`7ZBqzg_j!TjtYS==5EgEr^KS2$so$Hz$Uc- zCAsqg;f=h<9$pL52e_~Z0+FIfSVYCKvS&XeV)RGk+9E9CiI-X?EFu{akqe2?4yPQ; zheg;yA~qor8H>^f#IOhok)k13#0ex~5EAjAJ92H$ponuQ;6t^BV7x^$ql@jy$HrTB zLKYFK`?rQjv8K^cNbYvIzgjlnb|@NgJkA(Y-lSyP#=%sQ58$e2=QxTiTES@kLqoS` zit#2ZQQzOBz%85e3>UGx&AfD}reC7FEz=Pg~kt?HGW@bnZ`${&Z6v#a<^;*JlJrS16{DGPHj zybnCGJxU^I&h__${{>@(SgPeK#VL&`zij@O%zvjyQ&>|v`sDcSW0F3>S5L%!>xj8@ z>nG2@nUi^(j%V^2`DZq>_5KMcr(oQ)!_65fRrYZ3U|L}OyL2quq1@iLTOE`Wm$*op zcNul^q>iGiR`$Yo@mR4?ak7f{Z?EM9z(tgI z*=B!UG)gHJVZ=%n?AF)YG3Vl+klDC)D#E-CS+Vd}c-nQz_>1N+x1ClBG;ol|!^)*} zP3YM7|G6UmP~P4>~E*jW;yP-(TkQ943(&m#>q#$0H|<9m0f0IS!*}nk#tv zIBNDBTd04y8QWzTZ_E!?$nAF`X}Tr`*-7p)jgh+dLA|!g8pDwji|@jkeH}J9ODm-L z+}@hHZR8E^f23Y=GmaeOIDEG}VFQg8Z@gicW~{jqF2vb2(aPUt3yn+2*LgX>=j09z zHpFqbJy^kf(1~Q}nqW>db{-~mw~naLZ)6V^X%4Dbr_5x3FmP<{)wTP2Vn&MjwK@DUAH`p zkWZ<i&`ZYPQ!(t%c`>A=Q3AXn9I5Z zelAmhp3DA{JQK3zj;nw9&P(4@<9oWHXPu^U0KS)!f08NzBDS;kKta8--YUhNp1Xq1AWp^TN zn|Vi{mcz2jsdi>m&&^qr>Hx%z)2YTji1GG*^-!R?f zyt%fdW~WHh(47(%;M;Q80t-O%+`NDV+&-N;g9Y5*uf~Q1eEzUvMafvq+JAclAuOYz zn}m~H?)jyp<_Uv@;Tev$jgd}J%V8EIpdZI`^E)J)3kZS)Kr`sa zg9ONGxRbkW=9pHW{j{Q_EuM`uIMdSJyxgDa>aoQBgt*^riJglOHqda#X|ACz7D_T` z)X{LqXm)z3;jZtt8C7!l(#=Ly!~J3Np^NtB{QlI_%Bl4cD@3nlxl%cK!Wh!W!2LtX zA%@!~zxL+6)oR+xDN?Ap&(co5oIHLE>2EL{Glq;a5TGv>iZO7{E;(d$+pH@&v~b(> zFFAbZwwYUUsO7d9S8`~!KNV|I&6AI?jT%FKFmSIdIZW7}3a^}6T&d3QwzQKh_k;!- z-=AXWwX_p27gE=7*LB;3y42<%gtax?-7z)Q^8Qw?m^z1+dRDLzA{sg@9fNpbyx**o}&& z7~)*JF*smW#Y{PUGG@STw;tC#MZZ2nJi){z^Xb`uQ5kY=ZQ}6p5$<~t7evrb$li@@ z9bAJK2EX+g+L;HinoiuBHT(UYn+>+@=Vw15-1S^|)($9$kT*EzVkbWog*oFVZ$IB5 zj5(pWxoyTd=l7eHW={wM$!gMq{;e^-|A@+^HX3eoIzd{I-|(wl`th&1_Sw!>)OK^V zuXDb~cImyQ#(lTQ^_btb&B(=e-E4S_qZN3JW=KfI(pk3$_6KJXco+&QShgQ5+dT-D zjU5Zi#^s#DUvRYg))y7dlk=@)bYk+mCFRA+#{5V8(k0UU>}VV63QT4KOcUY1)}2)b z{mIQ2y~EFV1a;TRnwC`een{F_go+6*|$un)@{x=VjP3 zKKhdqj3s`e)90V4kzZ6yYer=usdAuwBuPX@=6Mm!b7*mJksWD$B)KVOpYxdsUCV4! zUVCjZO@&jF`gxArdG{T>Au)`WoJ%+!wV9eH6YUlH^q_tSKL5bt?8nUOm#!L_H2T z9VagmObE%p5+NFJ-r`O--hG>m49b_hVb83t+V|t2SwJ&BoVn^%Z@_`y`Fv4Cpr5s# zNP~l8VJ%*8=RUUWU+2W?Y43l$uZmm$^?4CqZhVWc__$9wYL?K&hgIJnX!_0LeSL)K zHw&*_bL}T(hMwAlch`Bm6K*Y@&gPqbYtuNcVtI&=^-jq9{*)da@sI&QX{%=(Qq(X1 zz;mxnLh*6HLB4>-k=|V5^6Rs{^isM05N>^9^q;THXwpp3&ZfyrKBO*FI%m{meIYRK zI6;u-@1-|SAM{qa4R3!iBJV~mbRY`1dd$`rc6??>+@}k_fsd_(0y-js|RVhKf z0IZ^B0X5>W>huTld0n`7KF8z|rK!9m7d&M`lk|MVa%+6VJm>pho1!oY`EB*Qk(DP& zgK%~1hj~t4(~ar<8*ke0NLTtGTU+OZS~Hp|@C%BU8>3346mv|&&nM9?wodkn^3!RZ z_sHs7ZT@Hp67+{5_D?N~hkEtj|LJW+UM!6_rjyLtU>gWL?8(LLKYwU;_c@Nt@?p3} zFyj3M{?SW1HiPvJA%bAJaejMt$%UWQiZi;=bptvKTRAd%HRHhu$iozJK5u~?KWDCU z?f^%26yRG5IgSc;Ksj`>{R3P;5*=)iMaU8O*aAoXYgbmtw^g}Utce2l!z~AX_N2fU z7Ua!A0>614n*ESxEFGjkIz2pG6G*rf2{H{`JHbLeuf32fE9j~PPXHMPd%^O6q&Tb~ zm5&_c2oL4#0Y1IDz@c><$hrp)Z6^oMcN$8Rrc1a0vKhIc12MpF-WmAKr-Qi@iIo?; zqDBJ8d1v6$Ity@Yzz!uaa|wb{4TU(dbhv{F3xh$}fuAuL`wYOS{sto%0mq_nFJUME z0^}PEGKz`Ab3MNH1col*v33wPxCUB)Upx4Q00&>dZVcUFG_2hUcn}Ye{S6&3f?RRW z;A$OoYxpa1(BVn)f?Q_w@LVE+RFHnG49Xy<$kJg1PbCASI&y@?k%2GF4Mrm%Piz9L z3XqwJ1F(Uw*B-7a!uQ-B%8f-WkGZRq2E0TWfHV3%;HPN<{KSDbe#Qsbi98c{#%2P~ zSS8>>ssuXy-_raj0oT&&Y(Yc76?F*k=Yv766aQ2J_t0x6Ut%!qwM(x&@Es-up058b z&5z)9J{;iE+XB*n{m(Q%Eg%h825^cu1c3sEz+|t}{49gPHGx08CU8QAUbTmOR z5dcR390Bk>Fu`>|Nr6WzDX8B9lT`pz40s-cByTRbV9Ni)QTIPd-mbF|fvji$GtG|y zxXb_lN!~=j-4_Ab$3#FrBN5O`1i1N&fXfvDaS=p-Bd`c?3KjuL_xY{~mXt707R8qG3CXH$;`6agmGG;)Gn1&ueHZ zOkhuJa>>^{a6YHTkd7EQC_&zT$|GpyCj}gP!fWsn_?e3UeGm!OzcGLzS9)2kAQ6y< za0uWI00$|~S^;}GBqlE4*b3kv3Q8+r-v;dN0EVIwOhI|Yz?v5UnqvrTYM^4S6aKM7 zYOGW29E20N0@=P=!8Qk(5e;6z%EcSX_60fZXTn|2iQqkW1yT`S0j1RnU`i+~h$*!J zw9!~P#6!XM1@QsoKotZBfs(ID-ommch6RAJuM@GAfdrCHu#_3d(SHicq6lKE04=r! zrk)Oj0ObK^Q*$R=05K3|fGTT*ugl&UzTPd6kWmPVF%T0_2PS$1bj`IUyAKb11n!X+ zq{Dmz>O^1!ifjP6_xr-*3j%e94z3?Ztb7H^x5froKqn)>0`i|BfciXu2ExbMy$x{i z&G3M4CLErw3-}_D&=*;x6~qGsL<2@}8PZ^khw!8+pq1G6$oB3mNH&H9dHayStsM#S z_ECT}Y6n)Z9azD3UN9i3RdtoSi#$11#g2DybV_HHdw*iUpK zhk^kF49Evc^BTX_?fC#V2e>)lHwS}U2W?n|$KIU;ln+o4wBc9}3=V=eT<4M#2D#3J zK^&9oymJ3#$ z7HQ2mwNjHMe-=cTM7CNW>Ctk=`qCE-H~75D6Lx;ym5?`%N&XV)Wp6)J<>Y4C zNjbG^KjmV@rSIy`}yuow#m(2(cdwwgsAal5RwHW>Aj-u zF_T1oF}rV1HJ?6s@?ka9gBGX4a^p#2SW?}Nk5H*l`V;3;-$KTsumD^v{@DwolpSQpyVe7oB}PhltJr(OIe@uswO<-+0-yJN`ga(&A9^t0;z ztATng=NJ3SQ!$~GwvN*7t;;*JHUqCoe6@JBmLHz3`HClQ2|Fb?te{)xn{~aSiqUWe>1rNj zZ0XbH{l&`a1lO1^ZcMyF2HbJ$^IeY+VM3PATU~|Hag-*gI$ku2`Y@QHL`nZ+>+yuqHukt3!P%jDwkr^gRMl32L`VB#Lv|&Pwoey_KZ{hrwB=&I< z^+_~AnLSC4wDX!q`?#AxCZ+AjOHmS_ z+{EhogdTn^WagWTG+vJDts5VA%gCf8p%*%DRZ1t`NyI)Lj6M4EaCo`r?A^oPdwB?;#ivXMGaPBL}K+!#usoNz*uxU zf-OQUkM_e4<@+x{ClMHd{xCo+zAy{)hXI;0I&@zi;qT#q3rd8MKzKrXPhfyT5gv0L z_f!g<{_g=ikSiL%pTjsQV3Y#Gab(%OH+c>HV}Jxee;A-KqQMx@Wz;1}gM0i?49dRU zA(#MIXknHCAQ20eh>U^ZE@&hI{5=gI@+mxDJ8^iVX)qFW*Pw4xh~8T~saxh-6B@lY zT5l6Ap!k4t0g44EGoYk^3IK`@CC3;tfP)O?Py}6G zz@qs82lVU*NrE1UAif^J2kxWbEtp#v6;NE5W`w{3GyMS#1M~x+*Z4CZJ3( z6-0-p*>V?5HWVJ*5KLzX3=ZXmg{DvrZf7|j2hmyYoR8T@z0z)$WVn}9v^FRFRhQCK znZPsPmo)2v=i~98@&M8+{T&`augrnXi3M+^6MC>)0Kfz7A58o`8W?E_fETeHSpL(1 z(FrihuaM@+_dCN1VJ{tC#2#R~&MCla8|aJ^3b8qh?;RfO@S2~KhVdh?Y0zNyb1E1X zkys%$mG8#}I4!^#0S@$7B!Kau2@iIh(*Yb(PkQ}I0OtbiEC7b2+axDtGQc~K2+UFv zo~2hXJb6Q)LNqZvb3O#0r~^D4;DDV6uqyyKbeLy~gQFE(!#23IMtG1WNc+_#&4K-W z1Sv}){5^CqI5j-DH*^hp{ghx%3;<@zvQy*a@CMhA32-8SKLYIF5)7eR4Cx;`FgVbn zml5zFtzb@+0G5W7OLxaPKHTdHy5D;JeK79I2LLe`XvI5~Vxa#!2l$=A7X#E7Gtl(d zFmM?=%u@vY0?@$srWN3n00)Zk3S5*rv|>%nx_4;cbz1)rUUzKY;8i9E7W6Z)n~341 zsRtHf?GLyS3M&S!b|=v24tnCjJ-2+|73&Pvr+^W>QDE_m4(5ObXtEgszzBAlGuY|w zU>6C2;S2z~9bms!WcT5rXNW+jKv?<_=!6bBp@B}%;ZA$6;7+bUn>De4t@HryL;*&^ z2AvRK6CpsI2W%y2AchpEDpD|EQn0gA0iFtQS}=$*7{me$0#u+NAuJvVb}ICw2-j}_ z3ho5-qzKIwdQyaGIG}!jf;|mADZ+RpOra-5m<9m~6chBM2qQo-K~IWs9b5$TqzKo6 zVuGF&;X05HJt@L)^rQ&Yp(jO{0{PIBB3uXZp(jPS4&*~mif|pshn^JS zI*<=NDZ+IiA9_-R>p(vAq&SDed1P%=7NL7@M07alBh6=W$HByH7XGb+dR=~HG^>}t zjCroKX%_FiDV5=6l0VDvHv0O{D_rZ(%pOc6rFagh&C%yMT@-fW*GN#^1=sUYRezgnw;F2vLpPr^4uKh-m^=NMf*38 z=H2R%H?-;~jY|Jr`HftF(qY}ZFa2i1z)c6_^Wokff`9ylJ~8l&h%0It3f0#IlG$(K zQM|LUSc;)|XNuQ4^3A1A*hunMevo!%9^Yx(oR@3i#-n^Q%WyMEWm6Wi;D@_D9DHev zk8N)jDBu+-+%9;EG4?rV)UCE)tV4mzv)WkF&z>vUvDslV!q0BTbYWpqvAM@;UyUB0 zqp0e($n5zhf{kJJH(Aq&mu4LF*d_8cMnNPPrGkluBg=E&64&au*-mQASpu7qqD5;Vgoc)`PeJFg9rr|uy z;QDOg6Jfx$`*1Mn>fFSXTJB&NdJ*)7Dre)>-goCcMcy$chsyl00dzkpLEA@FUSF3D zh+Qr#M;jf|7BgP&efzhc?kQfW@h?#2`Jd4=8cvbOJ2d%A528<$)o}QP@`L)7vOaVZ z^GTX`p%6$6_A}9(PyWK^W6qc1EA9T8Mq~5nJZ~gSqU7VgzSC)w(o`N>=Gn?ZJi?i` zo9XH79?QlrPPcCEpGeamTq4%?w67_>4Z2!wlmE%Ccq|{AyGPjND0O~^>^zU;biVgi z7P+$P51W5ekL4GT7Looskw|Ej=$NjT=A=~oEv)=96ZZ+1iBSmgtHJmHCL^C@CM?xn z6s|r~-=t>q!PtQLmE=8BBVISN8kW1#LwcW9xj2cMdY=$kp5DFrmqsDew@t5Pl?x|H zj@$G04Tr+dL!z(#TEK0b3Yoa=cWVv*DR832{=DLdZehCf^fpO*&y;92ab(~?$$Fcs z9p&Ml9(Rwb%vhVUP5v)(fBBzOeZ~)cIAQ|7?YL!$LCtpb;WsbdUK5qSv!p+crpt4T z?Gy~^vi%P@NOfE>y`@{!P3tuNbyHYkE}Bvp_TfbSJ7wWG3p(sUcWwu*H&IP-i1r_S zuoyzIZzhs>gw}D-0Ehe`mF@nAm2Q-ZHmq!Xv}OHIk0H@Qgi(;x10D`}2JhA1#P06m{V~dl2$2jC8dNvyHc~LR zS;p41oULrQ0F{&3%B@}c`Ywr*IbP+B4LgS+QWwI`j`N-b;inf{Ywe_uNe<9w#sZvG zxYw{7im~jnEJi8cX%Zm?MhZkWAOUZ(mAyM40ksl2mj#f3XTeez9FTwu-0;&ySO6`_ z0Rt>R;zDN>KluQu^((|$P>VE3>#5T`^LVRW8gp5Q;}^H!7~R9WFoBhi#kJ=n_v_#8-VV+MI*QUe*j#qtQ&X z(7hMEIj7liKj_tY%1_h)p9@{Ppa;3Z5;FN1ZRx2B=pio$59f+7M2dcnumk7?S`LZhPpzlHoBMfelL&3h~<~HWLmI_+;50*z~r*>3uUeJcpwFs(ryZx;AA3 z1Q_;?z(MvUIGBb^5zyf~Hn_Uy0Qqkbej5M)o#Rhc;ry5V6S{T(oB6ZAg!;eipU}~I zIDE}6`0)IZzz`q}8RgIk7yirs>GHptKSLr|I&{IkPXJ?sxbC&Uo>>Ycl0ql+9b!!& z1hXBuYt!IV{XWdzL<=9>Z$tM>ouvaZ8vM_=$$}k?0H%OWV2##NyceKR2h@#0-5Ast zK^+BH&ji82H8?#UgU^TUfu-+0I6}TY9tM%Z%fQ*R73ls1?jnd9Yluo$2IAV%f{q}Z zE*UWYvBIazyx@5L`XGA|aQwGu#7yA)84nzOgQNay!{)WUj|t}9#RL?3EQac8F#9nb zpukpo`~cLiac)q559syrHZW-(v%rW8379Sj+xy>R5@!I5K_)obzqXiOpPMg(OJ4@3 z>em)iEO5K9z_o{hdMK#NfjaaY0ev;sXX~b5vfym}_#GJh+Map~o`T0CKnVc-zr-XK z1n2K9;Fh<5JKO?{!Uk0T$MjeC;@b4r^zyp&sJb=*xjAiGsuC5{NNcw+-x z9LCSV>k1+uIY1<|$4Chmy5OyT49wkLz(SP?ws$^&-#}WedRqqyQNPf%ZEV z0%AZsauHyA!-lW*m=+S#C3X(w7udn^2G@`YF3lW>f%GH2MvVTH%?te3X!sb7qfuYk(NR5erS+c_dpwmoP z-$SpFKyM#hfmwRPvuuKFds;yVcA%tQ!<=jo&tt*`6}WB-zDMwjqX)iw8(3l;v;m>` z^IEOId^K~uv4NpU04M-*u#^?yMQjh2=?usTumx;x&R}OZg55C-7-4NjWv>LU^Ex7U zRnLGo2DX67tsKxJ(CG|xy4Gi?V2g-?&4B}V5(IX73NS`F*p1krQy}Pct<(;{PCEdj z-UD@9Am$^WQh;^>N)PB~KxM!n55OQKu(qNAbBYAwd9D)z00UhuFuB!&JJAJ()xD-b z2|xh=p?4OhfoW|T;L`xVzGnge7XY{bz#9R7BfuL0-Ux7afV%_S9pLT&KLhv~z|R1F z25{&I02&t^;OGEH2Y4XB0|9=0lL7$_J?lgK(g2qR{L%pL0(cj|udfajzA?uxFr5IG zUJULm6?~`2z-uE4;MRfP20iGe;ov!2QAhayvc8upR<6>K$a4`F zJX_rD6m@*8oSL_{-js#KreD!ss9GzP|Fu9+zXA^0Rpmf4O2aqy(xG^$P~(P5=wCJF zTZP(uV^cn(uldG$MJ@3iisJo77a$~L^yAlpA0;xpBY*sGX|)pJN9(Adhht7-#ZDJy zsmE@9|x)SCsw!Ry%+&Xy7 zP(xwp(zzZcQhjht5Vx2)>UQn~6*F$jeskmS^M2 z0=j2YTGE?jn^wl;)x=YXPJYW}OSpMp6mCwwq_#A)y z;GSSI`q#U{)C8q3=H&9PPAnJ^k2|Z+jU~N)Fa4NRuU_-%MgfqY_-gL}80U z#c4o6Z42N;5i_Pjsgt=4{e;{^A?icH*z`mBjYo`YpkQnhV?YtMQE`xJP(LO#s-|^Ftn6)37u}!b zx2UwHzb+6}s*FXCGaDf&DiI5T&(a*KRWB`<9`Vk_AQ;(OO0C@A8+h zlkEK9PG305_qk7Brl1eucS4~L>@T&fMju|%2joeG&l5c^;kLZ%UDYm@)43D+V4V2r z$5u(BWM$)HT>=gGgMv{s^kJG{{NdA&h9zG*ATi{3n8P5Mg zD!N)lR~ka4TM8U(Pe9KKK$9s{tg)c+=oc7@}nY^tbR&`v?pI82J zh7*Lp`}db@`a>APWnOs*UbIe{mS;Y-?3TRJ<7#I*^V#IKOstkw*Bc#s_G!|h!Jz-7 z!{w#Fa(~Ef6h@9e!J-ka6cckNtz|Ry9^G^FMdfOwsFC33aZ<*xt}!?9AdcZnnUa>N z${Q7R$uhYMW>hvhJ=O^UKip^Pk^hd;S(GNUiherV6&pTyF=s@ITT4oJXOm&JI&06X zS6|n~N;2!>Yh%q$OQ_fxv9ry*0&&1$)z(zIz_UA>%QMvhwGI!ah8nG~whtJ;8oosk zA~94fT35uTvN zy~B5Lw)2GAx2}$YWF`2><>?yUQPQVo+;4)Ab**0ZmaX^+UIIUQc4{_KFD~gs@MAqi;?9zDC+n2k!tgbqV)&BU#$tF+7blY>$I`HrU=PwRRTv!v7|D zzH(EZZIbGwDLpv*{BYuXX3^0-yk)MXmghe`%8)!VX;7Y9n12=KZvp&<5I=RqW2ecWng9*(@?{Z7RB3lTHP<^4WTQ;OB_ zr)AY>t!#N&s+o<8%CkecM%Igq&&P^`_O1AAvk8Ri!l^QdMVj5*gj@1v}CxnE?;t<>X9BC z@10oARq^l62|t$R=|P-kFCtm%1p9;^pZSUj?$`QfoyDUlJO8{EX14_^`g~)<-b2HYNua$)~O^WGLG}>ktS*~Lq&2Q7LgTsnO^yFi1zQP zwF4-We}KUd6x;vTI+P*(&_tM_>BY~$Vi3~*{~O(39Zrp2#s#OgZ2$=ciamx1s;+jN zW4EE4=v)7Uy08)AEz8IAZjjs|Y;X4Fj78t|QUsJVz;oX%0^ODzN(_+n)(}n)a6k*E z2k?fg_o$%ij3}sr%;~QAg2E|KK^5 z?W4+ZGNL9fHm}tMYNO?eb+-r`cl2**WOCS6N_=1BW=7wP*)SZEFVB$FeS4`Ce9z{% z^Uqh&Ezy8n+z4~>FRA=hGr^fk^C|1Iuh`@Pi%*{L;zthEcPv^UksCv~bf*TV0}Oe&X}PD{5xt?m*1dxkEv zG{Se^A%{3v>z>RQN2&U>NsGGgC|RmF7h%L5oXr|Z(QgipBDE#i=VAae#CrLgO99^KjZSp^AOu~@vro@DKAHCbV3t8 zd*?^TO#kJtOU5vWwkRhYF)P+<4rG7Y zY$oQ1Xb<^2xdfC)&i$;~cj9JxsuS9oO+{h^8prWy>O-wqsbd-&##N*$`F=1W9$i#% z6?ame%loOm<7qcV6(MWHXG1-npMbnL=dimn{A&-rcn@is!jHaJ@XWI|Qbu@U*bQC0 z-H>x(whdjf!lJAVu=kj+*+<`kW`0}BOn zduB*)U3%w?t`Yxg|K&ID+!|K)PL`~!;c{7b7h~y%$XtwcQTh4FxS*`nbe4{qLUV454&@QPa%=g%d+ zx7Qa(G?jc0Jmbr&Y}sNxu*dK$)rn5nY45vKuTXRR>p=Q#f7@bwxsB-Z43RjmdzrHQ z0IOI}i~EWA z4Fn0g7rj#N`rKISPvc96Sl6pJ)-<1`=#E>hj+K`z>FCZg&1*jUtD~E=A%U1`H(4yJ zCg`;trAb})n_gh)NgdMJ&OAe0Wslh?ws&U5bjjb3d5=CXK*QvWGe5x2*G&hNHtc*d zegZ*nuLStIO`y-WZQeymIpY{LaPf6NfXY#*#N484pD}+Ig+Ke;pL+NYl`2#QLnTAK zAI4%<&vQj5bX+sZSiiJ|`!shW=+XJc$R(0!6z;!E5eRysGF7uM{V#~=h=|C}Yo%I~ zpJi@CG5_mD)xQ>DpAxLMAMg6~<2A9hC3B*1hHf>WnD?M`3ucepN}@-j+Cw$b_gRG+ zC`HF_@#@|d{fpM!fU?|;((QqwP4o)xiXP>NIv9@{b%IjK)+SGkl8jBYexpC;KY;81 z>1+6(zE!3uCSX|KyFNQ^ZHIY9{R=G?^Y2D3enr$54}_599|vS$C3;$iHWg?7z5QB4 zoY7r(CYu3K|LNXDi=Na(>jBjd_^J^>+i^AYXb|O)knSYzmdF6Uh9Q)=`*_eVR*JR zke>c-Psm%*a87&Aanem2nH(?aQVwCPC z$DBKF1Mm3ksO_P?&4ng=WXd2dfV({l=f;3N)$OY6o0EyVU#UpRGhNvQT`xpg-(q$Cw)6Gq^ zNWg6mxU*nx2EZK$b7uf+6uN;b zJlZ-y#BZU@quCX~Q)30)OX0zs)!?a>p^Fkvp(lVwA<$S3H)4avELgU%3M{GXF^U-F zLlbvm>kwRyaM8WxF|PJJV>t94<=&uoTMz>Mg9aVm;Q0%}zT!ElK@sEB z^>h|Pm(n+jxGnoSir;BHmK+%(rH`l9>2E~tgd+~HDCTw9*B?+%wErXtbNTCQ`;`Mv z(e&(~x0T+uvDcbFXFq+J`B{zN82HoZ$%k5n3?q$x*%o5HIa2Q#+l5T>)PGf|y5z1z zFil4PIn3pq>?i&V;S_E58#7)D0_6%9O#2NE`;>yxwat2IA)P6+kM+||lW=)rCMnPA zE>;E5n<^J2mGiqJYu3J=ehiJ5?NsRzr91c5-L5%peUV!fYfrn9aVaW#6dP2=OS$4j zI1>K{ZI%;P|Bdi4>(Q(;=UMCfRj=JyXPE{=&m;1fEuJ~gz}z$amhF&}p%8+9p0$K4 z8ofueI-kzOTein<%x1Qn-FMYEUuxWrdhdOzUuaU3eG zH63xESELA%JGagz>^?3QzT%AiGrS-Fon_>Rr)l9=vzzzo1JG{0i*sL^IA)Z53CdN)o`$EA)WI#r}Vjzg@!NcuzDC|(c3*`gq8X6wj}-q z{|tW19-|cZxP2Ce@VBHPDB!I$1eN)_$MDyFq6>EkPwv0LTXMQ$G-vBri2o_ISJukU zG=OuCPVrIfq}*s|Z2Xzi#bO{@dX96gLb=sm=2M1erebL+L$~9X8NFV*S!8v497_=A zQ|HO;fZoZU9QPhdCVG)xLRgJ`k1y4to<5x;1wN)INg5S-X~EOZ(O6@a~%ZIu4HiwRC=_$IySpf#gOn*75hY&*tn$}-Kd&Fi>8e&M#?*b`ju zw^`q0@`)l~BSK8uC>JUfp|SvpGu?TYIsPQdcrRZmr7!lx=g$hu67hv?b%clwdj7w` zXG?6wA{jB4)1NgdZ{&pXn;GoOJskPFUDWM091~nP(*k-+B{FpPzefb zpmoyT+imC0OvYfSKe_L)T&yLh71(H8eJ`MtS7Z!#OD!Goz+v+@`KtXe?7o`0#yII$ zyb{kja!_=DgDjw9%EfK{+Wqd;c$pi1rnQ2>c<6e_&+c$kk-W=RdY*ev+O3|EP zgr*-Mw>x$!NHn}`Inh<`W0v~Kp6yfennxOzMNQCtbi7*~XsY z?wn$Q+r&7tX&j^VdOT;yt!cNsFg!n-W)-Pq3{Ve*>o3}B44880jC9N6lvTczYW6b5 zzJlu{fYSf6ZLaiuXMgbTJq=;4N>9n=fV0iv+uDk6cI*z7+-_TJThp8#r{4F8vyZ5@ z_=}zXcqV%3uc;+vUycVF_TZ1s9q%x^W}i+|)UYIuQD-Jw;WbXoN-OExx7*oV+J`7q zKaHAs+SoGwf`&CYEal3IFZ=U$2Dkl>;LYv&-a^Mpx8jx1^lT*E>FfNW+Q3rURN-gj zGNYeq9Fqf;#{aPNoQV85qI^02xb8Ri5SRN~jb7QkK=G@qk@2Zctt_#uB; zbSJ+TIyAVASojaUWTy(>NnZO=Vu^cS=Xqau%*k${@b?<;UDf=4?V8$C*>IAolis}a z(Y&w-B)6T=JYRVZ&#bPJi*k03b4_i=POrH1cG|exkM7ffopIXIxq75q?m_BmskBb3 zcIkm^)PcZ|Zsb?5W%u>yaXYAk`~{8KDdm@SR^rKvf8i1CO|`1qH&PWepI*dox;3b( zevEuW7vp=IEBb3|v{KL8EK>2*FhSW98cowbY3xp_Y;w8V@|Ma!6YFH9OL-MfRS>pv zKW-?jp|0#N*Kxd;;c7d(;NyfS2kp@Ve(u1mZA^!XZ6&Nk?RzHbe)(R316e^5fAR zTD^Dk0Rkc?%dG7DKmJa4oYRM%w$&MsquF!YzU+!Rk;!=68NT+AGqYFqht}^8St)dD zXp8iYcO~pt)Vf6XI|tStwj)<;r>QL;;g#-1C6@5+wG|Oj==}EA`csc*afYJ@g)+q& zl?Y=pV~pZnw5PRr6svvYd}PgYkx@(0{AG&CA$0RnakZW___UN_jdO0{muBmLxc-DL z-CC`C0hVrvgl9!y!wxY?@F_XPT6>on=>*XpL%t)aJnh~-OBG$3?ClR4zXmOqP1}Ub zI}J7+)dn6ibf)(vl6^gOW-|OZv5~tPpGa@j7t_GxWiiq{SLP@?Yt#61-P&Em%JHjv zHhdM(CAR)qA+4V>Kni6L*sH*_wr(E$uG~+p3tJqp6NOEr5d{8 z7fy+v8SknM-=$lW>Q6R$yIoclx}DCyfu6sA!G=l@@ilCNndR;v8k_F}E7axZi6|k} zK6_DezdLl=T(zp4b6ec9Bld!za5rx$#^9)>#&Fb9SG~{9A(J{Mn90cb@2)CvbexPB zI66-LQ+M>y-XV*_`xwjGaC98O{7C_^w96XvPt{VqDJL!l&Cw?vL3^F&$ldMqL-WRG z*u2phwdMD3mRc~TJ?Et1FZVvncYU6I+r`>IEgu(Y0)2XsF6HuTGxM*hBgwo%op*}n z=o^2YrOP)4j#hk8vt>j%5 z9_7fq#Fo;su+G$x{j1U!*ye~9J46k8ttT_zx5A5zz5r{}25-_Z8Iyzmho!3wh@$Jl zOLr(G-5}lFT@oVQ-Q6H1Afa@3BaKLh^ox{qgOqe5DIoC84&R@1_nvr8%(-{jW#+D9 z#tkuXpy{f2YqVv=ZTB`+D(Q|?nv#xJdK|Z(?BC@bf*o_{p^E;6&_fkfd4NL|FEXAF zRosOhs(A4cdZ?m51N2ZuV_WEtEBzJ(zj;aCXd2R7j3uj9Wx` z7j>4yK~$KBVoY8{sVDoFju2zgtv7AhCNhxHzbiU?PrFxp)Ioamy{e({Xls|;{=aQB z*7v;%msuxhrrhUUhn+8Esk*~F%KN!-i;x2+WI@^yfjBJ$eM-Fa)1cW z^KVdgonjLK#=Mx5!ErL&fKC3RXQ*A$Z6GJxc#xBD3K2O?evjUExaJpJMS0i;(}Y9U zsX@i!9!9S|Mr|eeVoF9=&(N|Tazr*Qik^mwJ4j1N+Qckruu>`IZMf;B2Gb?oI*uuZ zsOTC6`|2iDUI(lQbar14)g@W=A7?Y!N_nacEjRu>P7{k=vAG$&cGB7REw@@mx0R;< zNPYd5++n`sSOG)Z`Glk~)G=|JvPd+^Yl0Qe@zI+y1{=k8JC<>nlUTeYMX3Ds2)vR! zlQu9)zmaG19xM1IFo{cqZ;Q^J-2NF6VmsSz2Z_h;$^u?ud5ptMP>S#?J-mPYDQT{= zw25bN*%N9OCB0qGVoL?4U)p+FI{M2c63~aJMsIu1LJvp( z{`=NJzR*{`7Uw6I$d>syL!9V8iJre2xAobI;>wH0m^-x0oBFo!*4T3whD>Jm>JKv| zjrd*%a%3b0OF?Ma0(RBwg%RMF2zixwg+`8871VI?j@Z239xX8O9+_z4zNn)3M1jg^ zhJc%VK1L^R<-9ZYtJQrhhcNH-)`vmhX)X6*JVS`fjd19NviF`5jU4yAL^G8@ z;Xcet)K;Wb(4H*75-GTkCz&LHtb}hxej)H6NTkkOolusKwZRNKk#LiqMruP)n19iD zGbi^Z^~`Br-MtHqH-+vk|EwkkzC{>=S$irs}C9CRzXvfK?MEcP%FgxRED>nP!Mr4(G_ zu|2wzNA2BcSfcwwD`LtI>9}N81J&x>l?!ab4-2;f0-=Yv_Zwbjse_Ah-MVl)yEDX# zAEE_%w=~uoG*Wweq%|;y-ZR=1yhJT&6hqFMW536xR#y4*`!yz~K;!44SC(#y1ahwI zU2J8$`1iOGXZNu2ztsYbA?ndPHwYB{rbnH~>#Y|qUd9yaBt0i+(x0do13t*R;&!n? zRs_P=2!e6tE&v-d<}SAM8clQcGUiw6zbQ4xI=OXT?F-bq?0+;)6yH2zHdg;rl}5vo zy=oq)GXG`E{?$E6QTw_rOTU?-3_B^-h~39)xr1Ew1)Z8V|0UPndZq>Jn>#Aj`!_~U z4d^N$O^9Co;Vmi8(`zPDEuNKrgBf1z({h(q=OAQweRZ>I!0|1cMnFO?k(lc?J~l;# zCRwL*2vxxTbhwvEaCCfsC7*%N?|V)_$JTu-M$)hx36q%9JgPXy7xY@E~NYbUhp)5fRP-{OpM!1bQ`4eM5b=?M$$=fGC_sYjI zWAVgnQ{7XKKT>v@Uq&PuCWDLA=N@up=;bhp*4#%PEdFsFuS_tFXT#5gWqTgzdu)FZ zk{!#G>$IpJ*G>KA*(ccRCaY_YlLvi!694W)s097)? zHZMacM>EdUlQT?m64qese@D1hQkurVTmX#x9; zXp9>{AvZ@p)2Q{&?wGu$WBICGazM<(k0(oizPxZclfbMEa4A|)7Fy-*RSuMgZNhQF zZ?hlBl5Ob+osl?uhRl+@EsSxg1Pzyk=TLWI@pkUOI9K#nOipw*FvVzKmQlR@sz`s5 zGX2_ymU+YJ>s4s0dHDN(35X7SzYf2pvU~qzABUE!H(>Pu)qMc<<{p}WPq(?FDS#ni zYyq>3hUHty1z-ptfeE~bYYcBS|0oA0AiUGK3SgYIh)o3_htmtsk?q71=3dI+*LJY4 z**}<`q;D_;6~ioJsJ^d}_(>`xyqP3ya=)Sb^(wN}JYpA&gZWG+D_zLSXBCVC&FB!v zeE^;9jv8aZ$!EyC+6=(31mpPXQ>hQc@%;cAhiSpUQva`Sy;RR4-%4|+=mZQABd#$T z2$2sA@%wgTE(Z`|6Bwem@Ek7?;_4MN#IxLH!2tln3@p{@`zlWW!+#xGD$}UuHmE29 zEPtwBWk8jna$(F_0@%uyWQU~g{m3I=pZgzG&v9r+p8+cY=yFw&Ili4wFGMe-Ue@NE zwa#b$F!0QQ}hPnGpgJf^BkP*l>a_rrjr_qj)meXERr;!*n_gQ+z(FZBZ=KG8v# zCagK1Ds4bibp={g&lB|nfP!GwYra*g0HFUVXw@;F`5z!c1Vv&#HBvwExc=?MahtSn z(0}ELY&8py0mBHq)(J{y(puO8Yen#tC!*EtqcK>ke>>k+*|n?A+QGIG`#wtqr1E$P z?Z?_h^8nMDSEipqQT3`F8c=|sTj&D)yKF836=i{NPtzle>|K6`O&owTRO4qUKX$}D1c{zyY;J0YF-uOV!4T5Njxo)XvnAN!EPxY zTQ?Z@DYntjAxZ5g(CzD1PXSZHza+0^czj!go@P+~97zyu!4Hl+Q z6eA=vN~IB-wnF^{7M;@cH%{d`>GGfIzn1>y#yHce(BNHMGfv@V&NIqS7pF7t_jPi3 zkCfZ*{<`ELZ2DliFxO~0GMyPZTeh=aHL>Q9>wb|6la^R;!6M~7u}xDEu2>ltWx`1m zW!=B#|K})9^j{kjVV8;XzhBuqNyTd1WGLZ9b}{DeoKFRVybbXsg54Po)M$%-{B?Jw`o6_Ro(A&Z?-=)i1-qhFDK6rV|r%&@mnl#ayQ}< znsMwow2EkB@jX6LYsUMU=ee6Wb--0*bbLI#Xo z+=<*YyfG649242+{4f(wcokkTi6IRI0^>Lw3602Wn%fd}VX7&*`(?NucLmk=6h3qU z!0*%K%K5z&KcFu%)lHZ1Th8xxANaug`mAbl01+XV?QW_<$5$}*6P?-b?~~(nD7j*H z%QQU~gODs5A5jLk2K)~Ocz8m3pT!f=J%9-f;g$^xtODo4kRJR?i^!x#WST)Wdixjh z@un(sRPhvjt@BjzxYR8m1z#h%ewCqMkQIPJkQ_mc-6D$sv!R06IVz1r{6-p%V{1#E z!=}6CO>d)>i>X1cmsSlYU(olXexQ^{YH`KgDW{72*F{WPz?IcSOj{fl43kMDjmo5m zB>rhfXqtH&y~a{|^yyzS{uIJNzoLUc8=I< zTjr&Y0IS}HuV+#;RHmIF_Bw-kY1C$E#lybdrkER#IjY2RsdL&}PxyK$`wz}LnqJ-1 zcK+qr;WsJ+T-pXpU2zq<@1@sTZx@r!omC&?WySQHX+qe>{wuVuCy|024PTd0|)lkKCXr z(k%I?od8uu^3S<0%elF4MZ2O>2N5il>eeewo(wg!W94q_1&k;RiLpbvFN2JNoYU@4 z+H#ZQJ<0!cWzA&j)OSd5?tdDzigo|V9+mOofOi1>g%x7OGznKSCzqPxPCDiAPw|dH z*PrZ*!ITsWNtQp+eR88YxYm8^vNK@DlUxC1de8QkQtGc$#u&R!c^_+rda(#jlnxl% zJZ)<}ZnVI^^hD6P)~rK&Q_dvbh?*9xryYC%d^2KU2(!Q@ps5{PVjOHpVW=JKmlvjF zVrK|*FpACk;Zqyzj1ZXtY>FpBSu;-ye8mB(+Nq%n%9~0i@eYX|T9-gT(GZ#S0~#Q3 z<^cp>0YP3jt&1rjP=*T_cq?cS&?R}lsbQ;vr&)AGfeLV+a6M;G?T2Ck;NBtg)|3tbz5_E*I zF0~j`pz9$w(=JmS8ZC9)|2K#5*=+4mnb8>4N9hO5k2l>yoS5uZFst#d!LEes53i73 zrNOPn0uzMw6=0$byBZBl@YXwCJ^cLCkU7ChLB(O4spY3$SD{Hln=+iqcxDv1oqQqY zD3T=Imf4&~DE~yX+G$1c@bu@J4{m>a=hz)_sw=g54G;*fc3Q7^rM?uXVl1d*Zaqh^ z?-IEPd8g2N=qYD1ZR4-bO~#^7={mQfz?lJ(?m-tO&?cd4zx_Tj01sSPC2 z;dLj5tS2l8in*fx#8EEo+bM-7>f9Q%Z|Uh+$lmH+jeMTgPlWZ>L4BpXm-yRMfKZu` z*8NXP0N+uhhmHj53W^TJhxilNsw8oFZ@5$?isJW>N;>SRj^KVAWLq*53ZRE9Ib}O6AMGvnkd7T- zmg*g_Y#DwAhF?8~n~iU}q7FX(UvzrKz9W+5Uy zBo{;L{(_dA>w#6*>%WCm|6iBw(h2^(Af38wFIM!L#7hjz#MC5c$W)HpLjHEcN2V=Y zG@B~uPQNR(^aBfWmR!{F4+2pYTABbR(M5(25XiXT(h@MqE_whaXe5s3ND!aZNtGZ- zFae3<4KSIU%mpTCB#!@p$>QV*FwrJygg_wQ56ZA05R-x;D+nZ5CRPyEV+Hv=Uv^6I zI|f?)_tVjpYzdv^TugU7E3_&jndE468Uh)=rXxqh!ZYA@JXv3*=89pa^R<}hWI_Z? zR<}Y-_ffZkeLtgxmng@>?KlDoof4So-ak!YCF8z$x0=Mqez|FZ(tZPWdAaF(kRlnd z&lD+m`&N|^Des)?C=cqkkBKf=`==4a@%u7I)%|ylnG&e-0hfLk*Z=HegK^fPGpXE< zhY6c;v8w;ni&%c4#|1QuJpNpkPAp$9ZXiml%WGwBeT*ARqVKxGWVn8D+KFD;JL1D< z!H;J&){fIxem3x3pFJBjsJH#5xBRU1dlswU-p8Bka;?{ja~Am}IIE8rd)-wC#Yfhu z1Dz*cZMdHq@O0ni39&tWA|}(3l70BaX?MR=W~y+{A;XBKlDN6ps(0sV`jt?>sgb@f z$aL2!U^Kk8w$S1VJ?L`k_svr5{h<%%CF;t&IA*PFCdy0Z7^@0~s(%+XrLuW4hdbMGB0Z5&!p>I3?Bn}d;?zTW<$3v=YjTMMfV z=-cI^bg=I}AoiT>8EwL^>g=fxK+{@VU!40e%jeT{3P^;PZ%nQ*aveo<0z$2qAy8qU z$&J4FW$UAyR~L%)ebkC`?;>yAy)ysuxPKsyTg}>kP}HuoTV>?suK=g_ni#PC+R+sX z#S{ZE^FT~45EB-P*%Sg5b^*c^W$$Tr4MuCeF18Vo_P%_H%7gEJ{yMKN9}1f-`#6_h zL^|$v#Eem2W1UvJlYI;Fbxym8JYMgRS*25Yqglz>JkY0`cttL-In=2bocybtm`40f zE9MsN2`Rm!SH&*DT0gUjCsWs7rwSk1JNnbKK4#3Pp?id~-_vJez9LqxO{lao^|?i? z_O9{~5)n1zvco%5)rbu5@*X=Rhqoq^H~$j~2{B z+ekS^!q@67yL)%VXo_~>n)(GcUPF#Py7x|E*TRgU$WeFK@X?dR!04}JyWqlJHw$do zz%I<}gcUKE&}VhNR~!$^e^d% z?NOO3L6$cjWozUSDoQw{gQuk_QJ9|JeilqGNk_D)>`d627xqm}{#pC1bA7Z@QJ?gF z@oxym*I&2EiU&=zq*fn!oEtdTp9f1q}p2gStPxHAX*& zfI!GlGgeR^2^Q);6m;Jcj7P1CevS?Le+_jbj1JW#!_?t`r;LL@k>y~uq7lvFv0%Xo z4AdA24oV}yJR(52A{Zvw&R1J~AZi~N1vU7Z8hl*@zUBzVD-uUPpM-{Yt^@icf%^1E z2Prd10glaU#9JSz_!b_d(x9p^D1Hf2PC$tU(H9mv5q<#{1_7jaAjJSFX{{MIeyBep zXh8>3e30^j6cePZCjGB*LrK6Ij>ADyq=kBGg@;05g4vpOf0~p=uS18HL=~(8HCSK< zC;$lp)P^2TEBcFB{0NxlD=6Optl$7NdkZi$6^K@}m05f#STshcN;c^99f(B)b(i~z zi#&8&x##;J9{&XgdjgZ|j=2ey_QubFZt2``E^;`WTmS6aSLuTU>mVx@WJx}=p0z%J zEHjXm25NQUT8kpmoxcHD^)66E<7X^4kfr^s^%B(51pR*fkrDSH${%CQAN|eN(=%`k z2&@O1%!8~>GSCDAG;#h9G{FH)vcS04LZBwTm>^64nFTubWd&Kw&#dQ&RX||xXJBFw zSOf$M-bQ%1U`KRCIC&|gC+!<&`TUh4ziFy*7Nmz#0FXFpdtBlkk4fm0O8|6_#m+O zx9>o$JW%VA1T-Yz-U==PnuuCNYeCv78>r;>DLT$g=%r?Jq~aO_yc${JWVk|`Mw>T* za2IHpAPgN2ShIL-aM`bc9c&M_dLy`$n?WiF>^Hz(;tfu2KXT0Qx7cHH(xu$%E73IPa%G0`2^u zN^ZcW0IXngsLwHQPap;sFD%F4EhvS7N`GNPrA}bjeBi!{25f;+9D~Xr&KFRV3*1Ts zKz&$HA4P|QC`!T!*uUW^n?W<+j{#sWbp%870+<2kC zkU$S;Q0yBp<$JK2a3C}l0Q3gkjRP8sFqk+Qm^c=g!Snlo6wr4Rv6p*d=wO?T?Zd;B>S ze9%|@v&nNr2B3)qNOwWQR51DHRf`F7Fu_Hg3Yw|*LZc?>fl>otp9G{XDwJzD+Sd03a01J114h+2Kw~8i93M6 z^UuC8L6a-c#2F0LpBgmD0!`MUfp^4DzuNEx2o(p0L*8xM@Y-xw`Ic4*ms6tnjTlY* z%EsK@*I^`@Ior|;M)%+>{UX_|IBuE}{xs8Er#KIn))}KINMPW{TImtsvcIfba?xFK zYLemvVGW?K^bl>iG_0CJSfBE)SLB0F>x|HBd(m>)Q8g9QQ?mO_ksw5AZGdqF-rz1! zYyZpo6jrSwA6!~syk?s~%cWG+6iasrxmAi23hM)Mr3aJCzMO7}eyEbz55^TlgF9EP z{igLP)mp`7z$8(#O{C@0Uuz!|V0}~chEEI3)NI3Px#X&v%IPV|vrJhJ_no!16Txuv;#Xs-{AFO44c-v0&03<2C(&-vd$C+BaRF zBLAj{g_LIWgHZ(5z)zs^Qr=}hPPYULHtjJ?(+{`hvb1UnDO4%w2V($o%jIs>RK!%V z(41m~B?Afb+Y%e$SLzxJsR-;rRuX;pNDlNcoeOB;GvkLKx4t9WU-jh738n@@J=BirAeBGr+~rc zNtBFtDXUi4W&X>BD&cZA?ydTb-zYRgKOX;xhG(t3=4s*eS@eqqe3A5 ziC)-MD62I7@Zb-5`^n3C1j6S)qY-Hb#Y1J*LXI_R8tXr4S zBC~bVfs{>63EL>xxFD6{JETj3MZyOrFhVcn4E7&PBm4%!UmQD>UbI?5kRpH-4@%Dn zKpwwrcjLaE@%-(?|(rcjY|ODm)+uTHwGe6wE2otbQ&`KNKP zq|WZF_V> z<12axUCqi61%?;XiTPMvg->%gh)jT6?iYzJGKJ}*z|2A%8l-*IpBiXMYjGLMTy*GG(?vIq`Zyit{ys+FUW)VY z>rSocvI@%x9gOM)KZVQ2ULHe*s8AMKy;;RUj#h)%(vbeUL8dI_n)H9G-w7?Yq% z$~H3RkZxN}uvexzJ55~9$t(0Bb8CJ?sq=-5RFmpQeL34Si>0*^sb0lJU2F$=6(Qmf zj3I|z@mk8;V*{n8aE|igof|U){4ILP^Euyt((WXBwkV81-a;mW5IpnGVx*hAMONsnDHWQ$@aw`A_MeZ1&??|rd zC9%t5iS#Iu6JrGdsvfJS=Lv7B!1At`69@M8d%r!tVM{EHyi_$-3(6NsC}qr_L;3}u zqIL-96v9|`1;f|F4boeXg9b{c3!pj#pgwDe9=Qw7&tNDuKyMUXr)zG+gd9;Al zaZN2#GZE0iqBQ+Nm!R)=z!%7Ywq6BS4F0A@*RXnyZOyCFyV=x(H&XrlvtPeySZBWe zQT`~V9IWj4bq%C*ASzI=>ZKKk8*ARu4>1oQd;1U3NC13&}<5HSEmUmyRh za~%Ld@}oSkzC>_(fnDWFpBaD%cdZx)unE&&zAa(w>liWa5|oWHXmg`ycwf1FAkoaJ zAiZhX6W_%7GtlnlYJju`lT^T(n^6DB?&M!4d8HA94gF#IkY2R0OU*YEi1L}2d5@n> zi1#bBokEmV+dI-aW@|^(Rm(e4D&$p1kec6-sv~$V|HHB6DKJc@0sgaJ_lE6*dilKJ z%D)_(xR&ig!3Vq>J+gy4SqX)l%#46+R@G$7t_CyD(!W_F^#9zD2|KT=7ZLolSmM1X z8Tvg4LVOiya~Nelw8Rk>27b(bQ^5XfJU6nXkc##<%(e93OOY2Wm!y22yj?Y`Pk-gK zjs)-J)D5209s9yB#Z{7$iDINH*y=}XMs6?3>n4CFFU1@RjInf|UZ6b~SUkwFTpm&% zidhxpMN~bt7(TuGESmR-CZ%P7c}?v*W>x;-6V=}9a3cZwsAdD2taiS$rZdmq--R3aAzHVn zsoKejQ*jMgoPL(ws#=M+|G}dF_=js$FJX!8KuasSh!LV;Tv(wVp#>@He4|+s`*qOn z9SvL5T-da7s)K$Gji(Vu$8fP03Tw5tG8?;TBYviley<%1XGc}otl#M6eW8{%YxTTx z7n@Es-y4tuufKf5SLDte7A~E^JUN(uX*pz6XK+`xoh2f_*z6JEQQ09z_$EbG%F>OB#+sxkte zWC*;!>d8~hbjD|G=qi8rdl}8BlyTBrwWma;AOGF zHvIP7@5Nil?s`SBlOkx8yFK<6myG@l5w}%(25V8wQaa_Q$a_W-?@ydh)Y`zJ;U{85I27dgQ4_~T;i5*jmTbtGgz#lXs(f8utBhOS~sDxEtzbLzB)(w(yNduL z>h$^CN1`mkSyg0ELx5lN-jUNif~$(9?_EjHOI^((x4G&S&*A2vxN;qp*lK3G{N?i* zDy|TbdS|W|Nx#eUaT7){4aFnJ^d%Z_A(K6*g(;B8 zSS{>o1aXhL5F2VpVLhI-J`DD~jzj|vWU?Q%umciVqXir#%PXtxTsefkr&O*^Rb_EX z{8;0$r+mz|ysHJ=2c*(UIT>M)PqXzmH-f{{%fS@pSP2fb1%4(6QDdAo|G`GQl@;b{ z{Ste`DTp=yK|mx7aVBY6%0?W?#Sa;yjNo$wEUfZMR=*V02TY4U@$&hi%w#W7X3_wa zFDC>0l-&7`*<_M%MBV$8sgxL$v|lW)9g1;zimQLT)D`C27V$ZmRQ06y{p67)Nu-5T z=H(!vvYh$aa|dOsbkoum12w92fi-S_k1>KB&ap2&Ce96+YmhbiR-7e*JJfMHeN4bz zp6fqWWhX@iif`yV7AP%V(irt4p}x`>%^0CR(lNDYp?=aa4axwA)FLhXFjAd*k=cs%?>e%e z#!tr06E+0Qsm_0glUs71p4>ZCeDla^;io->@&|?aKNz+bd3)Rg$*Q4p!mGBiA93=+ z_RUk9J(lT238x2M|A)gK5G^VEVtPQsY=z?Q%kuBiZ^6$iFj-!5eQH?aIV5HpLvZH6hy?Tc+1J^sFYJPi!VTU+T2+1Bh|HA<@W-=shq@bZM zRJfNnln9Z2s81(h7a)!M&!scCK7%9}*#+|*VsX6J21NlRdn6e~I+#KU5%uwX!^aR8 zG9^sr7njyG>0S?{*~wa)>aQzt{2oH**Unayly{Qg6Hh3!s}+t^q?MSZGsY&pWTfy5 zXU0(J3r*49+R=Z+dAlf?ydllpF?!o^{XIz@ULLlNCkBCID&Shvs6 z@xI8hL^tW6&BcmpZ@Y}PlP4c>xQca%-KK7aJN(Tm&a}1Gq#M`*ZYxB^C$RkZSmm*q z{K7DgN^1N!s-Xk+oh|33r9lA_QCMI&dVqlTo&;h+9<7vd51wDG#NO`Ugtps9GBa#H z7{WWonh7ZkNio&%&P=9D_RtBo_=2w+s3N~8E?|a7y{3s{(@AxR&g7;qrCvLz51(m})^O!D8LMKvyTY>-^ z4rD`_@W6PcOSRC6>A?vsK+6g{)1Sv}vJZ$KU2=Z$%N?@zo*5t=nur5xX@h+y$$4oG zl$11gK5F#U4ScBmodb82ZCYFht-+Tw|ajfVVfCmrMo)5rkp6Kz1o$!f6Qw z1Yj@Rxp7`n0nuSd8Uw-@rc30|3GJi;<6RVyWckR#k0)HY=nsh6dp(E+s#H>4LwJ7a z5_?HQ6V5 z19S}V6C;>}cW}8A)R7Y?EFN7>7JIY?1#+*#R@2ZQD7E*fLMJ)~C+3_Fc%g0G#z(jW z+`=RaZEVqa^p0q-zXAp)MgS;YWW&JxrjP|odBo;$R|{J043(16OLOFC0aeFdsGL2>EDd8r6y^F%2XGz2zXm&KkY zSi4n;@W)Rew9wFmF#rLqBLYG{9oieU01Is8)PJy{lzlT_C?AK34rV=OdNpE`Rgy8~jf*ESqiGv_Fca zxfM=6EVkI}(+>!LD;QI*y-JmnSY8^myNZr%bDmsnDKOu(4;R%b4Kfe4bXoawEX{3% zkFH=RIp!B}{loFbxbfg0S6lqIpxWpandX2lgSYA>Jq)%A%F0|m47cMOaHV1#52=*J zk&pc?(QHknWXllXyX1iavcC|1;^R%VN?6F)__b>pEgZx;2?cZe<8}J#ZNDhy7w^Ev zxX}HawWCe7j_D7t(|?S<78~!}Y!+SnX{(U9w`OR+bo%?v4whti3H`fFx_(Y6YYSVu z>!W*RdZfVR)$hk7>RYNg^3&3EKAb7K`Ljo_os(6lcZFf7395G3RI}w~7_igJx#&BmVIWoFi1ToR z{NckW%-`X2(}C~jC6Y0E^La>gc^IbGi%2pw(~KcxgS+&gVZO;7m!%yp)aW9ctF+el?l5t7WcE#dRu4EL^=8NAp(^xIFf(VSnjF_Gm0KZxD zQh8fb-G7`>Na;MYUW}Z_&OI@Crt5&GYiA&lC&2cn;n6ibF%cT#1UxYz+ME=Qg9CH= zXF465J5o*zp<4Qd|1O23u^sH7AMkm(9x!!lWbLfx=14W$ZO68`HmlkGg=$mr}PP0b5niYwtF{(Sdvx!qFRzX{#)vk|!i6zI?FZ1ca`+jI_A3eOR zB!KFG03tOrEc)UK7g=g%2^hD4@dq$Aph(Tk0b>}d)XZ4e>-FJpbE~2+&cDs|fOHb1 zLm*ugeKGP|b9y3mbg58x)UV}Q={AbC$bBxpJ>=8XSLe}cUuA}o^WiUwX>E+mOqf}W zhKChu0b^gMs%ub3&boen^t&>AfBtQkE$*MYR)cQynnF$hi#8YBV9C_#pGQ+#!^9U# zrPs`PAw%gJi6wVVwi~It1UmzoUFsGo2jrG z)W=#!GbYfnSy6$2qFz{z}(^M<5^J10V+Ig4YjvquGpte_GpGSv8g*)H5$>l!Kb~j*mqNCq2 z8>Lj8{zW#(thaU)O9bXP#VoiUgC!qi<3b7>No{5RS=6b~w0+bM|Kc zcT$alL_^&w&mNl-+5)9-4QO5sjP-z&(tzg8^r~&MXy8-TSx6(w75z(@Cq?B_zKI-{ zXrKypCJm#m=|H9kMUJt3$L_TTY70C3y`o4XmDmpMB(`~Q+dcxrVSOhVKTrmMCmLT5 zj7(k&sKusz1F0)W&5zvG;?l_O4ogLD{odA zd%X<3w;T_>e`-kM8oy^$#QEW2_ROjdrR}eQ(UZ^&#yJ@>rsw#k2o=eJUPnx#<+4Cr z%`6&&Zd1<1o?b^%qF=2?b^S_8r@ooHYadSdBYz1c1KC`T?!vW$c-b(wX6lNQXS0BY z^Tqg74!(%TLFsXOVq4>BDf8gI+6r;Lq3sWQPQ#Vqm&qj-ib*pnl-P|_yFvPkq<$tXrI^;gO9@C*C*HKar$t@wjhg0 zjGIG~M;EvM{)@ka+Qq{vK^1L5*}Dx)gsxm%M*nzN3j&Q#-viFqdVX^dYur*I4T`4I zT|P$1#kh2Wm}t_gl7Grxe7T2;TGaMLaN~$JsElb~7E!qVTb2G(hR1p>hacbJ5;bxE znyj(6q*ETY4#(=#_mtmnsehhBV|2-wc+Wt_)4L6dYOsBU`io>+rmzIWuX{8lo400) zhs=3fmXH|4y?S`eytjO&5T7ofhV1%#sU)gP>w4tHkVS;~sFj3G1!99!Xj#?~dx+hH zZNrEI65uW9f6;i!#nQ*P)RVgfABF0NISu_O#@P8wfiTG0qInbx#oz@KcmD{AoNk~c zafxWoY_r3p@8NBk27@sqJ3MgfNA|v_LK#$P8PJb0ta-Iz1R7ol&n<3$dU0|g^D;ii zrE6ZV9eAJ(?r{*dj)3e^$2*Nl%V&^4LENjiZ`JM$z=-<`t(VV?IjIqV!2#AQ?tSIZ z2p+ZY2AF_CoTqQAS=cRDl-zT@EGWhjxvuziFBjS2rCUGh_#HG3pE3JtBj7=`4`Ow} zM;~`Z<`1_&5gMH-5XG;Y70xep7;y9{fpHjJ>kL3K`oTCVjqGm$477&?1PeCibDepp zXcQD3uG;+rLUeu(aoRk`7zmLC4AJ?07h1b%#JqpUK+z4E{k>Zs;vpzn}ChpwZu1`wk-~oee&)R$cF_W=Aln|22Qx zDDv{D>HtJXmr$$P5&I59r&p%UKp2N%9|XwkkKKBZ;ot%XVd}6Bd@Jh#&8<6VhnJmx zYhvYdh~I@?v-}UuZEe45B|5Rx#XThkmT<#n%dT%nwsfd;UcQsG)XfWc;5hZVHC?^h zvSwSjU$ljFv_mkPl(!wGxF+{r<7?Xrb{<^7xcMjft_PZs(0?xj&tIq6A%WY$enp1utImyh*9xR7t(w zuw+axF4n{?X7wlro+84tE3U~F*5N()F%W7~7;qbT#ypdQIRkyHsLizKfrQ;uw;V|f zr!ePwx3sQ7qh7DfjX|B&@=x}px6$dTpRnxtWrMI|)082PToQ^vZt`r^U|MQd=l))j zS7HLz1PffIYNF(%56!FC3ZD5hf!VY)Wpz95mkF9I2v*IkJ}7>=*zgl5e)_<7uk`#A zAru5T`Edvm0UjZp`0&1a@DE31Xfyh3-{BvQ$=DT* z)KcRBCzJB~g~bY`r{_hZdn1XeLQAjIAu8Y9X`5)wKj4EbO}k=je=@4U%7&-s;XvW` zV4hdl2RkYvwmwZ#+k7J6zibAxq3E597TjM@ejmhg{%t5=WQeWwtL-UO22MagUwj+! z%3tqa(Y0FWut6as-k<`RBL(qf&5w9XtV*V=${ZM187w|U*Ej8u;vuiuoU0qrb_}@^ zH(D}GM!VF#wUx)#o58DFxr9Qwh1R!3Z;Sr8aF$pE<#u7!+-)5W1hpig2Na)Na3`uW zFlgwpTGtpfibY2>mdHA(^i^51@%OytMJcN!b_(GDMl9i0l-MQ(@qm9r%Iv9<@x~R^ zwbBbF*&+}h0upm9$SVB65?t_2w<~V&-H?rrEMNB@-kFWA2ONj8zMw1mCAEmB)q&{> zRp?`&cJ{QFr;jvQ@MmjJL%b;KBJ4eMFtbRcg9F_epFf#=EVOVWxWBKP&lS6hbmvWc zg~KvW)F#)dKud}iUVQ#v@#}Aix95{NQ|{g*(z0SQ-fTsbu0qvnHE(P!Sq(cTV-7gz z4@#$I;HYL)i^}J53IYX{MYO~22&>kFt_Hmd1L+QLVhaQDLCSl0qoO%)*kdC@!#og* zqNzeRT|x53qQ>eHcR90D=d{V1SX$wey9e%Q!{>&BidS!Bsa=OWDrv&5TX&Yq@`P+^ zltn&^+vHgTW01Iw($3OMbu#u6EikgAU@uX+J08p_A|Kbb@_K%z4Qq0!QC_h_DG(Vl z$ZFeuDJf(I%>7Ub4DEn11f_tKXa0**f7nDWR4)+l}IK4~^mYEHwRn-+r=LF2dr(b!^{Dk?W|S{&$0FW4)0+^v*v* z5Vb%`WVd-fKs7@yGlMKOp3yo;V%gc&f9`9?=Ri8mm#O=9`ou=43I$~vH|>8*eSUM0 zHa)2+BIcQ$lDUkE9BbHW?R|)O;@|Ee9Zx9G9GO`0X!lP6?y<3@o)Y70I(#SCzVSw# zj=>``>dI&9XP3!IKkShBFcM)t84(4c{O25#-!eFFuB1?14Am$-f};qO)%HWt*ZuMp zk1k)bWtwD?s|O#3Tp+};{wc&@J(Iz731Bxo+Iq>hv@R)D44FqDKp`~%Aby@nAi9XS zd|N1|HRA4}4U~teL1V=eZ20dpT{;M8k~-K<%UmDVpS8{j8m6Ij82(l!HrV(~vVOO& znBe{9yKQLYzj#;!0t1%I)F?hjml!s;;KR_Ts1EDj%G5uv%I<1>xOcT0uTBHE(6wSwckw2luta}PUd{zewSyb9lZ zM*-JD)}nmmMGT}@1E%-CDy}^o$~218khK~@iyB7dQj}@1rX{1&)ks$+nHeco?zuFY zWz$Ai)EEiX8geH?lE%pWo}nF!8Ij3tRBjmzn#X0o@2!9K-|zRH^Sr9yCfx|4%3=+?P{oXC1~F+sJQ2#j@ixZiqh#Y7qQWJ!Az+UumomE^cUV1fO62j zBTz$=3WzO!@J%5HXbmb|*OwJ2?y%;!iEgVBrLd%n|B{x;0X=Sy0OulWJ`dttH4k%s z(M!Tpppc?~+P)RtT}~$dwt8B5Z*R4B-IOhZnF#k*X_V zILD`p1ii1x*g9nZ?ZNX)A*;}DaO(6-mL{5raasw(G1_TTx05yQIwVX_8WTi>eA&Ve z;vxk}H)G9bi6Rv@Ey89k3&fH{CBy9?!FfFQ6cxA z!Fj-IBRRn9I3T|@(BnLavI&UBs~KVxQe61n%4}8hx25h`uWzbJ%&7%V`Egl}c?CWneUE~hwV&8rjcbntf!cYU0Y%CV zY4)srR)q{XiyIz<=R>s#>9+}zt*Z|{Qh387MhkIUC#l)qB&egaJH34qU9SFA>FA#J zw8x;bkAvpy?Hl3%NEor?sq1u_N8unY8sO=QjJa%Agx;)~)9l8SFps zIdex|FC&NeV{+rQrDTqcw5sapjTdG{Bvnc|mPlWN($zJV&;VyFpG@gQSjrP@A3Wt> z&B0Q=YS2o@Cz5ViO^{UG;`6p`cT-eVG3jj^)S$`;#7bbeUztuRc!bf1z$nmZP?vuoCC zjOEkqPH--)ifmD{UL8d}WD7&K8U5BX)5@Xvk9?mbiU_BpZ@*068+`uMLa}?QL550k ztgs4KZtNtNk)N*9XKLV>_{&OvsJX)4@LHnT(n;=gIrK;DVZxc(u_8nLJVnc_vpwIs zKIe?x|IqQ+QOh%rmrdNlAgY^MIzQWfZuhfL%A9n%xpg(!p$Q$Z@eS4AZ@6JXy7Z{N zaOq_q!EEj)F0Y+>k5M-`(YNyr&Y|LEf5zz)rFKSz1;c)Fvv5;O7A~4S8kDEgMj9^b zQXXV^lYQ>Y@UhD*iiHcaOFQ+X$is})T6-|o*>0k@+$yjkPWsSJ(qSd>4F8&?pTQ{G z;BM_d8>8!qd3S}BN?HmG2}*p3t6o$c9oqTHFG8%>-gxf#`=y~Hk7I_*uf=j`2uE>7 zd*ke>#^xt6nrYE=bIr?ljUymH&r$5&-iXSG*1d#rg+5hqXzGq)^|r>R>CvfP7-6iT zu#{*GUY`iHbi_33<(oMvHznM44Zm6}1|G3lOBxS3Pv zrg}ApH?JQXU!sIfFv;STJ>2X+?Z=M22pPPOnH##V43>!YX@90Cu}BNu>ojtOfgvkA1u`Uswyr7oXpWE#4|;PB7b- z%@ZX=VLnPP?+qtrYh*@8;B(4ax!Lig7U5-mMROBraqj0uZxtczWB7W+T2&Aw6gP}>4P^mlYovQdi?$B#^@!=O{aYOOK z$5fd-MCl?nZkb_Vw*p;QNyov|1%J4rb!O^=iD^7>>Kq4AsMU^GPNwuGU5;2!iVsmJ zN0Dm&s|xcr?ga@n z+{|M+q*wU|6P2}AXr*q_woRC)5{8`;!`IX7=bdA1@*&%MqM$xX7Y}C&=C8K7r0SKS zRq)FY+V)QPAcRiv{jvAlVHuVv9*zkbWczr9V(JpbsXrI`zPf9N*rL9j$u*inb5pjn z1gUvn2~_eFtjNLtxoN$Hb|;{ZXDD__{GRug>OL>qGm2fmQsxBBc|Q4!>|+1 zvxk{xW+QwM#HABI8V0zCO2$j;`WOYPPv^}JhGp)Ep~_IC1cPu9sBPgv;FOGC<3fwh zT!Z@%5M=^UG=mffK+mwLN(9_1)v04a0rm{*v9|5$-^=D3CSOn|Xbe^(H;WgVP^=*{ z?;dw3Ny#S=4wz`Ty~%0SS&2PiPZBcg2+-z6jdnUZ)oT%q6kh9V-W8rMfAKJ0qFwV@ zb5E;UL?Rvreq z_w%wtmQ)u7RKrSNr`EpE_TZye`50VJHn9@s@<&kr+AfgtzBVT2dR8JWbv~aew8{1b zy;rH|%hsmg4o^0_S=g(^(x)wvxWzo<_&SF{RhG<78tsgdXMlnWqU2+*qjlY8kK$Pd|u|=t?90`()Aqcr$*-KZ_U?>$2OFt79z2h)yQegF83Lu z+ljH9I)2-?o_+6CS)0s-P*?|SCDOw`EvNPL!$z1Ibio1QQ+^%4(c+{tDV*nrlFE3- z9aPy1p@7PDKdi#p5W44Q6YDJlMYil#G8}j~2QJj26?<`<=Uo$=E7Au}S;j9*sWr~! z!zJ5A^%eK_i5Mi?j|>&5o$4I}#k182q8Z~WM2s-sYj4|-UCmtOq&KBWaGvS7!&Sk3 z@89tA)%uEH5noxJ5eu(NBJ(!J$!Myg=wai-2ZP?3r0UtB@1q3rrRu}d`Hx1TSVEVYxaz_g6S4d-2L4fBjWn z)`ybdpD9chQVN?w1UlL~yJhOe5?|zAacPdejQTaD;grBlDiAL4;70G;{*HfA;NDMK zsQFD#enhJVygYG$_S+crV7QsN$}0;T3<04cG2T`B_wGR!#%iz#c_dmM)918puM&?- zJq@bN=P3-ttppvP4i@qvT2Jm;e&-#!=lI)C(tqJ1` zL^z!#y?y3Qb8Amc_}(@i^Wq)ZkYu((;SUd~i*^OhfpNVXoXY6;S*qW(beAM9G67Mc z)nND+Z%XXQti~B%kr@Q`QQG7}vBo~(s8DIu$o+=Ez0SlBalhx%Cck>)09yGA9t1N8 zY@@Wlu6j`VgoBd4Z*l4dD8%%q#Y)`Hu`oPioE;D=P`wyr_%tG&#b-$~^8>?+9&1Qd zgnQHN(}+YCA7MhjmGaSRSx%Xwt+kh*MntptKG~-4N*!&>aLQbr_Y!^@5z6Ab(P}B7 zyy{v_8OF?dpY<@L$NoSO!4bIn>xJSyH+cFRerGBfEF+%NOzSxM_MsHMtyHM;B!o z{q*>&V>#UPCG~{W$OY2z%lBW@#^!}3v@&Yfg~z?NQ-u$$X&g9&*>i*la;4>1>0d>g z>)f_g8XA4BS)TRINt>6}PMI3inG}9_z0O!Xw7bY?Ww)okURln4Xe0Wqrp~L#NliP& zZGNQk;sRHZ6w&Hbn)|(ur(5u1I*Qe457&F0TixC5_klGZvy&@}y-)A&20CV&*c5dp zTN>?km`rRILVhq>iC8z3W|ni?395aoQDzx!L;~D!0H*pWVupZvg#w`d<;46Ipe_rj z8$}TriEF3uL>2sInazygr>x?orQyyQj*ivv;v3i}nw3eKr>|%A5TZcAO;^K~v#E~Z zy)TMpZ)6Fo*E?UZVhy#aOmOec+6V?#RSCSV0#0PH)6AZs^7EF{c(K#Mo}qPUE;=Ev z_r5fDz4l&>MVv$?a$k9khNZ8CIDw4Zg+HJaN~O&}i^0<5bM~TLSIqya;nr&&Q!-yu z<>duQML8xYb8l9Q)_ZCd$Ry~HH0ZqoI6>~JTGjnV0a}(3Q#^(nmwXp(nq+w(1=Y0= zUH4fbJJXY|Vt^fqV1+pcTq(n6OL+Jd_Vt7)D5P6au?ghrmWQQ{L=4(2&smFqY6WN^ z$Ryy9YcuT83CcH05kvaXe4O4CklWLk0xl#Fgxa%9Ev#Z(oRCJ^L39X>a`N0BO1thd zjPjj}1;M{8_vaqQfq{{T0YEafWKEwS zR)h+&;Xu^&r%CqzLi&`Ku8=|ARLonu0aFe^hqHNJbSPv{+EoN-IDcb2^Al3Ca6>1A zh_a2=e+I?&){46cHZJLVqI?&9%K9(M>&tXLrE;KdwpBmd$RS^i58MZcnIOmaO|za*XDAy@{FE-&tna|Syi>Q}hYE1@=QtjUJv@cKPYw01QAy-WaDo1S zx#$mu^djGqrUd%unev`@E&G32nwGhDN`hn@4`8#{VSxQ+ltJbv@CiCXxi|WI3Ls~$ zhocpO3O?|1q}4B02m?PZ_?4TrwRM!^9drk-A$Nd#VRHocrRf zY{aSD7C<^J#_90ph1bz>Am7 z@)!>2rQ&BF^1LTcrmhK!a`D|Di5o7ZsSiAkL$tw|!{&dX$t+Jc{rUlW&56o1MG)=6 zSN8r$FyqwvG6q}NuPP?y9!gxp?p~;4m-Rvg25!`*Y#ig%lFQ0D4lZ3RQ2V;S&cF+Ks3&A zT~VDI#4=ejZe*hfIvW_He}Rex;IwVWVI%SFC6xG{EEDu0ujJ8J@y#Wjtk`=kFVhp05Z71RqaHUc!x~8B9~pZ zywO9x0aPej$HfT;fHcj~$5Y1+McBu>BmpRg@yy_PAhc~sQ2~!@Q`we|zSc|7#LbAC zkp;}c;UFN>00J;~nH(hW3EDN%9ZB^E!}(;D#6nFouXSRM3&rg?KH!5e4Yml_BLKWw zH>X@o`apY24K)&wFRg>0!%*_*$<2uW8cMZaUS_9U0^yzNTV8% zTc^KvQtYRT@agrDYZvB_+vvLB28ifKL+>k6NF+@r%?kwZ8zOUK2GlcP9ip4G99lDI z)EOK*vC9~KKmV_jsLxQ9T;RqdktZx1DO z>TH*9{4Y_81-pQAX>9ZSXwgoNFtcNbyC;6WDN(IWnj zexr?ReMeYm{`JqNG#MG=ssi&)YeB%n6fl^JFpkgUpOU!vq{i>=H#y^wDdPNh~DT0!F@Wk&))Oxa!?T3j~5x3#Vp2EI_mP&Bl$N{9R3U{7C~u5 zXYKd?cTv$2u139t=IaR$gL~`KS6RR`{PxRr=`R5T5WN$dr!J`#^6qu^3wr@~4DxUMOTKFWgakR2h(_t z|51Ngx`_LadeS3u>QFEbYs8rrU>NryDbGu>mmxvLjIaZgR7Yv^Q@8 z&p8&4l4rle6cRK^wDd;d>qvp4>__zyo^#_K)@l;Gz;;muoA9B@b@am$V546bnA;U^ z*T0?rcQ;H72mWK-!R8xfCwON+;_dq1x;}@dnC+(cfA;}vz8H}Bb%ft=b};x6_YX}~K>%N8X8 z<-cL*C2&juT}iJSFY9lUA)nrsT8B@7%ku)4B@Ln9?FUXs%3`9ya}eY7#jWwbaeFId zh6Y8>*sr<+Z$g~o!gTciT`iaL-&PK8WuONbUt2?FXr!-4eznII2TIV^@|3MqTm}@H z+TEhp^D%;Bc98>>Wf8nC_J|m(W>0;RXsp2JjDb5$0f_Wg4bFczxO?r`WeYUnAMRb3 zewc#g^Y-U5!}{0iO`Ht~wo0#{XQF^a17S#2sYUq{z<8V4+ttloi2BvRh1LHR9IkG_ zK`R-$+RME6^hm*M>wQY>>Kj3#+gfV)?3w;?-aC08*2n>sak|@$7MSl<-@r$W{M&zB z7v?_JJs<^OZfg;kRJw+Pm>b(1r2!HyFB@(4ZG|pH_fRLM`La=<4gH!&=EjkDlo7$! z;O&)m<%jr;hxfK`Weo(Mikg&p5dPii86-Pr!N6li3Y`~c(0?Tdo)YJn(4ZLuh^@7* zUVvprZoY2`fSBXT814ZsbHC=-WDCF1K{!|I-9H^5TC!Otdxt(rf|ar@UT}aC=Y8zT zD}gL)s-*w-)YOn!iVT|aE*5!ygf?X~h$8o@+{xgUML5@ zmJx^3@Cw60ngpe9C;lKx=iZ#_Ddapdq{_ex;{ zt#NZnZr3~qUeaXEe~LxfVr|U>KB-G%Hi&1A7DR~L%wPhq*gi}i(_D7mEjZS3PZk;z z-ff%x-imV!1YfbKF_fsz3W;Zq59m}|O2ArlH4~m5$GGoeAmwZ!_+%f&xHI4&(sXZCv+i)vWu)HH=jhBPiO;$dVJ8U1u8w@iQoo7snTFxO?ZdawHK`3u9c~y*Ro4Xs7ZH$*6AX8Pok|@S z>4yWfh6Rh}CTxH9M^kv2FDEfjEBh!}h>X4dQ%V?LVf{r@pL^6+Vk3-OG_35xeY{V9 z6i?P+rG1u)U8@@IjeccSn`FDsT8Y0Y?%{TwFW#QaN>~c>g*WqbbQdnRRsdsb91PEV~^S3S!CrE1*ShKsY{h`&M zmu7fR9?u`Dh?BUt;e(EFIw1Y2Uo(k&4YSOevm;Fbd^^p{Y(Bp8nBy^g1V_cIiz=6X z+$~bIQf;aqM1Q25$IJ8@Zn5fWleP8rRR8lr)&gerBK6M>Wh_%{(WIol$4kO8WtLmX z6x35q6mOe~5$GdwS@I%Of}N>#YN*Ic^^4t>Bn$O}2VJIF+oI+^oERJ5a4} zQ(Dth`BCxUtVUs+#pyJo?y7e|$FD-;OIU6#^!4-I z?li3Fhqpq*g-aPWSLcc;o>Nz^xy}u6Qr}*N7031NRfOk|>E&{g4)vw;_iW+nGEr~{ z6R{E}`KLU*{@~{QRHnyjX7IIX!oIn|-#UWL zzYX`2)-P&h-S~}gDt3M*AyS^{)QI4DQ zRGGVpKTkAr$#fmMl*&dNE=N4_;)wr#Q>BfGeu_kY`9CMz4uS&6^*NyErMQi>pEW-i7B|{fS=uc2d}! z%7^R1Ms&N(Fl@Vz-V;@3fauMK>*yG+mhXV*depK#DSS@#LxY6a;xA=S>Xk0NmZd+z z!+@IFhmVU|k!h;kp><9Bb2&3fVFG}&D~7iRkh7-2S{gtEI1}|v3Csr!(+|^chZMTg zXseq}LpyU-yHzz!;4Re1lG$5Q`)@B3E|Dk>dL8T(zs?QXF9^xxEco~35|)VPaeTmi zqu4|A-RrdwoD-w1<`;nx!YPNK*KmIy8Z#9YQ%uywS-2{Tg-TtbuRCUGQF^;9dTT8> z<+M{S1Es&!1m{&J(-sfi@>2}Xa_FH=1AlN*VF9}Dl(lM1(KT0JksxGjw5Ay1Ym)L}8|i(I0FYOSuzMWBwefa+kMeatO}Y~?krpPabAEFV)MQiJAp5|_UA7@ zK2UL$VH~R4S451sc7(4s(R(T-Wjs>5#XF=RFDkE&pN#kYs^*$YmAITYJXgF#V```) z=feKQ62aYnasTLC%RK%aS>C(;Jp~_OGeSJC&&DO!y!o08&Em?E74S53{FLtfJO?)S zk?vi(fa5`7UB#myw!@ZvK&sPL-(p!eS;=?;JceQl8nR}MsI>}>O%*05$a_TkW5iI`_pNt4e<&;%yW2E;xeWQcIL|mn zEs&^EwK;T~pjT)NTpexayARAmnzo*5K~85ixM=e{o@ZIqB*TSqKUHkyOoOKU43*_L zUubQ)Fdx8LCfEunGP_okQ6YVyU34)>pTPh61CvX^9m9(8mSEx9lVOU{!n1VgO_Xy~ z5C>t(e4Uwo_;RubhDAQROTXRhK<4wJkl#NRBs&a>zfFgs4^uZTzZtl_#M7>cX}15G zvg_<+?>d7zRW?Bu-SrV|QzKoro~~vm8v0)3+O}ou74Qkk(!oNKx;FS>OAX_MBWwkK za2$5f6Q1nm5fSJM70c_=V(8-$lB+8|KkYOMR4vY}D=+XfmU+Hbo&@Lm%jyH>9^8vUE&2lV5X1%{z3M0leRN{cI=BAPkUK<_H(WM*>jUEU{U9$ zUy-sRC}Xl@L+m5;y?#VF1>A1dI31w~ z6`AlkbzRF3&@i9V4*&K2Q!V2q5NolOYC+`tG#J)Fypt$sxL-e{js^J#O22qKztj$m zYlJJ(SRlQ6J8^qk$*?ak>CY~Mfhvk$oP{gKGfe-j}N%CQmHt1LCnSx(OP!vlLPwF{d0Bj#VMF#UtgxHg{ z@QN|5*Q~UDUYO3KkIgWFOe99KgE&6^;Fe*9AvzndH7eA9j`s}y3(JB_8LPHmM^qGx z@a*^%Ht1($|4#ck@=K#8T_ekvpbpwT`rJ!V6Xjm~+vax+pt%G6A{i0@uZ4Hg2tOKh zY$xn5@|2c%>uRMp(=rO&Dn}_xAOig#V>M&$M60QbJFct z*U|#&Y8P*P!v}R!S|2W?{W?OUSXL6;9zKJfxfpimJ3-~3D8+PBz)zM^(Npv%$maYl z`4u1Zm_ewVhW0-ZL8v>e0($|VRdDA9vPKE9v)3`FeW(ijh%6w(e{J;mB(FWxsIsnq{I?p{U>oO=rZUD^A&;|Rh_tz}w70F{Y^qP}5$?^Eo> z*TWi)>jlj&mU1k?7}NVcRm`C0tj+jBTG3^>UVOO4tN0#3C$KcojSciujxvvI3^L%| z%fCXc45)((cVapnJ-?2$D3*C-oWf54DJVu6mP}yz zmb<@MLEKjS)f~qD-Y3zEk4;6C0J=6ENG2%)b=a~8TNFXhvgvEhK&J&nu`mnU>-mA? zw(jx{fjLX9tdYfnOqo1-JM%pWYjXBlZgO3oOM=Y= z4ycVphZ_q|+q89Ms+Ho`3hH3C=JdS=Jz77+Jz{_?nkl9ZA*#5K9d|b+J7hxf^*x=< zK^=ugkp>!2hkh~LL&c9=gv3ZaU)U8L6j^E+IHG|uCVGd3pcBJUdK*~y4V}d3uKBe7 zUn9wjZT@Sd`jxMYoR#J|Kq2QhzaGQlv;gT9jpkuO5xI9=o`YVgo85^aXZ!1=9>^*< z-<=mfUfYU6fa@LqAb|n(f->Bo?yFhJlL2&qhLlqc4u;BY+jYJTI?PXUcYp;QX7Ow8 zF^j5(M6o>cE}4N&PQ@S*Jy?ok^V@IqplA1%h?OFMe0>`BOMs>*%=!C>}V_)@|jG) z?}H!U0qom!(EN~K&Botik1j-A{gxL3_b^LS?a2==9oOcVt78ShB`k{@jxMHJY7`4S z+WxC*ep*l{hh|4vO->Ch6RfEINgpiljw4{Ckoa4sg>EOHBSW0D?o0ymi;(_U5B2zDPM#Hfjlk=0m5bUiCIITM@~-D6qU;?Vf_%2~mD5?1N# zHJVZKkq{)|&l4$Eu%pB^UoNqL2<~`W6lkS5zeKUL;HI<0{|M&` z{I_5G0zH#N2t-@K(Wdpm4M6+S=!&K6qqbibJBbm_t*!$L81Rn&nKd|&rTpWixJ^|= zh4OkftQbU91EW~>25|Pk`5CV4e}M{}F|PhxKF~<+yg}W_FN+@VvzV+62jX4l5%~b! zK$S{7$>6oO68SS;CCieFzvb#nYqrWyYk)2fhw@-R1{G3`O?S5fRN8l=Fv zLpzx_!wq7^SEd z^9)?Dp91KU;8+R#Z?tu{nC}8YXv&Faum5Yjtak}9a!~- zqg-raFL0V#Xw#K4O*G`P>-FiiXgT@gkK1}y+2l&1;Ib`6YIm=Qv3XhhGa41H(R-v< z{@-inTrs(3)w%!PGt+&Q4`DShn)T!s#x64tVZCo|+P3$iHblTQ`8nP)r0qqmEh4m~ z>X-r(tLS>QJ=`O{dz@r^?>yG-1TTzToKbo)(2ST7I;Fg@t)Pk=9~SxL8PTJB=DNLt z-AaiyQF@m_7l96q&{4qQR?D`G7G0#wSRkRg335pVnv5g-8)5w8nZ-bgax=wu3{|ky zQik}$`RZ?0$#x{NojokRhz-ZM>$n|`c~0p%P%ad4@;t`ce_N9m(FT7{@j8GYN!&EU z!_wrej^uA4YmuGR@3#EtC_bx}b2LlMBJ{u~_FgBBl^g5 zw)q1|y#Ck&OzuN?u(ta~Ff#h5x~1^oMArjVH$lV&WEN6W&9kBwcZ?<~1HrBx$-_){ zjEl8blQLJ4JpuMF(N#Yl2mfrs;EpSeIw3Ps?+k#c=O3u`Rv|@)UD~0oIg_RnMD#1l zR<#;gJbnpN8s*{8Ah05KWJp3?=Of2d^lj(Amsffs8Kwvu-&(D-VmeuKWQw$?M|$Q9 zkf0w6lM1)>BVv!)qx zkS1!_n~izV|J`w9FmvP$mQbtuWRYL_Hso96?_lJ=!{Mr`ii|aUYPeZ8NX>_J)M~g3 zM2>9qVY3VJ92(2bt9aQR3a%*`1;~d?H80|Y(bLS{6?S-zFiPi|r;%ZEXgE+7{IMD6 zRZS}7Jubje(n8|tTUY&KFKu%-AsVPYSm{x^lKcCE_x3b8akuAbN>1=QetAcWIC|Xd zc=i~%v@U97ITxL~obaZ?7?r~Apxm=fjmQnPp_I}>v-7ZwSdSlXT88cj(>$w;dSeET zzsq}kLR^e77>h3EdFo_nj#o}Fm6xoB0_XNaZ${Sn*?-xo_~|28`*%o7dR zbebwnK2J;;u&4FCag(cjm`!*-zH&tFaHY}&M?#RFRD8+=P8s~f7ldCmhQ8Sf8FvG4o6f?2-!T!pCQreD^$x1*VR z4&S!;3p}~wJlqI1!{xQZBG5_X{PdpBX%Jq7OYf&%?0mY@*21NR!7tL;wa=BhtFnb( z242+Y=ducUyfP2&_?ukgHJB!9@%yiHe5Km#h_l7Wx+{HkKa60%-TAX3_JnHxuf&r% zXDh#`Y%(d!)}pt+HRO=Qt@SP@xM1$d#}U8@_VZKGA7JdspL|vHKwsmls8#v8AVPmU z-8&rdPHfD)2QiS_#oeTnD}wv{FP02X^_86GW9Dr=CSqRT4{6xLw}%;9&&52LD8^8RkKadLiIu+n`z6%3bh*!LY1TjJ&sN^m zW@U;sHClh&9LYUS9 zj4)r|!#(N6^SDFq>lW=o6$-HGtWU(Bez#KBDn^p^Mm7M~lHgKF@R#Oa(bMfG2org? z!D41)L5h=gGOW6h$L}O_m|-XBB*uTh2A(FMG&nq-dmmV34pjVD^mRoydnf0DI9si! z>D(9@MQkpeaQV(mDuIBHZ#aVaa7{GMv2T z>lMB}vt+L7y%^+Org}TUULs!hg|H|twK1)G#KJQdUhK6JaXehZ4-&SbH{;cMc zXbHdk-tSVBMk^REcRYOX`gwSthVa8HkYC^QRA*I+y-5oSRWZ+ZQHz#!Dy}JL_hw6~ zbHlBw8Gg6_>3Bn*3Y8l+iL{~b{1_eqFB)x)_+*oOwa*8!c2r^N>GR>^JYajkw%zb>n*W8`XU73fn#BUdgRKTs1_sS{^N!hWv5Y z_kMi9$s+z9bi#;=cQy7Ak%gVeifb?`e^=Z5AO78GC}yggsTEgIVRtO&Osr;^FVkNMDT- zbM}u2n&T!DM?Q_d3~iXn?5{>-99Y7-tqfZ(_FL+Cx>vZ$K9i=zHvDMN0@f*vvw6e% zWAlxs$H{4$X9hIW8MKXfY+TJ~wuLVbY%1J`8ahvEu=kWt&;hKlDSm~-;R&#FAsm98d;e&|WHpaxmOr|PTXw9M+zU5t>3&Ho^ z-xOLU%TN9IzMFoi#BN{^wYz&P9)z(AikB__bP;ggTGXVVQ+z3O{sMAdVbK2IiuR4Kb_;ixz`Mfp;?>M0nOd{N*^s{ksVuV0K z^O{aS%dm%B+-kDo$1>sI zHIJk{o3w{*BR0;S=vGa`sNhB6+*^M9ML!Iah|nVU?Lpd2x@$$@%hIW?DM=p8FL)zc zTml)FH-M~sQ_WqXh!@V7^o7>Vn11ppIi9(H?12@Tb|(^yljwSIvVl5{G~+Prq0gR% z9+S z=kAyR?OT&)M+92l5l~9=d;1&WF1Znb1m9Iw1OAqLzc;>L6xhs7Q#Y4l9D;FLjHsxB zi1)@_AjuSs@+_goQm%Zv!r`EGD)*$9<$>GU*NsGu~if)#FD@X@*f z;$33)X^?6fY6U0UQ(E4J9y}1}m+2y!l}L=tcy>H9zt9`p5Vww*S)Y2$B@M;~8543V zsTxrD0Tw+k5|U{){ZDbE+}Wo_0UTbu(N65q`HCu{7~(g`a$(It!3H8S~m z06y{?d^g`(@jkIvhR;=wuPC=sug*Z8fBRh1;aQvD(OhU&=(pPFuu3HTgTi2)ULdGg zO=7Ft@6?wSg4j8~n2RgJIAAvXV^vE%8Esf_-(yFl%*wxo`hzXlHZD&<%Jd`mbfcML zTzo1VD_LCJNAiQ5?{yhrm8feaQ53d${Re6=8=t;8%!TVtf1@9u?yH#N?uXdn{!IB` zYvEZ)o3bR;IGsD`fZV44`@L(GHp-l))XdW{Q{lA#f>ZhOW-BGC&gw|bz`7+q9j66!Tx&xIeNkDsth_i4P+an{{YwNXY8&zUpiT5+o)*j( zCtu71PugbFWTNlDB{%?E??F!gd729Y!qaJzuyhjISllG%s z6RUe=;C=<5n9#^z_+Pt=Jv@Y97N2ozkJgAbKjZJhS+EucPN#~G{Hywr-^juKm4=Z> z2kg}y4&UFn2UL8kX$~uW!kM;cSP2fV$Ku-4zT9E$)t5(}M-+|~9Fx4yB2t8^65iXC z0AaXO4jc3!j20d+D|2F&w}o4TZ5%g*D~;`YAo2BS<$n5W$eC2J&P?T3f7Bcc1iqNV z{DNx?W5s2(R>n0zk(|=?T?E>FK0;+(Pmjq)0(afqpW8nZYP#PxJ^5jHbtz$`NM_Fq z?}J@ZVOjB;%u;1-OR78Czl(?erM#TdUH+i5u`E%@5C{yA5h{)RQk+U&guNzi{=8h9 zoGdHDz5-jcHn5d5hF_u2I^5nlYxy{=mTuPp* zpMr*_{b2tFnf#of)D&!>VOQOMt0;hMX8&FSTKiVYX=)|KUKqwyb}Q4j^5 z%MoO=KWO4IIy^T$_ux*2jiLT%?1V!Oex}pepYcE;m2>P&Xz>SwcV~*Hde-}$y+oA9 zF-7LK7=u?Zx~xc3kOrMgWn&j1Z5-&b|;a->qM}3u3B|qiATt>Y9$w zt>L!FpY6!bY|cL8&st8^t-qMuti6^w=0jqC-{d`x)yBBz+$$80(mNLjCF)}CQ698M zC={T@48+e?7s-CTA?u*beJu2m#6dcwV))i2Vszaq88iKrnr?E@H<%Vn;18wC-&(XX*!1mZ`v&6@aS(UP@EG@1>Mo=;aqt!JX zSLf0I+FS2;_f(~9nu=;f3JuZ-rd1#a)38Wx9gin!Y#_+qEj(u<*mumm-`n&~>QX9= zB+om`vt6Mv%tZ_&HF@{=m=kT0%$I0bt;#mr&@>9B4PtZy5X1j#8 zvCjDiH~eGm7aeqUM=uL2rBC~ ze-zxEte4tUOa4TgY4-x{^iRUmo9RM7tS8lM)TCX)LSEH0V> zHDK57f5<4CtXMAB1{ckElSK*I6{B3tDuI&L@B__Yll_6+E6qA7DoCV=Vd4}L8@vG8Rm)H!DUlX z3;F@YR~5kXLF-s|hH-q~6SR5H;olyh$8z(Qnfh3NaWIPDI?RD{5vZ7M^pWu3-FI-g z;911_PpXN4S0-96w+1A8d%w#EA!95fzIIR zToxur0@2aW^=1H#;OGyhwZHG_52iYN*+<~Ut^%4TSYrnX{G|tNHZK{X1PExsB}wm= zL!Mq>Ay9MU&75SGd4zAhfht#0lk2MYE_btGsdz7No|D>ABQH?^1`En{p zHIW@39LfPQw;m#33M80&&Y0Fn3UQG z7O}oBsLx~$xyBN0a}C6c z3hYnt`$>l8st$pnk;7kViGu=08Ku~xf)>+KCp-sttfnApflEEg#m^mZmp0?pEMOi- ztMKv9{>#JFU=+&3{bUEfe(p0S2v8=jsFDzJlF_W51UBP^*H|lJJN+^uTGQcu?rT;M zhi^|^o55*7BFhsO7EHA$D0OBlIAp-D=wJD9b5DqssiFO-#xk9JIbMIbDG!36TSsCx z0N&MY+C(mtF3mh`Ej$ox$EV)By9)B0yUWav1`^*S_m$!quxI(*=>Y)!bJl#JiT-4#jcN*g}l$gqc$UHhUzc1kv)Hv4P^TLfC>v+)~5!6^eWSo z=D?W&D9w1Yg5;F()H2UyOdzg$T5 z@&gcX9vh4B#w7wE+a0Di2c`cL&!PGJ#s%yLI<2&70{VeY68@MeaIirK1q#jRS+Z3I z8q7~O=46ZXe`0AiZwOw!;%HU|M4L<1TZbx;q3?#C@MIkZM-gC_`m7#w2VWf_S6H{L zz&w%uKc2oiuBzvGUqwKrL`qt^LApa)Qjl(>yE_#Dk?!v9xO7T$K^mmHySu*U-1q1A z`)^-+cW2J-&OXn~>^XZuTYbzX3U11QEiMeP9kok1?rn$nvO>)Ru{m208sTbJN%z6wcCgeKyt?IOeDR%OhaU6LC z1A_!en#*YGFOU%pb>;t4yt|n{UhoOVJHSy`Cjed^w#(wgb7%ikOeG}~0b_p%PuRM4 z4tW-!T9sh@jv5Bnkd*>qn4LV%*boDJin{zq!szV35o3K`xV1t86;IpdupJH9p@UGa zO~U!V5!dUtvgpFV5?vtR9zb$3uH$8X=4Oj!F(rVTREepkU|cU4XW{e{9H>e$zY+|m zwaU>nVVs@#nC1g$l{*fXWZ+%VcmbP8{rP5I*fWiO=2;ZG11J1AoA<&F5f!$UxJYYm z5KWkhhlj;ugsz~1cSFm6WIf8+U=G3G#qwrpQ&I2{i2AV&3`xRCUKWco+Ukj2 zBWg*10QYQL+0Go`ruiZgIsd7}2Rjm6Hc%e^f!W;t_`jN$VBP(-et5%wRGn+>&ja&P z#%Z0UVLsy)=fPKhP{bndf&mvHf$f zXNvS5dn&9ZpZ+g?0zGJ8x~+ z!0AB`=D#+t4^>ftAn^S?YmElT$_2y7H>edbI7+j#bJT_rwK40Gk1vQ&i$0m|Zm_D8 zo8i1a0Exg;q80qMcnvca6PKfOpr`L`hEBV$DhykqW@7)JDUsdHt{e_Z0Bhf0G`76} zfLDehZXI6|3IILI6#Z$h13?X~Y@SrW%Nn2&RM>=~4gW_C!-Ro%6EI-&%=Q^t1d+aS zmuT|;@7b-FP-W%gKd9wWsj%lHN^E}TvJBeUZLMnQY%feoatc?{D-h=_w*=Zgf)rcf zP!@m>BRHQUpLRkJ%o8T-x4wf9a=5tG@!wE0HSr>}lsBFUj@2Cc!iHKPY3}AVZ-ovc zk-2}1rY}IT1UfDMn_wrVlMPDP69rN{X8~t5JW`wQf(p<%!P#rWfeQz=Z-(5+MA-Lb`3WJDUoh;QyW!Pelip4J@I057*G^jH)7r<)^+f!SP^Gk2Q zr=R9c*L?-^T-vt+uK;)N*>m|aOc53{Vj?d6;TQ7{jjpGl=^m2SP!q;lAgi;oV`bEua}%!NZ`y`m)f{ReZD*XgVeRouSHr*#aiPpN; h73w(P|IQF`eRVO)4Td?fa@O>K{PO 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∋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

*|y7&{8R?>6?;6jSB@+;cJYMACRSEe?$K-gCM1 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 diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_20_0.json b/core/src/main/resources/bedrock/runtime_item_states.1_20_0.json deleted file mode 100644 index 8aa2d1b0a98..00000000000 --- a/core/src/main/resources/bedrock/runtime_item_states.1_20_0.json +++ /dev/null @@ -1,5186 +0,0 @@ -[ - { - "name": "minecraft:acacia_boat", - "id": 381 - }, - { - "name": "minecraft:acacia_button", - "id": -140 - }, - { - "name": "minecraft:acacia_chest_boat", - "id": 649 - }, - { - "name": "minecraft:acacia_door", - "id": 563 - }, - { - "name": "minecraft:acacia_fence", - "id": -575 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187 - }, - { - "name": "minecraft:acacia_hanging_sign", - "id": -504 - }, - { - "name": "minecraft:acacia_log", - "id": 162 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": -150 - }, - { - "name": "minecraft:acacia_sign", - "id": 586 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": -190 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": -145 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": -191 - }, - { - "name": "minecraft:activator_rail", - "id": 126 - }, - { - "name": "minecraft:agent_spawn_egg", - "id": 489 - }, - { - "name": "minecraft:air", - "id": -158 - }, - { - "name": "minecraft:allay_spawn_egg", - "id": 638 - }, - { - "name": "minecraft:allow", - "id": 210 - }, - { - "name": "minecraft:amethyst_block", - "id": -327 - }, - { - "name": "minecraft:amethyst_cluster", - "id": -329 - }, - { - "name": "minecraft:amethyst_shard", - "id": 631 - }, - { - "name": "minecraft:ancient_debris", - "id": -271 - }, - { - "name": "minecraft:andesite_stairs", - "id": -171 - }, - { - "name": "minecraft:angler_pottery_sherd", - "id": 663 - }, - { - "name": "minecraft:anvil", - "id": 145 - }, - { - "name": "minecraft:apple", - "id": 257 - }, - { - "name": "minecraft:archer_pottery_sherd", - "id": 664 - }, - { - "name": "minecraft:armor_stand", - "id": 559 - }, - { - "name": "minecraft:arms_up_pottery_sherd", - "id": 665 - }, - { - "name": "minecraft:arrow", - "id": 303 - }, - { - "name": "minecraft:axolotl_bucket", - "id": 371 - }, - { - "name": "minecraft:axolotl_spawn_egg", - "id": 503 - }, - { - "name": "minecraft:azalea", - "id": -337 - }, - { - "name": "minecraft:azalea_leaves", - "id": -324 - }, - { - "name": "minecraft:azalea_leaves_flowered", - "id": -325 - }, - { - "name": "minecraft:baked_potato", - "id": 281 - }, - { - "name": "minecraft:balloon", - "id": 605 - }, - { - "name": "minecraft:bamboo", - "id": -163 - }, - { - "name": "minecraft:bamboo_block", - "id": -527 - }, - { - "name": "minecraft:bamboo_button", - "id": -511 - }, - { - "name": "minecraft:bamboo_chest_raft", - "id": 661 - }, - { - "name": "minecraft:bamboo_door", - "id": -517 - }, - { - "name": "minecraft:bamboo_double_slab", - "id": -521 - }, - { - "name": "minecraft:bamboo_fence", - "id": -515 - }, - { - "name": "minecraft:bamboo_fence_gate", - "id": -516 - }, - { - "name": "minecraft:bamboo_hanging_sign", - "id": -522 - }, - { - "name": "minecraft:bamboo_mosaic", - "id": -509 - }, - { - "name": "minecraft:bamboo_mosaic_double_slab", - "id": -525 - }, - { - "name": "minecraft:bamboo_mosaic_slab", - "id": -524 - }, - { - "name": "minecraft:bamboo_mosaic_stairs", - "id": -523 - }, - { - "name": "minecraft:bamboo_planks", - "id": -510 - }, - { - "name": "minecraft:bamboo_pressure_plate", - "id": -514 - }, - { - "name": "minecraft:bamboo_raft", - "id": 660 - }, - { - "name": "minecraft:bamboo_sapling", - "id": -164 - }, - { - "name": "minecraft:bamboo_sign", - "id": 659 - }, - { - "name": "minecraft:bamboo_slab", - "id": -513 - }, - { - "name": "minecraft:bamboo_stairs", - "id": -512 - }, - { - "name": "minecraft:bamboo_standing_sign", - "id": -518 - }, - { - "name": "minecraft:bamboo_trapdoor", - "id": -520 - }, - { - "name": "minecraft:bamboo_wall_sign", - "id": -519 - }, - { - "name": "minecraft:banner", - "id": 574 - }, - { - "name": "minecraft:banner_pattern", - "id": 710 - }, - { - "name": "minecraft:barrel", - "id": -203 - }, - { - "name": "minecraft:barrier", - "id": -161 - }, - { - "name": "minecraft:basalt", - "id": -234 - }, - { - "name": "minecraft:bat_spawn_egg", - "id": 455 - }, - { - "name": "minecraft:beacon", - "id": 138 - }, - { - "name": "minecraft:bed", - "id": 420 - }, - { - "name": "minecraft:bedrock", - "id": 7 - }, - { - "name": "minecraft:bee_nest", - "id": -218 - }, - { - "name": "minecraft:bee_spawn_egg", - "id": 496 - }, - { - "name": "minecraft:beef", - "id": 273 - }, - { - "name": "minecraft:beehive", - "id": -219 - }, - { - "name": "minecraft:beetroot", - "id": 285 - }, - { - "name": "minecraft:beetroot_seeds", - "id": 295 - }, - { - "name": "minecraft:beetroot_soup", - "id": 286 - }, - { - "name": "minecraft:bell", - "id": -206 - }, - { - "name": "minecraft:big_dripleaf", - "id": -323 - }, - { - "name": "minecraft:birch_boat", - "id": 378 - }, - { - "name": "minecraft:birch_button", - "id": -141 - }, - { - "name": "minecraft:birch_chest_boat", - "id": 646 - }, - { - "name": "minecraft:birch_door", - "id": 561 - }, - { - "name": "minecraft:birch_fence", - "id": -576 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184 - }, - { - "name": "minecraft:birch_hanging_sign", - "id": -502 - }, - { - "name": "minecraft:birch_log", - "id": -570 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": -151 - }, - { - "name": "minecraft:birch_sign", - "id": 584 - }, - { - "name": "minecraft:birch_stairs", - "id": 135 - }, - { - "name": "minecraft:birch_standing_sign", - "id": -186 - }, - { - "name": "minecraft:birch_trapdoor", - "id": -146 - }, - { - "name": "minecraft:birch_wall_sign", - "id": -187 - }, - { - "name": "minecraft:black_candle", - "id": -428 - }, - { - "name": "minecraft:black_candle_cake", - "id": -445 - }, - { - "name": "minecraft:black_carpet", - "id": -611 - }, - { - "name": "minecraft:black_dye", - "id": 397 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235 - }, - { - "name": "minecraft:black_wool", - "id": -554 - }, - { - "name": "minecraft:blackstone", - "id": -273 - }, - { - "name": "minecraft:blackstone_double_slab", - "id": -283 - }, - { - "name": "minecraft:blackstone_slab", - "id": -282 - }, - { - "name": "minecraft:blackstone_stairs", - "id": -276 - }, - { - "name": "minecraft:blackstone_wall", - "id": -277 - }, - { - "name": "minecraft:blade_pottery_sherd", - "id": 666 - }, - { - "name": "minecraft:blast_furnace", - "id": -196 - }, - { - "name": "minecraft:blaze_powder", - "id": 431 - }, - { - "name": "minecraft:blaze_rod", - "id": 425 - }, - { - "name": "minecraft:blaze_spawn_egg", - "id": 458 - }, - { - "name": "minecraft:bleach", - "id": 603 - }, - { - "name": "minecraft:blue_candle", - "id": -424 - }, - { - "name": "minecraft:blue_candle_cake", - "id": -441 - }, - { - "name": "minecraft:blue_carpet", - "id": -607 - }, - { - "name": "minecraft:blue_dye", - "id": 401 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231 - }, - { - "name": "minecraft:blue_ice", - "id": -11 - }, - { - "name": "minecraft:blue_wool", - "id": -563 - }, - { - "name": "minecraft:boat", - "id": 708 - }, - { - "name": "minecraft:bone", - "id": 417 - }, - { - "name": "minecraft:bone_block", - "id": 216 - }, - { - "name": "minecraft:bone_meal", - "id": 413 - }, - { - "name": "minecraft:book", - "id": 389 - }, - { - "name": "minecraft:bookshelf", - "id": 47 - }, - { - "name": "minecraft:border_block", - "id": 212 - }, - { - "name": "minecraft:bordure_indented_banner_pattern", - "id": 593 - }, - { - "name": "minecraft:bow", - "id": 302 - }, - { - "name": "minecraft:bowl", - "id": 323 - }, - { - "name": "minecraft:brain_coral", - "id": -581 - }, - { - "name": "minecraft:bread", - "id": 261 - }, - { - "name": "minecraft:brewer_pottery_sherd", - "id": 667 - }, - { - "name": "minecraft:brewing_stand", - "id": 433 - }, - { - "name": "minecraft:brick", - "id": 385 - }, - { - "name": "minecraft:brick_block", - "id": 45 - }, - { - "name": "minecraft:brick_stairs", - "id": 108 - }, - { - "name": "minecraft:brown_candle", - "id": -425 - }, - { - "name": "minecraft:brown_candle_cake", - "id": -442 - }, - { - "name": "minecraft:brown_carpet", - "id": -608 - }, - { - "name": "minecraft:brown_dye", - "id": 400 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232 - }, - { - "name": "minecraft:brown_mushroom", - "id": 39 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99 - }, - { - "name": "minecraft:brown_wool", - "id": -555 - }, - { - "name": "minecraft:brush", - "id": 683 - }, - { - "name": "minecraft:bubble_column", - "id": -160 - }, - { - "name": "minecraft:bubble_coral", - "id": -582 - }, - { - "name": "minecraft:bucket", - "id": 362 - }, - { - "name": "minecraft:budding_amethyst", - "id": -328 - }, - { - "name": "minecraft:burn_pottery_sherd", - "id": 668 - }, - { - "name": "minecraft:cactus", - "id": 81 - }, - { - "name": "minecraft:cake", - "id": 419 - }, - { - "name": "minecraft:calcite", - "id": -326 - }, - { - "name": "minecraft:calibrated_sculk_sensor", - "id": -580 - }, - { - "name": "minecraft:camel_spawn_egg", - "id": 662 - }, - { - "name": "minecraft:camera", - "id": 600 - }, - { - "name": "minecraft:campfire", - "id": 596 - }, - { - "name": "minecraft:candle", - "id": -412 - }, - { - "name": "minecraft:candle_cake", - "id": -429 - }, - { - "name": "minecraft:carpet", - "id": 703 - }, - { - "name": "minecraft:carrot", - "id": 279 - }, - { - "name": "minecraft:carrot_on_a_stick", - "id": 524 - }, - { - "name": "minecraft:carrots", - "id": 141 - }, - { - "name": "minecraft:cartography_table", - "id": -200 - }, - { - "name": "minecraft:carved_pumpkin", - "id": -155 - }, - { - "name": "minecraft:cat_spawn_egg", - "id": 490 - }, - { - "name": "minecraft:cauldron", - "id": 434 - }, - { - "name": "minecraft:cave_spider_spawn_egg", - "id": 459 - }, - { - "name": "minecraft:cave_vines", - "id": -322 - }, - { - "name": "minecraft:cave_vines_body_with_berries", - "id": -375 - }, - { - "name": "minecraft:cave_vines_head_with_berries", - "id": -376 - }, - { - "name": "minecraft:chain", - "id": 626 - }, - { - "name": "minecraft:chain_command_block", - "id": 189 - }, - { - "name": "minecraft:chainmail_boots", - "id": 344 - }, - { - "name": "minecraft:chainmail_chestplate", - "id": 342 - }, - { - "name": "minecraft:chainmail_helmet", - "id": 341 - }, - { - "name": "minecraft:chainmail_leggings", - "id": 343 - }, - { - "name": "minecraft:charcoal", - "id": 305 - }, - { - "name": "minecraft:chemical_heat", - "id": 192 - }, - { - "name": "minecraft:chemistry_table", - "id": 238 - }, - { - "name": "minecraft:cherry_boat", - "id": 656 - }, - { - "name": "minecraft:cherry_button", - "id": -530 - }, - { - "name": "minecraft:cherry_chest_boat", - "id": 657 - }, - { - "name": "minecraft:cherry_door", - "id": -531 - }, - { - "name": "minecraft:cherry_double_slab", - "id": -540 - }, - { - "name": "minecraft:cherry_fence", - "id": -532 - }, - { - "name": "minecraft:cherry_fence_gate", - "id": -533 - }, - { - "name": "minecraft:cherry_hanging_sign", - "id": -534 - }, - { - "name": "minecraft:cherry_leaves", - "id": -548 - }, - { - "name": "minecraft:cherry_log", - "id": -536 - }, - { - "name": "minecraft:cherry_planks", - "id": -537 - }, - { - "name": "minecraft:cherry_pressure_plate", - "id": -538 - }, - { - "name": "minecraft:cherry_sapling", - "id": -547 - }, - { - "name": "minecraft:cherry_sign", - "id": 658 - }, - { - "name": "minecraft:cherry_slab", - "id": -539 - }, - { - "name": "minecraft:cherry_stairs", - "id": -541 - }, - { - "name": "minecraft:cherry_standing_sign", - "id": -542 - }, - { - "name": "minecraft:cherry_trapdoor", - "id": -543 - }, - { - "name": "minecraft:cherry_wall_sign", - "id": -544 - }, - { - "name": "minecraft:cherry_wood", - "id": -546 - }, - { - "name": "minecraft:chest", - "id": 54 - }, - { - "name": "minecraft:chest_boat", - "id": 652 - }, - { - "name": "minecraft:chest_minecart", - "id": 391 - }, - { - "name": "minecraft:chicken", - "id": 275 - }, - { - "name": "minecraft:chicken_spawn_egg", - "id": 437 - }, - { - "name": "minecraft:chiseled_bookshelf", - "id": -526 - }, - { - "name": "minecraft:chiseled_deepslate", - "id": -395 - }, - { - "name": "minecraft:chiseled_nether_bricks", - "id": -302 - }, - { - "name": "minecraft:chiseled_polished_blackstone", - "id": -279 - }, - { - "name": "minecraft:chorus_flower", - "id": 200 - }, - { - "name": "minecraft:chorus_fruit", - "id": 565 - }, - { - "name": "minecraft:chorus_plant", - "id": 240 - }, - { - "name": "minecraft:clay", - "id": 82 - }, - { - "name": "minecraft:clay_ball", - "id": 386 - }, - { - "name": "minecraft:client_request_placeholder_block", - "id": -465 - }, - { - "name": "minecraft:clock", - "id": 395 - }, - { - "name": "minecraft:coal", - "id": 304 - }, - { - "name": "minecraft:coal_block", - "id": 173 - }, - { - "name": "minecraft:coal_ore", - "id": 16 - }, - { - "name": "minecraft:coast_armor_trim_smithing_template", - "id": 687 - }, - { - "name": "minecraft:cobbled_deepslate", - "id": -379 - }, - { - "name": "minecraft:cobbled_deepslate_double_slab", - "id": -396 - }, - { - "name": "minecraft:cobbled_deepslate_slab", - "id": -380 - }, - { - "name": "minecraft:cobbled_deepslate_stairs", - "id": -381 - }, - { - "name": "minecraft:cobbled_deepslate_wall", - "id": -382 - }, - { - "name": "minecraft:cobblestone", - "id": 4 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139 - }, - { - "name": "minecraft:cocoa", - "id": 127 - }, - { - "name": "minecraft:cocoa_beans", - "id": 414 - }, - { - "name": "minecraft:cod", - "id": 264 - }, - { - "name": "minecraft:cod_bucket", - "id": 366 - }, - { - "name": "minecraft:cod_spawn_egg", - "id": 482 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202 - }, - { - "name": "minecraft:command_block", - "id": 137 - }, - { - "name": "minecraft:command_block_minecart", - "id": 570 - }, - { - "name": "minecraft:comparator", - "id": 529 - }, - { - "name": "minecraft:compass", - "id": 393 - }, - { - "name": "minecraft:composter", - "id": -213 - }, - { - "name": "minecraft:compound", - "id": 601 - }, - { - "name": "minecraft:concrete", - "id": 236 - }, - { - "name": "minecraft:concrete_powder", - "id": 237 - }, - { - "name": "minecraft:conduit", - "id": -157 - }, - { - "name": "minecraft:cooked_beef", - "id": 274 - }, - { - "name": "minecraft:cooked_chicken", - "id": 276 - }, - { - "name": "minecraft:cooked_cod", - "id": 268 - }, - { - "name": "minecraft:cooked_mutton", - "id": 558 - }, - { - "name": "minecraft:cooked_porkchop", - "id": 263 - }, - { - "name": "minecraft:cooked_rabbit", - "id": 289 - }, - { - "name": "minecraft:cooked_salmon", - "id": 269 - }, - { - "name": "minecraft:cookie", - "id": 271 - }, - { - "name": "minecraft:copper_block", - "id": -340 - }, - { - "name": "minecraft:copper_ingot", - "id": 511 - }, - { - "name": "minecraft:copper_ore", - "id": -311 - }, - { - "name": "minecraft:coral", - "id": 706 - }, - { - "name": "minecraft:coral_block", - "id": -132 - }, - { - "name": "minecraft:coral_fan", - "id": -133 - }, - { - "name": "minecraft:coral_fan_dead", - "id": -134 - }, - { - "name": "minecraft:coral_fan_hang", - "id": -135 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": -136 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": -137 - }, - { - "name": "minecraft:cow_spawn_egg", - "id": 438 - }, - { - "name": "minecraft:cracked_deepslate_bricks", - "id": -410 - }, - { - "name": "minecraft:cracked_deepslate_tiles", - "id": -409 - }, - { - "name": "minecraft:cracked_nether_bricks", - "id": -303 - }, - { - "name": "minecraft:cracked_polished_blackstone_bricks", - "id": -280 - }, - { - "name": "minecraft:crafting_table", - "id": 58 - }, - { - "name": "minecraft:creeper_banner_pattern", - "id": 589 - }, - { - "name": "minecraft:creeper_spawn_egg", - "id": 443 - }, - { - "name": "minecraft:crimson_button", - "id": -260 - }, - { - "name": "minecraft:crimson_door", - "id": 623 - }, - { - "name": "minecraft:crimson_double_slab", - "id": -266 - }, - { - "name": "minecraft:crimson_fence", - "id": -256 - }, - { - "name": "minecraft:crimson_fence_gate", - "id": -258 - }, - { - "name": "minecraft:crimson_fungus", - "id": -228 - }, - { - "name": "minecraft:crimson_hanging_sign", - "id": -506 - }, - { - "name": "minecraft:crimson_hyphae", - "id": -299 - }, - { - "name": "minecraft:crimson_nylium", - "id": -232 - }, - { - "name": "minecraft:crimson_planks", - "id": -242 - }, - { - "name": "minecraft:crimson_pressure_plate", - "id": -262 - }, - { - "name": "minecraft:crimson_roots", - "id": -223 - }, - { - "name": "minecraft:crimson_sign", - "id": 621 - }, - { - "name": "minecraft:crimson_slab", - "id": -264 - }, - { - "name": "minecraft:crimson_stairs", - "id": -254 - }, - { - "name": "minecraft:crimson_standing_sign", - "id": -250 - }, - { - "name": "minecraft:crimson_stem", - "id": -225 - }, - { - "name": "minecraft:crimson_trapdoor", - "id": -246 - }, - { - "name": "minecraft:crimson_wall_sign", - "id": -252 - }, - { - "name": "minecraft:crossbow", - "id": 582 - }, - { - "name": "minecraft:crying_obsidian", - "id": -289 - }, - { - "name": "minecraft:cut_copper", - "id": -347 - }, - { - "name": "minecraft:cut_copper_slab", - "id": -361 - }, - { - "name": "minecraft:cut_copper_stairs", - "id": -354 - }, - { - "name": "minecraft:cyan_candle", - "id": -422 - }, - { - "name": "minecraft:cyan_candle_cake", - "id": -439 - }, - { - "name": "minecraft:cyan_carpet", - "id": -605 - }, - { - "name": "minecraft:cyan_dye", - "id": 403 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229 - }, - { - "name": "minecraft:cyan_wool", - "id": -561 - }, - { - "name": "minecraft:danger_pottery_sherd", - "id": 669 - }, - { - "name": "minecraft:dark_oak_boat", - "id": 382 - }, - { - "name": "minecraft:dark_oak_button", - "id": -142 - }, - { - "name": "minecraft:dark_oak_chest_boat", - "id": 650 - }, - { - "name": "minecraft:dark_oak_door", - "id": 564 - }, - { - "name": "minecraft:dark_oak_fence", - "id": -577 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186 - }, - { - "name": "minecraft:dark_oak_hanging_sign", - "id": -505 - }, - { - "name": "minecraft:dark_oak_log", - "id": -572 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": -152 - }, - { - "name": "minecraft:dark_oak_sign", - "id": 587 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": -147 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": -3 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": -192 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": -193 - }, - { - "name": "minecraft:daylight_detector", - "id": 151 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178 - }, - { - "name": "minecraft:dead_brain_coral", - "id": -586 - }, - { - "name": "minecraft:dead_bubble_coral", - "id": -587 - }, - { - "name": "minecraft:dead_fire_coral", - "id": -588 - }, - { - "name": "minecraft:dead_horn_coral", - "id": -589 - }, - { - "name": "minecraft:dead_tube_coral", - "id": -585 - }, - { - "name": "minecraft:deadbush", - "id": 32 - }, - { - "name": "minecraft:decorated_pot", - "id": -551 - }, - { - "name": "minecraft:deepslate", - "id": -378 - }, - { - "name": "minecraft:deepslate_brick_double_slab", - "id": -399 - }, - { - "name": "minecraft:deepslate_brick_slab", - "id": -392 - }, - { - "name": "minecraft:deepslate_brick_stairs", - "id": -393 - }, - { - "name": "minecraft:deepslate_brick_wall", - "id": -394 - }, - { - "name": "minecraft:deepslate_bricks", - "id": -391 - }, - { - "name": "minecraft:deepslate_coal_ore", - "id": -406 - }, - { - "name": "minecraft:deepslate_copper_ore", - "id": -408 - }, - { - "name": "minecraft:deepslate_diamond_ore", - "id": -405 - }, - { - "name": "minecraft:deepslate_emerald_ore", - "id": -407 - }, - { - "name": "minecraft:deepslate_gold_ore", - "id": -402 - }, - { - "name": "minecraft:deepslate_iron_ore", - "id": -401 - }, - { - "name": "minecraft:deepslate_lapis_ore", - "id": -400 - }, - { - "name": "minecraft:deepslate_redstone_ore", - "id": -403 - }, - { - "name": "minecraft:deepslate_tile_double_slab", - "id": -398 - }, - { - "name": "minecraft:deepslate_tile_slab", - "id": -388 - }, - { - "name": "minecraft:deepslate_tile_stairs", - "id": -389 - }, - { - "name": "minecraft:deepslate_tile_wall", - "id": -390 - }, - { - "name": "minecraft:deepslate_tiles", - "id": -387 - }, - { - "name": "minecraft:deny", - "id": 211 - }, - { - "name": "minecraft:detector_rail", - "id": 28 - }, - { - "name": "minecraft:diamond", - "id": 306 - }, - { - "name": "minecraft:diamond_axe", - "id": 321 - }, - { - "name": "minecraft:diamond_block", - "id": 57 - }, - { - "name": "minecraft:diamond_boots", - "id": 352 - }, - { - "name": "minecraft:diamond_chestplate", - "id": 350 - }, - { - "name": "minecraft:diamond_helmet", - "id": 349 - }, - { - "name": "minecraft:diamond_hoe", - "id": 334 - }, - { - "name": "minecraft:diamond_horse_armor", - "id": 540 - }, - { - "name": "minecraft:diamond_leggings", - "id": 351 - }, - { - "name": "minecraft:diamond_ore", - "id": 56 - }, - { - "name": "minecraft:diamond_pickaxe", - "id": 320 - }, - { - "name": "minecraft:diamond_shovel", - "id": 319 - }, - { - "name": "minecraft:diamond_sword", - "id": 318 - }, - { - "name": "minecraft:diorite_stairs", - "id": -170 - }, - { - "name": "minecraft:dirt", - "id": 3 - }, - { - "name": "minecraft:dirt_with_roots", - "id": -318 - }, - { - "name": "minecraft:disc_fragment_5", - "id": 644 - }, - { - "name": "minecraft:dispenser", - "id": 23 - }, - { - "name": "minecraft:dolphin_spawn_egg", - "id": 486 - }, - { - "name": "minecraft:donkey_spawn_egg", - "id": 467 - }, - { - "name": "minecraft:double_cut_copper_slab", - "id": -368 - }, - { - "name": "minecraft:double_plant", - "id": 175 - }, - { - "name": "minecraft:double_stone_block_slab", - "id": 43 - }, - { - "name": "minecraft:double_stone_block_slab2", - "id": 181 - }, - { - "name": "minecraft:double_stone_block_slab3", - "id": -167 - }, - { - "name": "minecraft:double_stone_block_slab4", - "id": -168 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157 - }, - { - "name": "minecraft:dragon_breath", - "id": 567 - }, - { - "name": "minecraft:dragon_egg", - "id": 122 - }, - { - "name": "minecraft:dried_kelp", - "id": 270 - }, - { - "name": "minecraft:dried_kelp_block", - "id": -139 - }, - { - "name": "minecraft:dripstone_block", - "id": -317 - }, - { - "name": "minecraft:dropper", - "id": 125 - }, - { - "name": "minecraft:drowned_spawn_egg", - "id": 485 - }, - { - "name": "minecraft:dune_armor_trim_smithing_template", - "id": 686 - }, - { - "name": "minecraft:dye", - "id": 709 - }, - { - "name": "minecraft:echo_shard", - "id": 654 - }, - { - "name": "minecraft:egg", - "id": 392 - }, - { - "name": "minecraft:elder_guardian_spawn_egg", - "id": 473 - }, - { - "name": "minecraft:element_0", - "id": 36 - }, - { - "name": "minecraft:element_1", - "id": -12 - }, - { - "name": "minecraft:element_10", - "id": -21 - }, - { - "name": "minecraft:element_100", - "id": -111 - }, - { - "name": "minecraft:element_101", - "id": -112 - }, - { - "name": "minecraft:element_102", - "id": -113 - }, - { - "name": "minecraft:element_103", - "id": -114 - }, - { - "name": "minecraft:element_104", - "id": -115 - }, - { - "name": "minecraft:element_105", - "id": -116 - }, - { - "name": "minecraft:element_106", - "id": -117 - }, - { - "name": "minecraft:element_107", - "id": -118 - }, - { - "name": "minecraft:element_108", - "id": -119 - }, - { - "name": "minecraft:element_109", - "id": -120 - }, - { - "name": "minecraft:element_11", - "id": -22 - }, - { - "name": "minecraft:element_110", - "id": -121 - }, - { - "name": "minecraft:element_111", - "id": -122 - }, - { - "name": "minecraft:element_112", - "id": -123 - }, - { - "name": "minecraft:element_113", - "id": -124 - }, - { - "name": "minecraft:element_114", - "id": -125 - }, - { - "name": "minecraft:element_115", - "id": -126 - }, - { - "name": "minecraft:element_116", - "id": -127 - }, - { - "name": "minecraft:element_117", - "id": -128 - }, - { - "name": "minecraft:element_118", - "id": -129 - }, - { - "name": "minecraft:element_12", - "id": -23 - }, - { - "name": "minecraft:element_13", - "id": -24 - }, - { - "name": "minecraft:element_14", - "id": -25 - }, - { - "name": "minecraft:element_15", - "id": -26 - }, - { - "name": "minecraft:element_16", - "id": -27 - }, - { - "name": "minecraft:element_17", - "id": -28 - }, - { - "name": "minecraft:element_18", - "id": -29 - }, - { - "name": "minecraft:element_19", - "id": -30 - }, - { - "name": "minecraft:element_2", - "id": -13 - }, - { - "name": "minecraft:element_20", - "id": -31 - }, - { - "name": "minecraft:element_21", - "id": -32 - }, - { - "name": "minecraft:element_22", - "id": -33 - }, - { - "name": "minecraft:element_23", - "id": -34 - }, - { - "name": "minecraft:element_24", - "id": -35 - }, - { - "name": "minecraft:element_25", - "id": -36 - }, - { - "name": "minecraft:element_26", - "id": -37 - }, - { - "name": "minecraft:element_27", - "id": -38 - }, - { - "name": "minecraft:element_28", - "id": -39 - }, - { - "name": "minecraft:element_29", - "id": -40 - }, - { - "name": "minecraft:element_3", - "id": -14 - }, - { - "name": "minecraft:element_30", - "id": -41 - }, - { - "name": "minecraft:element_31", - "id": -42 - }, - { - "name": "minecraft:element_32", - "id": -43 - }, - { - "name": "minecraft:element_33", - "id": -44 - }, - { - "name": "minecraft:element_34", - "id": -45 - }, - { - "name": "minecraft:element_35", - "id": -46 - }, - { - "name": "minecraft:element_36", - "id": -47 - }, - { - "name": "minecraft:element_37", - "id": -48 - }, - { - "name": "minecraft:element_38", - "id": -49 - }, - { - "name": "minecraft:element_39", - "id": -50 - }, - { - "name": "minecraft:element_4", - "id": -15 - }, - { - "name": "minecraft:element_40", - "id": -51 - }, - { - "name": "minecraft:element_41", - "id": -52 - }, - { - "name": "minecraft:element_42", - "id": -53 - }, - { - "name": "minecraft:element_43", - "id": -54 - }, - { - "name": "minecraft:element_44", - "id": -55 - }, - { - "name": "minecraft:element_45", - "id": -56 - }, - { - "name": "minecraft:element_46", - "id": -57 - }, - { - "name": "minecraft:element_47", - "id": -58 - }, - { - "name": "minecraft:element_48", - "id": -59 - }, - { - "name": "minecraft:element_49", - "id": -60 - }, - { - "name": "minecraft:element_5", - "id": -16 - }, - { - "name": "minecraft:element_50", - "id": -61 - }, - { - "name": "minecraft:element_51", - "id": -62 - }, - { - "name": "minecraft:element_52", - "id": -63 - }, - { - "name": "minecraft:element_53", - "id": -64 - }, - { - "name": "minecraft:element_54", - "id": -65 - }, - { - "name": "minecraft:element_55", - "id": -66 - }, - { - "name": "minecraft:element_56", - "id": -67 - }, - { - "name": "minecraft:element_57", - "id": -68 - }, - { - "name": "minecraft:element_58", - "id": -69 - }, - { - "name": "minecraft:element_59", - "id": -70 - }, - { - "name": "minecraft:element_6", - "id": -17 - }, - { - "name": "minecraft:element_60", - "id": -71 - }, - { - "name": "minecraft:element_61", - "id": -72 - }, - { - "name": "minecraft:element_62", - "id": -73 - }, - { - "name": "minecraft:element_63", - "id": -74 - }, - { - "name": "minecraft:element_64", - "id": -75 - }, - { - "name": "minecraft:element_65", - "id": -76 - }, - { - "name": "minecraft:element_66", - "id": -77 - }, - { - "name": "minecraft:element_67", - "id": -78 - }, - { - "name": "minecraft:element_68", - "id": -79 - }, - { - "name": "minecraft:element_69", - "id": -80 - }, - { - "name": "minecraft:element_7", - "id": -18 - }, - { - "name": "minecraft:element_70", - "id": -81 - }, - { - "name": "minecraft:element_71", - "id": -82 - }, - { - "name": "minecraft:element_72", - "id": -83 - }, - { - "name": "minecraft:element_73", - "id": -84 - }, - { - "name": "minecraft:element_74", - "id": -85 - }, - { - "name": "minecraft:element_75", - "id": -86 - }, - { - "name": "minecraft:element_76", - "id": -87 - }, - { - "name": "minecraft:element_77", - "id": -88 - }, - { - "name": "minecraft:element_78", - "id": -89 - }, - { - "name": "minecraft:element_79", - "id": -90 - }, - { - "name": "minecraft:element_8", - "id": -19 - }, - { - "name": "minecraft:element_80", - "id": -91 - }, - { - "name": "minecraft:element_81", - "id": -92 - }, - { - "name": "minecraft:element_82", - "id": -93 - }, - { - "name": "minecraft:element_83", - "id": -94 - }, - { - "name": "minecraft:element_84", - "id": -95 - }, - { - "name": "minecraft:element_85", - "id": -96 - }, - { - "name": "minecraft:element_86", - "id": -97 - }, - { - "name": "minecraft:element_87", - "id": -98 - }, - { - "name": "minecraft:element_88", - "id": -99 - }, - { - "name": "minecraft:element_89", - "id": -100 - }, - { - "name": "minecraft:element_9", - "id": -20 - }, - { - "name": "minecraft:element_90", - "id": -101 - }, - { - "name": "minecraft:element_91", - "id": -102 - }, - { - "name": "minecraft:element_92", - "id": -103 - }, - { - "name": "minecraft:element_93", - "id": -104 - }, - { - "name": "minecraft:element_94", - "id": -105 - }, - { - "name": "minecraft:element_95", - "id": -106 - }, - { - "name": "minecraft:element_96", - "id": -107 - }, - { - "name": "minecraft:element_97", - "id": -108 - }, - { - "name": "minecraft:element_98", - "id": -109 - }, - { - "name": "minecraft:element_99", - "id": -110 - }, - { - "name": "minecraft:elytra", - "id": 571 - }, - { - "name": "minecraft:emerald", - "id": 519 - }, - { - "name": "minecraft:emerald_block", - "id": 133 - }, - { - "name": "minecraft:emerald_ore", - "id": 129 - }, - { - "name": "minecraft:empty_map", - "id": 522 - }, - { - "name": "minecraft:enchanted_book", - "id": 528 - }, - { - "name": "minecraft:enchanted_golden_apple", - "id": 259 - }, - { - "name": "minecraft:enchanting_table", - "id": 116 - }, - { - "name": "minecraft:end_brick_stairs", - "id": -178 - }, - { - "name": "minecraft:end_bricks", - "id": 206 - }, - { - "name": "minecraft:end_crystal", - "id": 712 - }, - { - "name": "minecraft:end_gateway", - "id": 209 - }, - { - "name": "minecraft:end_portal", - "id": 119 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120 - }, - { - "name": "minecraft:end_rod", - "id": 208 - }, - { - "name": "minecraft:end_stone", - "id": 121 - }, - { - "name": "minecraft:ender_chest", - "id": 130 - }, - { - "name": "minecraft:ender_dragon_spawn_egg", - "id": 508 - }, - { - "name": "minecraft:ender_eye", - "id": 435 - }, - { - "name": "minecraft:ender_pearl", - "id": 424 - }, - { - "name": "minecraft:enderman_spawn_egg", - "id": 444 - }, - { - "name": "minecraft:endermite_spawn_egg", - "id": 462 - }, - { - "name": "minecraft:evoker_spawn_egg", - "id": 477 - }, - { - "name": "minecraft:experience_bottle", - "id": 515 - }, - { - "name": "minecraft:explorer_pottery_sherd", - "id": 670 - }, - { - "name": "minecraft:exposed_copper", - "id": -341 - }, - { - "name": "minecraft:exposed_cut_copper", - "id": -348 - }, - { - "name": "minecraft:exposed_cut_copper_slab", - "id": -362 - }, - { - "name": "minecraft:exposed_cut_copper_stairs", - "id": -355 - }, - { - "name": "minecraft:exposed_double_cut_copper_slab", - "id": -369 - }, - { - "name": "minecraft:eye_armor_trim_smithing_template", - "id": 690 - }, - { - "name": "minecraft:farmland", - "id": 60 - }, - { - "name": "minecraft:feather", - "id": 329 - }, - { - "name": "minecraft:fence", - "id": 705 - }, - { - "name": "minecraft:fence_gate", - "id": 107 - }, - { - "name": "minecraft:fermented_spider_eye", - "id": 430 - }, - { - "name": "minecraft:field_masoned_banner_pattern", - "id": 592 - }, - { - "name": "minecraft:filled_map", - "id": 422 - }, - { - "name": "minecraft:fire", - "id": 51 - }, - { - "name": "minecraft:fire_charge", - "id": 516 - }, - { - "name": "minecraft:fire_coral", - "id": -583 - }, - { - "name": "minecraft:firework_rocket", - "id": 526 - }, - { - "name": "minecraft:firework_star", - "id": 527 - }, - { - "name": "minecraft:fishing_rod", - "id": 394 - }, - { - "name": "minecraft:fletching_table", - "id": -201 - }, - { - "name": "minecraft:flint", - "id": 358 - }, - { - "name": "minecraft:flint_and_steel", - "id": 301 - }, - { - "name": "minecraft:flower_banner_pattern", - "id": 588 - }, - { - "name": "minecraft:flower_pot", - "id": 521 - }, - { - "name": "minecraft:flowering_azalea", - "id": -338 - }, - { - "name": "minecraft:flowing_lava", - "id": 10 - }, - { - "name": "minecraft:flowing_water", - "id": 8 - }, - { - "name": "minecraft:fox_spawn_egg", - "id": 492 - }, - { - "name": "minecraft:frame", - "id": 520 - }, - { - "name": "minecraft:friend_pottery_sherd", - "id": 671 - }, - { - "name": "minecraft:frog_spawn", - "id": -468 - }, - { - "name": "minecraft:frog_spawn_egg", - "id": 635 - }, - { - "name": "minecraft:frosted_ice", - "id": 207 - }, - { - "name": "minecraft:furnace", - "id": 61 - }, - { - "name": "minecraft:ghast_spawn_egg", - "id": 456 - }, - { - "name": "minecraft:ghast_tear", - "id": 426 - }, - { - "name": "minecraft:gilded_blackstone", - "id": -281 - }, - { - "name": "minecraft:glass", - "id": 20 - }, - { - "name": "minecraft:glass_bottle", - "id": 429 - }, - { - "name": "minecraft:glass_pane", - "id": 102 - }, - { - "name": "minecraft:glistering_melon_slice", - "id": 436 - }, - { - "name": "minecraft:globe_banner_pattern", - "id": 595 - }, - { - "name": "minecraft:glow_berries", - "id": 713 - }, - { - "name": "minecraft:glow_frame", - "id": 630 - }, - { - "name": "minecraft:glow_ink_sac", - "id": 510 - }, - { - "name": "minecraft:glow_lichen", - "id": -411 - }, - { - "name": "minecraft:glow_squid_spawn_egg", - "id": 505 - }, - { - "name": "minecraft:glow_stick", - "id": 608 - }, - { - "name": "minecraft:glowingobsidian", - "id": 246 - }, - { - "name": "minecraft:glowstone", - "id": 89 - }, - { - "name": "minecraft:glowstone_dust", - "id": 396 - }, - { - "name": "minecraft:goat_horn", - "id": 634 - }, - { - "name": "minecraft:goat_spawn_egg", - "id": 504 - }, - { - "name": "minecraft:gold_block", - "id": 41 - }, - { - "name": "minecraft:gold_ingot", - "id": 308 - }, - { - "name": "minecraft:gold_nugget", - "id": 427 - }, - { - "name": "minecraft:gold_ore", - "id": 14 - }, - { - "name": "minecraft:golden_apple", - "id": 258 - }, - { - "name": "minecraft:golden_axe", - "id": 327 - }, - { - "name": "minecraft:golden_boots", - "id": 356 - }, - { - "name": "minecraft:golden_carrot", - "id": 283 - }, - { - "name": "minecraft:golden_chestplate", - "id": 354 - }, - { - "name": "minecraft:golden_helmet", - "id": 353 - }, - { - "name": "minecraft:golden_hoe", - "id": 335 - }, - { - "name": "minecraft:golden_horse_armor", - "id": 539 - }, - { - "name": "minecraft:golden_leggings", - "id": 355 - }, - { - "name": "minecraft:golden_pickaxe", - "id": 326 - }, - { - "name": "minecraft:golden_rail", - "id": 27 - }, - { - "name": "minecraft:golden_shovel", - "id": 325 - }, - { - "name": "minecraft:golden_sword", - "id": 324 - }, - { - "name": "minecraft:granite_stairs", - "id": -169 - }, - { - "name": "minecraft:grass", - "id": 2 - }, - { - "name": "minecraft:grass_path", - "id": 198 - }, - { - "name": "minecraft:gravel", - "id": 13 - }, - { - "name": "minecraft:gray_candle", - "id": -420 - }, - { - "name": "minecraft:gray_candle_cake", - "id": -437 - }, - { - "name": "minecraft:gray_carpet", - "id": -603 - }, - { - "name": "minecraft:gray_dye", - "id": 405 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227 - }, - { - "name": "minecraft:gray_wool", - "id": -553 - }, - { - "name": "minecraft:green_candle", - "id": -426 - }, - { - "name": "minecraft:green_candle_cake", - "id": -443 - }, - { - "name": "minecraft:green_carpet", - "id": -609 - }, - { - "name": "minecraft:green_dye", - "id": 399 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233 - }, - { - "name": "minecraft:green_wool", - "id": -560 - }, - { - "name": "minecraft:grindstone", - "id": -195 - }, - { - "name": "minecraft:guardian_spawn_egg", - "id": 463 - }, - { - "name": "minecraft:gunpowder", - "id": 330 - }, - { - "name": "minecraft:hanging_roots", - "id": -319 - }, - { - "name": "minecraft:hard_glass", - "id": 253 - }, - { - "name": "minecraft:hard_glass_pane", - "id": 190 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191 - }, - { - "name": "minecraft:hardened_clay", - "id": 172 - }, - { - "name": "minecraft:hay_block", - "id": 170 - }, - { - "name": "minecraft:heart_of_the_sea", - "id": 578 - }, - { - "name": "minecraft:heart_pottery_sherd", - "id": 672 - }, - { - "name": "minecraft:heartbreak_pottery_sherd", - "id": 673 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148 - }, - { - "name": "minecraft:hoglin_spawn_egg", - "id": 498 - }, - { - "name": "minecraft:honey_block", - "id": -220 - }, - { - "name": "minecraft:honey_bottle", - "id": 599 - }, - { - "name": "minecraft:honeycomb", - "id": 598 - }, - { - "name": "minecraft:honeycomb_block", - "id": -221 - }, - { - "name": "minecraft:hopper", - "id": 534 - }, - { - "name": "minecraft:hopper_minecart", - "id": 533 - }, - { - "name": "minecraft:horn_coral", - "id": -584 - }, - { - "name": "minecraft:horse_spawn_egg", - "id": 460 - }, - { - "name": "minecraft:host_armor_trim_smithing_template", - "id": 700 - }, - { - "name": "minecraft:howl_pottery_sherd", - "id": 674 - }, - { - "name": "minecraft:husk_spawn_egg", - "id": 465 - }, - { - "name": "minecraft:ice", - "id": 79 - }, - { - "name": "minecraft:ice_bomb", - "id": 602 - }, - { - "name": "minecraft:infested_deepslate", - "id": -454 - }, - { - "name": "minecraft:info_update", - "id": 248 - }, - { - "name": "minecraft:info_update2", - "id": 249 - }, - { - "name": "minecraft:ink_sac", - "id": 415 - }, - { - "name": "minecraft:invisible_bedrock", - "id": 95 - }, - { - "name": "minecraft:iron_axe", - "id": 300 - }, - { - "name": "minecraft:iron_bars", - "id": 101 - }, - { - "name": "minecraft:iron_block", - "id": 42 - }, - { - "name": "minecraft:iron_boots", - "id": 348 - }, - { - "name": "minecraft:iron_chestplate", - "id": 346 - }, - { - "name": "minecraft:iron_door", - "id": 374 - }, - { - "name": "minecraft:iron_golem_spawn_egg", - "id": 506 - }, - { - "name": "minecraft:iron_helmet", - "id": 345 - }, - { - "name": "minecraft:iron_hoe", - "id": 333 - }, - { - "name": "minecraft:iron_horse_armor", - "id": 538 - }, - { - "name": "minecraft:iron_ingot", - "id": 307 - }, - { - "name": "minecraft:iron_leggings", - "id": 347 - }, - { - "name": "minecraft:iron_nugget", - "id": 576 - }, - { - "name": "minecraft:iron_ore", - "id": 15 - }, - { - "name": "minecraft:iron_pickaxe", - "id": 299 - }, - { - "name": "minecraft:iron_shovel", - "id": 298 - }, - { - "name": "minecraft:iron_sword", - "id": 309 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167 - }, - { - "name": "minecraft:item.acacia_door", - "id": 196 - }, - { - "name": "minecraft:item.bed", - "id": 26 - }, - { - "name": "minecraft:item.beetroot", - "id": 244 - }, - { - "name": "minecraft:item.birch_door", - "id": 194 - }, - { - "name": "minecraft:item.brewing_stand", - "id": 117 - }, - { - "name": "minecraft:item.cake", - "id": 92 - }, - { - "name": "minecraft:item.camera", - "id": 242 - }, - { - "name": "minecraft:item.campfire", - "id": -209 - }, - { - "name": "minecraft:item.cauldron", - "id": 118 - }, - { - "name": "minecraft:item.chain", - "id": -286 - }, - { - "name": "minecraft:item.crimson_door", - "id": -244 - }, - { - "name": "minecraft:item.dark_oak_door", - "id": 197 - }, - { - "name": "minecraft:item.flower_pot", - "id": 140 - }, - { - "name": "minecraft:item.frame", - "id": 199 - }, - { - "name": "minecraft:item.glow_frame", - "id": -339 - }, - { - "name": "minecraft:item.hopper", - "id": 154 - }, - { - "name": "minecraft:item.iron_door", - "id": 71 - }, - { - "name": "minecraft:item.jungle_door", - "id": 195 - }, - { - "name": "minecraft:item.kelp", - "id": -138 - }, - { - "name": "minecraft:item.mangrove_door", - "id": -493 - }, - { - "name": "minecraft:item.nether_sprouts", - "id": -238 - }, - { - "name": "minecraft:item.nether_wart", - "id": 115 - }, - { - "name": "minecraft:item.reeds", - "id": 83 - }, - { - "name": "minecraft:item.skull", - "id": 144 - }, - { - "name": "minecraft:item.soul_campfire", - "id": -290 - }, - { - "name": "minecraft:item.spruce_door", - "id": 193 - }, - { - "name": "minecraft:item.warped_door", - "id": -245 - }, - { - "name": "minecraft:item.wheat", - "id": 59 - }, - { - "name": "minecraft:item.wooden_door", - "id": 64 - }, - { - "name": "minecraft:jigsaw", - "id": -211 - }, - { - "name": "minecraft:jukebox", - "id": 84 - }, - { - "name": "minecraft:jungle_boat", - "id": 379 - }, - { - "name": "minecraft:jungle_button", - "id": -143 - }, - { - "name": "minecraft:jungle_chest_boat", - "id": 647 - }, - { - "name": "minecraft:jungle_door", - "id": 562 - }, - { - "name": "minecraft:jungle_fence", - "id": -578 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185 - }, - { - "name": "minecraft:jungle_hanging_sign", - "id": -503 - }, - { - "name": "minecraft:jungle_log", - "id": -571 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": -153 - }, - { - "name": "minecraft:jungle_sign", - "id": 585 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": -188 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": -148 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": -189 - }, - { - "name": "minecraft:kelp", - "id": 384 - }, - { - "name": "minecraft:ladder", - "id": 65 - }, - { - "name": "minecraft:lantern", - "id": -208 - }, - { - "name": "minecraft:lapis_block", - "id": 22 - }, - { - "name": "minecraft:lapis_lazuli", - "id": 416 - }, - { - "name": "minecraft:lapis_ore", - "id": 21 - }, - { - "name": "minecraft:large_amethyst_bud", - "id": -330 - }, - { - "name": "minecraft:lava", - "id": 11 - }, - { - "name": "minecraft:lava_bucket", - "id": 365 - }, - { - "name": "minecraft:lead", - "id": 554 - }, - { - "name": "minecraft:leather", - "id": 383 - }, - { - "name": "minecraft:leather_boots", - "id": 340 - }, - { - "name": "minecraft:leather_chestplate", - "id": 338 - }, - { - "name": "minecraft:leather_helmet", - "id": 337 - }, - { - "name": "minecraft:leather_horse_armor", - "id": 537 - }, - { - "name": "minecraft:leather_leggings", - "id": 339 - }, - { - "name": "minecraft:leaves", - "id": 18 - }, - { - "name": "minecraft:leaves2", - "id": 161 - }, - { - "name": "minecraft:lectern", - "id": -194 - }, - { - "name": "minecraft:lever", - "id": 69 - }, - { - "name": "minecraft:light_block", - "id": -215 - }, - { - "name": "minecraft:light_blue_candle", - "id": -416 - }, - { - "name": "minecraft:light_blue_candle_cake", - "id": -433 - }, - { - "name": "minecraft:light_blue_carpet", - "id": -599 - }, - { - "name": "minecraft:light_blue_dye", - "id": 409 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223 - }, - { - "name": "minecraft:light_blue_wool", - "id": -562 - }, - { - "name": "minecraft:light_gray_candle", - "id": -421 - }, - { - "name": "minecraft:light_gray_candle_cake", - "id": -438 - }, - { - "name": "minecraft:light_gray_carpet", - "id": -604 - }, - { - "name": "minecraft:light_gray_dye", - "id": 404 - }, - { - "name": "minecraft:light_gray_wool", - "id": -552 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147 - }, - { - "name": "minecraft:lightning_rod", - "id": -312 - }, - { - "name": "minecraft:lime_candle", - "id": -418 - }, - { - "name": "minecraft:lime_candle_cake", - "id": -435 - }, - { - "name": "minecraft:lime_carpet", - "id": -601 - }, - { - "name": "minecraft:lime_dye", - "id": 407 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225 - }, - { - "name": "minecraft:lime_wool", - "id": -559 - }, - { - "name": "minecraft:lingering_potion", - "id": 569 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": -214 - }, - { - "name": "minecraft:lit_deepslate_redstone_ore", - "id": -404 - }, - { - "name": "minecraft:lit_furnace", - "id": 62 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91 - }, - { - "name": "minecraft:lit_redstone_lamp", - "id": 124 - }, - { - "name": "minecraft:lit_redstone_ore", - "id": 74 - }, - { - "name": "minecraft:lit_smoker", - "id": -199 - }, - { - "name": "minecraft:llama_spawn_egg", - "id": 475 - }, - { - "name": "minecraft:lodestone", - "id": -222 - }, - { - "name": "minecraft:lodestone_compass", - "id": 609 - }, - { - "name": "minecraft:log", - "id": 704 - }, - { - "name": "minecraft:log2", - "id": 707 - }, - { - "name": "minecraft:loom", - "id": -204 - }, - { - "name": "minecraft:magenta_candle", - "id": -415 - }, - { - "name": "minecraft:magenta_candle_cake", - "id": -432 - }, - { - "name": "minecraft:magenta_carpet", - "id": -598 - }, - { - "name": "minecraft:magenta_dye", - "id": 410 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222 - }, - { - "name": "minecraft:magenta_wool", - "id": -565 - }, - { - "name": "minecraft:magma", - "id": 213 - }, - { - "name": "minecraft:magma_cream", - "id": 432 - }, - { - "name": "minecraft:magma_cube_spawn_egg", - "id": 457 - }, - { - "name": "minecraft:mangrove_boat", - "id": 642 - }, - { - "name": "minecraft:mangrove_button", - "id": -487 - }, - { - "name": "minecraft:mangrove_chest_boat", - "id": 651 - }, - { - "name": "minecraft:mangrove_door", - "id": 640 - }, - { - "name": "minecraft:mangrove_double_slab", - "id": -499 - }, - { - "name": "minecraft:mangrove_fence", - "id": -491 - }, - { - "name": "minecraft:mangrove_fence_gate", - "id": -492 - }, - { - "name": "minecraft:mangrove_hanging_sign", - "id": -508 - }, - { - "name": "minecraft:mangrove_leaves", - "id": -472 - }, - { - "name": "minecraft:mangrove_log", - "id": -484 - }, - { - "name": "minecraft:mangrove_planks", - "id": -486 - }, - { - "name": "minecraft:mangrove_pressure_plate", - "id": -490 - }, - { - "name": "minecraft:mangrove_propagule", - "id": -474 - }, - { - "name": "minecraft:mangrove_roots", - "id": -482 - }, - { - "name": "minecraft:mangrove_sign", - "id": 641 - }, - { - "name": "minecraft:mangrove_slab", - "id": -489 - }, - { - "name": "minecraft:mangrove_stairs", - "id": -488 - }, - { - "name": "minecraft:mangrove_standing_sign", - "id": -494 - }, - { - "name": "minecraft:mangrove_trapdoor", - "id": -496 - }, - { - "name": "minecraft:mangrove_wall_sign", - "id": -495 - }, - { - "name": "minecraft:mangrove_wood", - "id": -497 - }, - { - "name": "minecraft:medicine", - "id": 606 - }, - { - "name": "minecraft:medium_amethyst_bud", - "id": -331 - }, - { - "name": "minecraft:melon_block", - "id": 103 - }, - { - "name": "minecraft:melon_seeds", - "id": 293 - }, - { - "name": "minecraft:melon_slice", - "id": 272 - }, - { - "name": "minecraft:melon_stem", - "id": 105 - }, - { - "name": "minecraft:milk_bucket", - "id": 363 - }, - { - "name": "minecraft:minecart", - "id": 372 - }, - { - "name": "minecraft:miner_pottery_sherd", - "id": 675 - }, - { - "name": "minecraft:mob_spawner", - "id": 52 - }, - { - "name": "minecraft:mojang_banner_pattern", - "id": 591 - }, - { - "name": "minecraft:monster_egg", - "id": 97 - }, - { - "name": "minecraft:mooshroom_spawn_egg", - "id": 442 - }, - { - "name": "minecraft:moss_block", - "id": -320 - }, - { - "name": "minecraft:moss_carpet", - "id": -335 - }, - { - "name": "minecraft:mossy_cobblestone", - "id": 48 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": -179 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": -175 - }, - { - "name": "minecraft:mourner_pottery_sherd", - "id": 676 - }, - { - "name": "minecraft:moving_block", - "id": 250 - }, - { - "name": "minecraft:mud", - "id": -473 - }, - { - "name": "minecraft:mud_brick_double_slab", - "id": -479 - }, - { - "name": "minecraft:mud_brick_slab", - "id": -478 - }, - { - "name": "minecraft:mud_brick_stairs", - "id": -480 - }, - { - "name": "minecraft:mud_brick_wall", - "id": -481 - }, - { - "name": "minecraft:mud_bricks", - "id": -475 - }, - { - "name": "minecraft:muddy_mangrove_roots", - "id": -483 - }, - { - "name": "minecraft:mule_spawn_egg", - "id": 468 - }, - { - "name": "minecraft:mushroom_stew", - "id": 260 - }, - { - "name": "minecraft:music_disc_11", - "id": 551 - }, - { - "name": "minecraft:music_disc_13", - "id": 541 - }, - { - "name": "minecraft:music_disc_5", - "id": 643 - }, - { - "name": "minecraft:music_disc_blocks", - "id": 543 - }, - { - "name": "minecraft:music_disc_cat", - "id": 542 - }, - { - "name": "minecraft:music_disc_chirp", - "id": 544 - }, - { - "name": "minecraft:music_disc_far", - "id": 545 - }, - { - "name": "minecraft:music_disc_mall", - "id": 546 - }, - { - "name": "minecraft:music_disc_mellohi", - "id": 547 - }, - { - "name": "minecraft:music_disc_otherside", - "id": 633 - }, - { - "name": "minecraft:music_disc_pigstep", - "id": 627 - }, - { - "name": "minecraft:music_disc_relic", - "id": 701 - }, - { - "name": "minecraft:music_disc_stal", - "id": 548 - }, - { - "name": "minecraft:music_disc_strad", - "id": 549 - }, - { - "name": "minecraft:music_disc_wait", - "id": 552 - }, - { - "name": "minecraft:music_disc_ward", - "id": 550 - }, - { - "name": "minecraft:mutton", - "id": 557 - }, - { - "name": "minecraft:mycelium", - "id": 110 - }, - { - "name": "minecraft:name_tag", - "id": 555 - }, - { - "name": "minecraft:nautilus_shell", - "id": 577 - }, - { - "name": "minecraft:nether_brick", - "id": 112 - }, - { - "name": "minecraft:nether_brick_fence", - "id": 113 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114 - }, - { - "name": "minecraft:nether_gold_ore", - "id": -288 - }, - { - "name": "minecraft:nether_sprouts", - "id": 628 - }, - { - "name": "minecraft:nether_star", - "id": 525 - }, - { - "name": "minecraft:nether_wart", - "id": 294 - }, - { - "name": "minecraft:nether_wart_block", - "id": 214 - }, - { - "name": "minecraft:netherbrick", - "id": 530 - }, - { - "name": "minecraft:netherite_axe", - "id": 613 - }, - { - "name": "minecraft:netherite_block", - "id": -270 - }, - { - "name": "minecraft:netherite_boots", - "id": 619 - }, - { - "name": "minecraft:netherite_chestplate", - "id": 617 - }, - { - "name": "minecraft:netherite_helmet", - "id": 616 - }, - { - "name": "minecraft:netherite_hoe", - "id": 614 - }, - { - "name": "minecraft:netherite_ingot", - "id": 615 - }, - { - "name": "minecraft:netherite_leggings", - "id": 618 - }, - { - "name": "minecraft:netherite_pickaxe", - "id": 612 - }, - { - "name": "minecraft:netherite_scrap", - "id": 620 - }, - { - "name": "minecraft:netherite_shovel", - "id": 611 - }, - { - "name": "minecraft:netherite_sword", - "id": 610 - }, - { - "name": "minecraft:netherite_upgrade_smithing_template", - "id": 684 - }, - { - "name": "minecraft:netherrack", - "id": 87 - }, - { - "name": "minecraft:netherreactor", - "id": 247 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": -180 - }, - { - "name": "minecraft:noteblock", - "id": 25 - }, - { - "name": "minecraft:npc_spawn_egg", - "id": 472 - }, - { - "name": "minecraft:oak_boat", - "id": 377 - }, - { - "name": "minecraft:oak_chest_boat", - "id": 645 - }, - { - "name": "minecraft:oak_fence", - "id": 85 - }, - { - "name": "minecraft:oak_hanging_sign", - "id": -500 - }, - { - "name": "minecraft:oak_log", - "id": 17 - }, - { - "name": "minecraft:oak_sign", - "id": 360 - }, - { - "name": "minecraft:oak_stairs", - "id": 53 - }, - { - "name": "minecraft:observer", - "id": 251 - }, - { - "name": "minecraft:obsidian", - "id": 49 - }, - { - "name": "minecraft:ocelot_spawn_egg", - "id": 453 - }, - { - "name": "minecraft:ochre_froglight", - "id": -471 - }, - { - "name": "minecraft:orange_candle", - "id": -414 - }, - { - "name": "minecraft:orange_candle_cake", - "id": -431 - }, - { - "name": "minecraft:orange_carpet", - "id": -597 - }, - { - "name": "minecraft:orange_dye", - "id": 411 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221 - }, - { - "name": "minecraft:orange_wool", - "id": -557 - }, - { - "name": "minecraft:oxidized_copper", - "id": -343 - }, - { - "name": "minecraft:oxidized_cut_copper", - "id": -350 - }, - { - "name": "minecraft:oxidized_cut_copper_slab", - "id": -364 - }, - { - "name": "minecraft:oxidized_cut_copper_stairs", - "id": -357 - }, - { - "name": "minecraft:oxidized_double_cut_copper_slab", - "id": -371 - }, - { - "name": "minecraft:packed_ice", - "id": 174 - }, - { - "name": "minecraft:packed_mud", - "id": -477 - }, - { - "name": "minecraft:painting", - "id": 359 - }, - { - "name": "minecraft:panda_spawn_egg", - "id": 491 - }, - { - "name": "minecraft:paper", - "id": 388 - }, - { - "name": "minecraft:parrot_spawn_egg", - "id": 480 - }, - { - "name": "minecraft:pearlescent_froglight", - "id": -469 - }, - { - "name": "minecraft:phantom_membrane", - "id": 581 - }, - { - "name": "minecraft:phantom_spawn_egg", - "id": 488 - }, - { - "name": "minecraft:pig_spawn_egg", - "id": 439 - }, - { - "name": "minecraft:piglin_banner_pattern", - "id": 594 - }, - { - "name": "minecraft:piglin_brute_spawn_egg", - "id": 501 - }, - { - "name": "minecraft:piglin_spawn_egg", - "id": 499 - }, - { - "name": "minecraft:pillager_spawn_egg", - "id": 493 - }, - { - "name": "minecraft:pink_candle", - "id": -419 - }, - { - "name": "minecraft:pink_candle_cake", - "id": -436 - }, - { - "name": "minecraft:pink_carpet", - "id": -602 - }, - { - "name": "minecraft:pink_dye", - "id": 406 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226 - }, - { - "name": "minecraft:pink_petals", - "id": -549 - }, - { - "name": "minecraft:pink_wool", - "id": -566 - }, - { - "name": "minecraft:piston", - "id": 33 - }, - { - "name": "minecraft:piston_arm_collision", - "id": 34 - }, - { - "name": "minecraft:pitcher_crop", - "id": -574 - }, - { - "name": "minecraft:pitcher_plant", - "id": -612 - }, - { - "name": "minecraft:pitcher_pod", - "id": 297 - }, - { - "name": "minecraft:planks", - "id": 5 - }, - { - "name": "minecraft:plenty_pottery_sherd", - "id": 677 - }, - { - "name": "minecraft:podzol", - "id": 243 - }, - { - "name": "minecraft:pointed_dripstone", - "id": -308 - }, - { - "name": "minecraft:poisonous_potato", - "id": 282 - }, - { - "name": "minecraft:polar_bear_spawn_egg", - "id": 474 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": -174 - }, - { - "name": "minecraft:polished_basalt", - "id": -235 - }, - { - "name": "minecraft:polished_blackstone", - "id": -291 - }, - { - "name": "minecraft:polished_blackstone_brick_double_slab", - "id": -285 - }, - { - "name": "minecraft:polished_blackstone_brick_slab", - "id": -284 - }, - { - "name": "minecraft:polished_blackstone_brick_stairs", - "id": -275 - }, - { - "name": "minecraft:polished_blackstone_brick_wall", - "id": -278 - }, - { - "name": "minecraft:polished_blackstone_bricks", - "id": -274 - }, - { - "name": "minecraft:polished_blackstone_button", - "id": -296 - }, - { - "name": "minecraft:polished_blackstone_double_slab", - "id": -294 - }, - { - "name": "minecraft:polished_blackstone_pressure_plate", - "id": -295 - }, - { - "name": "minecraft:polished_blackstone_slab", - "id": -293 - }, - { - "name": "minecraft:polished_blackstone_stairs", - "id": -292 - }, - { - "name": "minecraft:polished_blackstone_wall", - "id": -297 - }, - { - "name": "minecraft:polished_deepslate", - "id": -383 - }, - { - "name": "minecraft:polished_deepslate_double_slab", - "id": -397 - }, - { - "name": "minecraft:polished_deepslate_slab", - "id": -384 - }, - { - "name": "minecraft:polished_deepslate_stairs", - "id": -385 - }, - { - "name": "minecraft:polished_deepslate_wall", - "id": -386 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": -173 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": -172 - }, - { - "name": "minecraft:popped_chorus_fruit", - "id": 566 - }, - { - "name": "minecraft:porkchop", - "id": 262 - }, - { - "name": "minecraft:portal", - "id": 90 - }, - { - "name": "minecraft:potato", - "id": 280 - }, - { - "name": "minecraft:potatoes", - "id": 142 - }, - { - "name": "minecraft:potion", - "id": 428 - }, - { - "name": "minecraft:powder_snow", - "id": -306 - }, - { - "name": "minecraft:powder_snow_bucket", - "id": 370 - }, - { - "name": "minecraft:powered_comparator", - "id": 150 - }, - { - "name": "minecraft:powered_repeater", - "id": 94 - }, - { - "name": "minecraft:prismarine", - "id": 168 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": -4 - }, - { - "name": "minecraft:prismarine_crystals", - "id": 556 - }, - { - "name": "minecraft:prismarine_shard", - "id": 572 - }, - { - "name": "minecraft:prismarine_stairs", - "id": -2 - }, - { - "name": "minecraft:prize_pottery_sherd", - "id": 678 - }, - { - "name": "minecraft:pufferfish", - "id": 267 - }, - { - "name": "minecraft:pufferfish_bucket", - "id": 369 - }, - { - "name": "minecraft:pufferfish_spawn_egg", - "id": 483 - }, - { - "name": "minecraft:pumpkin", - "id": 86 - }, - { - "name": "minecraft:pumpkin_pie", - "id": 284 - }, - { - "name": "minecraft:pumpkin_seeds", - "id": 292 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104 - }, - { - "name": "minecraft:purple_candle", - "id": -423 - }, - { - "name": "minecraft:purple_candle_cake", - "id": -440 - }, - { - "name": "minecraft:purple_carpet", - "id": -606 - }, - { - "name": "minecraft:purple_dye", - "id": 402 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219 - }, - { - "name": "minecraft:purple_wool", - "id": -564 - }, - { - "name": "minecraft:purpur_block", - "id": 201 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203 - }, - { - "name": "minecraft:quartz", - "id": 531 - }, - { - "name": "minecraft:quartz_block", - "id": 155 - }, - { - "name": "minecraft:quartz_bricks", - "id": -304 - }, - { - "name": "minecraft:quartz_ore", - "id": 153 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156 - }, - { - "name": "minecraft:rabbit", - "id": 288 - }, - { - "name": "minecraft:rabbit_foot", - "id": 535 - }, - { - "name": "minecraft:rabbit_hide", - "id": 536 - }, - { - "name": "minecraft:rabbit_spawn_egg", - "id": 461 - }, - { - "name": "minecraft:rabbit_stew", - "id": 290 - }, - { - "name": "minecraft:rail", - "id": 66 - }, - { - "name": "minecraft:raiser_armor_trim_smithing_template", - "id": 698 - }, - { - "name": "minecraft:rapid_fertilizer", - "id": 604 - }, - { - "name": "minecraft:ravager_spawn_egg", - "id": 495 - }, - { - "name": "minecraft:raw_copper", - "id": 514 - }, - { - "name": "minecraft:raw_copper_block", - "id": -452 - }, - { - "name": "minecraft:raw_gold", - "id": 513 - }, - { - "name": "minecraft:raw_gold_block", - "id": -453 - }, - { - "name": "minecraft:raw_iron", - "id": 512 - }, - { - "name": "minecraft:raw_iron_block", - "id": -451 - }, - { - "name": "minecraft:recovery_compass", - "id": 653 - }, - { - "name": "minecraft:red_candle", - "id": -427 - }, - { - "name": "minecraft:red_candle_cake", - "id": -444 - }, - { - "name": "minecraft:red_carpet", - "id": -610 - }, - { - "name": "minecraft:red_dye", - "id": 398 - }, - { - "name": "minecraft:red_flower", - "id": 38 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234 - }, - { - "name": "minecraft:red_mushroom", - "id": 40 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100 - }, - { - "name": "minecraft:red_nether_brick", - "id": 215 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": -184 - }, - { - "name": "minecraft:red_sandstone", - "id": 179 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180 - }, - { - "name": "minecraft:red_wool", - "id": -556 - }, - { - "name": "minecraft:redstone", - "id": 375 - }, - { - "name": "minecraft:redstone_block", - "id": 152 - }, - { - "name": "minecraft:redstone_lamp", - "id": 123 - }, - { - "name": "minecraft:redstone_ore", - "id": 73 - }, - { - "name": "minecraft:redstone_torch", - "id": 76 - }, - { - "name": "minecraft:redstone_wire", - "id": 55 - }, - { - "name": "minecraft:reinforced_deepslate", - "id": -466 - }, - { - "name": "minecraft:repeater", - "id": 421 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188 - }, - { - "name": "minecraft:reserved6", - "id": 255 - }, - { - "name": "minecraft:respawn_anchor", - "id": -272 - }, - { - "name": "minecraft:rib_armor_trim_smithing_template", - "id": 694 - }, - { - "name": "minecraft:rotten_flesh", - "id": 277 - }, - { - "name": "minecraft:saddle", - "id": 373 - }, - { - "name": "minecraft:salmon", - "id": 265 - }, - { - "name": "minecraft:salmon_bucket", - "id": 367 - }, - { - "name": "minecraft:salmon_spawn_egg", - "id": 484 - }, - { - "name": "minecraft:sand", - "id": 12 - }, - { - "name": "minecraft:sandstone", - "id": 24 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128 - }, - { - "name": "minecraft:sapling", - "id": 6 - }, - { - "name": "minecraft:scaffolding", - "id": -165 - }, - { - "name": "minecraft:sculk", - "id": -458 - }, - { - "name": "minecraft:sculk_catalyst", - "id": -460 - }, - { - "name": "minecraft:sculk_sensor", - "id": -307 - }, - { - "name": "minecraft:sculk_shrieker", - "id": -461 - }, - { - "name": "minecraft:sculk_vein", - "id": -459 - }, - { - "name": "minecraft:scute", - "id": 579 - }, - { - "name": "minecraft:sea_lantern", - "id": 169 - }, - { - "name": "minecraft:sea_pickle", - "id": -156 - }, - { - "name": "minecraft:seagrass", - "id": -130 - }, - { - "name": "minecraft:sentry_armor_trim_smithing_template", - "id": 685 - }, - { - "name": "minecraft:shaper_armor_trim_smithing_template", - "id": 699 - }, - { - "name": "minecraft:sheaf_pottery_sherd", - "id": 679 - }, - { - "name": "minecraft:shears", - "id": 423 - }, - { - "name": "minecraft:sheep_spawn_egg", - "id": 440 - }, - { - "name": "minecraft:shelter_pottery_sherd", - "id": 680 - }, - { - "name": "minecraft:shield", - "id": 357 - }, - { - "name": "minecraft:shroomlight", - "id": -230 - }, - { - "name": "minecraft:shulker_box", - "id": 218 - }, - { - "name": "minecraft:shulker_shell", - "id": 573 - }, - { - "name": "minecraft:shulker_spawn_egg", - "id": 471 - }, - { - "name": "minecraft:silence_armor_trim_smithing_template", - "id": 696 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228 - }, - { - "name": "minecraft:silverfish_spawn_egg", - "id": 445 - }, - { - "name": "minecraft:skeleton_horse_spawn_egg", - "id": 469 - }, - { - "name": "minecraft:skeleton_spawn_egg", - "id": 446 - }, - { - "name": "minecraft:skull", - "id": 523 - }, - { - "name": "minecraft:skull_banner_pattern", - "id": 590 - }, - { - "name": "minecraft:skull_pottery_sherd", - "id": 681 - }, - { - "name": "minecraft:slime", - "id": 165 - }, - { - "name": "minecraft:slime_ball", - "id": 390 - }, - { - "name": "minecraft:slime_spawn_egg", - "id": 447 - }, - { - "name": "minecraft:small_amethyst_bud", - "id": -332 - }, - { - "name": "minecraft:small_dripleaf_block", - "id": -336 - }, - { - "name": "minecraft:smithing_table", - "id": -202 - }, - { - "name": "minecraft:smoker", - "id": -198 - }, - { - "name": "minecraft:smooth_basalt", - "id": -377 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": -185 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": -176 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": -177 - }, - { - "name": "minecraft:smooth_stone", - "id": -183 - }, - { - "name": "minecraft:sniffer_egg", - "id": -596 - }, - { - "name": "minecraft:sniffer_spawn_egg", - "id": 502 - }, - { - "name": "minecraft:snort_pottery_sherd", - "id": 682 - }, - { - "name": "minecraft:snout_armor_trim_smithing_template", - "id": 693 - }, - { - "name": "minecraft:snow", - "id": 80 - }, - { - "name": "minecraft:snow_golem_spawn_egg", - "id": 507 - }, - { - "name": "minecraft:snow_layer", - "id": 78 - }, - { - "name": "minecraft:snowball", - "id": 376 - }, - { - "name": "minecraft:soul_campfire", - "id": 629 - }, - { - "name": "minecraft:soul_fire", - "id": -237 - }, - { - "name": "minecraft:soul_lantern", - "id": -269 - }, - { - "name": "minecraft:soul_sand", - "id": 88 - }, - { - "name": "minecraft:soul_soil", - "id": -236 - }, - { - "name": "minecraft:soul_torch", - "id": -268 - }, - { - "name": "minecraft:sparkler", - "id": 607 - }, - { - "name": "minecraft:spawn_egg", - "id": 711 - }, - { - "name": "minecraft:spider_eye", - "id": 278 - }, - { - "name": "minecraft:spider_spawn_egg", - "id": 448 - }, - { - "name": "minecraft:spire_armor_trim_smithing_template", - "id": 695 - }, - { - "name": "minecraft:splash_potion", - "id": 568 - }, - { - "name": "minecraft:sponge", - "id": 19 - }, - { - "name": "minecraft:spore_blossom", - "id": -321 - }, - { - "name": "minecraft:spruce_boat", - "id": 380 - }, - { - "name": "minecraft:spruce_button", - "id": -144 - }, - { - "name": "minecraft:spruce_chest_boat", - "id": 648 - }, - { - "name": "minecraft:spruce_door", - "id": 560 - }, - { - "name": "minecraft:spruce_fence", - "id": -579 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183 - }, - { - "name": "minecraft:spruce_hanging_sign", - "id": -501 - }, - { - "name": "minecraft:spruce_log", - "id": -569 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": -154 - }, - { - "name": "minecraft:spruce_sign", - "id": 583 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": -181 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": -149 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": -182 - }, - { - "name": "minecraft:spyglass", - "id": 632 - }, - { - "name": "minecraft:squid_spawn_egg", - "id": 452 - }, - { - "name": "minecraft:stained_glass", - "id": 241 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159 - }, - { - "name": "minecraft:standing_banner", - "id": 176 - }, - { - "name": "minecraft:standing_sign", - "id": 63 - }, - { - "name": "minecraft:stick", - "id": 322 - }, - { - "name": "minecraft:sticky_piston", - "id": 29 - }, - { - "name": "minecraft:sticky_piston_arm_collision", - "id": -217 - }, - { - "name": "minecraft:stone", - "id": 1 - }, - { - "name": "minecraft:stone_axe", - "id": 317 - }, - { - "name": "minecraft:stone_block_slab", - "id": 44 - }, - { - "name": "minecraft:stone_block_slab2", - "id": 182 - }, - { - "name": "minecraft:stone_block_slab3", - "id": -162 - }, - { - "name": "minecraft:stone_block_slab4", - "id": -166 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109 - }, - { - "name": "minecraft:stone_button", - "id": 77 - }, - { - "name": "minecraft:stone_hoe", - "id": 332 - }, - { - "name": "minecraft:stone_pickaxe", - "id": 316 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70 - }, - { - "name": "minecraft:stone_shovel", - "id": 315 - }, - { - "name": "minecraft:stone_stairs", - "id": 67 - }, - { - "name": "minecraft:stone_sword", - "id": 314 - }, - { - "name": "minecraft:stonebrick", - "id": 98 - }, - { - "name": "minecraft:stonecutter", - "id": 245 - }, - { - "name": "minecraft:stonecutter_block", - "id": -197 - }, - { - "name": "minecraft:stray_spawn_egg", - "id": 464 - }, - { - "name": "minecraft:strider_spawn_egg", - "id": 497 - }, - { - "name": "minecraft:string", - "id": 328 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": -8 - }, - { - "name": "minecraft:stripped_bamboo_block", - "id": -528 - }, - { - "name": "minecraft:stripped_birch_log", - "id": -6 - }, - { - "name": "minecraft:stripped_cherry_log", - "id": -535 - }, - { - "name": "minecraft:stripped_cherry_wood", - "id": -545 - }, - { - "name": "minecraft:stripped_crimson_hyphae", - "id": -300 - }, - { - "name": "minecraft:stripped_crimson_stem", - "id": -240 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": -9 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": -7 - }, - { - "name": "minecraft:stripped_mangrove_log", - "id": -485 - }, - { - "name": "minecraft:stripped_mangrove_wood", - "id": -498 - }, - { - "name": "minecraft:stripped_oak_log", - "id": -10 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": -5 - }, - { - "name": "minecraft:stripped_warped_hyphae", - "id": -301 - }, - { - "name": "minecraft:stripped_warped_stem", - "id": -241 - }, - { - "name": "minecraft:structure_block", - "id": 252 - }, - { - "name": "minecraft:structure_void", - "id": 217 - }, - { - "name": "minecraft:sugar", - "id": 418 - }, - { - "name": "minecraft:sugar_cane", - "id": 387 - }, - { - "name": "minecraft:suspicious_gravel", - "id": -573 - }, - { - "name": "minecraft:suspicious_sand", - "id": -529 - }, - { - "name": "minecraft:suspicious_stew", - "id": 597 - }, - { - "name": "minecraft:sweet_berries", - "id": 287 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": -207 - }, - { - "name": "minecraft:tadpole_bucket", - "id": 637 - }, - { - "name": "minecraft:tadpole_spawn_egg", - "id": 636 - }, - { - "name": "minecraft:tallgrass", - "id": 31 - }, - { - "name": "minecraft:target", - "id": -239 - }, - { - "name": "minecraft:tide_armor_trim_smithing_template", - "id": 692 - }, - { - "name": "minecraft:tinted_glass", - "id": -334 - }, - { - "name": "minecraft:tnt", - "id": 46 - }, - { - "name": "minecraft:tnt_minecart", - "id": 532 - }, - { - "name": "minecraft:torch", - "id": 50 - }, - { - "name": "minecraft:torchflower", - "id": -568 - }, - { - "name": "minecraft:torchflower_crop", - "id": -567 - }, - { - "name": "minecraft:torchflower_seeds", - "id": 296 - }, - { - "name": "minecraft:totem_of_undying", - "id": 575 - }, - { - "name": "minecraft:trader_llama_spawn_egg", - "id": 655 - }, - { - "name": "minecraft:trapdoor", - "id": 96 - }, - { - "name": "minecraft:trapped_chest", - "id": 146 - }, - { - "name": "minecraft:trident", - "id": 553 - }, - { - "name": "minecraft:trip_wire", - "id": 132 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131 - }, - { - "name": "minecraft:tropical_fish", - "id": 266 - }, - { - "name": "minecraft:tropical_fish_bucket", - "id": 368 - }, - { - "name": "minecraft:tropical_fish_spawn_egg", - "id": 481 - }, - { - "name": "minecraft:tube_coral", - "id": -131 - }, - { - "name": "minecraft:tuff", - "id": -333 - }, - { - "name": "minecraft:turtle_egg", - "id": -159 - }, - { - "name": "minecraft:turtle_helmet", - "id": 580 - }, - { - "name": "minecraft:turtle_spawn_egg", - "id": 487 - }, - { - "name": "minecraft:twisting_vines", - "id": -287 - }, - { - "name": "minecraft:underwater_torch", - "id": 239 - }, - { - "name": "minecraft:undyed_shulker_box", - "id": 205 - }, - { - "name": "minecraft:unknown", - "id": -305 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93 - }, - { - "name": "minecraft:verdant_froglight", - "id": -470 - }, - { - "name": "minecraft:vex_armor_trim_smithing_template", - "id": 691 - }, - { - "name": "minecraft:vex_spawn_egg", - "id": 478 - }, - { - "name": "minecraft:villager_spawn_egg", - "id": 451 - }, - { - "name": "minecraft:vindicator_spawn_egg", - "id": 476 - }, - { - "name": "minecraft:vine", - "id": 106 - }, - { - "name": "minecraft:wall_banner", - "id": 177 - }, - { - "name": "minecraft:wall_sign", - "id": 68 - }, - { - "name": "minecraft:wandering_trader_spawn_egg", - "id": 494 - }, - { - "name": "minecraft:ward_armor_trim_smithing_template", - "id": 689 - }, - { - "name": "minecraft:warden_spawn_egg", - "id": 639 - }, - { - "name": "minecraft:warped_button", - "id": -261 - }, - { - "name": "minecraft:warped_door", - "id": 624 - }, - { - "name": "minecraft:warped_double_slab", - "id": -267 - }, - { - "name": "minecraft:warped_fence", - "id": -257 - }, - { - "name": "minecraft:warped_fence_gate", - "id": -259 - }, - { - "name": "minecraft:warped_fungus", - "id": -229 - }, - { - "name": "minecraft:warped_fungus_on_a_stick", - "id": 625 - }, - { - "name": "minecraft:warped_hanging_sign", - "id": -507 - }, - { - "name": "minecraft:warped_hyphae", - "id": -298 - }, - { - "name": "minecraft:warped_nylium", - "id": -233 - }, - { - "name": "minecraft:warped_planks", - "id": -243 - }, - { - "name": "minecraft:warped_pressure_plate", - "id": -263 - }, - { - "name": "minecraft:warped_roots", - "id": -224 - }, - { - "name": "minecraft:warped_sign", - "id": 622 - }, - { - "name": "minecraft:warped_slab", - "id": -265 - }, - { - "name": "minecraft:warped_stairs", - "id": -255 - }, - { - "name": "minecraft:warped_standing_sign", - "id": -251 - }, - { - "name": "minecraft:warped_stem", - "id": -226 - }, - { - "name": "minecraft:warped_trapdoor", - "id": -247 - }, - { - "name": "minecraft:warped_wall_sign", - "id": -253 - }, - { - "name": "minecraft:warped_wart_block", - "id": -227 - }, - { - "name": "minecraft:water", - "id": 9 - }, - { - "name": "minecraft:water_bucket", - "id": 364 - }, - { - "name": "minecraft:waterlily", - "id": 111 - }, - { - "name": "minecraft:waxed_copper", - "id": -344 - }, - { - "name": "minecraft:waxed_cut_copper", - "id": -351 - }, - { - "name": "minecraft:waxed_cut_copper_slab", - "id": -365 - }, - { - "name": "minecraft:waxed_cut_copper_stairs", - "id": -358 - }, - { - "name": "minecraft:waxed_double_cut_copper_slab", - "id": -372 - }, - { - "name": "minecraft:waxed_exposed_copper", - "id": -345 - }, - { - "name": "minecraft:waxed_exposed_cut_copper", - "id": -352 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_slab", - "id": -366 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_stairs", - "id": -359 - }, - { - "name": "minecraft:waxed_exposed_double_cut_copper_slab", - "id": -373 - }, - { - "name": "minecraft:waxed_oxidized_copper", - "id": -446 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper", - "id": -447 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_slab", - "id": -449 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_stairs", - "id": -448 - }, - { - "name": "minecraft:waxed_oxidized_double_cut_copper_slab", - "id": -450 - }, - { - "name": "minecraft:waxed_weathered_copper", - "id": -346 - }, - { - "name": "minecraft:waxed_weathered_cut_copper", - "id": -353 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_slab", - "id": -367 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_stairs", - "id": -360 - }, - { - "name": "minecraft:waxed_weathered_double_cut_copper_slab", - "id": -374 - }, - { - "name": "minecraft:wayfinder_armor_trim_smithing_template", - "id": 697 - }, - { - "name": "minecraft:weathered_copper", - "id": -342 - }, - { - "name": "minecraft:weathered_cut_copper", - "id": -349 - }, - { - "name": "minecraft:weathered_cut_copper_slab", - "id": -363 - }, - { - "name": "minecraft:weathered_cut_copper_stairs", - "id": -356 - }, - { - "name": "minecraft:weathered_double_cut_copper_slab", - "id": -370 - }, - { - "name": "minecraft:web", - "id": 30 - }, - { - "name": "minecraft:weeping_vines", - "id": -231 - }, - { - "name": "minecraft:wheat", - "id": 336 - }, - { - "name": "minecraft:wheat_seeds", - "id": 291 - }, - { - "name": "minecraft:white_candle", - "id": -413 - }, - { - "name": "minecraft:white_candle_cake", - "id": -430 - }, - { - "name": "minecraft:white_carpet", - "id": 171 - }, - { - "name": "minecraft:white_dye", - "id": 412 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220 - }, - { - "name": "minecraft:white_wool", - "id": 35 - }, - { - "name": "minecraft:wild_armor_trim_smithing_template", - "id": 688 - }, - { - "name": "minecraft:witch_spawn_egg", - "id": 454 - }, - { - "name": "minecraft:wither_rose", - "id": -216 - }, - { - "name": "minecraft:wither_skeleton_spawn_egg", - "id": 466 - }, - { - "name": "minecraft:wither_spawn_egg", - "id": 509 - }, - { - "name": "minecraft:wolf_spawn_egg", - "id": 441 - }, - { - "name": "minecraft:wood", - "id": -212 - }, - { - "name": "minecraft:wooden_axe", - "id": 313 - }, - { - "name": "minecraft:wooden_button", - "id": 143 - }, - { - "name": "minecraft:wooden_door", - "id": 361 - }, - { - "name": "minecraft:wooden_hoe", - "id": 331 - }, - { - "name": "minecraft:wooden_pickaxe", - "id": 312 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72 - }, - { - "name": "minecraft:wooden_shovel", - "id": 311 - }, - { - "name": "minecraft:wooden_slab", - "id": 158 - }, - { - "name": "minecraft:wooden_sword", - "id": 310 - }, - { - "name": "minecraft:wool", - "id": 702 - }, - { - "name": "minecraft:writable_book", - "id": 517 - }, - { - "name": "minecraft:written_book", - "id": 518 - }, - { - "name": "minecraft:yellow_candle", - "id": -417 - }, - { - "name": "minecraft:yellow_candle_cake", - "id": -434 - }, - { - "name": "minecraft:yellow_carpet", - "id": -600 - }, - { - "name": "minecraft:yellow_dye", - "id": 408 - }, - { - "name": "minecraft:yellow_flower", - "id": 37 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224 - }, - { - "name": "minecraft:yellow_wool", - "id": -558 - }, - { - "name": "minecraft:zoglin_spawn_egg", - "id": 500 - }, - { - "name": "minecraft:zombie_horse_spawn_egg", - "id": 470 - }, - { - "name": "minecraft:zombie_pigman_spawn_egg", - "id": 450 - }, - { - "name": "minecraft:zombie_spawn_egg", - "id": 449 - }, - { - "name": "minecraft:zombie_villager_spawn_egg", - "id": 479 - } -] \ No newline at end of file diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_20_10.json b/core/src/main/resources/bedrock/runtime_item_states.1_20_10.json deleted file mode 100644 index 3625f30458f..00000000000 --- a/core/src/main/resources/bedrock/runtime_item_states.1_20_10.json +++ /dev/null @@ -1,5314 +0,0 @@ -[ - { - "name": "minecraft:acacia_boat", - "id": 381 - }, - { - "name": "minecraft:acacia_button", - "id": -140 - }, - { - "name": "minecraft:acacia_chest_boat", - "id": 649 - }, - { - "name": "minecraft:acacia_door", - "id": 563 - }, - { - "name": "minecraft:acacia_fence", - "id": -575 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187 - }, - { - "name": "minecraft:acacia_hanging_sign", - "id": -504 - }, - { - "name": "minecraft:acacia_log", - "id": 162 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": -150 - }, - { - "name": "minecraft:acacia_sign", - "id": 586 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": -190 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": -145 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": -191 - }, - { - "name": "minecraft:activator_rail", - "id": 126 - }, - { - "name": "minecraft:agent_spawn_egg", - "id": 489 - }, - { - "name": "minecraft:air", - "id": -158 - }, - { - "name": "minecraft:allay_spawn_egg", - "id": 638 - }, - { - "name": "minecraft:allow", - "id": 210 - }, - { - "name": "minecraft:amethyst_block", - "id": -327 - }, - { - "name": "minecraft:amethyst_cluster", - "id": -329 - }, - { - "name": "minecraft:amethyst_shard", - "id": 631 - }, - { - "name": "minecraft:ancient_debris", - "id": -271 - }, - { - "name": "minecraft:andesite_stairs", - "id": -171 - }, - { - "name": "minecraft:angler_pottery_sherd", - "id": 663 - }, - { - "name": "minecraft:anvil", - "id": 145 - }, - { - "name": "minecraft:apple", - "id": 257 - }, - { - "name": "minecraft:archer_pottery_sherd", - "id": 664 - }, - { - "name": "minecraft:armor_stand", - "id": 559 - }, - { - "name": "minecraft:arms_up_pottery_sherd", - "id": 665 - }, - { - "name": "minecraft:arrow", - "id": 303 - }, - { - "name": "minecraft:axolotl_bucket", - "id": 371 - }, - { - "name": "minecraft:axolotl_spawn_egg", - "id": 503 - }, - { - "name": "minecraft:azalea", - "id": -337 - }, - { - "name": "minecraft:azalea_leaves", - "id": -324 - }, - { - "name": "minecraft:azalea_leaves_flowered", - "id": -325 - }, - { - "name": "minecraft:baked_potato", - "id": 281 - }, - { - "name": "minecraft:balloon", - "id": 605 - }, - { - "name": "minecraft:bamboo", - "id": -163 - }, - { - "name": "minecraft:bamboo_block", - "id": -527 - }, - { - "name": "minecraft:bamboo_button", - "id": -511 - }, - { - "name": "minecraft:bamboo_chest_raft", - "id": 661 - }, - { - "name": "minecraft:bamboo_door", - "id": -517 - }, - { - "name": "minecraft:bamboo_double_slab", - "id": -521 - }, - { - "name": "minecraft:bamboo_fence", - "id": -515 - }, - { - "name": "minecraft:bamboo_fence_gate", - "id": -516 - }, - { - "name": "minecraft:bamboo_hanging_sign", - "id": -522 - }, - { - "name": "minecraft:bamboo_mosaic", - "id": -509 - }, - { - "name": "minecraft:bamboo_mosaic_double_slab", - "id": -525 - }, - { - "name": "minecraft:bamboo_mosaic_slab", - "id": -524 - }, - { - "name": "minecraft:bamboo_mosaic_stairs", - "id": -523 - }, - { - "name": "minecraft:bamboo_planks", - "id": -510 - }, - { - "name": "minecraft:bamboo_pressure_plate", - "id": -514 - }, - { - "name": "minecraft:bamboo_raft", - "id": 660 - }, - { - "name": "minecraft:bamboo_sapling", - "id": -164 - }, - { - "name": "minecraft:bamboo_sign", - "id": 659 - }, - { - "name": "minecraft:bamboo_slab", - "id": -513 - }, - { - "name": "minecraft:bamboo_stairs", - "id": -512 - }, - { - "name": "minecraft:bamboo_standing_sign", - "id": -518 - }, - { - "name": "minecraft:bamboo_trapdoor", - "id": -520 - }, - { - "name": "minecraft:bamboo_wall_sign", - "id": -519 - }, - { - "name": "minecraft:banner", - "id": 574 - }, - { - "name": "minecraft:banner_pattern", - "id": 712 - }, - { - "name": "minecraft:barrel", - "id": -203 - }, - { - "name": "minecraft:barrier", - "id": -161 - }, - { - "name": "minecraft:basalt", - "id": -234 - }, - { - "name": "minecraft:bat_spawn_egg", - "id": 455 - }, - { - "name": "minecraft:beacon", - "id": 138 - }, - { - "name": "minecraft:bed", - "id": 420 - }, - { - "name": "minecraft:bedrock", - "id": 7 - }, - { - "name": "minecraft:bee_nest", - "id": -218 - }, - { - "name": "minecraft:bee_spawn_egg", - "id": 496 - }, - { - "name": "minecraft:beef", - "id": 273 - }, - { - "name": "minecraft:beehive", - "id": -219 - }, - { - "name": "minecraft:beetroot", - "id": 285 - }, - { - "name": "minecraft:beetroot_seeds", - "id": 295 - }, - { - "name": "minecraft:beetroot_soup", - "id": 286 - }, - { - "name": "minecraft:bell", - "id": -206 - }, - { - "name": "minecraft:big_dripleaf", - "id": -323 - }, - { - "name": "minecraft:birch_boat", - "id": 378 - }, - { - "name": "minecraft:birch_button", - "id": -141 - }, - { - "name": "minecraft:birch_chest_boat", - "id": 646 - }, - { - "name": "minecraft:birch_door", - "id": 561 - }, - { - "name": "minecraft:birch_fence", - "id": -576 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184 - }, - { - "name": "minecraft:birch_hanging_sign", - "id": -502 - }, - { - "name": "minecraft:birch_log", - "id": -570 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": -151 - }, - { - "name": "minecraft:birch_sign", - "id": 584 - }, - { - "name": "minecraft:birch_stairs", - "id": 135 - }, - { - "name": "minecraft:birch_standing_sign", - "id": -186 - }, - { - "name": "minecraft:birch_trapdoor", - "id": -146 - }, - { - "name": "minecraft:birch_wall_sign", - "id": -187 - }, - { - "name": "minecraft:black_candle", - "id": -428 - }, - { - "name": "minecraft:black_candle_cake", - "id": -445 - }, - { - "name": "minecraft:black_carpet", - "id": -611 - }, - { - "name": "minecraft:black_concrete", - "id": -642 - }, - { - "name": "minecraft:black_dye", - "id": 397 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235 - }, - { - "name": "minecraft:black_shulker_box", - "id": -627 - }, - { - "name": "minecraft:black_wool", - "id": -554 - }, - { - "name": "minecraft:blackstone", - "id": -273 - }, - { - "name": "minecraft:blackstone_double_slab", - "id": -283 - }, - { - "name": "minecraft:blackstone_slab", - "id": -282 - }, - { - "name": "minecraft:blackstone_stairs", - "id": -276 - }, - { - "name": "minecraft:blackstone_wall", - "id": -277 - }, - { - "name": "minecraft:blade_pottery_sherd", - "id": 666 - }, - { - "name": "minecraft:blast_furnace", - "id": -196 - }, - { - "name": "minecraft:blaze_powder", - "id": 431 - }, - { - "name": "minecraft:blaze_rod", - "id": 425 - }, - { - "name": "minecraft:blaze_spawn_egg", - "id": 458 - }, - { - "name": "minecraft:bleach", - "id": 603 - }, - { - "name": "minecraft:blue_candle", - "id": -424 - }, - { - "name": "minecraft:blue_candle_cake", - "id": -441 - }, - { - "name": "minecraft:blue_carpet", - "id": -607 - }, - { - "name": "minecraft:blue_concrete", - "id": -638 - }, - { - "name": "minecraft:blue_dye", - "id": 401 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231 - }, - { - "name": "minecraft:blue_ice", - "id": -11 - }, - { - "name": "minecraft:blue_shulker_box", - "id": -623 - }, - { - "name": "minecraft:blue_wool", - "id": -563 - }, - { - "name": "minecraft:boat", - "id": 710 - }, - { - "name": "minecraft:bone", - "id": 417 - }, - { - "name": "minecraft:bone_block", - "id": 216 - }, - { - "name": "minecraft:bone_meal", - "id": 413 - }, - { - "name": "minecraft:book", - "id": 389 - }, - { - "name": "minecraft:bookshelf", - "id": 47 - }, - { - "name": "minecraft:border_block", - "id": 212 - }, - { - "name": "minecraft:bordure_indented_banner_pattern", - "id": 593 - }, - { - "name": "minecraft:bow", - "id": 302 - }, - { - "name": "minecraft:bowl", - "id": 323 - }, - { - "name": "minecraft:brain_coral", - "id": -581 - }, - { - "name": "minecraft:bread", - "id": 261 - }, - { - "name": "minecraft:brewer_pottery_sherd", - "id": 667 - }, - { - "name": "minecraft:brewing_stand", - "id": 433 - }, - { - "name": "minecraft:brick", - "id": 385 - }, - { - "name": "minecraft:brick_block", - "id": 45 - }, - { - "name": "minecraft:brick_stairs", - "id": 108 - }, - { - "name": "minecraft:brown_candle", - "id": -425 - }, - { - "name": "minecraft:brown_candle_cake", - "id": -442 - }, - { - "name": "minecraft:brown_carpet", - "id": -608 - }, - { - "name": "minecraft:brown_concrete", - "id": -639 - }, - { - "name": "minecraft:brown_dye", - "id": 400 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232 - }, - { - "name": "minecraft:brown_mushroom", - "id": 39 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99 - }, - { - "name": "minecraft:brown_shulker_box", - "id": -624 - }, - { - "name": "minecraft:brown_wool", - "id": -555 - }, - { - "name": "minecraft:brush", - "id": 683 - }, - { - "name": "minecraft:bubble_column", - "id": -160 - }, - { - "name": "minecraft:bubble_coral", - "id": -582 - }, - { - "name": "minecraft:bucket", - "id": 362 - }, - { - "name": "minecraft:budding_amethyst", - "id": -328 - }, - { - "name": "minecraft:burn_pottery_sherd", - "id": 668 - }, - { - "name": "minecraft:cactus", - "id": 81 - }, - { - "name": "minecraft:cake", - "id": 419 - }, - { - "name": "minecraft:calcite", - "id": -326 - }, - { - "name": "minecraft:calibrated_sculk_sensor", - "id": -580 - }, - { - "name": "minecraft:camel_spawn_egg", - "id": 662 - }, - { - "name": "minecraft:camera", - "id": 600 - }, - { - "name": "minecraft:campfire", - "id": 596 - }, - { - "name": "minecraft:candle", - "id": -412 - }, - { - "name": "minecraft:candle_cake", - "id": -429 - }, - { - "name": "minecraft:carpet", - "id": 703 - }, - { - "name": "minecraft:carrot", - "id": 279 - }, - { - "name": "minecraft:carrot_on_a_stick", - "id": 524 - }, - { - "name": "minecraft:carrots", - "id": 141 - }, - { - "name": "minecraft:cartography_table", - "id": -200 - }, - { - "name": "minecraft:carved_pumpkin", - "id": -155 - }, - { - "name": "minecraft:cat_spawn_egg", - "id": 490 - }, - { - "name": "minecraft:cauldron", - "id": 434 - }, - { - "name": "minecraft:cave_spider_spawn_egg", - "id": 459 - }, - { - "name": "minecraft:cave_vines", - "id": -322 - }, - { - "name": "minecraft:cave_vines_body_with_berries", - "id": -375 - }, - { - "name": "minecraft:cave_vines_head_with_berries", - "id": -376 - }, - { - "name": "minecraft:chain", - "id": 626 - }, - { - "name": "minecraft:chain_command_block", - "id": 189 - }, - { - "name": "minecraft:chainmail_boots", - "id": 344 - }, - { - "name": "minecraft:chainmail_chestplate", - "id": 342 - }, - { - "name": "minecraft:chainmail_helmet", - "id": 341 - }, - { - "name": "minecraft:chainmail_leggings", - "id": 343 - }, - { - "name": "minecraft:charcoal", - "id": 305 - }, - { - "name": "minecraft:chemical_heat", - "id": 192 - }, - { - "name": "minecraft:chemistry_table", - "id": 238 - }, - { - "name": "minecraft:cherry_boat", - "id": 656 - }, - { - "name": "minecraft:cherry_button", - "id": -530 - }, - { - "name": "minecraft:cherry_chest_boat", - "id": 657 - }, - { - "name": "minecraft:cherry_door", - "id": -531 - }, - { - "name": "minecraft:cherry_double_slab", - "id": -540 - }, - { - "name": "minecraft:cherry_fence", - "id": -532 - }, - { - "name": "minecraft:cherry_fence_gate", - "id": -533 - }, - { - "name": "minecraft:cherry_hanging_sign", - "id": -534 - }, - { - "name": "minecraft:cherry_leaves", - "id": -548 - }, - { - "name": "minecraft:cherry_log", - "id": -536 - }, - { - "name": "minecraft:cherry_planks", - "id": -537 - }, - { - "name": "minecraft:cherry_pressure_plate", - "id": -538 - }, - { - "name": "minecraft:cherry_sapling", - "id": -547 - }, - { - "name": "minecraft:cherry_sign", - "id": 658 - }, - { - "name": "minecraft:cherry_slab", - "id": -539 - }, - { - "name": "minecraft:cherry_stairs", - "id": -541 - }, - { - "name": "minecraft:cherry_standing_sign", - "id": -542 - }, - { - "name": "minecraft:cherry_trapdoor", - "id": -543 - }, - { - "name": "minecraft:cherry_wall_sign", - "id": -544 - }, - { - "name": "minecraft:cherry_wood", - "id": -546 - }, - { - "name": "minecraft:chest", - "id": 54 - }, - { - "name": "minecraft:chest_boat", - "id": 652 - }, - { - "name": "minecraft:chest_minecart", - "id": 391 - }, - { - "name": "minecraft:chicken", - "id": 275 - }, - { - "name": "minecraft:chicken_spawn_egg", - "id": 437 - }, - { - "name": "minecraft:chiseled_bookshelf", - "id": -526 - }, - { - "name": "minecraft:chiseled_deepslate", - "id": -395 - }, - { - "name": "minecraft:chiseled_nether_bricks", - "id": -302 - }, - { - "name": "minecraft:chiseled_polished_blackstone", - "id": -279 - }, - { - "name": "minecraft:chorus_flower", - "id": 200 - }, - { - "name": "minecraft:chorus_fruit", - "id": 565 - }, - { - "name": "minecraft:chorus_plant", - "id": 240 - }, - { - "name": "minecraft:clay", - "id": 82 - }, - { - "name": "minecraft:clay_ball", - "id": 386 - }, - { - "name": "minecraft:client_request_placeholder_block", - "id": -465 - }, - { - "name": "minecraft:clock", - "id": 395 - }, - { - "name": "minecraft:coal", - "id": 304 - }, - { - "name": "minecraft:coal_block", - "id": 173 - }, - { - "name": "minecraft:coal_ore", - "id": 16 - }, - { - "name": "minecraft:coast_armor_trim_smithing_template", - "id": 687 - }, - { - "name": "minecraft:cobbled_deepslate", - "id": -379 - }, - { - "name": "minecraft:cobbled_deepslate_double_slab", - "id": -396 - }, - { - "name": "minecraft:cobbled_deepslate_slab", - "id": -380 - }, - { - "name": "minecraft:cobbled_deepslate_stairs", - "id": -381 - }, - { - "name": "minecraft:cobbled_deepslate_wall", - "id": -382 - }, - { - "name": "minecraft:cobblestone", - "id": 4 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139 - }, - { - "name": "minecraft:cocoa", - "id": 127 - }, - { - "name": "minecraft:cocoa_beans", - "id": 414 - }, - { - "name": "minecraft:cod", - "id": 264 - }, - { - "name": "minecraft:cod_bucket", - "id": 366 - }, - { - "name": "minecraft:cod_spawn_egg", - "id": 482 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202 - }, - { - "name": "minecraft:command_block", - "id": 137 - }, - { - "name": "minecraft:command_block_minecart", - "id": 570 - }, - { - "name": "minecraft:comparator", - "id": 529 - }, - { - "name": "minecraft:compass", - "id": 393 - }, - { - "name": "minecraft:composter", - "id": -213 - }, - { - "name": "minecraft:compound", - "id": 601 - }, - { - "name": "minecraft:concrete", - "id": 708 - }, - { - "name": "minecraft:concrete_powder", - "id": 237 - }, - { - "name": "minecraft:conduit", - "id": -157 - }, - { - "name": "minecraft:cooked_beef", - "id": 274 - }, - { - "name": "minecraft:cooked_chicken", - "id": 276 - }, - { - "name": "minecraft:cooked_cod", - "id": 268 - }, - { - "name": "minecraft:cooked_mutton", - "id": 558 - }, - { - "name": "minecraft:cooked_porkchop", - "id": 263 - }, - { - "name": "minecraft:cooked_rabbit", - "id": 289 - }, - { - "name": "minecraft:cooked_salmon", - "id": 269 - }, - { - "name": "minecraft:cookie", - "id": 271 - }, - { - "name": "minecraft:copper_block", - "id": -340 - }, - { - "name": "minecraft:copper_ingot", - "id": 511 - }, - { - "name": "minecraft:copper_ore", - "id": -311 - }, - { - "name": "minecraft:coral", - "id": 706 - }, - { - "name": "minecraft:coral_block", - "id": -132 - }, - { - "name": "minecraft:coral_fan", - "id": -133 - }, - { - "name": "minecraft:coral_fan_dead", - "id": -134 - }, - { - "name": "minecraft:coral_fan_hang", - "id": -135 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": -136 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": -137 - }, - { - "name": "minecraft:cow_spawn_egg", - "id": 438 - }, - { - "name": "minecraft:cracked_deepslate_bricks", - "id": -410 - }, - { - "name": "minecraft:cracked_deepslate_tiles", - "id": -409 - }, - { - "name": "minecraft:cracked_nether_bricks", - "id": -303 - }, - { - "name": "minecraft:cracked_polished_blackstone_bricks", - "id": -280 - }, - { - "name": "minecraft:crafting_table", - "id": 58 - }, - { - "name": "minecraft:creeper_banner_pattern", - "id": 589 - }, - { - "name": "minecraft:creeper_spawn_egg", - "id": 443 - }, - { - "name": "minecraft:crimson_button", - "id": -260 - }, - { - "name": "minecraft:crimson_door", - "id": 623 - }, - { - "name": "minecraft:crimson_double_slab", - "id": -266 - }, - { - "name": "minecraft:crimson_fence", - "id": -256 - }, - { - "name": "minecraft:crimson_fence_gate", - "id": -258 - }, - { - "name": "minecraft:crimson_fungus", - "id": -228 - }, - { - "name": "minecraft:crimson_hanging_sign", - "id": -506 - }, - { - "name": "minecraft:crimson_hyphae", - "id": -299 - }, - { - "name": "minecraft:crimson_nylium", - "id": -232 - }, - { - "name": "minecraft:crimson_planks", - "id": -242 - }, - { - "name": "minecraft:crimson_pressure_plate", - "id": -262 - }, - { - "name": "minecraft:crimson_roots", - "id": -223 - }, - { - "name": "minecraft:crimson_sign", - "id": 621 - }, - { - "name": "minecraft:crimson_slab", - "id": -264 - }, - { - "name": "minecraft:crimson_stairs", - "id": -254 - }, - { - "name": "minecraft:crimson_standing_sign", - "id": -250 - }, - { - "name": "minecraft:crimson_stem", - "id": -225 - }, - { - "name": "minecraft:crimson_trapdoor", - "id": -246 - }, - { - "name": "minecraft:crimson_wall_sign", - "id": -252 - }, - { - "name": "minecraft:crossbow", - "id": 582 - }, - { - "name": "minecraft:crying_obsidian", - "id": -289 - }, - { - "name": "minecraft:cut_copper", - "id": -347 - }, - { - "name": "minecraft:cut_copper_slab", - "id": -361 - }, - { - "name": "minecraft:cut_copper_stairs", - "id": -354 - }, - { - "name": "minecraft:cyan_candle", - "id": -422 - }, - { - "name": "minecraft:cyan_candle_cake", - "id": -439 - }, - { - "name": "minecraft:cyan_carpet", - "id": -605 - }, - { - "name": "minecraft:cyan_concrete", - "id": -636 - }, - { - "name": "minecraft:cyan_dye", - "id": 403 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229 - }, - { - "name": "minecraft:cyan_shulker_box", - "id": -621 - }, - { - "name": "minecraft:cyan_wool", - "id": -561 - }, - { - "name": "minecraft:danger_pottery_sherd", - "id": 669 - }, - { - "name": "minecraft:dark_oak_boat", - "id": 382 - }, - { - "name": "minecraft:dark_oak_button", - "id": -142 - }, - { - "name": "minecraft:dark_oak_chest_boat", - "id": 650 - }, - { - "name": "minecraft:dark_oak_door", - "id": 564 - }, - { - "name": "minecraft:dark_oak_fence", - "id": -577 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186 - }, - { - "name": "minecraft:dark_oak_hanging_sign", - "id": -505 - }, - { - "name": "minecraft:dark_oak_log", - "id": -572 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": -152 - }, - { - "name": "minecraft:dark_oak_sign", - "id": 587 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": -147 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": -3 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": -192 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": -193 - }, - { - "name": "minecraft:daylight_detector", - "id": 151 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178 - }, - { - "name": "minecraft:dead_brain_coral", - "id": -586 - }, - { - "name": "minecraft:dead_bubble_coral", - "id": -587 - }, - { - "name": "minecraft:dead_fire_coral", - "id": -588 - }, - { - "name": "minecraft:dead_horn_coral", - "id": -589 - }, - { - "name": "minecraft:dead_tube_coral", - "id": -585 - }, - { - "name": "minecraft:deadbush", - "id": 32 - }, - { - "name": "minecraft:decorated_pot", - "id": -551 - }, - { - "name": "minecraft:deepslate", - "id": -378 - }, - { - "name": "minecraft:deepslate_brick_double_slab", - "id": -399 - }, - { - "name": "minecraft:deepslate_brick_slab", - "id": -392 - }, - { - "name": "minecraft:deepslate_brick_stairs", - "id": -393 - }, - { - "name": "minecraft:deepslate_brick_wall", - "id": -394 - }, - { - "name": "minecraft:deepslate_bricks", - "id": -391 - }, - { - "name": "minecraft:deepslate_coal_ore", - "id": -406 - }, - { - "name": "minecraft:deepslate_copper_ore", - "id": -408 - }, - { - "name": "minecraft:deepslate_diamond_ore", - "id": -405 - }, - { - "name": "minecraft:deepslate_emerald_ore", - "id": -407 - }, - { - "name": "minecraft:deepslate_gold_ore", - "id": -402 - }, - { - "name": "minecraft:deepslate_iron_ore", - "id": -401 - }, - { - "name": "minecraft:deepslate_lapis_ore", - "id": -400 - }, - { - "name": "minecraft:deepslate_redstone_ore", - "id": -403 - }, - { - "name": "minecraft:deepslate_tile_double_slab", - "id": -398 - }, - { - "name": "minecraft:deepslate_tile_slab", - "id": -388 - }, - { - "name": "minecraft:deepslate_tile_stairs", - "id": -389 - }, - { - "name": "minecraft:deepslate_tile_wall", - "id": -390 - }, - { - "name": "minecraft:deepslate_tiles", - "id": -387 - }, - { - "name": "minecraft:deny", - "id": 211 - }, - { - "name": "minecraft:detector_rail", - "id": 28 - }, - { - "name": "minecraft:diamond", - "id": 306 - }, - { - "name": "minecraft:diamond_axe", - "id": 321 - }, - { - "name": "minecraft:diamond_block", - "id": 57 - }, - { - "name": "minecraft:diamond_boots", - "id": 352 - }, - { - "name": "minecraft:diamond_chestplate", - "id": 350 - }, - { - "name": "minecraft:diamond_helmet", - "id": 349 - }, - { - "name": "minecraft:diamond_hoe", - "id": 334 - }, - { - "name": "minecraft:diamond_horse_armor", - "id": 540 - }, - { - "name": "minecraft:diamond_leggings", - "id": 351 - }, - { - "name": "minecraft:diamond_ore", - "id": 56 - }, - { - "name": "minecraft:diamond_pickaxe", - "id": 320 - }, - { - "name": "minecraft:diamond_shovel", - "id": 319 - }, - { - "name": "minecraft:diamond_sword", - "id": 318 - }, - { - "name": "minecraft:diorite_stairs", - "id": -170 - }, - { - "name": "minecraft:dirt", - "id": 3 - }, - { - "name": "minecraft:dirt_with_roots", - "id": -318 - }, - { - "name": "minecraft:disc_fragment_5", - "id": 644 - }, - { - "name": "minecraft:dispenser", - "id": 23 - }, - { - "name": "minecraft:dolphin_spawn_egg", - "id": 486 - }, - { - "name": "minecraft:donkey_spawn_egg", - "id": 467 - }, - { - "name": "minecraft:double_cut_copper_slab", - "id": -368 - }, - { - "name": "minecraft:double_plant", - "id": 175 - }, - { - "name": "minecraft:double_stone_block_slab", - "id": 43 - }, - { - "name": "minecraft:double_stone_block_slab2", - "id": 181 - }, - { - "name": "minecraft:double_stone_block_slab3", - "id": -167 - }, - { - "name": "minecraft:double_stone_block_slab4", - "id": -168 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157 - }, - { - "name": "minecraft:dragon_breath", - "id": 567 - }, - { - "name": "minecraft:dragon_egg", - "id": 122 - }, - { - "name": "minecraft:dried_kelp", - "id": 270 - }, - { - "name": "minecraft:dried_kelp_block", - "id": -139 - }, - { - "name": "minecraft:dripstone_block", - "id": -317 - }, - { - "name": "minecraft:dropper", - "id": 125 - }, - { - "name": "minecraft:drowned_spawn_egg", - "id": 485 - }, - { - "name": "minecraft:dune_armor_trim_smithing_template", - "id": 686 - }, - { - "name": "minecraft:dye", - "id": 711 - }, - { - "name": "minecraft:echo_shard", - "id": 654 - }, - { - "name": "minecraft:egg", - "id": 392 - }, - { - "name": "minecraft:elder_guardian_spawn_egg", - "id": 473 - }, - { - "name": "minecraft:element_0", - "id": 36 - }, - { - "name": "minecraft:element_1", - "id": -12 - }, - { - "name": "minecraft:element_10", - "id": -21 - }, - { - "name": "minecraft:element_100", - "id": -111 - }, - { - "name": "minecraft:element_101", - "id": -112 - }, - { - "name": "minecraft:element_102", - "id": -113 - }, - { - "name": "minecraft:element_103", - "id": -114 - }, - { - "name": "minecraft:element_104", - "id": -115 - }, - { - "name": "minecraft:element_105", - "id": -116 - }, - { - "name": "minecraft:element_106", - "id": -117 - }, - { - "name": "minecraft:element_107", - "id": -118 - }, - { - "name": "minecraft:element_108", - "id": -119 - }, - { - "name": "minecraft:element_109", - "id": -120 - }, - { - "name": "minecraft:element_11", - "id": -22 - }, - { - "name": "minecraft:element_110", - "id": -121 - }, - { - "name": "minecraft:element_111", - "id": -122 - }, - { - "name": "minecraft:element_112", - "id": -123 - }, - { - "name": "minecraft:element_113", - "id": -124 - }, - { - "name": "minecraft:element_114", - "id": -125 - }, - { - "name": "minecraft:element_115", - "id": -126 - }, - { - "name": "minecraft:element_116", - "id": -127 - }, - { - "name": "minecraft:element_117", - "id": -128 - }, - { - "name": "minecraft:element_118", - "id": -129 - }, - { - "name": "minecraft:element_12", - "id": -23 - }, - { - "name": "minecraft:element_13", - "id": -24 - }, - { - "name": "minecraft:element_14", - "id": -25 - }, - { - "name": "minecraft:element_15", - "id": -26 - }, - { - "name": "minecraft:element_16", - "id": -27 - }, - { - "name": "minecraft:element_17", - "id": -28 - }, - { - "name": "minecraft:element_18", - "id": -29 - }, - { - "name": "minecraft:element_19", - "id": -30 - }, - { - "name": "minecraft:element_2", - "id": -13 - }, - { - "name": "minecraft:element_20", - "id": -31 - }, - { - "name": "minecraft:element_21", - "id": -32 - }, - { - "name": "minecraft:element_22", - "id": -33 - }, - { - "name": "minecraft:element_23", - "id": -34 - }, - { - "name": "minecraft:element_24", - "id": -35 - }, - { - "name": "minecraft:element_25", - "id": -36 - }, - { - "name": "minecraft:element_26", - "id": -37 - }, - { - "name": "minecraft:element_27", - "id": -38 - }, - { - "name": "minecraft:element_28", - "id": -39 - }, - { - "name": "minecraft:element_29", - "id": -40 - }, - { - "name": "minecraft:element_3", - "id": -14 - }, - { - "name": "minecraft:element_30", - "id": -41 - }, - { - "name": "minecraft:element_31", - "id": -42 - }, - { - "name": "minecraft:element_32", - "id": -43 - }, - { - "name": "minecraft:element_33", - "id": -44 - }, - { - "name": "minecraft:element_34", - "id": -45 - }, - { - "name": "minecraft:element_35", - "id": -46 - }, - { - "name": "minecraft:element_36", - "id": -47 - }, - { - "name": "minecraft:element_37", - "id": -48 - }, - { - "name": "minecraft:element_38", - "id": -49 - }, - { - "name": "minecraft:element_39", - "id": -50 - }, - { - "name": "minecraft:element_4", - "id": -15 - }, - { - "name": "minecraft:element_40", - "id": -51 - }, - { - "name": "minecraft:element_41", - "id": -52 - }, - { - "name": "minecraft:element_42", - "id": -53 - }, - { - "name": "minecraft:element_43", - "id": -54 - }, - { - "name": "minecraft:element_44", - "id": -55 - }, - { - "name": "minecraft:element_45", - "id": -56 - }, - { - "name": "minecraft:element_46", - "id": -57 - }, - { - "name": "minecraft:element_47", - "id": -58 - }, - { - "name": "minecraft:element_48", - "id": -59 - }, - { - "name": "minecraft:element_49", - "id": -60 - }, - { - "name": "minecraft:element_5", - "id": -16 - }, - { - "name": "minecraft:element_50", - "id": -61 - }, - { - "name": "minecraft:element_51", - "id": -62 - }, - { - "name": "minecraft:element_52", - "id": -63 - }, - { - "name": "minecraft:element_53", - "id": -64 - }, - { - "name": "minecraft:element_54", - "id": -65 - }, - { - "name": "minecraft:element_55", - "id": -66 - }, - { - "name": "minecraft:element_56", - "id": -67 - }, - { - "name": "minecraft:element_57", - "id": -68 - }, - { - "name": "minecraft:element_58", - "id": -69 - }, - { - "name": "minecraft:element_59", - "id": -70 - }, - { - "name": "minecraft:element_6", - "id": -17 - }, - { - "name": "minecraft:element_60", - "id": -71 - }, - { - "name": "minecraft:element_61", - "id": -72 - }, - { - "name": "minecraft:element_62", - "id": -73 - }, - { - "name": "minecraft:element_63", - "id": -74 - }, - { - "name": "minecraft:element_64", - "id": -75 - }, - { - "name": "minecraft:element_65", - "id": -76 - }, - { - "name": "minecraft:element_66", - "id": -77 - }, - { - "name": "minecraft:element_67", - "id": -78 - }, - { - "name": "minecraft:element_68", - "id": -79 - }, - { - "name": "minecraft:element_69", - "id": -80 - }, - { - "name": "minecraft:element_7", - "id": -18 - }, - { - "name": "minecraft:element_70", - "id": -81 - }, - { - "name": "minecraft:element_71", - "id": -82 - }, - { - "name": "minecraft:element_72", - "id": -83 - }, - { - "name": "minecraft:element_73", - "id": -84 - }, - { - "name": "minecraft:element_74", - "id": -85 - }, - { - "name": "minecraft:element_75", - "id": -86 - }, - { - "name": "minecraft:element_76", - "id": -87 - }, - { - "name": "minecraft:element_77", - "id": -88 - }, - { - "name": "minecraft:element_78", - "id": -89 - }, - { - "name": "minecraft:element_79", - "id": -90 - }, - { - "name": "minecraft:element_8", - "id": -19 - }, - { - "name": "minecraft:element_80", - "id": -91 - }, - { - "name": "minecraft:element_81", - "id": -92 - }, - { - "name": "minecraft:element_82", - "id": -93 - }, - { - "name": "minecraft:element_83", - "id": -94 - }, - { - "name": "minecraft:element_84", - "id": -95 - }, - { - "name": "minecraft:element_85", - "id": -96 - }, - { - "name": "minecraft:element_86", - "id": -97 - }, - { - "name": "minecraft:element_87", - "id": -98 - }, - { - "name": "minecraft:element_88", - "id": -99 - }, - { - "name": "minecraft:element_89", - "id": -100 - }, - { - "name": "minecraft:element_9", - "id": -20 - }, - { - "name": "minecraft:element_90", - "id": -101 - }, - { - "name": "minecraft:element_91", - "id": -102 - }, - { - "name": "minecraft:element_92", - "id": -103 - }, - { - "name": "minecraft:element_93", - "id": -104 - }, - { - "name": "minecraft:element_94", - "id": -105 - }, - { - "name": "minecraft:element_95", - "id": -106 - }, - { - "name": "minecraft:element_96", - "id": -107 - }, - { - "name": "minecraft:element_97", - "id": -108 - }, - { - "name": "minecraft:element_98", - "id": -109 - }, - { - "name": "minecraft:element_99", - "id": -110 - }, - { - "name": "minecraft:elytra", - "id": 571 - }, - { - "name": "minecraft:emerald", - "id": 519 - }, - { - "name": "minecraft:emerald_block", - "id": 133 - }, - { - "name": "minecraft:emerald_ore", - "id": 129 - }, - { - "name": "minecraft:empty_map", - "id": 522 - }, - { - "name": "minecraft:enchanted_book", - "id": 528 - }, - { - "name": "minecraft:enchanted_golden_apple", - "id": 259 - }, - { - "name": "minecraft:enchanting_table", - "id": 116 - }, - { - "name": "minecraft:end_brick_stairs", - "id": -178 - }, - { - "name": "minecraft:end_bricks", - "id": 206 - }, - { - "name": "minecraft:end_crystal", - "id": 714 - }, - { - "name": "minecraft:end_gateway", - "id": 209 - }, - { - "name": "minecraft:end_portal", - "id": 119 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120 - }, - { - "name": "minecraft:end_rod", - "id": 208 - }, - { - "name": "minecraft:end_stone", - "id": 121 - }, - { - "name": "minecraft:ender_chest", - "id": 130 - }, - { - "name": "minecraft:ender_dragon_spawn_egg", - "id": 508 - }, - { - "name": "minecraft:ender_eye", - "id": 435 - }, - { - "name": "minecraft:ender_pearl", - "id": 424 - }, - { - "name": "minecraft:enderman_spawn_egg", - "id": 444 - }, - { - "name": "minecraft:endermite_spawn_egg", - "id": 462 - }, - { - "name": "minecraft:evoker_spawn_egg", - "id": 477 - }, - { - "name": "minecraft:experience_bottle", - "id": 515 - }, - { - "name": "minecraft:explorer_pottery_sherd", - "id": 670 - }, - { - "name": "minecraft:exposed_copper", - "id": -341 - }, - { - "name": "minecraft:exposed_cut_copper", - "id": -348 - }, - { - "name": "minecraft:exposed_cut_copper_slab", - "id": -362 - }, - { - "name": "minecraft:exposed_cut_copper_stairs", - "id": -355 - }, - { - "name": "minecraft:exposed_double_cut_copper_slab", - "id": -369 - }, - { - "name": "minecraft:eye_armor_trim_smithing_template", - "id": 690 - }, - { - "name": "minecraft:farmland", - "id": 60 - }, - { - "name": "minecraft:feather", - "id": 329 - }, - { - "name": "minecraft:fence", - "id": 705 - }, - { - "name": "minecraft:fence_gate", - "id": 107 - }, - { - "name": "minecraft:fermented_spider_eye", - "id": 430 - }, - { - "name": "minecraft:field_masoned_banner_pattern", - "id": 592 - }, - { - "name": "minecraft:filled_map", - "id": 422 - }, - { - "name": "minecraft:fire", - "id": 51 - }, - { - "name": "minecraft:fire_charge", - "id": 516 - }, - { - "name": "minecraft:fire_coral", - "id": -583 - }, - { - "name": "minecraft:firework_rocket", - "id": 526 - }, - { - "name": "minecraft:firework_star", - "id": 527 - }, - { - "name": "minecraft:fishing_rod", - "id": 394 - }, - { - "name": "minecraft:fletching_table", - "id": -201 - }, - { - "name": "minecraft:flint", - "id": 358 - }, - { - "name": "minecraft:flint_and_steel", - "id": 301 - }, - { - "name": "minecraft:flower_banner_pattern", - "id": 588 - }, - { - "name": "minecraft:flower_pot", - "id": 521 - }, - { - "name": "minecraft:flowering_azalea", - "id": -338 - }, - { - "name": "minecraft:flowing_lava", - "id": 10 - }, - { - "name": "minecraft:flowing_water", - "id": 8 - }, - { - "name": "minecraft:fox_spawn_egg", - "id": 492 - }, - { - "name": "minecraft:frame", - "id": 520 - }, - { - "name": "minecraft:friend_pottery_sherd", - "id": 671 - }, - { - "name": "minecraft:frog_spawn", - "id": -468 - }, - { - "name": "minecraft:frog_spawn_egg", - "id": 635 - }, - { - "name": "minecraft:frosted_ice", - "id": 207 - }, - { - "name": "minecraft:furnace", - "id": 61 - }, - { - "name": "minecraft:ghast_spawn_egg", - "id": 456 - }, - { - "name": "minecraft:ghast_tear", - "id": 426 - }, - { - "name": "minecraft:gilded_blackstone", - "id": -281 - }, - { - "name": "minecraft:glass", - "id": 20 - }, - { - "name": "minecraft:glass_bottle", - "id": 429 - }, - { - "name": "minecraft:glass_pane", - "id": 102 - }, - { - "name": "minecraft:glistering_melon_slice", - "id": 436 - }, - { - "name": "minecraft:globe_banner_pattern", - "id": 595 - }, - { - "name": "minecraft:glow_berries", - "id": 715 - }, - { - "name": "minecraft:glow_frame", - "id": 630 - }, - { - "name": "minecraft:glow_ink_sac", - "id": 510 - }, - { - "name": "minecraft:glow_lichen", - "id": -411 - }, - { - "name": "minecraft:glow_squid_spawn_egg", - "id": 505 - }, - { - "name": "minecraft:glow_stick", - "id": 608 - }, - { - "name": "minecraft:glowingobsidian", - "id": 246 - }, - { - "name": "minecraft:glowstone", - "id": 89 - }, - { - "name": "minecraft:glowstone_dust", - "id": 396 - }, - { - "name": "minecraft:goat_horn", - "id": 634 - }, - { - "name": "minecraft:goat_spawn_egg", - "id": 504 - }, - { - "name": "minecraft:gold_block", - "id": 41 - }, - { - "name": "minecraft:gold_ingot", - "id": 308 - }, - { - "name": "minecraft:gold_nugget", - "id": 427 - }, - { - "name": "minecraft:gold_ore", - "id": 14 - }, - { - "name": "minecraft:golden_apple", - "id": 258 - }, - { - "name": "minecraft:golden_axe", - "id": 327 - }, - { - "name": "minecraft:golden_boots", - "id": 356 - }, - { - "name": "minecraft:golden_carrot", - "id": 283 - }, - { - "name": "minecraft:golden_chestplate", - "id": 354 - }, - { - "name": "minecraft:golden_helmet", - "id": 353 - }, - { - "name": "minecraft:golden_hoe", - "id": 335 - }, - { - "name": "minecraft:golden_horse_armor", - "id": 539 - }, - { - "name": "minecraft:golden_leggings", - "id": 355 - }, - { - "name": "minecraft:golden_pickaxe", - "id": 326 - }, - { - "name": "minecraft:golden_rail", - "id": 27 - }, - { - "name": "minecraft:golden_shovel", - "id": 325 - }, - { - "name": "minecraft:golden_sword", - "id": 324 - }, - { - "name": "minecraft:granite_stairs", - "id": -169 - }, - { - "name": "minecraft:grass", - "id": 2 - }, - { - "name": "minecraft:grass_path", - "id": 198 - }, - { - "name": "minecraft:gravel", - "id": 13 - }, - { - "name": "minecraft:gray_candle", - "id": -420 - }, - { - "name": "minecraft:gray_candle_cake", - "id": -437 - }, - { - "name": "minecraft:gray_carpet", - "id": -603 - }, - { - "name": "minecraft:gray_concrete", - "id": -634 - }, - { - "name": "minecraft:gray_dye", - "id": 405 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227 - }, - { - "name": "minecraft:gray_shulker_box", - "id": -619 - }, - { - "name": "minecraft:gray_wool", - "id": -553 - }, - { - "name": "minecraft:green_candle", - "id": -426 - }, - { - "name": "minecraft:green_candle_cake", - "id": -443 - }, - { - "name": "minecraft:green_carpet", - "id": -609 - }, - { - "name": "minecraft:green_concrete", - "id": -640 - }, - { - "name": "minecraft:green_dye", - "id": 399 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233 - }, - { - "name": "minecraft:green_shulker_box", - "id": -625 - }, - { - "name": "minecraft:green_wool", - "id": -560 - }, - { - "name": "minecraft:grindstone", - "id": -195 - }, - { - "name": "minecraft:guardian_spawn_egg", - "id": 463 - }, - { - "name": "minecraft:gunpowder", - "id": 330 - }, - { - "name": "minecraft:hanging_roots", - "id": -319 - }, - { - "name": "minecraft:hard_glass", - "id": 253 - }, - { - "name": "minecraft:hard_glass_pane", - "id": 190 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191 - }, - { - "name": "minecraft:hardened_clay", - "id": 172 - }, - { - "name": "minecraft:hay_block", - "id": 170 - }, - { - "name": "minecraft:heart_of_the_sea", - "id": 578 - }, - { - "name": "minecraft:heart_pottery_sherd", - "id": 672 - }, - { - "name": "minecraft:heartbreak_pottery_sherd", - "id": 673 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148 - }, - { - "name": "minecraft:hoglin_spawn_egg", - "id": 498 - }, - { - "name": "minecraft:honey_block", - "id": -220 - }, - { - "name": "minecraft:honey_bottle", - "id": 599 - }, - { - "name": "minecraft:honeycomb", - "id": 598 - }, - { - "name": "minecraft:honeycomb_block", - "id": -221 - }, - { - "name": "minecraft:hopper", - "id": 534 - }, - { - "name": "minecraft:hopper_minecart", - "id": 533 - }, - { - "name": "minecraft:horn_coral", - "id": -584 - }, - { - "name": "minecraft:horse_spawn_egg", - "id": 460 - }, - { - "name": "minecraft:host_armor_trim_smithing_template", - "id": 700 - }, - { - "name": "minecraft:howl_pottery_sherd", - "id": 674 - }, - { - "name": "minecraft:husk_spawn_egg", - "id": 465 - }, - { - "name": "minecraft:ice", - "id": 79 - }, - { - "name": "minecraft:ice_bomb", - "id": 602 - }, - { - "name": "minecraft:infested_deepslate", - "id": -454 - }, - { - "name": "minecraft:info_update", - "id": 248 - }, - { - "name": "minecraft:info_update2", - "id": 249 - }, - { - "name": "minecraft:ink_sac", - "id": 415 - }, - { - "name": "minecraft:invisible_bedrock", - "id": 95 - }, - { - "name": "minecraft:iron_axe", - "id": 300 - }, - { - "name": "minecraft:iron_bars", - "id": 101 - }, - { - "name": "minecraft:iron_block", - "id": 42 - }, - { - "name": "minecraft:iron_boots", - "id": 348 - }, - { - "name": "minecraft:iron_chestplate", - "id": 346 - }, - { - "name": "minecraft:iron_door", - "id": 374 - }, - { - "name": "minecraft:iron_golem_spawn_egg", - "id": 506 - }, - { - "name": "minecraft:iron_helmet", - "id": 345 - }, - { - "name": "minecraft:iron_hoe", - "id": 333 - }, - { - "name": "minecraft:iron_horse_armor", - "id": 538 - }, - { - "name": "minecraft:iron_ingot", - "id": 307 - }, - { - "name": "minecraft:iron_leggings", - "id": 347 - }, - { - "name": "minecraft:iron_nugget", - "id": 576 - }, - { - "name": "minecraft:iron_ore", - "id": 15 - }, - { - "name": "minecraft:iron_pickaxe", - "id": 299 - }, - { - "name": "minecraft:iron_shovel", - "id": 298 - }, - { - "name": "minecraft:iron_sword", - "id": 309 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167 - }, - { - "name": "minecraft:item.acacia_door", - "id": 196 - }, - { - "name": "minecraft:item.bed", - "id": 26 - }, - { - "name": "minecraft:item.beetroot", - "id": 244 - }, - { - "name": "minecraft:item.birch_door", - "id": 194 - }, - { - "name": "minecraft:item.brewing_stand", - "id": 117 - }, - { - "name": "minecraft:item.cake", - "id": 92 - }, - { - "name": "minecraft:item.camera", - "id": 242 - }, - { - "name": "minecraft:item.campfire", - "id": -209 - }, - { - "name": "minecraft:item.cauldron", - "id": 118 - }, - { - "name": "minecraft:item.chain", - "id": -286 - }, - { - "name": "minecraft:item.crimson_door", - "id": -244 - }, - { - "name": "minecraft:item.dark_oak_door", - "id": 197 - }, - { - "name": "minecraft:item.flower_pot", - "id": 140 - }, - { - "name": "minecraft:item.frame", - "id": 199 - }, - { - "name": "minecraft:item.glow_frame", - "id": -339 - }, - { - "name": "minecraft:item.hopper", - "id": 154 - }, - { - "name": "minecraft:item.iron_door", - "id": 71 - }, - { - "name": "minecraft:item.jungle_door", - "id": 195 - }, - { - "name": "minecraft:item.kelp", - "id": -138 - }, - { - "name": "minecraft:item.mangrove_door", - "id": -493 - }, - { - "name": "minecraft:item.nether_sprouts", - "id": -238 - }, - { - "name": "minecraft:item.nether_wart", - "id": 115 - }, - { - "name": "minecraft:item.reeds", - "id": 83 - }, - { - "name": "minecraft:item.skull", - "id": 144 - }, - { - "name": "minecraft:item.soul_campfire", - "id": -290 - }, - { - "name": "minecraft:item.spruce_door", - "id": 193 - }, - { - "name": "minecraft:item.warped_door", - "id": -245 - }, - { - "name": "minecraft:item.wheat", - "id": 59 - }, - { - "name": "minecraft:item.wooden_door", - "id": 64 - }, - { - "name": "minecraft:jigsaw", - "id": -211 - }, - { - "name": "minecraft:jukebox", - "id": 84 - }, - { - "name": "minecraft:jungle_boat", - "id": 379 - }, - { - "name": "minecraft:jungle_button", - "id": -143 - }, - { - "name": "minecraft:jungle_chest_boat", - "id": 647 - }, - { - "name": "minecraft:jungle_door", - "id": 562 - }, - { - "name": "minecraft:jungle_fence", - "id": -578 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185 - }, - { - "name": "minecraft:jungle_hanging_sign", - "id": -503 - }, - { - "name": "minecraft:jungle_log", - "id": -571 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": -153 - }, - { - "name": "minecraft:jungle_sign", - "id": 585 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": -188 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": -148 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": -189 - }, - { - "name": "minecraft:kelp", - "id": 384 - }, - { - "name": "minecraft:ladder", - "id": 65 - }, - { - "name": "minecraft:lantern", - "id": -208 - }, - { - "name": "minecraft:lapis_block", - "id": 22 - }, - { - "name": "minecraft:lapis_lazuli", - "id": 416 - }, - { - "name": "minecraft:lapis_ore", - "id": 21 - }, - { - "name": "minecraft:large_amethyst_bud", - "id": -330 - }, - { - "name": "minecraft:lava", - "id": 11 - }, - { - "name": "minecraft:lava_bucket", - "id": 365 - }, - { - "name": "minecraft:lead", - "id": 554 - }, - { - "name": "minecraft:leather", - "id": 383 - }, - { - "name": "minecraft:leather_boots", - "id": 340 - }, - { - "name": "minecraft:leather_chestplate", - "id": 338 - }, - { - "name": "minecraft:leather_helmet", - "id": 337 - }, - { - "name": "minecraft:leather_horse_armor", - "id": 537 - }, - { - "name": "minecraft:leather_leggings", - "id": 339 - }, - { - "name": "minecraft:leaves", - "id": 18 - }, - { - "name": "minecraft:leaves2", - "id": 161 - }, - { - "name": "minecraft:lectern", - "id": -194 - }, - { - "name": "minecraft:lever", - "id": 69 - }, - { - "name": "minecraft:light_block", - "id": -215 - }, - { - "name": "minecraft:light_blue_candle", - "id": -416 - }, - { - "name": "minecraft:light_blue_candle_cake", - "id": -433 - }, - { - "name": "minecraft:light_blue_carpet", - "id": -599 - }, - { - "name": "minecraft:light_blue_concrete", - "id": -630 - }, - { - "name": "minecraft:light_blue_dye", - "id": 409 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223 - }, - { - "name": "minecraft:light_blue_shulker_box", - "id": -615 - }, - { - "name": "minecraft:light_blue_wool", - "id": -562 - }, - { - "name": "minecraft:light_gray_candle", - "id": -421 - }, - { - "name": "minecraft:light_gray_candle_cake", - "id": -438 - }, - { - "name": "minecraft:light_gray_carpet", - "id": -604 - }, - { - "name": "minecraft:light_gray_concrete", - "id": -635 - }, - { - "name": "minecraft:light_gray_dye", - "id": 404 - }, - { - "name": "minecraft:light_gray_shulker_box", - "id": -620 - }, - { - "name": "minecraft:light_gray_wool", - "id": -552 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147 - }, - { - "name": "minecraft:lightning_rod", - "id": -312 - }, - { - "name": "minecraft:lime_candle", - "id": -418 - }, - { - "name": "minecraft:lime_candle_cake", - "id": -435 - }, - { - "name": "minecraft:lime_carpet", - "id": -601 - }, - { - "name": "minecraft:lime_concrete", - "id": -632 - }, - { - "name": "minecraft:lime_dye", - "id": 407 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225 - }, - { - "name": "minecraft:lime_shulker_box", - "id": -617 - }, - { - "name": "minecraft:lime_wool", - "id": -559 - }, - { - "name": "minecraft:lingering_potion", - "id": 569 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": -214 - }, - { - "name": "minecraft:lit_deepslate_redstone_ore", - "id": -404 - }, - { - "name": "minecraft:lit_furnace", - "id": 62 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91 - }, - { - "name": "minecraft:lit_redstone_lamp", - "id": 124 - }, - { - "name": "minecraft:lit_redstone_ore", - "id": 74 - }, - { - "name": "minecraft:lit_smoker", - "id": -199 - }, - { - "name": "minecraft:llama_spawn_egg", - "id": 475 - }, - { - "name": "minecraft:lodestone", - "id": -222 - }, - { - "name": "minecraft:lodestone_compass", - "id": 609 - }, - { - "name": "minecraft:log", - "id": 704 - }, - { - "name": "minecraft:log2", - "id": 707 - }, - { - "name": "minecraft:loom", - "id": -204 - }, - { - "name": "minecraft:magenta_candle", - "id": -415 - }, - { - "name": "minecraft:magenta_candle_cake", - "id": -432 - }, - { - "name": "minecraft:magenta_carpet", - "id": -598 - }, - { - "name": "minecraft:magenta_concrete", - "id": -629 - }, - { - "name": "minecraft:magenta_dye", - "id": 410 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222 - }, - { - "name": "minecraft:magenta_shulker_box", - "id": -614 - }, - { - "name": "minecraft:magenta_wool", - "id": -565 - }, - { - "name": "minecraft:magma", - "id": 213 - }, - { - "name": "minecraft:magma_cream", - "id": 432 - }, - { - "name": "minecraft:magma_cube_spawn_egg", - "id": 457 - }, - { - "name": "minecraft:mangrove_boat", - "id": 642 - }, - { - "name": "minecraft:mangrove_button", - "id": -487 - }, - { - "name": "minecraft:mangrove_chest_boat", - "id": 651 - }, - { - "name": "minecraft:mangrove_door", - "id": 640 - }, - { - "name": "minecraft:mangrove_double_slab", - "id": -499 - }, - { - "name": "minecraft:mangrove_fence", - "id": -491 - }, - { - "name": "minecraft:mangrove_fence_gate", - "id": -492 - }, - { - "name": "minecraft:mangrove_hanging_sign", - "id": -508 - }, - { - "name": "minecraft:mangrove_leaves", - "id": -472 - }, - { - "name": "minecraft:mangrove_log", - "id": -484 - }, - { - "name": "minecraft:mangrove_planks", - "id": -486 - }, - { - "name": "minecraft:mangrove_pressure_plate", - "id": -490 - }, - { - "name": "minecraft:mangrove_propagule", - "id": -474 - }, - { - "name": "minecraft:mangrove_roots", - "id": -482 - }, - { - "name": "minecraft:mangrove_sign", - "id": 641 - }, - { - "name": "minecraft:mangrove_slab", - "id": -489 - }, - { - "name": "minecraft:mangrove_stairs", - "id": -488 - }, - { - "name": "minecraft:mangrove_standing_sign", - "id": -494 - }, - { - "name": "minecraft:mangrove_trapdoor", - "id": -496 - }, - { - "name": "minecraft:mangrove_wall_sign", - "id": -495 - }, - { - "name": "minecraft:mangrove_wood", - "id": -497 - }, - { - "name": "minecraft:medicine", - "id": 606 - }, - { - "name": "minecraft:medium_amethyst_bud", - "id": -331 - }, - { - "name": "minecraft:melon_block", - "id": 103 - }, - { - "name": "minecraft:melon_seeds", - "id": 293 - }, - { - "name": "minecraft:melon_slice", - "id": 272 - }, - { - "name": "minecraft:melon_stem", - "id": 105 - }, - { - "name": "minecraft:milk_bucket", - "id": 363 - }, - { - "name": "minecraft:minecart", - "id": 372 - }, - { - "name": "minecraft:miner_pottery_sherd", - "id": 675 - }, - { - "name": "minecraft:mob_spawner", - "id": 52 - }, - { - "name": "minecraft:mojang_banner_pattern", - "id": 591 - }, - { - "name": "minecraft:monster_egg", - "id": 97 - }, - { - "name": "minecraft:mooshroom_spawn_egg", - "id": 442 - }, - { - "name": "minecraft:moss_block", - "id": -320 - }, - { - "name": "minecraft:moss_carpet", - "id": -335 - }, - { - "name": "minecraft:mossy_cobblestone", - "id": 48 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": -179 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": -175 - }, - { - "name": "minecraft:mourner_pottery_sherd", - "id": 676 - }, - { - "name": "minecraft:moving_block", - "id": 250 - }, - { - "name": "minecraft:mud", - "id": -473 - }, - { - "name": "minecraft:mud_brick_double_slab", - "id": -479 - }, - { - "name": "minecraft:mud_brick_slab", - "id": -478 - }, - { - "name": "minecraft:mud_brick_stairs", - "id": -480 - }, - { - "name": "minecraft:mud_brick_wall", - "id": -481 - }, - { - "name": "minecraft:mud_bricks", - "id": -475 - }, - { - "name": "minecraft:muddy_mangrove_roots", - "id": -483 - }, - { - "name": "minecraft:mule_spawn_egg", - "id": 468 - }, - { - "name": "minecraft:mushroom_stew", - "id": 260 - }, - { - "name": "minecraft:music_disc_11", - "id": 551 - }, - { - "name": "minecraft:music_disc_13", - "id": 541 - }, - { - "name": "minecraft:music_disc_5", - "id": 643 - }, - { - "name": "minecraft:music_disc_blocks", - "id": 543 - }, - { - "name": "minecraft:music_disc_cat", - "id": 542 - }, - { - "name": "minecraft:music_disc_chirp", - "id": 544 - }, - { - "name": "minecraft:music_disc_far", - "id": 545 - }, - { - "name": "minecraft:music_disc_mall", - "id": 546 - }, - { - "name": "minecraft:music_disc_mellohi", - "id": 547 - }, - { - "name": "minecraft:music_disc_otherside", - "id": 633 - }, - { - "name": "minecraft:music_disc_pigstep", - "id": 627 - }, - { - "name": "minecraft:music_disc_relic", - "id": 701 - }, - { - "name": "minecraft:music_disc_stal", - "id": 548 - }, - { - "name": "minecraft:music_disc_strad", - "id": 549 - }, - { - "name": "minecraft:music_disc_wait", - "id": 552 - }, - { - "name": "minecraft:music_disc_ward", - "id": 550 - }, - { - "name": "minecraft:mutton", - "id": 557 - }, - { - "name": "minecraft:mycelium", - "id": 110 - }, - { - "name": "minecraft:name_tag", - "id": 555 - }, - { - "name": "minecraft:nautilus_shell", - "id": 577 - }, - { - "name": "minecraft:nether_brick", - "id": 112 - }, - { - "name": "minecraft:nether_brick_fence", - "id": 113 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114 - }, - { - "name": "minecraft:nether_gold_ore", - "id": -288 - }, - { - "name": "minecraft:nether_sprouts", - "id": 628 - }, - { - "name": "minecraft:nether_star", - "id": 525 - }, - { - "name": "minecraft:nether_wart", - "id": 294 - }, - { - "name": "minecraft:nether_wart_block", - "id": 214 - }, - { - "name": "minecraft:netherbrick", - "id": 530 - }, - { - "name": "minecraft:netherite_axe", - "id": 613 - }, - { - "name": "minecraft:netherite_block", - "id": -270 - }, - { - "name": "minecraft:netherite_boots", - "id": 619 - }, - { - "name": "minecraft:netherite_chestplate", - "id": 617 - }, - { - "name": "minecraft:netherite_helmet", - "id": 616 - }, - { - "name": "minecraft:netherite_hoe", - "id": 614 - }, - { - "name": "minecraft:netherite_ingot", - "id": 615 - }, - { - "name": "minecraft:netherite_leggings", - "id": 618 - }, - { - "name": "minecraft:netherite_pickaxe", - "id": 612 - }, - { - "name": "minecraft:netherite_scrap", - "id": 620 - }, - { - "name": "minecraft:netherite_shovel", - "id": 611 - }, - { - "name": "minecraft:netherite_sword", - "id": 610 - }, - { - "name": "minecraft:netherite_upgrade_smithing_template", - "id": 684 - }, - { - "name": "minecraft:netherrack", - "id": 87 - }, - { - "name": "minecraft:netherreactor", - "id": 247 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": -180 - }, - { - "name": "minecraft:noteblock", - "id": 25 - }, - { - "name": "minecraft:npc_spawn_egg", - "id": 472 - }, - { - "name": "minecraft:oak_boat", - "id": 377 - }, - { - "name": "minecraft:oak_chest_boat", - "id": 645 - }, - { - "name": "minecraft:oak_fence", - "id": 85 - }, - { - "name": "minecraft:oak_hanging_sign", - "id": -500 - }, - { - "name": "minecraft:oak_log", - "id": 17 - }, - { - "name": "minecraft:oak_sign", - "id": 360 - }, - { - "name": "minecraft:oak_stairs", - "id": 53 - }, - { - "name": "minecraft:observer", - "id": 251 - }, - { - "name": "minecraft:obsidian", - "id": 49 - }, - { - "name": "minecraft:ocelot_spawn_egg", - "id": 453 - }, - { - "name": "minecraft:ochre_froglight", - "id": -471 - }, - { - "name": "minecraft:orange_candle", - "id": -414 - }, - { - "name": "minecraft:orange_candle_cake", - "id": -431 - }, - { - "name": "minecraft:orange_carpet", - "id": -597 - }, - { - "name": "minecraft:orange_concrete", - "id": -628 - }, - { - "name": "minecraft:orange_dye", - "id": 411 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221 - }, - { - "name": "minecraft:orange_shulker_box", - "id": -613 - }, - { - "name": "minecraft:orange_wool", - "id": -557 - }, - { - "name": "minecraft:oxidized_copper", - "id": -343 - }, - { - "name": "minecraft:oxidized_cut_copper", - "id": -350 - }, - { - "name": "minecraft:oxidized_cut_copper_slab", - "id": -364 - }, - { - "name": "minecraft:oxidized_cut_copper_stairs", - "id": -357 - }, - { - "name": "minecraft:oxidized_double_cut_copper_slab", - "id": -371 - }, - { - "name": "minecraft:packed_ice", - "id": 174 - }, - { - "name": "minecraft:packed_mud", - "id": -477 - }, - { - "name": "minecraft:painting", - "id": 359 - }, - { - "name": "minecraft:panda_spawn_egg", - "id": 491 - }, - { - "name": "minecraft:paper", - "id": 388 - }, - { - "name": "minecraft:parrot_spawn_egg", - "id": 480 - }, - { - "name": "minecraft:pearlescent_froglight", - "id": -469 - }, - { - "name": "minecraft:phantom_membrane", - "id": 581 - }, - { - "name": "minecraft:phantom_spawn_egg", - "id": 488 - }, - { - "name": "minecraft:pig_spawn_egg", - "id": 439 - }, - { - "name": "minecraft:piglin_banner_pattern", - "id": 594 - }, - { - "name": "minecraft:piglin_brute_spawn_egg", - "id": 501 - }, - { - "name": "minecraft:piglin_spawn_egg", - "id": 499 - }, - { - "name": "minecraft:pillager_spawn_egg", - "id": 493 - }, - { - "name": "minecraft:pink_candle", - "id": -419 - }, - { - "name": "minecraft:pink_candle_cake", - "id": -436 - }, - { - "name": "minecraft:pink_carpet", - "id": -602 - }, - { - "name": "minecraft:pink_concrete", - "id": -633 - }, - { - "name": "minecraft:pink_dye", - "id": 406 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226 - }, - { - "name": "minecraft:pink_petals", - "id": -549 - }, - { - "name": "minecraft:pink_shulker_box", - "id": -618 - }, - { - "name": "minecraft:pink_wool", - "id": -566 - }, - { - "name": "minecraft:piston", - "id": 33 - }, - { - "name": "minecraft:piston_arm_collision", - "id": 34 - }, - { - "name": "minecraft:pitcher_crop", - "id": -574 - }, - { - "name": "minecraft:pitcher_plant", - "id": -612 - }, - { - "name": "minecraft:pitcher_pod", - "id": 297 - }, - { - "name": "minecraft:planks", - "id": 5 - }, - { - "name": "minecraft:plenty_pottery_sherd", - "id": 677 - }, - { - "name": "minecraft:podzol", - "id": 243 - }, - { - "name": "minecraft:pointed_dripstone", - "id": -308 - }, - { - "name": "minecraft:poisonous_potato", - "id": 282 - }, - { - "name": "minecraft:polar_bear_spawn_egg", - "id": 474 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": -174 - }, - { - "name": "minecraft:polished_basalt", - "id": -235 - }, - { - "name": "minecraft:polished_blackstone", - "id": -291 - }, - { - "name": "minecraft:polished_blackstone_brick_double_slab", - "id": -285 - }, - { - "name": "minecraft:polished_blackstone_brick_slab", - "id": -284 - }, - { - "name": "minecraft:polished_blackstone_brick_stairs", - "id": -275 - }, - { - "name": "minecraft:polished_blackstone_brick_wall", - "id": -278 - }, - { - "name": "minecraft:polished_blackstone_bricks", - "id": -274 - }, - { - "name": "minecraft:polished_blackstone_button", - "id": -296 - }, - { - "name": "minecraft:polished_blackstone_double_slab", - "id": -294 - }, - { - "name": "minecraft:polished_blackstone_pressure_plate", - "id": -295 - }, - { - "name": "minecraft:polished_blackstone_slab", - "id": -293 - }, - { - "name": "minecraft:polished_blackstone_stairs", - "id": -292 - }, - { - "name": "minecraft:polished_blackstone_wall", - "id": -297 - }, - { - "name": "minecraft:polished_deepslate", - "id": -383 - }, - { - "name": "minecraft:polished_deepslate_double_slab", - "id": -397 - }, - { - "name": "minecraft:polished_deepslate_slab", - "id": -384 - }, - { - "name": "minecraft:polished_deepslate_stairs", - "id": -385 - }, - { - "name": "minecraft:polished_deepslate_wall", - "id": -386 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": -173 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": -172 - }, - { - "name": "minecraft:popped_chorus_fruit", - "id": 566 - }, - { - "name": "minecraft:porkchop", - "id": 262 - }, - { - "name": "minecraft:portal", - "id": 90 - }, - { - "name": "minecraft:potato", - "id": 280 - }, - { - "name": "minecraft:potatoes", - "id": 142 - }, - { - "name": "minecraft:potion", - "id": 428 - }, - { - "name": "minecraft:powder_snow", - "id": -306 - }, - { - "name": "minecraft:powder_snow_bucket", - "id": 370 - }, - { - "name": "minecraft:powered_comparator", - "id": 150 - }, - { - "name": "minecraft:powered_repeater", - "id": 94 - }, - { - "name": "minecraft:prismarine", - "id": 168 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": -4 - }, - { - "name": "minecraft:prismarine_crystals", - "id": 556 - }, - { - "name": "minecraft:prismarine_shard", - "id": 572 - }, - { - "name": "minecraft:prismarine_stairs", - "id": -2 - }, - { - "name": "minecraft:prize_pottery_sherd", - "id": 678 - }, - { - "name": "minecraft:pufferfish", - "id": 267 - }, - { - "name": "minecraft:pufferfish_bucket", - "id": 369 - }, - { - "name": "minecraft:pufferfish_spawn_egg", - "id": 483 - }, - { - "name": "minecraft:pumpkin", - "id": 86 - }, - { - "name": "minecraft:pumpkin_pie", - "id": 284 - }, - { - "name": "minecraft:pumpkin_seeds", - "id": 292 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104 - }, - { - "name": "minecraft:purple_candle", - "id": -423 - }, - { - "name": "minecraft:purple_candle_cake", - "id": -440 - }, - { - "name": "minecraft:purple_carpet", - "id": -606 - }, - { - "name": "minecraft:purple_concrete", - "id": -637 - }, - { - "name": "minecraft:purple_dye", - "id": 402 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219 - }, - { - "name": "minecraft:purple_shulker_box", - "id": -622 - }, - { - "name": "minecraft:purple_wool", - "id": -564 - }, - { - "name": "minecraft:purpur_block", - "id": 201 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203 - }, - { - "name": "minecraft:quartz", - "id": 531 - }, - { - "name": "minecraft:quartz_block", - "id": 155 - }, - { - "name": "minecraft:quartz_bricks", - "id": -304 - }, - { - "name": "minecraft:quartz_ore", - "id": 153 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156 - }, - { - "name": "minecraft:rabbit", - "id": 288 - }, - { - "name": "minecraft:rabbit_foot", - "id": 535 - }, - { - "name": "minecraft:rabbit_hide", - "id": 536 - }, - { - "name": "minecraft:rabbit_spawn_egg", - "id": 461 - }, - { - "name": "minecraft:rabbit_stew", - "id": 290 - }, - { - "name": "minecraft:rail", - "id": 66 - }, - { - "name": "minecraft:raiser_armor_trim_smithing_template", - "id": 698 - }, - { - "name": "minecraft:rapid_fertilizer", - "id": 604 - }, - { - "name": "minecraft:ravager_spawn_egg", - "id": 495 - }, - { - "name": "minecraft:raw_copper", - "id": 514 - }, - { - "name": "minecraft:raw_copper_block", - "id": -452 - }, - { - "name": "minecraft:raw_gold", - "id": 513 - }, - { - "name": "minecraft:raw_gold_block", - "id": -453 - }, - { - "name": "minecraft:raw_iron", - "id": 512 - }, - { - "name": "minecraft:raw_iron_block", - "id": -451 - }, - { - "name": "minecraft:recovery_compass", - "id": 653 - }, - { - "name": "minecraft:red_candle", - "id": -427 - }, - { - "name": "minecraft:red_candle_cake", - "id": -444 - }, - { - "name": "minecraft:red_carpet", - "id": -610 - }, - { - "name": "minecraft:red_concrete", - "id": -641 - }, - { - "name": "minecraft:red_dye", - "id": 398 - }, - { - "name": "minecraft:red_flower", - "id": 38 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234 - }, - { - "name": "minecraft:red_mushroom", - "id": 40 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100 - }, - { - "name": "minecraft:red_nether_brick", - "id": 215 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": -184 - }, - { - "name": "minecraft:red_sandstone", - "id": 179 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180 - }, - { - "name": "minecraft:red_shulker_box", - "id": -626 - }, - { - "name": "minecraft:red_wool", - "id": -556 - }, - { - "name": "minecraft:redstone", - "id": 375 - }, - { - "name": "minecraft:redstone_block", - "id": 152 - }, - { - "name": "minecraft:redstone_lamp", - "id": 123 - }, - { - "name": "minecraft:redstone_ore", - "id": 73 - }, - { - "name": "minecraft:redstone_torch", - "id": 76 - }, - { - "name": "minecraft:redstone_wire", - "id": 55 - }, - { - "name": "minecraft:reinforced_deepslate", - "id": -466 - }, - { - "name": "minecraft:repeater", - "id": 421 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188 - }, - { - "name": "minecraft:reserved6", - "id": 255 - }, - { - "name": "minecraft:respawn_anchor", - "id": -272 - }, - { - "name": "minecraft:rib_armor_trim_smithing_template", - "id": 694 - }, - { - "name": "minecraft:rotten_flesh", - "id": 277 - }, - { - "name": "minecraft:saddle", - "id": 373 - }, - { - "name": "minecraft:salmon", - "id": 265 - }, - { - "name": "minecraft:salmon_bucket", - "id": 367 - }, - { - "name": "minecraft:salmon_spawn_egg", - "id": 484 - }, - { - "name": "minecraft:sand", - "id": 12 - }, - { - "name": "minecraft:sandstone", - "id": 24 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128 - }, - { - "name": "minecraft:sapling", - "id": 6 - }, - { - "name": "minecraft:scaffolding", - "id": -165 - }, - { - "name": "minecraft:sculk", - "id": -458 - }, - { - "name": "minecraft:sculk_catalyst", - "id": -460 - }, - { - "name": "minecraft:sculk_sensor", - "id": -307 - }, - { - "name": "minecraft:sculk_shrieker", - "id": -461 - }, - { - "name": "minecraft:sculk_vein", - "id": -459 - }, - { - "name": "minecraft:scute", - "id": 579 - }, - { - "name": "minecraft:sea_lantern", - "id": 169 - }, - { - "name": "minecraft:sea_pickle", - "id": -156 - }, - { - "name": "minecraft:seagrass", - "id": -130 - }, - { - "name": "minecraft:sentry_armor_trim_smithing_template", - "id": 685 - }, - { - "name": "minecraft:shaper_armor_trim_smithing_template", - "id": 699 - }, - { - "name": "minecraft:sheaf_pottery_sherd", - "id": 679 - }, - { - "name": "minecraft:shears", - "id": 423 - }, - { - "name": "minecraft:sheep_spawn_egg", - "id": 440 - }, - { - "name": "minecraft:shelter_pottery_sherd", - "id": 680 - }, - { - "name": "minecraft:shield", - "id": 357 - }, - { - "name": "minecraft:shroomlight", - "id": -230 - }, - { - "name": "minecraft:shulker_box", - "id": 709 - }, - { - "name": "minecraft:shulker_shell", - "id": 573 - }, - { - "name": "minecraft:shulker_spawn_egg", - "id": 471 - }, - { - "name": "minecraft:silence_armor_trim_smithing_template", - "id": 696 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228 - }, - { - "name": "minecraft:silverfish_spawn_egg", - "id": 445 - }, - { - "name": "minecraft:skeleton_horse_spawn_egg", - "id": 469 - }, - { - "name": "minecraft:skeleton_spawn_egg", - "id": 446 - }, - { - "name": "minecraft:skull", - "id": 523 - }, - { - "name": "minecraft:skull_banner_pattern", - "id": 590 - }, - { - "name": "minecraft:skull_pottery_sherd", - "id": 681 - }, - { - "name": "minecraft:slime", - "id": 165 - }, - { - "name": "minecraft:slime_ball", - "id": 390 - }, - { - "name": "minecraft:slime_spawn_egg", - "id": 447 - }, - { - "name": "minecraft:small_amethyst_bud", - "id": -332 - }, - { - "name": "minecraft:small_dripleaf_block", - "id": -336 - }, - { - "name": "minecraft:smithing_table", - "id": -202 - }, - { - "name": "minecraft:smoker", - "id": -198 - }, - { - "name": "minecraft:smooth_basalt", - "id": -377 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": -185 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": -176 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": -177 - }, - { - "name": "minecraft:smooth_stone", - "id": -183 - }, - { - "name": "minecraft:sniffer_egg", - "id": -596 - }, - { - "name": "minecraft:sniffer_spawn_egg", - "id": 502 - }, - { - "name": "minecraft:snort_pottery_sherd", - "id": 682 - }, - { - "name": "minecraft:snout_armor_trim_smithing_template", - "id": 693 - }, - { - "name": "minecraft:snow", - "id": 80 - }, - { - "name": "minecraft:snow_golem_spawn_egg", - "id": 507 - }, - { - "name": "minecraft:snow_layer", - "id": 78 - }, - { - "name": "minecraft:snowball", - "id": 376 - }, - { - "name": "minecraft:soul_campfire", - "id": 629 - }, - { - "name": "minecraft:soul_fire", - "id": -237 - }, - { - "name": "minecraft:soul_lantern", - "id": -269 - }, - { - "name": "minecraft:soul_sand", - "id": 88 - }, - { - "name": "minecraft:soul_soil", - "id": -236 - }, - { - "name": "minecraft:soul_torch", - "id": -268 - }, - { - "name": "minecraft:sparkler", - "id": 607 - }, - { - "name": "minecraft:spawn_egg", - "id": 713 - }, - { - "name": "minecraft:spider_eye", - "id": 278 - }, - { - "name": "minecraft:spider_spawn_egg", - "id": 448 - }, - { - "name": "minecraft:spire_armor_trim_smithing_template", - "id": 695 - }, - { - "name": "minecraft:splash_potion", - "id": 568 - }, - { - "name": "minecraft:sponge", - "id": 19 - }, - { - "name": "minecraft:spore_blossom", - "id": -321 - }, - { - "name": "minecraft:spruce_boat", - "id": 380 - }, - { - "name": "minecraft:spruce_button", - "id": -144 - }, - { - "name": "minecraft:spruce_chest_boat", - "id": 648 - }, - { - "name": "minecraft:spruce_door", - "id": 560 - }, - { - "name": "minecraft:spruce_fence", - "id": -579 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183 - }, - { - "name": "minecraft:spruce_hanging_sign", - "id": -501 - }, - { - "name": "minecraft:spruce_log", - "id": -569 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": -154 - }, - { - "name": "minecraft:spruce_sign", - "id": 583 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": -181 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": -149 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": -182 - }, - { - "name": "minecraft:spyglass", - "id": 632 - }, - { - "name": "minecraft:squid_spawn_egg", - "id": 452 - }, - { - "name": "minecraft:stained_glass", - "id": 241 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 160 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 159 - }, - { - "name": "minecraft:standing_banner", - "id": 176 - }, - { - "name": "minecraft:standing_sign", - "id": 63 - }, - { - "name": "minecraft:stick", - "id": 322 - }, - { - "name": "minecraft:sticky_piston", - "id": 29 - }, - { - "name": "minecraft:sticky_piston_arm_collision", - "id": -217 - }, - { - "name": "minecraft:stone", - "id": 1 - }, - { - "name": "minecraft:stone_axe", - "id": 317 - }, - { - "name": "minecraft:stone_block_slab", - "id": 44 - }, - { - "name": "minecraft:stone_block_slab2", - "id": 182 - }, - { - "name": "minecraft:stone_block_slab3", - "id": -162 - }, - { - "name": "minecraft:stone_block_slab4", - "id": -166 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109 - }, - { - "name": "minecraft:stone_button", - "id": 77 - }, - { - "name": "minecraft:stone_hoe", - "id": 332 - }, - { - "name": "minecraft:stone_pickaxe", - "id": 316 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70 - }, - { - "name": "minecraft:stone_shovel", - "id": 315 - }, - { - "name": "minecraft:stone_stairs", - "id": 67 - }, - { - "name": "minecraft:stone_sword", - "id": 314 - }, - { - "name": "minecraft:stonebrick", - "id": 98 - }, - { - "name": "minecraft:stonecutter", - "id": 245 - }, - { - "name": "minecraft:stonecutter_block", - "id": -197 - }, - { - "name": "minecraft:stray_spawn_egg", - "id": 464 - }, - { - "name": "minecraft:strider_spawn_egg", - "id": 497 - }, - { - "name": "minecraft:string", - "id": 328 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": -8 - }, - { - "name": "minecraft:stripped_bamboo_block", - "id": -528 - }, - { - "name": "minecraft:stripped_birch_log", - "id": -6 - }, - { - "name": "minecraft:stripped_cherry_log", - "id": -535 - }, - { - "name": "minecraft:stripped_cherry_wood", - "id": -545 - }, - { - "name": "minecraft:stripped_crimson_hyphae", - "id": -300 - }, - { - "name": "minecraft:stripped_crimson_stem", - "id": -240 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": -9 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": -7 - }, - { - "name": "minecraft:stripped_mangrove_log", - "id": -485 - }, - { - "name": "minecraft:stripped_mangrove_wood", - "id": -498 - }, - { - "name": "minecraft:stripped_oak_log", - "id": -10 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": -5 - }, - { - "name": "minecraft:stripped_warped_hyphae", - "id": -301 - }, - { - "name": "minecraft:stripped_warped_stem", - "id": -241 - }, - { - "name": "minecraft:structure_block", - "id": 252 - }, - { - "name": "minecraft:structure_void", - "id": 217 - }, - { - "name": "minecraft:sugar", - "id": 418 - }, - { - "name": "minecraft:sugar_cane", - "id": 387 - }, - { - "name": "minecraft:suspicious_gravel", - "id": -573 - }, - { - "name": "minecraft:suspicious_sand", - "id": -529 - }, - { - "name": "minecraft:suspicious_stew", - "id": 597 - }, - { - "name": "minecraft:sweet_berries", - "id": 287 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": -207 - }, - { - "name": "minecraft:tadpole_bucket", - "id": 637 - }, - { - "name": "minecraft:tadpole_spawn_egg", - "id": 636 - }, - { - "name": "minecraft:tallgrass", - "id": 31 - }, - { - "name": "minecraft:target", - "id": -239 - }, - { - "name": "minecraft:tide_armor_trim_smithing_template", - "id": 692 - }, - { - "name": "minecraft:tinted_glass", - "id": -334 - }, - { - "name": "minecraft:tnt", - "id": 46 - }, - { - "name": "minecraft:tnt_minecart", - "id": 532 - }, - { - "name": "minecraft:torch", - "id": 50 - }, - { - "name": "minecraft:torchflower", - "id": -568 - }, - { - "name": "minecraft:torchflower_crop", - "id": -567 - }, - { - "name": "minecraft:torchflower_seeds", - "id": 296 - }, - { - "name": "minecraft:totem_of_undying", - "id": 575 - }, - { - "name": "minecraft:trader_llama_spawn_egg", - "id": 655 - }, - { - "name": "minecraft:trapdoor", - "id": 96 - }, - { - "name": "minecraft:trapped_chest", - "id": 146 - }, - { - "name": "minecraft:trident", - "id": 553 - }, - { - "name": "minecraft:trip_wire", - "id": 132 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131 - }, - { - "name": "minecraft:tropical_fish", - "id": 266 - }, - { - "name": "minecraft:tropical_fish_bucket", - "id": 368 - }, - { - "name": "minecraft:tropical_fish_spawn_egg", - "id": 481 - }, - { - "name": "minecraft:tube_coral", - "id": -131 - }, - { - "name": "minecraft:tuff", - "id": -333 - }, - { - "name": "minecraft:turtle_egg", - "id": -159 - }, - { - "name": "minecraft:turtle_helmet", - "id": 580 - }, - { - "name": "minecraft:turtle_spawn_egg", - "id": 487 - }, - { - "name": "minecraft:twisting_vines", - "id": -287 - }, - { - "name": "minecraft:underwater_torch", - "id": 239 - }, - { - "name": "minecraft:undyed_shulker_box", - "id": 205 - }, - { - "name": "minecraft:unknown", - "id": -305 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93 - }, - { - "name": "minecraft:verdant_froglight", - "id": -470 - }, - { - "name": "minecraft:vex_armor_trim_smithing_template", - "id": 691 - }, - { - "name": "minecraft:vex_spawn_egg", - "id": 478 - }, - { - "name": "minecraft:villager_spawn_egg", - "id": 451 - }, - { - "name": "minecraft:vindicator_spawn_egg", - "id": 476 - }, - { - "name": "minecraft:vine", - "id": 106 - }, - { - "name": "minecraft:wall_banner", - "id": 177 - }, - { - "name": "minecraft:wall_sign", - "id": 68 - }, - { - "name": "minecraft:wandering_trader_spawn_egg", - "id": 494 - }, - { - "name": "minecraft:ward_armor_trim_smithing_template", - "id": 689 - }, - { - "name": "minecraft:warden_spawn_egg", - "id": 639 - }, - { - "name": "minecraft:warped_button", - "id": -261 - }, - { - "name": "minecraft:warped_door", - "id": 624 - }, - { - "name": "minecraft:warped_double_slab", - "id": -267 - }, - { - "name": "minecraft:warped_fence", - "id": -257 - }, - { - "name": "minecraft:warped_fence_gate", - "id": -259 - }, - { - "name": "minecraft:warped_fungus", - "id": -229 - }, - { - "name": "minecraft:warped_fungus_on_a_stick", - "id": 625 - }, - { - "name": "minecraft:warped_hanging_sign", - "id": -507 - }, - { - "name": "minecraft:warped_hyphae", - "id": -298 - }, - { - "name": "minecraft:warped_nylium", - "id": -233 - }, - { - "name": "minecraft:warped_planks", - "id": -243 - }, - { - "name": "minecraft:warped_pressure_plate", - "id": -263 - }, - { - "name": "minecraft:warped_roots", - "id": -224 - }, - { - "name": "minecraft:warped_sign", - "id": 622 - }, - { - "name": "minecraft:warped_slab", - "id": -265 - }, - { - "name": "minecraft:warped_stairs", - "id": -255 - }, - { - "name": "minecraft:warped_standing_sign", - "id": -251 - }, - { - "name": "minecraft:warped_stem", - "id": -226 - }, - { - "name": "minecraft:warped_trapdoor", - "id": -247 - }, - { - "name": "minecraft:warped_wall_sign", - "id": -253 - }, - { - "name": "minecraft:warped_wart_block", - "id": -227 - }, - { - "name": "minecraft:water", - "id": 9 - }, - { - "name": "minecraft:water_bucket", - "id": 364 - }, - { - "name": "minecraft:waterlily", - "id": 111 - }, - { - "name": "minecraft:waxed_copper", - "id": -344 - }, - { - "name": "minecraft:waxed_cut_copper", - "id": -351 - }, - { - "name": "minecraft:waxed_cut_copper_slab", - "id": -365 - }, - { - "name": "minecraft:waxed_cut_copper_stairs", - "id": -358 - }, - { - "name": "minecraft:waxed_double_cut_copper_slab", - "id": -372 - }, - { - "name": "minecraft:waxed_exposed_copper", - "id": -345 - }, - { - "name": "minecraft:waxed_exposed_cut_copper", - "id": -352 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_slab", - "id": -366 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_stairs", - "id": -359 - }, - { - "name": "minecraft:waxed_exposed_double_cut_copper_slab", - "id": -373 - }, - { - "name": "minecraft:waxed_oxidized_copper", - "id": -446 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper", - "id": -447 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_slab", - "id": -449 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_stairs", - "id": -448 - }, - { - "name": "minecraft:waxed_oxidized_double_cut_copper_slab", - "id": -450 - }, - { - "name": "minecraft:waxed_weathered_copper", - "id": -346 - }, - { - "name": "minecraft:waxed_weathered_cut_copper", - "id": -353 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_slab", - "id": -367 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_stairs", - "id": -360 - }, - { - "name": "minecraft:waxed_weathered_double_cut_copper_slab", - "id": -374 - }, - { - "name": "minecraft:wayfinder_armor_trim_smithing_template", - "id": 697 - }, - { - "name": "minecraft:weathered_copper", - "id": -342 - }, - { - "name": "minecraft:weathered_cut_copper", - "id": -349 - }, - { - "name": "minecraft:weathered_cut_copper_slab", - "id": -363 - }, - { - "name": "minecraft:weathered_cut_copper_stairs", - "id": -356 - }, - { - "name": "minecraft:weathered_double_cut_copper_slab", - "id": -370 - }, - { - "name": "minecraft:web", - "id": 30 - }, - { - "name": "minecraft:weeping_vines", - "id": -231 - }, - { - "name": "minecraft:wheat", - "id": 336 - }, - { - "name": "minecraft:wheat_seeds", - "id": 291 - }, - { - "name": "minecraft:white_candle", - "id": -413 - }, - { - "name": "minecraft:white_candle_cake", - "id": -430 - }, - { - "name": "minecraft:white_carpet", - "id": 171 - }, - { - "name": "minecraft:white_concrete", - "id": 236 - }, - { - "name": "minecraft:white_dye", - "id": 412 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220 - }, - { - "name": "minecraft:white_shulker_box", - "id": 218 - }, - { - "name": "minecraft:white_wool", - "id": 35 - }, - { - "name": "minecraft:wild_armor_trim_smithing_template", - "id": 688 - }, - { - "name": "minecraft:witch_spawn_egg", - "id": 454 - }, - { - "name": "minecraft:wither_rose", - "id": -216 - }, - { - "name": "minecraft:wither_skeleton_spawn_egg", - "id": 466 - }, - { - "name": "minecraft:wither_spawn_egg", - "id": 509 - }, - { - "name": "minecraft:wolf_spawn_egg", - "id": 441 - }, - { - "name": "minecraft:wood", - "id": -212 - }, - { - "name": "minecraft:wooden_axe", - "id": 313 - }, - { - "name": "minecraft:wooden_button", - "id": 143 - }, - { - "name": "minecraft:wooden_door", - "id": 361 - }, - { - "name": "minecraft:wooden_hoe", - "id": 331 - }, - { - "name": "minecraft:wooden_pickaxe", - "id": 312 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72 - }, - { - "name": "minecraft:wooden_shovel", - "id": 311 - }, - { - "name": "minecraft:wooden_slab", - "id": 158 - }, - { - "name": "minecraft:wooden_sword", - "id": 310 - }, - { - "name": "minecraft:wool", - "id": 702 - }, - { - "name": "minecraft:writable_book", - "id": 517 - }, - { - "name": "minecraft:written_book", - "id": 518 - }, - { - "name": "minecraft:yellow_candle", - "id": -417 - }, - { - "name": "minecraft:yellow_candle_cake", - "id": -434 - }, - { - "name": "minecraft:yellow_carpet", - "id": -600 - }, - { - "name": "minecraft:yellow_concrete", - "id": -631 - }, - { - "name": "minecraft:yellow_dye", - "id": 408 - }, - { - "name": "minecraft:yellow_flower", - "id": 37 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224 - }, - { - "name": "minecraft:yellow_shulker_box", - "id": -616 - }, - { - "name": "minecraft:yellow_wool", - "id": -558 - }, - { - "name": "minecraft:zoglin_spawn_egg", - "id": 500 - }, - { - "name": "minecraft:zombie_horse_spawn_egg", - "id": 470 - }, - { - "name": "minecraft:zombie_pigman_spawn_egg", - "id": 450 - }, - { - "name": "minecraft:zombie_spawn_egg", - "id": 449 - }, - { - "name": "minecraft:zombie_villager_spawn_egg", - "id": 479 - } -] \ No newline at end of file diff --git a/core/src/main/resources/bedrock/runtime_item_states.1_20_30.json b/core/src/main/resources/bedrock/runtime_item_states.1_20_30.json deleted file mode 100644 index 861b29c8a37..00000000000 --- a/core/src/main/resources/bedrock/runtime_item_states.1_20_30.json +++ /dev/null @@ -1,5570 +0,0 @@ -[ - { - "name": "minecraft:acacia_boat", - "id": 381 - }, - { - "name": "minecraft:acacia_button", - "id": -140 - }, - { - "name": "minecraft:acacia_chest_boat", - "id": 649 - }, - { - "name": "minecraft:acacia_door", - "id": 563 - }, - { - "name": "minecraft:acacia_fence", - "id": -575 - }, - { - "name": "minecraft:acacia_fence_gate", - "id": 187 - }, - { - "name": "minecraft:acacia_hanging_sign", - "id": -504 - }, - { - "name": "minecraft:acacia_log", - "id": 162 - }, - { - "name": "minecraft:acacia_pressure_plate", - "id": -150 - }, - { - "name": "minecraft:acacia_sign", - "id": 586 - }, - { - "name": "minecraft:acacia_stairs", - "id": 163 - }, - { - "name": "minecraft:acacia_standing_sign", - "id": -190 - }, - { - "name": "minecraft:acacia_trapdoor", - "id": -145 - }, - { - "name": "minecraft:acacia_wall_sign", - "id": -191 - }, - { - "name": "minecraft:activator_rail", - "id": 126 - }, - { - "name": "minecraft:agent_spawn_egg", - "id": 489 - }, - { - "name": "minecraft:air", - "id": -158 - }, - { - "name": "minecraft:allay_spawn_egg", - "id": 638 - }, - { - "name": "minecraft:allow", - "id": 210 - }, - { - "name": "minecraft:amethyst_block", - "id": -327 - }, - { - "name": "minecraft:amethyst_cluster", - "id": -329 - }, - { - "name": "minecraft:amethyst_shard", - "id": 631 - }, - { - "name": "minecraft:ancient_debris", - "id": -271 - }, - { - "name": "minecraft:andesite_stairs", - "id": -171 - }, - { - "name": "minecraft:angler_pottery_sherd", - "id": 663 - }, - { - "name": "minecraft:anvil", - "id": 145 - }, - { - "name": "minecraft:apple", - "id": 257 - }, - { - "name": "minecraft:archer_pottery_sherd", - "id": 664 - }, - { - "name": "minecraft:armor_stand", - "id": 559 - }, - { - "name": "minecraft:arms_up_pottery_sherd", - "id": 665 - }, - { - "name": "minecraft:arrow", - "id": 303 - }, - { - "name": "minecraft:axolotl_bucket", - "id": 371 - }, - { - "name": "minecraft:axolotl_spawn_egg", - "id": 503 - }, - { - "name": "minecraft:azalea", - "id": -337 - }, - { - "name": "minecraft:azalea_leaves", - "id": -324 - }, - { - "name": "minecraft:azalea_leaves_flowered", - "id": -325 - }, - { - "name": "minecraft:baked_potato", - "id": 281 - }, - { - "name": "minecraft:balloon", - "id": 605 - }, - { - "name": "minecraft:bamboo", - "id": -163 - }, - { - "name": "minecraft:bamboo_block", - "id": -527 - }, - { - "name": "minecraft:bamboo_button", - "id": -511 - }, - { - "name": "minecraft:bamboo_chest_raft", - "id": 661 - }, - { - "name": "minecraft:bamboo_door", - "id": -517 - }, - { - "name": "minecraft:bamboo_double_slab", - "id": -521 - }, - { - "name": "minecraft:bamboo_fence", - "id": -515 - }, - { - "name": "minecraft:bamboo_fence_gate", - "id": -516 - }, - { - "name": "minecraft:bamboo_hanging_sign", - "id": -522 - }, - { - "name": "minecraft:bamboo_mosaic", - "id": -509 - }, - { - "name": "minecraft:bamboo_mosaic_double_slab", - "id": -525 - }, - { - "name": "minecraft:bamboo_mosaic_slab", - "id": -524 - }, - { - "name": "minecraft:bamboo_mosaic_stairs", - "id": -523 - }, - { - "name": "minecraft:bamboo_planks", - "id": -510 - }, - { - "name": "minecraft:bamboo_pressure_plate", - "id": -514 - }, - { - "name": "minecraft:bamboo_raft", - "id": 660 - }, - { - "name": "minecraft:bamboo_sapling", - "id": -164 - }, - { - "name": "minecraft:bamboo_sign", - "id": 659 - }, - { - "name": "minecraft:bamboo_slab", - "id": -513 - }, - { - "name": "minecraft:bamboo_stairs", - "id": -512 - }, - { - "name": "minecraft:bamboo_standing_sign", - "id": -518 - }, - { - "name": "minecraft:bamboo_trapdoor", - "id": -520 - }, - { - "name": "minecraft:bamboo_wall_sign", - "id": -519 - }, - { - "name": "minecraft:banner", - "id": 574 - }, - { - "name": "minecraft:banner_pattern", - "id": 716 - }, - { - "name": "minecraft:barrel", - "id": -203 - }, - { - "name": "minecraft:barrier", - "id": -161 - }, - { - "name": "minecraft:basalt", - "id": -234 - }, - { - "name": "minecraft:bat_spawn_egg", - "id": 455 - }, - { - "name": "minecraft:beacon", - "id": 138 - }, - { - "name": "minecraft:bed", - "id": 420 - }, - { - "name": "minecraft:bedrock", - "id": 7 - }, - { - "name": "minecraft:bee_nest", - "id": -218 - }, - { - "name": "minecraft:bee_spawn_egg", - "id": 496 - }, - { - "name": "minecraft:beef", - "id": 273 - }, - { - "name": "minecraft:beehive", - "id": -219 - }, - { - "name": "minecraft:beetroot", - "id": 285 - }, - { - "name": "minecraft:beetroot_seeds", - "id": 295 - }, - { - "name": "minecraft:beetroot_soup", - "id": 286 - }, - { - "name": "minecraft:bell", - "id": -206 - }, - { - "name": "minecraft:big_dripleaf", - "id": -323 - }, - { - "name": "minecraft:birch_boat", - "id": 378 - }, - { - "name": "minecraft:birch_button", - "id": -141 - }, - { - "name": "minecraft:birch_chest_boat", - "id": 646 - }, - { - "name": "minecraft:birch_door", - "id": 561 - }, - { - "name": "minecraft:birch_fence", - "id": -576 - }, - { - "name": "minecraft:birch_fence_gate", - "id": 184 - }, - { - "name": "minecraft:birch_hanging_sign", - "id": -502 - }, - { - "name": "minecraft:birch_log", - "id": -570 - }, - { - "name": "minecraft:birch_pressure_plate", - "id": -151 - }, - { - "name": "minecraft:birch_sign", - "id": 584 - }, - { - "name": "minecraft:birch_stairs", - "id": 135 - }, - { - "name": "minecraft:birch_standing_sign", - "id": -186 - }, - { - "name": "minecraft:birch_trapdoor", - "id": -146 - }, - { - "name": "minecraft:birch_wall_sign", - "id": -187 - }, - { - "name": "minecraft:black_candle", - "id": -428 - }, - { - "name": "minecraft:black_candle_cake", - "id": -445 - }, - { - "name": "minecraft:black_carpet", - "id": -611 - }, - { - "name": "minecraft:black_concrete", - "id": -642 - }, - { - "name": "minecraft:black_concrete_powder", - "id": -723 - }, - { - "name": "minecraft:black_dye", - "id": 397 - }, - { - "name": "minecraft:black_glazed_terracotta", - "id": 235 - }, - { - "name": "minecraft:black_shulker_box", - "id": -627 - }, - { - "name": "minecraft:black_stained_glass", - "id": -687 - }, - { - "name": "minecraft:black_stained_glass_pane", - "id": -657 - }, - { - "name": "minecraft:black_terracotta", - "id": -738 - }, - { - "name": "minecraft:black_wool", - "id": -554 - }, - { - "name": "minecraft:blackstone", - "id": -273 - }, - { - "name": "minecraft:blackstone_double_slab", - "id": -283 - }, - { - "name": "minecraft:blackstone_slab", - "id": -282 - }, - { - "name": "minecraft:blackstone_stairs", - "id": -276 - }, - { - "name": "minecraft:blackstone_wall", - "id": -277 - }, - { - "name": "minecraft:blade_pottery_sherd", - "id": 666 - }, - { - "name": "minecraft:blast_furnace", - "id": -196 - }, - { - "name": "minecraft:blaze_powder", - "id": 431 - }, - { - "name": "minecraft:blaze_rod", - "id": 425 - }, - { - "name": "minecraft:blaze_spawn_egg", - "id": 458 - }, - { - "name": "minecraft:bleach", - "id": 603 - }, - { - "name": "minecraft:blue_candle", - "id": -424 - }, - { - "name": "minecraft:blue_candle_cake", - "id": -441 - }, - { - "name": "minecraft:blue_carpet", - "id": -607 - }, - { - "name": "minecraft:blue_concrete", - "id": -638 - }, - { - "name": "minecraft:blue_concrete_powder", - "id": -719 - }, - { - "name": "minecraft:blue_dye", - "id": 401 - }, - { - "name": "minecraft:blue_glazed_terracotta", - "id": 231 - }, - { - "name": "minecraft:blue_ice", - "id": -11 - }, - { - "name": "minecraft:blue_shulker_box", - "id": -623 - }, - { - "name": "minecraft:blue_stained_glass", - "id": -683 - }, - { - "name": "minecraft:blue_stained_glass_pane", - "id": -653 - }, - { - "name": "minecraft:blue_terracotta", - "id": -734 - }, - { - "name": "minecraft:blue_wool", - "id": -563 - }, - { - "name": "minecraft:boat", - "id": 714 - }, - { - "name": "minecraft:bone", - "id": 417 - }, - { - "name": "minecraft:bone_block", - "id": 216 - }, - { - "name": "minecraft:bone_meal", - "id": 413 - }, - { - "name": "minecraft:book", - "id": 389 - }, - { - "name": "minecraft:bookshelf", - "id": 47 - }, - { - "name": "minecraft:border_block", - "id": 212 - }, - { - "name": "minecraft:bordure_indented_banner_pattern", - "id": 593 - }, - { - "name": "minecraft:bow", - "id": 302 - }, - { - "name": "minecraft:bowl", - "id": 323 - }, - { - "name": "minecraft:brain_coral", - "id": -581 - }, - { - "name": "minecraft:bread", - "id": 261 - }, - { - "name": "minecraft:brewer_pottery_sherd", - "id": 667 - }, - { - "name": "minecraft:brewing_stand", - "id": 433 - }, - { - "name": "minecraft:brick", - "id": 385 - }, - { - "name": "minecraft:brick_block", - "id": 45 - }, - { - "name": "minecraft:brick_stairs", - "id": 108 - }, - { - "name": "minecraft:brown_candle", - "id": -425 - }, - { - "name": "minecraft:brown_candle_cake", - "id": -442 - }, - { - "name": "minecraft:brown_carpet", - "id": -608 - }, - { - "name": "minecraft:brown_concrete", - "id": -639 - }, - { - "name": "minecraft:brown_concrete_powder", - "id": -720 - }, - { - "name": "minecraft:brown_dye", - "id": 400 - }, - { - "name": "minecraft:brown_glazed_terracotta", - "id": 232 - }, - { - "name": "minecraft:brown_mushroom", - "id": 39 - }, - { - "name": "minecraft:brown_mushroom_block", - "id": 99 - }, - { - "name": "minecraft:brown_shulker_box", - "id": -624 - }, - { - "name": "minecraft:brown_stained_glass", - "id": -684 - }, - { - "name": "minecraft:brown_stained_glass_pane", - "id": -654 - }, - { - "name": "minecraft:brown_terracotta", - "id": -735 - }, - { - "name": "minecraft:brown_wool", - "id": -555 - }, - { - "name": "minecraft:brush", - "id": 683 - }, - { - "name": "minecraft:bubble_column", - "id": -160 - }, - { - "name": "minecraft:bubble_coral", - "id": -582 - }, - { - "name": "minecraft:bucket", - "id": 362 - }, - { - "name": "minecraft:budding_amethyst", - "id": -328 - }, - { - "name": "minecraft:burn_pottery_sherd", - "id": 668 - }, - { - "name": "minecraft:cactus", - "id": 81 - }, - { - "name": "minecraft:cake", - "id": 419 - }, - { - "name": "minecraft:calcite", - "id": -326 - }, - { - "name": "minecraft:calibrated_sculk_sensor", - "id": -580 - }, - { - "name": "minecraft:camel_spawn_egg", - "id": 662 - }, - { - "name": "minecraft:camera", - "id": 600 - }, - { - "name": "minecraft:campfire", - "id": 596 - }, - { - "name": "minecraft:candle", - "id": -412 - }, - { - "name": "minecraft:candle_cake", - "id": -429 - }, - { - "name": "minecraft:carpet", - "id": 704 - }, - { - "name": "minecraft:carrot", - "id": 279 - }, - { - "name": "minecraft:carrot_on_a_stick", - "id": 524 - }, - { - "name": "minecraft:carrots", - "id": 141 - }, - { - "name": "minecraft:cartography_table", - "id": -200 - }, - { - "name": "minecraft:carved_pumpkin", - "id": -155 - }, - { - "name": "minecraft:cat_spawn_egg", - "id": 490 - }, - { - "name": "minecraft:cauldron", - "id": 434 - }, - { - "name": "minecraft:cave_spider_spawn_egg", - "id": 459 - }, - { - "name": "minecraft:cave_vines", - "id": -322 - }, - { - "name": "minecraft:cave_vines_body_with_berries", - "id": -375 - }, - { - "name": "minecraft:cave_vines_head_with_berries", - "id": -376 - }, - { - "name": "minecraft:chain", - "id": 626 - }, - { - "name": "minecraft:chain_command_block", - "id": 189 - }, - { - "name": "minecraft:chainmail_boots", - "id": 344 - }, - { - "name": "minecraft:chainmail_chestplate", - "id": 342 - }, - { - "name": "minecraft:chainmail_helmet", - "id": 341 - }, - { - "name": "minecraft:chainmail_leggings", - "id": 343 - }, - { - "name": "minecraft:charcoal", - "id": 305 - }, - { - "name": "minecraft:chemical_heat", - "id": 192 - }, - { - "name": "minecraft:chemistry_table", - "id": 238 - }, - { - "name": "minecraft:cherry_boat", - "id": 656 - }, - { - "name": "minecraft:cherry_button", - "id": -530 - }, - { - "name": "minecraft:cherry_chest_boat", - "id": 657 - }, - { - "name": "minecraft:cherry_door", - "id": -531 - }, - { - "name": "minecraft:cherry_double_slab", - "id": -540 - }, - { - "name": "minecraft:cherry_fence", - "id": -532 - }, - { - "name": "minecraft:cherry_fence_gate", - "id": -533 - }, - { - "name": "minecraft:cherry_hanging_sign", - "id": -534 - }, - { - "name": "minecraft:cherry_leaves", - "id": -548 - }, - { - "name": "minecraft:cherry_log", - "id": -536 - }, - { - "name": "minecraft:cherry_planks", - "id": -537 - }, - { - "name": "minecraft:cherry_pressure_plate", - "id": -538 - }, - { - "name": "minecraft:cherry_sapling", - "id": -547 - }, - { - "name": "minecraft:cherry_sign", - "id": 658 - }, - { - "name": "minecraft:cherry_slab", - "id": -539 - }, - { - "name": "minecraft:cherry_stairs", - "id": -541 - }, - { - "name": "minecraft:cherry_standing_sign", - "id": -542 - }, - { - "name": "minecraft:cherry_trapdoor", - "id": -543 - }, - { - "name": "minecraft:cherry_wall_sign", - "id": -544 - }, - { - "name": "minecraft:cherry_wood", - "id": -546 - }, - { - "name": "minecraft:chest", - "id": 54 - }, - { - "name": "minecraft:chest_boat", - "id": 652 - }, - { - "name": "minecraft:chest_minecart", - "id": 391 - }, - { - "name": "minecraft:chicken", - "id": 275 - }, - { - "name": "minecraft:chicken_spawn_egg", - "id": 437 - }, - { - "name": "minecraft:chiseled_bookshelf", - "id": -526 - }, - { - "name": "minecraft:chiseled_deepslate", - "id": -395 - }, - { - "name": "minecraft:chiseled_nether_bricks", - "id": -302 - }, - { - "name": "minecraft:chiseled_polished_blackstone", - "id": -279 - }, - { - "name": "minecraft:chorus_flower", - "id": 200 - }, - { - "name": "minecraft:chorus_fruit", - "id": 565 - }, - { - "name": "minecraft:chorus_plant", - "id": 240 - }, - { - "name": "minecraft:clay", - "id": 82 - }, - { - "name": "minecraft:clay_ball", - "id": 386 - }, - { - "name": "minecraft:client_request_placeholder_block", - "id": -465 - }, - { - "name": "minecraft:clock", - "id": 395 - }, - { - "name": "minecraft:coal", - "id": 304 - }, - { - "name": "minecraft:coal_block", - "id": 173 - }, - { - "name": "minecraft:coal_ore", - "id": 16 - }, - { - "name": "minecraft:coast_armor_trim_smithing_template", - "id": 687 - }, - { - "name": "minecraft:cobbled_deepslate", - "id": -379 - }, - { - "name": "minecraft:cobbled_deepslate_double_slab", - "id": -396 - }, - { - "name": "minecraft:cobbled_deepslate_slab", - "id": -380 - }, - { - "name": "minecraft:cobbled_deepslate_stairs", - "id": -381 - }, - { - "name": "minecraft:cobbled_deepslate_wall", - "id": -382 - }, - { - "name": "minecraft:cobblestone", - "id": 4 - }, - { - "name": "minecraft:cobblestone_wall", - "id": 139 - }, - { - "name": "minecraft:cocoa", - "id": 127 - }, - { - "name": "minecraft:cocoa_beans", - "id": 414 - }, - { - "name": "minecraft:cod", - "id": 264 - }, - { - "name": "minecraft:cod_bucket", - "id": 366 - }, - { - "name": "minecraft:cod_spawn_egg", - "id": 482 - }, - { - "name": "minecraft:colored_torch_bp", - "id": 204 - }, - { - "name": "minecraft:colored_torch_rg", - "id": 202 - }, - { - "name": "minecraft:command_block", - "id": 137 - }, - { - "name": "minecraft:command_block_minecart", - "id": 570 - }, - { - "name": "minecraft:comparator", - "id": 529 - }, - { - "name": "minecraft:compass", - "id": 393 - }, - { - "name": "minecraft:composter", - "id": -213 - }, - { - "name": "minecraft:compound", - "id": 601 - }, - { - "name": "minecraft:concrete", - "id": 709 - }, - { - "name": "minecraft:concrete_powder", - "id": 710 - }, - { - "name": "minecraft:conduit", - "id": -157 - }, - { - "name": "minecraft:cooked_beef", - "id": 274 - }, - { - "name": "minecraft:cooked_chicken", - "id": 276 - }, - { - "name": "minecraft:cooked_cod", - "id": 268 - }, - { - "name": "minecraft:cooked_mutton", - "id": 558 - }, - { - "name": "minecraft:cooked_porkchop", - "id": 263 - }, - { - "name": "minecraft:cooked_rabbit", - "id": 289 - }, - { - "name": "minecraft:cooked_salmon", - "id": 269 - }, - { - "name": "minecraft:cookie", - "id": 271 - }, - { - "name": "minecraft:copper_block", - "id": -340 - }, - { - "name": "minecraft:copper_ingot", - "id": 511 - }, - { - "name": "minecraft:copper_ore", - "id": -311 - }, - { - "name": "minecraft:coral", - "id": 707 - }, - { - "name": "minecraft:coral_block", - "id": -132 - }, - { - "name": "minecraft:coral_fan", - "id": -133 - }, - { - "name": "minecraft:coral_fan_dead", - "id": -134 - }, - { - "name": "minecraft:coral_fan_hang", - "id": -135 - }, - { - "name": "minecraft:coral_fan_hang2", - "id": -136 - }, - { - "name": "minecraft:coral_fan_hang3", - "id": -137 - }, - { - "name": "minecraft:cow_spawn_egg", - "id": 438 - }, - { - "name": "minecraft:cracked_deepslate_bricks", - "id": -410 - }, - { - "name": "minecraft:cracked_deepslate_tiles", - "id": -409 - }, - { - "name": "minecraft:cracked_nether_bricks", - "id": -303 - }, - { - "name": "minecraft:cracked_polished_blackstone_bricks", - "id": -280 - }, - { - "name": "minecraft:crafting_table", - "id": 58 - }, - { - "name": "minecraft:creeper_banner_pattern", - "id": 589 - }, - { - "name": "minecraft:creeper_spawn_egg", - "id": 443 - }, - { - "name": "minecraft:crimson_button", - "id": -260 - }, - { - "name": "minecraft:crimson_door", - "id": 623 - }, - { - "name": "minecraft:crimson_double_slab", - "id": -266 - }, - { - "name": "minecraft:crimson_fence", - "id": -256 - }, - { - "name": "minecraft:crimson_fence_gate", - "id": -258 - }, - { - "name": "minecraft:crimson_fungus", - "id": -228 - }, - { - "name": "minecraft:crimson_hanging_sign", - "id": -506 - }, - { - "name": "minecraft:crimson_hyphae", - "id": -299 - }, - { - "name": "minecraft:crimson_nylium", - "id": -232 - }, - { - "name": "minecraft:crimson_planks", - "id": -242 - }, - { - "name": "minecraft:crimson_pressure_plate", - "id": -262 - }, - { - "name": "minecraft:crimson_roots", - "id": -223 - }, - { - "name": "minecraft:crimson_sign", - "id": 621 - }, - { - "name": "minecraft:crimson_slab", - "id": -264 - }, - { - "name": "minecraft:crimson_stairs", - "id": -254 - }, - { - "name": "minecraft:crimson_standing_sign", - "id": -250 - }, - { - "name": "minecraft:crimson_stem", - "id": -225 - }, - { - "name": "minecraft:crimson_trapdoor", - "id": -246 - }, - { - "name": "minecraft:crimson_wall_sign", - "id": -252 - }, - { - "name": "minecraft:crossbow", - "id": 582 - }, - { - "name": "minecraft:crying_obsidian", - "id": -289 - }, - { - "name": "minecraft:cut_copper", - "id": -347 - }, - { - "name": "minecraft:cut_copper_slab", - "id": -361 - }, - { - "name": "minecraft:cut_copper_stairs", - "id": -354 - }, - { - "name": "minecraft:cyan_candle", - "id": -422 - }, - { - "name": "minecraft:cyan_candle_cake", - "id": -439 - }, - { - "name": "minecraft:cyan_carpet", - "id": -605 - }, - { - "name": "minecraft:cyan_concrete", - "id": -636 - }, - { - "name": "minecraft:cyan_concrete_powder", - "id": -717 - }, - { - "name": "minecraft:cyan_dye", - "id": 403 - }, - { - "name": "minecraft:cyan_glazed_terracotta", - "id": 229 - }, - { - "name": "minecraft:cyan_shulker_box", - "id": -621 - }, - { - "name": "minecraft:cyan_stained_glass", - "id": -681 - }, - { - "name": "minecraft:cyan_stained_glass_pane", - "id": -651 - }, - { - "name": "minecraft:cyan_terracotta", - "id": -732 - }, - { - "name": "minecraft:cyan_wool", - "id": -561 - }, - { - "name": "minecraft:danger_pottery_sherd", - "id": 669 - }, - { - "name": "minecraft:dark_oak_boat", - "id": 382 - }, - { - "name": "minecraft:dark_oak_button", - "id": -142 - }, - { - "name": "minecraft:dark_oak_chest_boat", - "id": 650 - }, - { - "name": "minecraft:dark_oak_door", - "id": 564 - }, - { - "name": "minecraft:dark_oak_fence", - "id": -577 - }, - { - "name": "minecraft:dark_oak_fence_gate", - "id": 186 - }, - { - "name": "minecraft:dark_oak_hanging_sign", - "id": -505 - }, - { - "name": "minecraft:dark_oak_log", - "id": -572 - }, - { - "name": "minecraft:dark_oak_pressure_plate", - "id": -152 - }, - { - "name": "minecraft:dark_oak_sign", - "id": 587 - }, - { - "name": "minecraft:dark_oak_stairs", - "id": 164 - }, - { - "name": "minecraft:dark_oak_trapdoor", - "id": -147 - }, - { - "name": "minecraft:dark_prismarine_stairs", - "id": -3 - }, - { - "name": "minecraft:darkoak_standing_sign", - "id": -192 - }, - { - "name": "minecraft:darkoak_wall_sign", - "id": -193 - }, - { - "name": "minecraft:daylight_detector", - "id": 151 - }, - { - "name": "minecraft:daylight_detector_inverted", - "id": 178 - }, - { - "name": "minecraft:dead_brain_coral", - "id": -586 - }, - { - "name": "minecraft:dead_bubble_coral", - "id": -587 - }, - { - "name": "minecraft:dead_fire_coral", - "id": -588 - }, - { - "name": "minecraft:dead_horn_coral", - "id": -589 - }, - { - "name": "minecraft:dead_tube_coral", - "id": -585 - }, - { - "name": "minecraft:deadbush", - "id": 32 - }, - { - "name": "minecraft:decorated_pot", - "id": -551 - }, - { - "name": "minecraft:deepslate", - "id": -378 - }, - { - "name": "minecraft:deepslate_brick_double_slab", - "id": -399 - }, - { - "name": "minecraft:deepslate_brick_slab", - "id": -392 - }, - { - "name": "minecraft:deepslate_brick_stairs", - "id": -393 - }, - { - "name": "minecraft:deepslate_brick_wall", - "id": -394 - }, - { - "name": "minecraft:deepslate_bricks", - "id": -391 - }, - { - "name": "minecraft:deepslate_coal_ore", - "id": -406 - }, - { - "name": "minecraft:deepslate_copper_ore", - "id": -408 - }, - { - "name": "minecraft:deepslate_diamond_ore", - "id": -405 - }, - { - "name": "minecraft:deepslate_emerald_ore", - "id": -407 - }, - { - "name": "minecraft:deepslate_gold_ore", - "id": -402 - }, - { - "name": "minecraft:deepslate_iron_ore", - "id": -401 - }, - { - "name": "minecraft:deepslate_lapis_ore", - "id": -400 - }, - { - "name": "minecraft:deepslate_redstone_ore", - "id": -403 - }, - { - "name": "minecraft:deepslate_tile_double_slab", - "id": -398 - }, - { - "name": "minecraft:deepslate_tile_slab", - "id": -388 - }, - { - "name": "minecraft:deepslate_tile_stairs", - "id": -389 - }, - { - "name": "minecraft:deepslate_tile_wall", - "id": -390 - }, - { - "name": "minecraft:deepslate_tiles", - "id": -387 - }, - { - "name": "minecraft:deny", - "id": 211 - }, - { - "name": "minecraft:detector_rail", - "id": 28 - }, - { - "name": "minecraft:diamond", - "id": 306 - }, - { - "name": "minecraft:diamond_axe", - "id": 321 - }, - { - "name": "minecraft:diamond_block", - "id": 57 - }, - { - "name": "minecraft:diamond_boots", - "id": 352 - }, - { - "name": "minecraft:diamond_chestplate", - "id": 350 - }, - { - "name": "minecraft:diamond_helmet", - "id": 349 - }, - { - "name": "minecraft:diamond_hoe", - "id": 334 - }, - { - "name": "minecraft:diamond_horse_armor", - "id": 540 - }, - { - "name": "minecraft:diamond_leggings", - "id": 351 - }, - { - "name": "minecraft:diamond_ore", - "id": 56 - }, - { - "name": "minecraft:diamond_pickaxe", - "id": 320 - }, - { - "name": "minecraft:diamond_shovel", - "id": 319 - }, - { - "name": "minecraft:diamond_sword", - "id": 318 - }, - { - "name": "minecraft:diorite_stairs", - "id": -170 - }, - { - "name": "minecraft:dirt", - "id": 3 - }, - { - "name": "minecraft:dirt_with_roots", - "id": -318 - }, - { - "name": "minecraft:disc_fragment_5", - "id": 644 - }, - { - "name": "minecraft:dispenser", - "id": 23 - }, - { - "name": "minecraft:dolphin_spawn_egg", - "id": 486 - }, - { - "name": "minecraft:donkey_spawn_egg", - "id": 467 - }, - { - "name": "minecraft:double_cut_copper_slab", - "id": -368 - }, - { - "name": "minecraft:double_plant", - "id": 175 - }, - { - "name": "minecraft:double_stone_block_slab", - "id": 43 - }, - { - "name": "minecraft:double_stone_block_slab2", - "id": 181 - }, - { - "name": "minecraft:double_stone_block_slab3", - "id": -167 - }, - { - "name": "minecraft:double_stone_block_slab4", - "id": -168 - }, - { - "name": "minecraft:double_wooden_slab", - "id": 157 - }, - { - "name": "minecraft:dragon_breath", - "id": 567 - }, - { - "name": "minecraft:dragon_egg", - "id": 122 - }, - { - "name": "minecraft:dried_kelp", - "id": 270 - }, - { - "name": "minecraft:dried_kelp_block", - "id": -139 - }, - { - "name": "minecraft:dripstone_block", - "id": -317 - }, - { - "name": "minecraft:dropper", - "id": 125 - }, - { - "name": "minecraft:drowned_spawn_egg", - "id": 485 - }, - { - "name": "minecraft:dune_armor_trim_smithing_template", - "id": 686 - }, - { - "name": "minecraft:dye", - "id": 715 - }, - { - "name": "minecraft:echo_shard", - "id": 654 - }, - { - "name": "minecraft:egg", - "id": 392 - }, - { - "name": "minecraft:elder_guardian_spawn_egg", - "id": 473 - }, - { - "name": "minecraft:element_0", - "id": 36 - }, - { - "name": "minecraft:element_1", - "id": -12 - }, - { - "name": "minecraft:element_10", - "id": -21 - }, - { - "name": "minecraft:element_100", - "id": -111 - }, - { - "name": "minecraft:element_101", - "id": -112 - }, - { - "name": "minecraft:element_102", - "id": -113 - }, - { - "name": "minecraft:element_103", - "id": -114 - }, - { - "name": "minecraft:element_104", - "id": -115 - }, - { - "name": "minecraft:element_105", - "id": -116 - }, - { - "name": "minecraft:element_106", - "id": -117 - }, - { - "name": "minecraft:element_107", - "id": -118 - }, - { - "name": "minecraft:element_108", - "id": -119 - }, - { - "name": "minecraft:element_109", - "id": -120 - }, - { - "name": "minecraft:element_11", - "id": -22 - }, - { - "name": "minecraft:element_110", - "id": -121 - }, - { - "name": "minecraft:element_111", - "id": -122 - }, - { - "name": "minecraft:element_112", - "id": -123 - }, - { - "name": "minecraft:element_113", - "id": -124 - }, - { - "name": "minecraft:element_114", - "id": -125 - }, - { - "name": "minecraft:element_115", - "id": -126 - }, - { - "name": "minecraft:element_116", - "id": -127 - }, - { - "name": "minecraft:element_117", - "id": -128 - }, - { - "name": "minecraft:element_118", - "id": -129 - }, - { - "name": "minecraft:element_12", - "id": -23 - }, - { - "name": "minecraft:element_13", - "id": -24 - }, - { - "name": "minecraft:element_14", - "id": -25 - }, - { - "name": "minecraft:element_15", - "id": -26 - }, - { - "name": "minecraft:element_16", - "id": -27 - }, - { - "name": "minecraft:element_17", - "id": -28 - }, - { - "name": "minecraft:element_18", - "id": -29 - }, - { - "name": "minecraft:element_19", - "id": -30 - }, - { - "name": "minecraft:element_2", - "id": -13 - }, - { - "name": "minecraft:element_20", - "id": -31 - }, - { - "name": "minecraft:element_21", - "id": -32 - }, - { - "name": "minecraft:element_22", - "id": -33 - }, - { - "name": "minecraft:element_23", - "id": -34 - }, - { - "name": "minecraft:element_24", - "id": -35 - }, - { - "name": "minecraft:element_25", - "id": -36 - }, - { - "name": "minecraft:element_26", - "id": -37 - }, - { - "name": "minecraft:element_27", - "id": -38 - }, - { - "name": "minecraft:element_28", - "id": -39 - }, - { - "name": "minecraft:element_29", - "id": -40 - }, - { - "name": "minecraft:element_3", - "id": -14 - }, - { - "name": "minecraft:element_30", - "id": -41 - }, - { - "name": "minecraft:element_31", - "id": -42 - }, - { - "name": "minecraft:element_32", - "id": -43 - }, - { - "name": "minecraft:element_33", - "id": -44 - }, - { - "name": "minecraft:element_34", - "id": -45 - }, - { - "name": "minecraft:element_35", - "id": -46 - }, - { - "name": "minecraft:element_36", - "id": -47 - }, - { - "name": "minecraft:element_37", - "id": -48 - }, - { - "name": "minecraft:element_38", - "id": -49 - }, - { - "name": "minecraft:element_39", - "id": -50 - }, - { - "name": "minecraft:element_4", - "id": -15 - }, - { - "name": "minecraft:element_40", - "id": -51 - }, - { - "name": "minecraft:element_41", - "id": -52 - }, - { - "name": "minecraft:element_42", - "id": -53 - }, - { - "name": "minecraft:element_43", - "id": -54 - }, - { - "name": "minecraft:element_44", - "id": -55 - }, - { - "name": "minecraft:element_45", - "id": -56 - }, - { - "name": "minecraft:element_46", - "id": -57 - }, - { - "name": "minecraft:element_47", - "id": -58 - }, - { - "name": "minecraft:element_48", - "id": -59 - }, - { - "name": "minecraft:element_49", - "id": -60 - }, - { - "name": "minecraft:element_5", - "id": -16 - }, - { - "name": "minecraft:element_50", - "id": -61 - }, - { - "name": "minecraft:element_51", - "id": -62 - }, - { - "name": "minecraft:element_52", - "id": -63 - }, - { - "name": "minecraft:element_53", - "id": -64 - }, - { - "name": "minecraft:element_54", - "id": -65 - }, - { - "name": "minecraft:element_55", - "id": -66 - }, - { - "name": "minecraft:element_56", - "id": -67 - }, - { - "name": "minecraft:element_57", - "id": -68 - }, - { - "name": "minecraft:element_58", - "id": -69 - }, - { - "name": "minecraft:element_59", - "id": -70 - }, - { - "name": "minecraft:element_6", - "id": -17 - }, - { - "name": "minecraft:element_60", - "id": -71 - }, - { - "name": "minecraft:element_61", - "id": -72 - }, - { - "name": "minecraft:element_62", - "id": -73 - }, - { - "name": "minecraft:element_63", - "id": -74 - }, - { - "name": "minecraft:element_64", - "id": -75 - }, - { - "name": "minecraft:element_65", - "id": -76 - }, - { - "name": "minecraft:element_66", - "id": -77 - }, - { - "name": "minecraft:element_67", - "id": -78 - }, - { - "name": "minecraft:element_68", - "id": -79 - }, - { - "name": "minecraft:element_69", - "id": -80 - }, - { - "name": "minecraft:element_7", - "id": -18 - }, - { - "name": "minecraft:element_70", - "id": -81 - }, - { - "name": "minecraft:element_71", - "id": -82 - }, - { - "name": "minecraft:element_72", - "id": -83 - }, - { - "name": "minecraft:element_73", - "id": -84 - }, - { - "name": "minecraft:element_74", - "id": -85 - }, - { - "name": "minecraft:element_75", - "id": -86 - }, - { - "name": "minecraft:element_76", - "id": -87 - }, - { - "name": "minecraft:element_77", - "id": -88 - }, - { - "name": "minecraft:element_78", - "id": -89 - }, - { - "name": "minecraft:element_79", - "id": -90 - }, - { - "name": "minecraft:element_8", - "id": -19 - }, - { - "name": "minecraft:element_80", - "id": -91 - }, - { - "name": "minecraft:element_81", - "id": -92 - }, - { - "name": "minecraft:element_82", - "id": -93 - }, - { - "name": "minecraft:element_83", - "id": -94 - }, - { - "name": "minecraft:element_84", - "id": -95 - }, - { - "name": "minecraft:element_85", - "id": -96 - }, - { - "name": "minecraft:element_86", - "id": -97 - }, - { - "name": "minecraft:element_87", - "id": -98 - }, - { - "name": "minecraft:element_88", - "id": -99 - }, - { - "name": "minecraft:element_89", - "id": -100 - }, - { - "name": "minecraft:element_9", - "id": -20 - }, - { - "name": "minecraft:element_90", - "id": -101 - }, - { - "name": "minecraft:element_91", - "id": -102 - }, - { - "name": "minecraft:element_92", - "id": -103 - }, - { - "name": "minecraft:element_93", - "id": -104 - }, - { - "name": "minecraft:element_94", - "id": -105 - }, - { - "name": "minecraft:element_95", - "id": -106 - }, - { - "name": "minecraft:element_96", - "id": -107 - }, - { - "name": "minecraft:element_97", - "id": -108 - }, - { - "name": "minecraft:element_98", - "id": -109 - }, - { - "name": "minecraft:element_99", - "id": -110 - }, - { - "name": "minecraft:elytra", - "id": 571 - }, - { - "name": "minecraft:emerald", - "id": 519 - }, - { - "name": "minecraft:emerald_block", - "id": 133 - }, - { - "name": "minecraft:emerald_ore", - "id": 129 - }, - { - "name": "minecraft:empty_map", - "id": 522 - }, - { - "name": "minecraft:enchanted_book", - "id": 528 - }, - { - "name": "minecraft:enchanted_golden_apple", - "id": 259 - }, - { - "name": "minecraft:enchanting_table", - "id": 116 - }, - { - "name": "minecraft:end_brick_stairs", - "id": -178 - }, - { - "name": "minecraft:end_bricks", - "id": 206 - }, - { - "name": "minecraft:end_crystal", - "id": 718 - }, - { - "name": "minecraft:end_gateway", - "id": 209 - }, - { - "name": "minecraft:end_portal", - "id": 119 - }, - { - "name": "minecraft:end_portal_frame", - "id": 120 - }, - { - "name": "minecraft:end_rod", - "id": 208 - }, - { - "name": "minecraft:end_stone", - "id": 121 - }, - { - "name": "minecraft:ender_chest", - "id": 130 - }, - { - "name": "minecraft:ender_dragon_spawn_egg", - "id": 508 - }, - { - "name": "minecraft:ender_eye", - "id": 435 - }, - { - "name": "minecraft:ender_pearl", - "id": 424 - }, - { - "name": "minecraft:enderman_spawn_egg", - "id": 444 - }, - { - "name": "minecraft:endermite_spawn_egg", - "id": 462 - }, - { - "name": "minecraft:evoker_spawn_egg", - "id": 477 - }, - { - "name": "minecraft:experience_bottle", - "id": 515 - }, - { - "name": "minecraft:explorer_pottery_sherd", - "id": 670 - }, - { - "name": "minecraft:exposed_copper", - "id": -341 - }, - { - "name": "minecraft:exposed_cut_copper", - "id": -348 - }, - { - "name": "minecraft:exposed_cut_copper_slab", - "id": -362 - }, - { - "name": "minecraft:exposed_cut_copper_stairs", - "id": -355 - }, - { - "name": "minecraft:exposed_double_cut_copper_slab", - "id": -369 - }, - { - "name": "minecraft:eye_armor_trim_smithing_template", - "id": 690 - }, - { - "name": "minecraft:farmland", - "id": 60 - }, - { - "name": "minecraft:feather", - "id": 329 - }, - { - "name": "minecraft:fence", - "id": 706 - }, - { - "name": "minecraft:fence_gate", - "id": 107 - }, - { - "name": "minecraft:fermented_spider_eye", - "id": 430 - }, - { - "name": "minecraft:field_masoned_banner_pattern", - "id": 592 - }, - { - "name": "minecraft:filled_map", - "id": 422 - }, - { - "name": "minecraft:fire", - "id": 51 - }, - { - "name": "minecraft:fire_charge", - "id": 516 - }, - { - "name": "minecraft:fire_coral", - "id": -583 - }, - { - "name": "minecraft:firework_rocket", - "id": 526 - }, - { - "name": "minecraft:firework_star", - "id": 527 - }, - { - "name": "minecraft:fishing_rod", - "id": 394 - }, - { - "name": "minecraft:fletching_table", - "id": -201 - }, - { - "name": "minecraft:flint", - "id": 358 - }, - { - "name": "minecraft:flint_and_steel", - "id": 301 - }, - { - "name": "minecraft:flower_banner_pattern", - "id": 588 - }, - { - "name": "minecraft:flower_pot", - "id": 521 - }, - { - "name": "minecraft:flowering_azalea", - "id": -338 - }, - { - "name": "minecraft:flowing_lava", - "id": 10 - }, - { - "name": "minecraft:flowing_water", - "id": 8 - }, - { - "name": "minecraft:fox_spawn_egg", - "id": 492 - }, - { - "name": "minecraft:frame", - "id": 520 - }, - { - "name": "minecraft:friend_pottery_sherd", - "id": 671 - }, - { - "name": "minecraft:frog_spawn", - "id": -468 - }, - { - "name": "minecraft:frog_spawn_egg", - "id": 635 - }, - { - "name": "minecraft:frosted_ice", - "id": 207 - }, - { - "name": "minecraft:furnace", - "id": 61 - }, - { - "name": "minecraft:ghast_spawn_egg", - "id": 456 - }, - { - "name": "minecraft:ghast_tear", - "id": 426 - }, - { - "name": "minecraft:gilded_blackstone", - "id": -281 - }, - { - "name": "minecraft:glass", - "id": 20 - }, - { - "name": "minecraft:glass_bottle", - "id": 429 - }, - { - "name": "minecraft:glass_pane", - "id": 102 - }, - { - "name": "minecraft:glistering_melon_slice", - "id": 436 - }, - { - "name": "minecraft:globe_banner_pattern", - "id": 595 - }, - { - "name": "minecraft:glow_berries", - "id": 719 - }, - { - "name": "minecraft:glow_frame", - "id": 630 - }, - { - "name": "minecraft:glow_ink_sac", - "id": 510 - }, - { - "name": "minecraft:glow_lichen", - "id": -411 - }, - { - "name": "minecraft:glow_squid_spawn_egg", - "id": 505 - }, - { - "name": "minecraft:glow_stick", - "id": 608 - }, - { - "name": "minecraft:glowingobsidian", - "id": 246 - }, - { - "name": "minecraft:glowstone", - "id": 89 - }, - { - "name": "minecraft:glowstone_dust", - "id": 396 - }, - { - "name": "minecraft:goat_horn", - "id": 634 - }, - { - "name": "minecraft:goat_spawn_egg", - "id": 504 - }, - { - "name": "minecraft:gold_block", - "id": 41 - }, - { - "name": "minecraft:gold_ingot", - "id": 308 - }, - { - "name": "minecraft:gold_nugget", - "id": 427 - }, - { - "name": "minecraft:gold_ore", - "id": 14 - }, - { - "name": "minecraft:golden_apple", - "id": 258 - }, - { - "name": "minecraft:golden_axe", - "id": 327 - }, - { - "name": "minecraft:golden_boots", - "id": 356 - }, - { - "name": "minecraft:golden_carrot", - "id": 283 - }, - { - "name": "minecraft:golden_chestplate", - "id": 354 - }, - { - "name": "minecraft:golden_helmet", - "id": 353 - }, - { - "name": "minecraft:golden_hoe", - "id": 335 - }, - { - "name": "minecraft:golden_horse_armor", - "id": 539 - }, - { - "name": "minecraft:golden_leggings", - "id": 355 - }, - { - "name": "minecraft:golden_pickaxe", - "id": 326 - }, - { - "name": "minecraft:golden_rail", - "id": 27 - }, - { - "name": "minecraft:golden_shovel", - "id": 325 - }, - { - "name": "minecraft:golden_sword", - "id": 324 - }, - { - "name": "minecraft:granite_stairs", - "id": -169 - }, - { - "name": "minecraft:grass", - "id": 2 - }, - { - "name": "minecraft:grass_path", - "id": 198 - }, - { - "name": "minecraft:gravel", - "id": 13 - }, - { - "name": "minecraft:gray_candle", - "id": -420 - }, - { - "name": "minecraft:gray_candle_cake", - "id": -437 - }, - { - "name": "minecraft:gray_carpet", - "id": -603 - }, - { - "name": "minecraft:gray_concrete", - "id": -634 - }, - { - "name": "minecraft:gray_concrete_powder", - "id": -715 - }, - { - "name": "minecraft:gray_dye", - "id": 405 - }, - { - "name": "minecraft:gray_glazed_terracotta", - "id": 227 - }, - { - "name": "minecraft:gray_shulker_box", - "id": -619 - }, - { - "name": "minecraft:gray_stained_glass", - "id": -679 - }, - { - "name": "minecraft:gray_stained_glass_pane", - "id": -649 - }, - { - "name": "minecraft:gray_terracotta", - "id": -730 - }, - { - "name": "minecraft:gray_wool", - "id": -553 - }, - { - "name": "minecraft:green_candle", - "id": -426 - }, - { - "name": "minecraft:green_candle_cake", - "id": -443 - }, - { - "name": "minecraft:green_carpet", - "id": -609 - }, - { - "name": "minecraft:green_concrete", - "id": -640 - }, - { - "name": "minecraft:green_concrete_powder", - "id": -721 - }, - { - "name": "minecraft:green_dye", - "id": 399 - }, - { - "name": "minecraft:green_glazed_terracotta", - "id": 233 - }, - { - "name": "minecraft:green_shulker_box", - "id": -625 - }, - { - "name": "minecraft:green_stained_glass", - "id": -685 - }, - { - "name": "minecraft:green_stained_glass_pane", - "id": -655 - }, - { - "name": "minecraft:green_terracotta", - "id": -736 - }, - { - "name": "minecraft:green_wool", - "id": -560 - }, - { - "name": "minecraft:grindstone", - "id": -195 - }, - { - "name": "minecraft:guardian_spawn_egg", - "id": 463 - }, - { - "name": "minecraft:gunpowder", - "id": 330 - }, - { - "name": "minecraft:hanging_roots", - "id": -319 - }, - { - "name": "minecraft:hard_glass", - "id": 253 - }, - { - "name": "minecraft:hard_glass_pane", - "id": 190 - }, - { - "name": "minecraft:hard_stained_glass", - "id": 254 - }, - { - "name": "minecraft:hard_stained_glass_pane", - "id": 191 - }, - { - "name": "minecraft:hardened_clay", - "id": 172 - }, - { - "name": "minecraft:hay_block", - "id": 170 - }, - { - "name": "minecraft:heart_of_the_sea", - "id": 578 - }, - { - "name": "minecraft:heart_pottery_sherd", - "id": 672 - }, - { - "name": "minecraft:heartbreak_pottery_sherd", - "id": 673 - }, - { - "name": "minecraft:heavy_weighted_pressure_plate", - "id": 148 - }, - { - "name": "minecraft:hoglin_spawn_egg", - "id": 498 - }, - { - "name": "minecraft:honey_block", - "id": -220 - }, - { - "name": "minecraft:honey_bottle", - "id": 599 - }, - { - "name": "minecraft:honeycomb", - "id": 598 - }, - { - "name": "minecraft:honeycomb_block", - "id": -221 - }, - { - "name": "minecraft:hopper", - "id": 534 - }, - { - "name": "minecraft:hopper_minecart", - "id": 533 - }, - { - "name": "minecraft:horn_coral", - "id": -584 - }, - { - "name": "minecraft:horse_spawn_egg", - "id": 460 - }, - { - "name": "minecraft:host_armor_trim_smithing_template", - "id": 700 - }, - { - "name": "minecraft:howl_pottery_sherd", - "id": 674 - }, - { - "name": "minecraft:husk_spawn_egg", - "id": 465 - }, - { - "name": "minecraft:ice", - "id": 79 - }, - { - "name": "minecraft:ice_bomb", - "id": 602 - }, - { - "name": "minecraft:infested_deepslate", - "id": -454 - }, - { - "name": "minecraft:info_update", - "id": 248 - }, - { - "name": "minecraft:info_update2", - "id": 249 - }, - { - "name": "minecraft:ink_sac", - "id": 415 - }, - { - "name": "minecraft:invisible_bedrock", - "id": 95 - }, - { - "name": "minecraft:iron_axe", - "id": 300 - }, - { - "name": "minecraft:iron_bars", - "id": 101 - }, - { - "name": "minecraft:iron_block", - "id": 42 - }, - { - "name": "minecraft:iron_boots", - "id": 348 - }, - { - "name": "minecraft:iron_chestplate", - "id": 346 - }, - { - "name": "minecraft:iron_door", - "id": 374 - }, - { - "name": "minecraft:iron_golem_spawn_egg", - "id": 506 - }, - { - "name": "minecraft:iron_helmet", - "id": 345 - }, - { - "name": "minecraft:iron_hoe", - "id": 333 - }, - { - "name": "minecraft:iron_horse_armor", - "id": 538 - }, - { - "name": "minecraft:iron_ingot", - "id": 307 - }, - { - "name": "minecraft:iron_leggings", - "id": 347 - }, - { - "name": "minecraft:iron_nugget", - "id": 576 - }, - { - "name": "minecraft:iron_ore", - "id": 15 - }, - { - "name": "minecraft:iron_pickaxe", - "id": 299 - }, - { - "name": "minecraft:iron_shovel", - "id": 298 - }, - { - "name": "minecraft:iron_sword", - "id": 309 - }, - { - "name": "minecraft:iron_trapdoor", - "id": 167 - }, - { - "name": "minecraft:item.acacia_door", - "id": 196 - }, - { - "name": "minecraft:item.bed", - "id": 26 - }, - { - "name": "minecraft:item.beetroot", - "id": 244 - }, - { - "name": "minecraft:item.birch_door", - "id": 194 - }, - { - "name": "minecraft:item.brewing_stand", - "id": 117 - }, - { - "name": "minecraft:item.cake", - "id": 92 - }, - { - "name": "minecraft:item.camera", - "id": 242 - }, - { - "name": "minecraft:item.campfire", - "id": -209 - }, - { - "name": "minecraft:item.cauldron", - "id": 118 - }, - { - "name": "minecraft:item.chain", - "id": -286 - }, - { - "name": "minecraft:item.crimson_door", - "id": -244 - }, - { - "name": "minecraft:item.dark_oak_door", - "id": 197 - }, - { - "name": "minecraft:item.flower_pot", - "id": 140 - }, - { - "name": "minecraft:item.frame", - "id": 199 - }, - { - "name": "minecraft:item.glow_frame", - "id": -339 - }, - { - "name": "minecraft:item.hopper", - "id": 154 - }, - { - "name": "minecraft:item.iron_door", - "id": 71 - }, - { - "name": "minecraft:item.jungle_door", - "id": 195 - }, - { - "name": "minecraft:item.kelp", - "id": -138 - }, - { - "name": "minecraft:item.mangrove_door", - "id": -493 - }, - { - "name": "minecraft:item.nether_sprouts", - "id": -238 - }, - { - "name": "minecraft:item.nether_wart", - "id": 115 - }, - { - "name": "minecraft:item.reeds", - "id": 83 - }, - { - "name": "minecraft:item.skull", - "id": 144 - }, - { - "name": "minecraft:item.soul_campfire", - "id": -290 - }, - { - "name": "minecraft:item.spruce_door", - "id": 193 - }, - { - "name": "minecraft:item.warped_door", - "id": -245 - }, - { - "name": "minecraft:item.wheat", - "id": 59 - }, - { - "name": "minecraft:item.wooden_door", - "id": 64 - }, - { - "name": "minecraft:jigsaw", - "id": -211 - }, - { - "name": "minecraft:jukebox", - "id": 84 - }, - { - "name": "minecraft:jungle_boat", - "id": 379 - }, - { - "name": "minecraft:jungle_button", - "id": -143 - }, - { - "name": "minecraft:jungle_chest_boat", - "id": 647 - }, - { - "name": "minecraft:jungle_door", - "id": 562 - }, - { - "name": "minecraft:jungle_fence", - "id": -578 - }, - { - "name": "minecraft:jungle_fence_gate", - "id": 185 - }, - { - "name": "minecraft:jungle_hanging_sign", - "id": -503 - }, - { - "name": "minecraft:jungle_log", - "id": -571 - }, - { - "name": "minecraft:jungle_pressure_plate", - "id": -153 - }, - { - "name": "minecraft:jungle_sign", - "id": 585 - }, - { - "name": "minecraft:jungle_stairs", - "id": 136 - }, - { - "name": "minecraft:jungle_standing_sign", - "id": -188 - }, - { - "name": "minecraft:jungle_trapdoor", - "id": -148 - }, - { - "name": "minecraft:jungle_wall_sign", - "id": -189 - }, - { - "name": "minecraft:kelp", - "id": 384 - }, - { - "name": "minecraft:ladder", - "id": 65 - }, - { - "name": "minecraft:lantern", - "id": -208 - }, - { - "name": "minecraft:lapis_block", - "id": 22 - }, - { - "name": "minecraft:lapis_lazuli", - "id": 416 - }, - { - "name": "minecraft:lapis_ore", - "id": 21 - }, - { - "name": "minecraft:large_amethyst_bud", - "id": -330 - }, - { - "name": "minecraft:lava", - "id": 11 - }, - { - "name": "minecraft:lava_bucket", - "id": 365 - }, - { - "name": "minecraft:lead", - "id": 554 - }, - { - "name": "minecraft:leather", - "id": 383 - }, - { - "name": "minecraft:leather_boots", - "id": 340 - }, - { - "name": "minecraft:leather_chestplate", - "id": 338 - }, - { - "name": "minecraft:leather_helmet", - "id": 337 - }, - { - "name": "minecraft:leather_horse_armor", - "id": 537 - }, - { - "name": "minecraft:leather_leggings", - "id": 339 - }, - { - "name": "minecraft:leaves", - "id": 18 - }, - { - "name": "minecraft:leaves2", - "id": 161 - }, - { - "name": "minecraft:lectern", - "id": -194 - }, - { - "name": "minecraft:lever", - "id": 69 - }, - { - "name": "minecraft:light_block", - "id": -215 - }, - { - "name": "minecraft:light_blue_candle", - "id": -416 - }, - { - "name": "minecraft:light_blue_candle_cake", - "id": -433 - }, - { - "name": "minecraft:light_blue_carpet", - "id": -599 - }, - { - "name": "minecraft:light_blue_concrete", - "id": -630 - }, - { - "name": "minecraft:light_blue_concrete_powder", - "id": -711 - }, - { - "name": "minecraft:light_blue_dye", - "id": 409 - }, - { - "name": "minecraft:light_blue_glazed_terracotta", - "id": 223 - }, - { - "name": "minecraft:light_blue_shulker_box", - "id": -615 - }, - { - "name": "minecraft:light_blue_stained_glass", - "id": -675 - }, - { - "name": "minecraft:light_blue_stained_glass_pane", - "id": -645 - }, - { - "name": "minecraft:light_blue_terracotta", - "id": -726 - }, - { - "name": "minecraft:light_blue_wool", - "id": -562 - }, - { - "name": "minecraft:light_gray_candle", - "id": -421 - }, - { - "name": "minecraft:light_gray_candle_cake", - "id": -438 - }, - { - "name": "minecraft:light_gray_carpet", - "id": -604 - }, - { - "name": "minecraft:light_gray_concrete", - "id": -635 - }, - { - "name": "minecraft:light_gray_concrete_powder", - "id": -716 - }, - { - "name": "minecraft:light_gray_dye", - "id": 404 - }, - { - "name": "minecraft:light_gray_shulker_box", - "id": -620 - }, - { - "name": "minecraft:light_gray_stained_glass", - "id": -680 - }, - { - "name": "minecraft:light_gray_stained_glass_pane", - "id": -650 - }, - { - "name": "minecraft:light_gray_terracotta", - "id": -731 - }, - { - "name": "minecraft:light_gray_wool", - "id": -552 - }, - { - "name": "minecraft:light_weighted_pressure_plate", - "id": 147 - }, - { - "name": "minecraft:lightning_rod", - "id": -312 - }, - { - "name": "minecraft:lime_candle", - "id": -418 - }, - { - "name": "minecraft:lime_candle_cake", - "id": -435 - }, - { - "name": "minecraft:lime_carpet", - "id": -601 - }, - { - "name": "minecraft:lime_concrete", - "id": -632 - }, - { - "name": "minecraft:lime_concrete_powder", - "id": -713 - }, - { - "name": "minecraft:lime_dye", - "id": 407 - }, - { - "name": "minecraft:lime_glazed_terracotta", - "id": 225 - }, - { - "name": "minecraft:lime_shulker_box", - "id": -617 - }, - { - "name": "minecraft:lime_stained_glass", - "id": -677 - }, - { - "name": "minecraft:lime_stained_glass_pane", - "id": -647 - }, - { - "name": "minecraft:lime_terracotta", - "id": -728 - }, - { - "name": "minecraft:lime_wool", - "id": -559 - }, - { - "name": "minecraft:lingering_potion", - "id": 569 - }, - { - "name": "minecraft:lit_blast_furnace", - "id": -214 - }, - { - "name": "minecraft:lit_deepslate_redstone_ore", - "id": -404 - }, - { - "name": "minecraft:lit_furnace", - "id": 62 - }, - { - "name": "minecraft:lit_pumpkin", - "id": 91 - }, - { - "name": "minecraft:lit_redstone_lamp", - "id": 124 - }, - { - "name": "minecraft:lit_redstone_ore", - "id": 74 - }, - { - "name": "minecraft:lit_smoker", - "id": -199 - }, - { - "name": "minecraft:llama_spawn_egg", - "id": 475 - }, - { - "name": "minecraft:lodestone", - "id": -222 - }, - { - "name": "minecraft:lodestone_compass", - "id": 609 - }, - { - "name": "minecraft:log", - "id": 705 - }, - { - "name": "minecraft:log2", - "id": 708 - }, - { - "name": "minecraft:loom", - "id": -204 - }, - { - "name": "minecraft:magenta_candle", - "id": -415 - }, - { - "name": "minecraft:magenta_candle_cake", - "id": -432 - }, - { - "name": "minecraft:magenta_carpet", - "id": -598 - }, - { - "name": "minecraft:magenta_concrete", - "id": -629 - }, - { - "name": "minecraft:magenta_concrete_powder", - "id": -710 - }, - { - "name": "minecraft:magenta_dye", - "id": 410 - }, - { - "name": "minecraft:magenta_glazed_terracotta", - "id": 222 - }, - { - "name": "minecraft:magenta_shulker_box", - "id": -614 - }, - { - "name": "minecraft:magenta_stained_glass", - "id": -674 - }, - { - "name": "minecraft:magenta_stained_glass_pane", - "id": -644 - }, - { - "name": "minecraft:magenta_terracotta", - "id": -725 - }, - { - "name": "minecraft:magenta_wool", - "id": -565 - }, - { - "name": "minecraft:magma", - "id": 213 - }, - { - "name": "minecraft:magma_cream", - "id": 432 - }, - { - "name": "minecraft:magma_cube_spawn_egg", - "id": 457 - }, - { - "name": "minecraft:mangrove_boat", - "id": 642 - }, - { - "name": "minecraft:mangrove_button", - "id": -487 - }, - { - "name": "minecraft:mangrove_chest_boat", - "id": 651 - }, - { - "name": "minecraft:mangrove_door", - "id": 640 - }, - { - "name": "minecraft:mangrove_double_slab", - "id": -499 - }, - { - "name": "minecraft:mangrove_fence", - "id": -491 - }, - { - "name": "minecraft:mangrove_fence_gate", - "id": -492 - }, - { - "name": "minecraft:mangrove_hanging_sign", - "id": -508 - }, - { - "name": "minecraft:mangrove_leaves", - "id": -472 - }, - { - "name": "minecraft:mangrove_log", - "id": -484 - }, - { - "name": "minecraft:mangrove_planks", - "id": -486 - }, - { - "name": "minecraft:mangrove_pressure_plate", - "id": -490 - }, - { - "name": "minecraft:mangrove_propagule", - "id": -474 - }, - { - "name": "minecraft:mangrove_roots", - "id": -482 - }, - { - "name": "minecraft:mangrove_sign", - "id": 641 - }, - { - "name": "minecraft:mangrove_slab", - "id": -489 - }, - { - "name": "minecraft:mangrove_stairs", - "id": -488 - }, - { - "name": "minecraft:mangrove_standing_sign", - "id": -494 - }, - { - "name": "minecraft:mangrove_trapdoor", - "id": -496 - }, - { - "name": "minecraft:mangrove_wall_sign", - "id": -495 - }, - { - "name": "minecraft:mangrove_wood", - "id": -497 - }, - { - "name": "minecraft:medicine", - "id": 606 - }, - { - "name": "minecraft:medium_amethyst_bud", - "id": -331 - }, - { - "name": "minecraft:melon_block", - "id": 103 - }, - { - "name": "minecraft:melon_seeds", - "id": 293 - }, - { - "name": "minecraft:melon_slice", - "id": 272 - }, - { - "name": "minecraft:melon_stem", - "id": 105 - }, - { - "name": "minecraft:milk_bucket", - "id": 363 - }, - { - "name": "minecraft:minecart", - "id": 372 - }, - { - "name": "minecraft:miner_pottery_sherd", - "id": 675 - }, - { - "name": "minecraft:mob_spawner", - "id": 52 - }, - { - "name": "minecraft:mojang_banner_pattern", - "id": 591 - }, - { - "name": "minecraft:monster_egg", - "id": 97 - }, - { - "name": "minecraft:mooshroom_spawn_egg", - "id": 442 - }, - { - "name": "minecraft:moss_block", - "id": -320 - }, - { - "name": "minecraft:moss_carpet", - "id": -335 - }, - { - "name": "minecraft:mossy_cobblestone", - "id": 48 - }, - { - "name": "minecraft:mossy_cobblestone_stairs", - "id": -179 - }, - { - "name": "minecraft:mossy_stone_brick_stairs", - "id": -175 - }, - { - "name": "minecraft:mourner_pottery_sherd", - "id": 676 - }, - { - "name": "minecraft:moving_block", - "id": 250 - }, - { - "name": "minecraft:mud", - "id": -473 - }, - { - "name": "minecraft:mud_brick_double_slab", - "id": -479 - }, - { - "name": "minecraft:mud_brick_slab", - "id": -478 - }, - { - "name": "minecraft:mud_brick_stairs", - "id": -480 - }, - { - "name": "minecraft:mud_brick_wall", - "id": -481 - }, - { - "name": "minecraft:mud_bricks", - "id": -475 - }, - { - "name": "minecraft:muddy_mangrove_roots", - "id": -483 - }, - { - "name": "minecraft:mule_spawn_egg", - "id": 468 - }, - { - "name": "minecraft:mushroom_stew", - "id": 260 - }, - { - "name": "minecraft:music_disc_11", - "id": 551 - }, - { - "name": "minecraft:music_disc_13", - "id": 541 - }, - { - "name": "minecraft:music_disc_5", - "id": 643 - }, - { - "name": "minecraft:music_disc_blocks", - "id": 543 - }, - { - "name": "minecraft:music_disc_cat", - "id": 542 - }, - { - "name": "minecraft:music_disc_chirp", - "id": 544 - }, - { - "name": "minecraft:music_disc_far", - "id": 545 - }, - { - "name": "minecraft:music_disc_mall", - "id": 546 - }, - { - "name": "minecraft:music_disc_mellohi", - "id": 547 - }, - { - "name": "minecraft:music_disc_otherside", - "id": 633 - }, - { - "name": "minecraft:music_disc_pigstep", - "id": 627 - }, - { - "name": "minecraft:music_disc_relic", - "id": 701 - }, - { - "name": "minecraft:music_disc_stal", - "id": 548 - }, - { - "name": "minecraft:music_disc_strad", - "id": 549 - }, - { - "name": "minecraft:music_disc_wait", - "id": 552 - }, - { - "name": "minecraft:music_disc_ward", - "id": 550 - }, - { - "name": "minecraft:mutton", - "id": 557 - }, - { - "name": "minecraft:mycelium", - "id": 110 - }, - { - "name": "minecraft:name_tag", - "id": 555 - }, - { - "name": "minecraft:nautilus_shell", - "id": 577 - }, - { - "name": "minecraft:nether_brick", - "id": 112 - }, - { - "name": "minecraft:nether_brick_fence", - "id": 113 - }, - { - "name": "minecraft:nether_brick_stairs", - "id": 114 - }, - { - "name": "minecraft:nether_gold_ore", - "id": -288 - }, - { - "name": "minecraft:nether_sprouts", - "id": 628 - }, - { - "name": "minecraft:nether_star", - "id": 525 - }, - { - "name": "minecraft:nether_wart", - "id": 294 - }, - { - "name": "minecraft:nether_wart_block", - "id": 214 - }, - { - "name": "minecraft:netherbrick", - "id": 530 - }, - { - "name": "minecraft:netherite_axe", - "id": 613 - }, - { - "name": "minecraft:netherite_block", - "id": -270 - }, - { - "name": "minecraft:netherite_boots", - "id": 619 - }, - { - "name": "minecraft:netherite_chestplate", - "id": 617 - }, - { - "name": "minecraft:netherite_helmet", - "id": 616 - }, - { - "name": "minecraft:netherite_hoe", - "id": 614 - }, - { - "name": "minecraft:netherite_ingot", - "id": 615 - }, - { - "name": "minecraft:netherite_leggings", - "id": 618 - }, - { - "name": "minecraft:netherite_pickaxe", - "id": 612 - }, - { - "name": "minecraft:netherite_scrap", - "id": 620 - }, - { - "name": "minecraft:netherite_shovel", - "id": 611 - }, - { - "name": "minecraft:netherite_sword", - "id": 610 - }, - { - "name": "minecraft:netherite_upgrade_smithing_template", - "id": 684 - }, - { - "name": "minecraft:netherrack", - "id": 87 - }, - { - "name": "minecraft:netherreactor", - "id": 247 - }, - { - "name": "minecraft:normal_stone_stairs", - "id": -180 - }, - { - "name": "minecraft:noteblock", - "id": 25 - }, - { - "name": "minecraft:npc_spawn_egg", - "id": 472 - }, - { - "name": "minecraft:oak_boat", - "id": 377 - }, - { - "name": "minecraft:oak_chest_boat", - "id": 645 - }, - { - "name": "minecraft:oak_fence", - "id": 85 - }, - { - "name": "minecraft:oak_hanging_sign", - "id": -500 - }, - { - "name": "minecraft:oak_log", - "id": 17 - }, - { - "name": "minecraft:oak_sign", - "id": 360 - }, - { - "name": "minecraft:oak_stairs", - "id": 53 - }, - { - "name": "minecraft:observer", - "id": 251 - }, - { - "name": "minecraft:obsidian", - "id": 49 - }, - { - "name": "minecraft:ocelot_spawn_egg", - "id": 453 - }, - { - "name": "minecraft:ochre_froglight", - "id": -471 - }, - { - "name": "minecraft:orange_candle", - "id": -414 - }, - { - "name": "minecraft:orange_candle_cake", - "id": -431 - }, - { - "name": "minecraft:orange_carpet", - "id": -597 - }, - { - "name": "minecraft:orange_concrete", - "id": -628 - }, - { - "name": "minecraft:orange_concrete_powder", - "id": -709 - }, - { - "name": "minecraft:orange_dye", - "id": 411 - }, - { - "name": "minecraft:orange_glazed_terracotta", - "id": 221 - }, - { - "name": "minecraft:orange_shulker_box", - "id": -613 - }, - { - "name": "minecraft:orange_stained_glass", - "id": -673 - }, - { - "name": "minecraft:orange_stained_glass_pane", - "id": -643 - }, - { - "name": "minecraft:orange_terracotta", - "id": -724 - }, - { - "name": "minecraft:orange_wool", - "id": -557 - }, - { - "name": "minecraft:oxidized_copper", - "id": -343 - }, - { - "name": "minecraft:oxidized_cut_copper", - "id": -350 - }, - { - "name": "minecraft:oxidized_cut_copper_slab", - "id": -364 - }, - { - "name": "minecraft:oxidized_cut_copper_stairs", - "id": -357 - }, - { - "name": "minecraft:oxidized_double_cut_copper_slab", - "id": -371 - }, - { - "name": "minecraft:packed_ice", - "id": 174 - }, - { - "name": "minecraft:packed_mud", - "id": -477 - }, - { - "name": "minecraft:painting", - "id": 359 - }, - { - "name": "minecraft:panda_spawn_egg", - "id": 491 - }, - { - "name": "minecraft:paper", - "id": 388 - }, - { - "name": "minecraft:parrot_spawn_egg", - "id": 480 - }, - { - "name": "minecraft:pearlescent_froglight", - "id": -469 - }, - { - "name": "minecraft:phantom_membrane", - "id": 581 - }, - { - "name": "minecraft:phantom_spawn_egg", - "id": 488 - }, - { - "name": "minecraft:pig_spawn_egg", - "id": 439 - }, - { - "name": "minecraft:piglin_banner_pattern", - "id": 594 - }, - { - "name": "minecraft:piglin_brute_spawn_egg", - "id": 501 - }, - { - "name": "minecraft:piglin_spawn_egg", - "id": 499 - }, - { - "name": "minecraft:pillager_spawn_egg", - "id": 493 - }, - { - "name": "minecraft:pink_candle", - "id": -419 - }, - { - "name": "minecraft:pink_candle_cake", - "id": -436 - }, - { - "name": "minecraft:pink_carpet", - "id": -602 - }, - { - "name": "minecraft:pink_concrete", - "id": -633 - }, - { - "name": "minecraft:pink_concrete_powder", - "id": -714 - }, - { - "name": "minecraft:pink_dye", - "id": 406 - }, - { - "name": "minecraft:pink_glazed_terracotta", - "id": 226 - }, - { - "name": "minecraft:pink_petals", - "id": -549 - }, - { - "name": "minecraft:pink_shulker_box", - "id": -618 - }, - { - "name": "minecraft:pink_stained_glass", - "id": -678 - }, - { - "name": "minecraft:pink_stained_glass_pane", - "id": -648 - }, - { - "name": "minecraft:pink_terracotta", - "id": -729 - }, - { - "name": "minecraft:pink_wool", - "id": -566 - }, - { - "name": "minecraft:piston", - "id": 33 - }, - { - "name": "minecraft:piston_arm_collision", - "id": 34 - }, - { - "name": "minecraft:pitcher_crop", - "id": -574 - }, - { - "name": "minecraft:pitcher_plant", - "id": -612 - }, - { - "name": "minecraft:pitcher_pod", - "id": 297 - }, - { - "name": "minecraft:planks", - "id": 5 - }, - { - "name": "minecraft:plenty_pottery_sherd", - "id": 677 - }, - { - "name": "minecraft:podzol", - "id": 243 - }, - { - "name": "minecraft:pointed_dripstone", - "id": -308 - }, - { - "name": "minecraft:poisonous_potato", - "id": 282 - }, - { - "name": "minecraft:polar_bear_spawn_egg", - "id": 474 - }, - { - "name": "minecraft:polished_andesite_stairs", - "id": -174 - }, - { - "name": "minecraft:polished_basalt", - "id": -235 - }, - { - "name": "minecraft:polished_blackstone", - "id": -291 - }, - { - "name": "minecraft:polished_blackstone_brick_double_slab", - "id": -285 - }, - { - "name": "minecraft:polished_blackstone_brick_slab", - "id": -284 - }, - { - "name": "minecraft:polished_blackstone_brick_stairs", - "id": -275 - }, - { - "name": "minecraft:polished_blackstone_brick_wall", - "id": -278 - }, - { - "name": "minecraft:polished_blackstone_bricks", - "id": -274 - }, - { - "name": "minecraft:polished_blackstone_button", - "id": -296 - }, - { - "name": "minecraft:polished_blackstone_double_slab", - "id": -294 - }, - { - "name": "minecraft:polished_blackstone_pressure_plate", - "id": -295 - }, - { - "name": "minecraft:polished_blackstone_slab", - "id": -293 - }, - { - "name": "minecraft:polished_blackstone_stairs", - "id": -292 - }, - { - "name": "minecraft:polished_blackstone_wall", - "id": -297 - }, - { - "name": "minecraft:polished_deepslate", - "id": -383 - }, - { - "name": "minecraft:polished_deepslate_double_slab", - "id": -397 - }, - { - "name": "minecraft:polished_deepslate_slab", - "id": -384 - }, - { - "name": "minecraft:polished_deepslate_stairs", - "id": -385 - }, - { - "name": "minecraft:polished_deepslate_wall", - "id": -386 - }, - { - "name": "minecraft:polished_diorite_stairs", - "id": -173 - }, - { - "name": "minecraft:polished_granite_stairs", - "id": -172 - }, - { - "name": "minecraft:popped_chorus_fruit", - "id": 566 - }, - { - "name": "minecraft:porkchop", - "id": 262 - }, - { - "name": "minecraft:portal", - "id": 90 - }, - { - "name": "minecraft:potato", - "id": 280 - }, - { - "name": "minecraft:potatoes", - "id": 142 - }, - { - "name": "minecraft:potion", - "id": 428 - }, - { - "name": "minecraft:powder_snow", - "id": -306 - }, - { - "name": "minecraft:powder_snow_bucket", - "id": 370 - }, - { - "name": "minecraft:powered_comparator", - "id": 150 - }, - { - "name": "minecraft:powered_repeater", - "id": 94 - }, - { - "name": "minecraft:prismarine", - "id": 168 - }, - { - "name": "minecraft:prismarine_bricks_stairs", - "id": -4 - }, - { - "name": "minecraft:prismarine_crystals", - "id": 556 - }, - { - "name": "minecraft:prismarine_shard", - "id": 572 - }, - { - "name": "minecraft:prismarine_stairs", - "id": -2 - }, - { - "name": "minecraft:prize_pottery_sherd", - "id": 678 - }, - { - "name": "minecraft:pufferfish", - "id": 267 - }, - { - "name": "minecraft:pufferfish_bucket", - "id": 369 - }, - { - "name": "minecraft:pufferfish_spawn_egg", - "id": 483 - }, - { - "name": "minecraft:pumpkin", - "id": 86 - }, - { - "name": "minecraft:pumpkin_pie", - "id": 284 - }, - { - "name": "minecraft:pumpkin_seeds", - "id": 292 - }, - { - "name": "minecraft:pumpkin_stem", - "id": 104 - }, - { - "name": "minecraft:purple_candle", - "id": -423 - }, - { - "name": "minecraft:purple_candle_cake", - "id": -440 - }, - { - "name": "minecraft:purple_carpet", - "id": -606 - }, - { - "name": "minecraft:purple_concrete", - "id": -637 - }, - { - "name": "minecraft:purple_concrete_powder", - "id": -718 - }, - { - "name": "minecraft:purple_dye", - "id": 402 - }, - { - "name": "minecraft:purple_glazed_terracotta", - "id": 219 - }, - { - "name": "minecraft:purple_shulker_box", - "id": -622 - }, - { - "name": "minecraft:purple_stained_glass", - "id": -682 - }, - { - "name": "minecraft:purple_stained_glass_pane", - "id": -652 - }, - { - "name": "minecraft:purple_terracotta", - "id": -733 - }, - { - "name": "minecraft:purple_wool", - "id": -564 - }, - { - "name": "minecraft:purpur_block", - "id": 201 - }, - { - "name": "minecraft:purpur_stairs", - "id": 203 - }, - { - "name": "minecraft:quartz", - "id": 531 - }, - { - "name": "minecraft:quartz_block", - "id": 155 - }, - { - "name": "minecraft:quartz_bricks", - "id": -304 - }, - { - "name": "minecraft:quartz_ore", - "id": 153 - }, - { - "name": "minecraft:quartz_stairs", - "id": 156 - }, - { - "name": "minecraft:rabbit", - "id": 288 - }, - { - "name": "minecraft:rabbit_foot", - "id": 535 - }, - { - "name": "minecraft:rabbit_hide", - "id": 536 - }, - { - "name": "minecraft:rabbit_spawn_egg", - "id": 461 - }, - { - "name": "minecraft:rabbit_stew", - "id": 290 - }, - { - "name": "minecraft:rail", - "id": 66 - }, - { - "name": "minecraft:raiser_armor_trim_smithing_template", - "id": 698 - }, - { - "name": "minecraft:rapid_fertilizer", - "id": 604 - }, - { - "name": "minecraft:ravager_spawn_egg", - "id": 495 - }, - { - "name": "minecraft:raw_copper", - "id": 514 - }, - { - "name": "minecraft:raw_copper_block", - "id": -452 - }, - { - "name": "minecraft:raw_gold", - "id": 513 - }, - { - "name": "minecraft:raw_gold_block", - "id": -453 - }, - { - "name": "minecraft:raw_iron", - "id": 512 - }, - { - "name": "minecraft:raw_iron_block", - "id": -451 - }, - { - "name": "minecraft:recovery_compass", - "id": 653 - }, - { - "name": "minecraft:red_candle", - "id": -427 - }, - { - "name": "minecraft:red_candle_cake", - "id": -444 - }, - { - "name": "minecraft:red_carpet", - "id": -610 - }, - { - "name": "minecraft:red_concrete", - "id": -641 - }, - { - "name": "minecraft:red_concrete_powder", - "id": -722 - }, - { - "name": "minecraft:red_dye", - "id": 398 - }, - { - "name": "minecraft:red_flower", - "id": 38 - }, - { - "name": "minecraft:red_glazed_terracotta", - "id": 234 - }, - { - "name": "minecraft:red_mushroom", - "id": 40 - }, - { - "name": "minecraft:red_mushroom_block", - "id": 100 - }, - { - "name": "minecraft:red_nether_brick", - "id": 215 - }, - { - "name": "minecraft:red_nether_brick_stairs", - "id": -184 - }, - { - "name": "minecraft:red_sandstone", - "id": 179 - }, - { - "name": "minecraft:red_sandstone_stairs", - "id": 180 - }, - { - "name": "minecraft:red_shulker_box", - "id": -626 - }, - { - "name": "minecraft:red_stained_glass", - "id": -686 - }, - { - "name": "minecraft:red_stained_glass_pane", - "id": -656 - }, - { - "name": "minecraft:red_terracotta", - "id": -737 - }, - { - "name": "minecraft:red_wool", - "id": -556 - }, - { - "name": "minecraft:redstone", - "id": 375 - }, - { - "name": "minecraft:redstone_block", - "id": 152 - }, - { - "name": "minecraft:redstone_lamp", - "id": 123 - }, - { - "name": "minecraft:redstone_ore", - "id": 73 - }, - { - "name": "minecraft:redstone_torch", - "id": 76 - }, - { - "name": "minecraft:redstone_wire", - "id": 55 - }, - { - "name": "minecraft:reinforced_deepslate", - "id": -466 - }, - { - "name": "minecraft:repeater", - "id": 421 - }, - { - "name": "minecraft:repeating_command_block", - "id": 188 - }, - { - "name": "minecraft:reserved6", - "id": 255 - }, - { - "name": "minecraft:respawn_anchor", - "id": -272 - }, - { - "name": "minecraft:rib_armor_trim_smithing_template", - "id": 694 - }, - { - "name": "minecraft:rotten_flesh", - "id": 277 - }, - { - "name": "minecraft:saddle", - "id": 373 - }, - { - "name": "minecraft:salmon", - "id": 265 - }, - { - "name": "minecraft:salmon_bucket", - "id": 367 - }, - { - "name": "minecraft:salmon_spawn_egg", - "id": 484 - }, - { - "name": "minecraft:sand", - "id": 12 - }, - { - "name": "minecraft:sandstone", - "id": 24 - }, - { - "name": "minecraft:sandstone_stairs", - "id": 128 - }, - { - "name": "minecraft:sapling", - "id": 6 - }, - { - "name": "minecraft:scaffolding", - "id": -165 - }, - { - "name": "minecraft:sculk", - "id": -458 - }, - { - "name": "minecraft:sculk_catalyst", - "id": -460 - }, - { - "name": "minecraft:sculk_sensor", - "id": -307 - }, - { - "name": "minecraft:sculk_shrieker", - "id": -461 - }, - { - "name": "minecraft:sculk_vein", - "id": -459 - }, - { - "name": "minecraft:scute", - "id": 579 - }, - { - "name": "minecraft:sea_lantern", - "id": 169 - }, - { - "name": "minecraft:sea_pickle", - "id": -156 - }, - { - "name": "minecraft:seagrass", - "id": -130 - }, - { - "name": "minecraft:sentry_armor_trim_smithing_template", - "id": 685 - }, - { - "name": "minecraft:shaper_armor_trim_smithing_template", - "id": 699 - }, - { - "name": "minecraft:sheaf_pottery_sherd", - "id": 679 - }, - { - "name": "minecraft:shears", - "id": 423 - }, - { - "name": "minecraft:sheep_spawn_egg", - "id": 440 - }, - { - "name": "minecraft:shelter_pottery_sherd", - "id": 680 - }, - { - "name": "minecraft:shield", - "id": 357 - }, - { - "name": "minecraft:shroomlight", - "id": -230 - }, - { - "name": "minecraft:shulker_box", - "id": 713 - }, - { - "name": "minecraft:shulker_shell", - "id": 573 - }, - { - "name": "minecraft:shulker_spawn_egg", - "id": 471 - }, - { - "name": "minecraft:silence_armor_trim_smithing_template", - "id": 696 - }, - { - "name": "minecraft:silver_glazed_terracotta", - "id": 228 - }, - { - "name": "minecraft:silverfish_spawn_egg", - "id": 445 - }, - { - "name": "minecraft:skeleton_horse_spawn_egg", - "id": 469 - }, - { - "name": "minecraft:skeleton_spawn_egg", - "id": 446 - }, - { - "name": "minecraft:skull", - "id": 523 - }, - { - "name": "minecraft:skull_banner_pattern", - "id": 590 - }, - { - "name": "minecraft:skull_pottery_sherd", - "id": 681 - }, - { - "name": "minecraft:slime", - "id": 165 - }, - { - "name": "minecraft:slime_ball", - "id": 390 - }, - { - "name": "minecraft:slime_spawn_egg", - "id": 447 - }, - { - "name": "minecraft:small_amethyst_bud", - "id": -332 - }, - { - "name": "minecraft:small_dripleaf_block", - "id": -336 - }, - { - "name": "minecraft:smithing_table", - "id": -202 - }, - { - "name": "minecraft:smoker", - "id": -198 - }, - { - "name": "minecraft:smooth_basalt", - "id": -377 - }, - { - "name": "minecraft:smooth_quartz_stairs", - "id": -185 - }, - { - "name": "minecraft:smooth_red_sandstone_stairs", - "id": -176 - }, - { - "name": "minecraft:smooth_sandstone_stairs", - "id": -177 - }, - { - "name": "minecraft:smooth_stone", - "id": -183 - }, - { - "name": "minecraft:sniffer_egg", - "id": -596 - }, - { - "name": "minecraft:sniffer_spawn_egg", - "id": 502 - }, - { - "name": "minecraft:snort_pottery_sherd", - "id": 682 - }, - { - "name": "minecraft:snout_armor_trim_smithing_template", - "id": 693 - }, - { - "name": "minecraft:snow", - "id": 80 - }, - { - "name": "minecraft:snow_golem_spawn_egg", - "id": 507 - }, - { - "name": "minecraft:snow_layer", - "id": 78 - }, - { - "name": "minecraft:snowball", - "id": 376 - }, - { - "name": "minecraft:soul_campfire", - "id": 629 - }, - { - "name": "minecraft:soul_fire", - "id": -237 - }, - { - "name": "minecraft:soul_lantern", - "id": -269 - }, - { - "name": "minecraft:soul_sand", - "id": 88 - }, - { - "name": "minecraft:soul_soil", - "id": -236 - }, - { - "name": "minecraft:soul_torch", - "id": -268 - }, - { - "name": "minecraft:sparkler", - "id": 607 - }, - { - "name": "minecraft:spawn_egg", - "id": 717 - }, - { - "name": "minecraft:spider_eye", - "id": 278 - }, - { - "name": "minecraft:spider_spawn_egg", - "id": 448 - }, - { - "name": "minecraft:spire_armor_trim_smithing_template", - "id": 695 - }, - { - "name": "minecraft:splash_potion", - "id": 568 - }, - { - "name": "minecraft:sponge", - "id": 19 - }, - { - "name": "minecraft:spore_blossom", - "id": -321 - }, - { - "name": "minecraft:spruce_boat", - "id": 380 - }, - { - "name": "minecraft:spruce_button", - "id": -144 - }, - { - "name": "minecraft:spruce_chest_boat", - "id": 648 - }, - { - "name": "minecraft:spruce_door", - "id": 560 - }, - { - "name": "minecraft:spruce_fence", - "id": -579 - }, - { - "name": "minecraft:spruce_fence_gate", - "id": 183 - }, - { - "name": "minecraft:spruce_hanging_sign", - "id": -501 - }, - { - "name": "minecraft:spruce_log", - "id": -569 - }, - { - "name": "minecraft:spruce_pressure_plate", - "id": -154 - }, - { - "name": "minecraft:spruce_sign", - "id": 583 - }, - { - "name": "minecraft:spruce_stairs", - "id": 134 - }, - { - "name": "minecraft:spruce_standing_sign", - "id": -181 - }, - { - "name": "minecraft:spruce_trapdoor", - "id": -149 - }, - { - "name": "minecraft:spruce_wall_sign", - "id": -182 - }, - { - "name": "minecraft:spyglass", - "id": 632 - }, - { - "name": "minecraft:squid_spawn_egg", - "id": 452 - }, - { - "name": "minecraft:stained_glass", - "id": 711 - }, - { - "name": "minecraft:stained_glass_pane", - "id": 712 - }, - { - "name": "minecraft:stained_hardened_clay", - "id": 702 - }, - { - "name": "minecraft:standing_banner", - "id": 176 - }, - { - "name": "minecraft:standing_sign", - "id": 63 - }, - { - "name": "minecraft:stick", - "id": 322 - }, - { - "name": "minecraft:sticky_piston", - "id": 29 - }, - { - "name": "minecraft:sticky_piston_arm_collision", - "id": -217 - }, - { - "name": "minecraft:stone", - "id": 1 - }, - { - "name": "minecraft:stone_axe", - "id": 317 - }, - { - "name": "minecraft:stone_block_slab", - "id": 44 - }, - { - "name": "minecraft:stone_block_slab2", - "id": 182 - }, - { - "name": "minecraft:stone_block_slab3", - "id": -162 - }, - { - "name": "minecraft:stone_block_slab4", - "id": -166 - }, - { - "name": "minecraft:stone_brick_stairs", - "id": 109 - }, - { - "name": "minecraft:stone_button", - "id": 77 - }, - { - "name": "minecraft:stone_hoe", - "id": 332 - }, - { - "name": "minecraft:stone_pickaxe", - "id": 316 - }, - { - "name": "minecraft:stone_pressure_plate", - "id": 70 - }, - { - "name": "minecraft:stone_shovel", - "id": 315 - }, - { - "name": "minecraft:stone_stairs", - "id": 67 - }, - { - "name": "minecraft:stone_sword", - "id": 314 - }, - { - "name": "minecraft:stonebrick", - "id": 98 - }, - { - "name": "minecraft:stonecutter", - "id": 245 - }, - { - "name": "minecraft:stonecutter_block", - "id": -197 - }, - { - "name": "minecraft:stray_spawn_egg", - "id": 464 - }, - { - "name": "minecraft:strider_spawn_egg", - "id": 497 - }, - { - "name": "minecraft:string", - "id": 328 - }, - { - "name": "minecraft:stripped_acacia_log", - "id": -8 - }, - { - "name": "minecraft:stripped_bamboo_block", - "id": -528 - }, - { - "name": "minecraft:stripped_birch_log", - "id": -6 - }, - { - "name": "minecraft:stripped_cherry_log", - "id": -535 - }, - { - "name": "minecraft:stripped_cherry_wood", - "id": -545 - }, - { - "name": "minecraft:stripped_crimson_hyphae", - "id": -300 - }, - { - "name": "minecraft:stripped_crimson_stem", - "id": -240 - }, - { - "name": "minecraft:stripped_dark_oak_log", - "id": -9 - }, - { - "name": "minecraft:stripped_jungle_log", - "id": -7 - }, - { - "name": "minecraft:stripped_mangrove_log", - "id": -485 - }, - { - "name": "minecraft:stripped_mangrove_wood", - "id": -498 - }, - { - "name": "minecraft:stripped_oak_log", - "id": -10 - }, - { - "name": "minecraft:stripped_spruce_log", - "id": -5 - }, - { - "name": "minecraft:stripped_warped_hyphae", - "id": -301 - }, - { - "name": "minecraft:stripped_warped_stem", - "id": -241 - }, - { - "name": "minecraft:structure_block", - "id": 252 - }, - { - "name": "minecraft:structure_void", - "id": 217 - }, - { - "name": "minecraft:sugar", - "id": 418 - }, - { - "name": "minecraft:sugar_cane", - "id": 387 - }, - { - "name": "minecraft:suspicious_gravel", - "id": -573 - }, - { - "name": "minecraft:suspicious_sand", - "id": -529 - }, - { - "name": "minecraft:suspicious_stew", - "id": 597 - }, - { - "name": "minecraft:sweet_berries", - "id": 287 - }, - { - "name": "minecraft:sweet_berry_bush", - "id": -207 - }, - { - "name": "minecraft:tadpole_bucket", - "id": 637 - }, - { - "name": "minecraft:tadpole_spawn_egg", - "id": 636 - }, - { - "name": "minecraft:tallgrass", - "id": 31 - }, - { - "name": "minecraft:target", - "id": -239 - }, - { - "name": "minecraft:tide_armor_trim_smithing_template", - "id": 692 - }, - { - "name": "minecraft:tinted_glass", - "id": -334 - }, - { - "name": "minecraft:tnt", - "id": 46 - }, - { - "name": "minecraft:tnt_minecart", - "id": 532 - }, - { - "name": "minecraft:torch", - "id": 50 - }, - { - "name": "minecraft:torchflower", - "id": -568 - }, - { - "name": "minecraft:torchflower_crop", - "id": -567 - }, - { - "name": "minecraft:torchflower_seeds", - "id": 296 - }, - { - "name": "minecraft:totem_of_undying", - "id": 575 - }, - { - "name": "minecraft:trader_llama_spawn_egg", - "id": 655 - }, - { - "name": "minecraft:trapdoor", - "id": 96 - }, - { - "name": "minecraft:trapped_chest", - "id": 146 - }, - { - "name": "minecraft:trident", - "id": 553 - }, - { - "name": "minecraft:trip_wire", - "id": 132 - }, - { - "name": "minecraft:tripwire_hook", - "id": 131 - }, - { - "name": "minecraft:tropical_fish", - "id": 266 - }, - { - "name": "minecraft:tropical_fish_bucket", - "id": 368 - }, - { - "name": "minecraft:tropical_fish_spawn_egg", - "id": 481 - }, - { - "name": "minecraft:tube_coral", - "id": -131 - }, - { - "name": "minecraft:tuff", - "id": -333 - }, - { - "name": "minecraft:turtle_egg", - "id": -159 - }, - { - "name": "minecraft:turtle_helmet", - "id": 580 - }, - { - "name": "minecraft:turtle_spawn_egg", - "id": 487 - }, - { - "name": "minecraft:twisting_vines", - "id": -287 - }, - { - "name": "minecraft:underwater_torch", - "id": 239 - }, - { - "name": "minecraft:undyed_shulker_box", - "id": 205 - }, - { - "name": "minecraft:unknown", - "id": -305 - }, - { - "name": "minecraft:unlit_redstone_torch", - "id": 75 - }, - { - "name": "minecraft:unpowered_comparator", - "id": 149 - }, - { - "name": "minecraft:unpowered_repeater", - "id": 93 - }, - { - "name": "minecraft:verdant_froglight", - "id": -470 - }, - { - "name": "minecraft:vex_armor_trim_smithing_template", - "id": 691 - }, - { - "name": "minecraft:vex_spawn_egg", - "id": 478 - }, - { - "name": "minecraft:villager_spawn_egg", - "id": 451 - }, - { - "name": "minecraft:vindicator_spawn_egg", - "id": 476 - }, - { - "name": "minecraft:vine", - "id": 106 - }, - { - "name": "minecraft:wall_banner", - "id": 177 - }, - { - "name": "minecraft:wall_sign", - "id": 68 - }, - { - "name": "minecraft:wandering_trader_spawn_egg", - "id": 494 - }, - { - "name": "minecraft:ward_armor_trim_smithing_template", - "id": 689 - }, - { - "name": "minecraft:warden_spawn_egg", - "id": 639 - }, - { - "name": "minecraft:warped_button", - "id": -261 - }, - { - "name": "minecraft:warped_door", - "id": 624 - }, - { - "name": "minecraft:warped_double_slab", - "id": -267 - }, - { - "name": "minecraft:warped_fence", - "id": -257 - }, - { - "name": "minecraft:warped_fence_gate", - "id": -259 - }, - { - "name": "minecraft:warped_fungus", - "id": -229 - }, - { - "name": "minecraft:warped_fungus_on_a_stick", - "id": 625 - }, - { - "name": "minecraft:warped_hanging_sign", - "id": -507 - }, - { - "name": "minecraft:warped_hyphae", - "id": -298 - }, - { - "name": "minecraft:warped_nylium", - "id": -233 - }, - { - "name": "minecraft:warped_planks", - "id": -243 - }, - { - "name": "minecraft:warped_pressure_plate", - "id": -263 - }, - { - "name": "minecraft:warped_roots", - "id": -224 - }, - { - "name": "minecraft:warped_sign", - "id": 622 - }, - { - "name": "minecraft:warped_slab", - "id": -265 - }, - { - "name": "minecraft:warped_stairs", - "id": -255 - }, - { - "name": "minecraft:warped_standing_sign", - "id": -251 - }, - { - "name": "minecraft:warped_stem", - "id": -226 - }, - { - "name": "minecraft:warped_trapdoor", - "id": -247 - }, - { - "name": "minecraft:warped_wall_sign", - "id": -253 - }, - { - "name": "minecraft:warped_wart_block", - "id": -227 - }, - { - "name": "minecraft:water", - "id": 9 - }, - { - "name": "minecraft:water_bucket", - "id": 364 - }, - { - "name": "minecraft:waterlily", - "id": 111 - }, - { - "name": "minecraft:waxed_copper", - "id": -344 - }, - { - "name": "minecraft:waxed_cut_copper", - "id": -351 - }, - { - "name": "minecraft:waxed_cut_copper_slab", - "id": -365 - }, - { - "name": "minecraft:waxed_cut_copper_stairs", - "id": -358 - }, - { - "name": "minecraft:waxed_double_cut_copper_slab", - "id": -372 - }, - { - "name": "minecraft:waxed_exposed_copper", - "id": -345 - }, - { - "name": "minecraft:waxed_exposed_cut_copper", - "id": -352 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_slab", - "id": -366 - }, - { - "name": "minecraft:waxed_exposed_cut_copper_stairs", - "id": -359 - }, - { - "name": "minecraft:waxed_exposed_double_cut_copper_slab", - "id": -373 - }, - { - "name": "minecraft:waxed_oxidized_copper", - "id": -446 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper", - "id": -447 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_slab", - "id": -449 - }, - { - "name": "minecraft:waxed_oxidized_cut_copper_stairs", - "id": -448 - }, - { - "name": "minecraft:waxed_oxidized_double_cut_copper_slab", - "id": -450 - }, - { - "name": "minecraft:waxed_weathered_copper", - "id": -346 - }, - { - "name": "minecraft:waxed_weathered_cut_copper", - "id": -353 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_slab", - "id": -367 - }, - { - "name": "minecraft:waxed_weathered_cut_copper_stairs", - "id": -360 - }, - { - "name": "minecraft:waxed_weathered_double_cut_copper_slab", - "id": -374 - }, - { - "name": "minecraft:wayfinder_armor_trim_smithing_template", - "id": 697 - }, - { - "name": "minecraft:weathered_copper", - "id": -342 - }, - { - "name": "minecraft:weathered_cut_copper", - "id": -349 - }, - { - "name": "minecraft:weathered_cut_copper_slab", - "id": -363 - }, - { - "name": "minecraft:weathered_cut_copper_stairs", - "id": -356 - }, - { - "name": "minecraft:weathered_double_cut_copper_slab", - "id": -370 - }, - { - "name": "minecraft:web", - "id": 30 - }, - { - "name": "minecraft:weeping_vines", - "id": -231 - }, - { - "name": "minecraft:wheat", - "id": 336 - }, - { - "name": "minecraft:wheat_seeds", - "id": 291 - }, - { - "name": "minecraft:white_candle", - "id": -413 - }, - { - "name": "minecraft:white_candle_cake", - "id": -430 - }, - { - "name": "minecraft:white_carpet", - "id": 171 - }, - { - "name": "minecraft:white_concrete", - "id": 236 - }, - { - "name": "minecraft:white_concrete_powder", - "id": 237 - }, - { - "name": "minecraft:white_dye", - "id": 412 - }, - { - "name": "minecraft:white_glazed_terracotta", - "id": 220 - }, - { - "name": "minecraft:white_shulker_box", - "id": 218 - }, - { - "name": "minecraft:white_stained_glass", - "id": 241 - }, - { - "name": "minecraft:white_stained_glass_pane", - "id": 160 - }, - { - "name": "minecraft:white_terracotta", - "id": 159 - }, - { - "name": "minecraft:white_wool", - "id": 35 - }, - { - "name": "minecraft:wild_armor_trim_smithing_template", - "id": 688 - }, - { - "name": "minecraft:witch_spawn_egg", - "id": 454 - }, - { - "name": "minecraft:wither_rose", - "id": -216 - }, - { - "name": "minecraft:wither_skeleton_spawn_egg", - "id": 466 - }, - { - "name": "minecraft:wither_spawn_egg", - "id": 509 - }, - { - "name": "minecraft:wolf_spawn_egg", - "id": 441 - }, - { - "name": "minecraft:wood", - "id": -212 - }, - { - "name": "minecraft:wooden_axe", - "id": 313 - }, - { - "name": "minecraft:wooden_button", - "id": 143 - }, - { - "name": "minecraft:wooden_door", - "id": 361 - }, - { - "name": "minecraft:wooden_hoe", - "id": 331 - }, - { - "name": "minecraft:wooden_pickaxe", - "id": 312 - }, - { - "name": "minecraft:wooden_pressure_plate", - "id": 72 - }, - { - "name": "minecraft:wooden_shovel", - "id": 311 - }, - { - "name": "minecraft:wooden_slab", - "id": 158 - }, - { - "name": "minecraft:wooden_sword", - "id": 310 - }, - { - "name": "minecraft:wool", - "id": 703 - }, - { - "name": "minecraft:writable_book", - "id": 517 - }, - { - "name": "minecraft:written_book", - "id": 518 - }, - { - "name": "minecraft:yellow_candle", - "id": -417 - }, - { - "name": "minecraft:yellow_candle_cake", - "id": -434 - }, - { - "name": "minecraft:yellow_carpet", - "id": -600 - }, - { - "name": "minecraft:yellow_concrete", - "id": -631 - }, - { - "name": "minecraft:yellow_concrete_powder", - "id": -712 - }, - { - "name": "minecraft:yellow_dye", - "id": 408 - }, - { - "name": "minecraft:yellow_flower", - "id": 37 - }, - { - "name": "minecraft:yellow_glazed_terracotta", - "id": 224 - }, - { - "name": "minecraft:yellow_shulker_box", - "id": -616 - }, - { - "name": "minecraft:yellow_stained_glass", - "id": -676 - }, - { - "name": "minecraft:yellow_stained_glass_pane", - "id": -646 - }, - { - "name": "minecraft:yellow_terracotta", - "id": -727 - }, - { - "name": "minecraft:yellow_wool", - "id": -558 - }, - { - "name": "minecraft:zoglin_spawn_egg", - "id": 500 - }, - { - "name": "minecraft:zombie_horse_spawn_egg", - "id": 470 - }, - { - "name": "minecraft:zombie_pigman_spawn_egg", - "id": 450 - }, - { - "name": "minecraft:zombie_spawn_egg", - "id": 449 - }, - { - "name": "minecraft:zombie_villager_spawn_egg", - "id": 479 - } -] \ No newline at end of file From f0e983977a35e80ed19f7488ec58dadcb8b9ab04 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:39:52 -0500 Subject: [PATCH 22/54] update mappings --- core/src/main/resources/mappings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/mappings b/core/src/main/resources/mappings index 31ce17e12e9..ad4b7952e99 160000 --- a/core/src/main/resources/mappings +++ b/core/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit 31ce17e12e991bd841270b99f461641093f42564 +Subproject commit ad4b7952e997aaff144e2ce80e9552c8db93b8f1 From c7da8fe16302eb9ebfa6a584dc45b0f0b0ba1955 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 30 Nov 2023 01:58:35 -0500 Subject: [PATCH 23/54] Better nullability annotations/handling for ItemStacks --- .../org/geysermc/geyser/inventory/GeyserItemStack.java | 7 ++++--- .../geyser/inventory/recipe/GeyserShapedRecipe.java | 3 ++- .../geyser/inventory/recipe/GeyserShapelessRecipe.java | 3 ++- .../geyser/inventory/recipe/GeyserStonecutterData.java | 3 ++- core/src/main/java/org/geysermc/geyser/item/Items.java | 2 ++ .../main/java/org/geysermc/geyser/item/type/Item.java | 3 ++- .../org/geysermc/geyser/registry/type/ItemMappings.java | 2 +- .../geyser/translator/inventory/item/ItemTranslator.java | 5 +++-- .../bedrock/BedrockBlockPickRequestTranslator.java | 2 +- .../java/inventory/JavaContainerSetSlotTranslator.java | 2 +- .../java/inventory/JavaMerchantOffersTranslator.java | 5 +++-- .../java/org/geysermc/geyser/util/InventoryUtils.java | 9 +++++---- gradle/libs.versions.toml | 2 +- 13 files changed, 29 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java index a67516c5c99..4ff8db9f064 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java @@ -34,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; @@ -42,7 +43,7 @@ @Data public class GeyserItemStack { - public static final GeyserItemStack EMPTY = new GeyserItemStack(0, 0, null); + public static final GeyserItemStack EMPTY = new GeyserItemStack(Items.AIR_ID, 0, null); private final int javaId; private int amount; @@ -64,7 +65,7 @@ private GeyserItemStack(int javaId, int amount, CompoundTag nbt, int netId) { this.netId = netId; } - public static @NonNull GeyserItemStack from(ItemStack itemStack) { + public static @NonNull GeyserItemStack from(@Nullable ItemStack itemStack) { return itemStack == null ? EMPTY : new GeyserItemStack(itemStack.getId(), itemStack.getAmount(), itemStack.getNbt()); } @@ -122,7 +123,7 @@ public Item asItem() { } public boolean isEmpty() { - return amount <= 0 || javaId == 0; + return amount <= 0 || javaId == Items.AIR_ID; } public GeyserItemStack copy() { diff --git a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java index d61945ad8d7..05c17cf9f3d 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapedRecipe.java @@ -28,8 +28,9 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.recipe.Ingredient; import com.github.steveice10.mc.protocol.data.game.recipe.data.ShapedRecipeData; +import org.checkerframework.checker.nullness.qual.Nullable; -public record GeyserShapedRecipe(int width, int height, Ingredient[] ingredients, ItemStack result) implements GeyserRecipe { +public record GeyserShapedRecipe(int width, int height, Ingredient[] ingredients, @Nullable ItemStack result) implements GeyserRecipe { public GeyserShapedRecipe(ShapedRecipeData data) { this(data.getWidth(), data.getHeight(), data.getIngredients(), data.getResult()); diff --git a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapelessRecipe.java b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapelessRecipe.java index 6c7665bbbea..e300e3ec822 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapelessRecipe.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserShapelessRecipe.java @@ -28,8 +28,9 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.recipe.Ingredient; import com.github.steveice10.mc.protocol.data.game.recipe.data.ShapelessRecipeData; +import org.checkerframework.checker.nullness.qual.Nullable; -public record GeyserShapelessRecipe(Ingredient[] ingredients, ItemStack result) implements GeyserRecipe { +public record GeyserShapelessRecipe(Ingredient[] ingredients, @Nullable ItemStack result) implements GeyserRecipe { public GeyserShapelessRecipe(ShapelessRecipeData data) { this(data.getIngredients(), data.getResult()); diff --git a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserStonecutterData.java b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserStonecutterData.java index 04a772c31fd..22163eced1a 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserStonecutterData.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/recipe/GeyserStonecutterData.java @@ -26,10 +26,11 @@ package org.geysermc.geyser.inventory.recipe; import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; +import org.checkerframework.checker.nullness.qual.Nullable; /** * @param buttonId the button that needs to be pressed for Java Edition to accept this item. * @param output the expected output of this item when cut. */ -public record GeyserStonecutterData(int buttonId, ItemStack output) { +public record GeyserStonecutterData(int buttonId, @Nullable ItemStack output) { } diff --git a/core/src/main/java/org/geysermc/geyser/item/Items.java b/core/src/main/java/org/geysermc/geyser/item/Items.java index 92c446f6855..e84315fd8bd 100644 --- a/core/src/main/java/org/geysermc/geyser/item/Items.java +++ b/core/src/main/java/org/geysermc/geyser/item/Items.java @@ -1351,6 +1351,8 @@ public final class Items { public static final Item TRIAL_SPAWNER = register(new BlockItem("trial_spawner", builder())); public static final Item TRIAL_KEY = register(new Item("trial_key", builder())); + public static final int AIR_ID = AIR.javaId(); + private static T register(T item) { return register(item, Registries.JAVA_ITEMS.get().size()); } diff --git a/core/src/main/java/org/geysermc/geyser/item/type/Item.java b/core/src/main/java/org/geysermc/geyser/item/type/Item.java index a7a59f6af4b..94bb3324eb7 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/Item.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/Item.java @@ -40,6 +40,7 @@ import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.InventoryUtils; import java.util.ArrayList; import java.util.List; @@ -82,7 +83,7 @@ public boolean isValidRepairItem(Item other) { /* Translation methods to Bedrock and back */ public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) { - if (itemStack == null) { + if (InventoryUtils.isEmpty(itemStack)) { // Return, essentially, air return ItemData.builder(); } diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java index 704d5c21129..40359b437fa 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java @@ -83,7 +83,7 @@ public class ItemMappings implements DefinitionRegistry { * @return an item entry from the given java edition identifier */ @NonNull - public ItemMapping getMapping(ItemStack itemStack) { + public ItemMapping getMapping(@NonNull ItemStack itemStack) { return this.getMapping(itemStack.getId()); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java index 856b22c9bcb..d1a25655109 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/ItemTranslator.java @@ -67,6 +67,7 @@ import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.InventoryUtils; import java.text.DecimalFormat; import java.util.*; @@ -89,7 +90,7 @@ private ItemTranslator() { */ public static ItemStack translateToJava(ItemData data, ItemMappings mappings) { if (data == null) { - return new ItemStack(0); + return new ItemStack(Items.AIR_ID); } ItemMapping bedrockItem = mappings.getMapping(data); @@ -118,7 +119,7 @@ public static ItemStack translateToJava(ItemData data, ItemMappings mappings) { @NonNull public static ItemData translateToBedrock(GeyserSession session, ItemStack stack) { - if (stack == null) { + if (InventoryUtils.isEmpty(stack)) { return ItemData.AIR; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockPickRequestTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockPickRequestTranslator.java index dd1a259fd90..381adf2b7e9 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockPickRequestTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockBlockPickRequestTranslator.java @@ -56,7 +56,7 @@ public void translate(GeyserSession session, BlockPickRequestPacket packet) { ItemFrameEntity entity = ItemFrameEntity.getItemFrameEntity(session, packet.getBlockPosition()); if (entity != null) { // Check to see if the item frame has an item in it first - if (entity.getHeldItem() != null && entity.getHeldItem().getId() != 0) { + if (!InventoryUtils.isEmpty(entity.getHeldItem())) { // Grab the item in the frame InventoryUtils.findOrCreateItem(session, entity.getHeldItem()); } else { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java index 4806de09cb6..734c6945a1d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java @@ -118,7 +118,7 @@ private static void updateCraftingGrid(GeyserSession session, int slot, ItemStac return; } - if (item == null || item.getId() == 0) { + if (InventoryUtils.isEmpty(item)) { return; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java index 2758902d43d..17a4314ec53 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaMerchantOffersTranslator.java @@ -44,6 +44,7 @@ import org.geysermc.geyser.translator.inventory.item.ItemTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.geyser.util.InventoryUtils; import org.geysermc.geyser.util.MathUtils; import java.util.ArrayList; @@ -158,14 +159,14 @@ public static void openMerchant(GeyserSession session, ClientboundMerchantOffers } private static NbtMap getItemTag(GeyserSession session, ItemStack stack) { - if (stack == null || stack.getAmount() <= 0) { // Negative item counts appear as air on Java + if (InventoryUtils.isEmpty(stack)) { // Negative item counts appear as air on Java return NbtMap.EMPTY; } return getItemTag(session, stack, session.getItemMappings().getMapping(stack), stack.getAmount()); } private static NbtMap getItemTag(GeyserSession session, ItemStack stack, int specialPrice, int demand, float priceMultiplier) { - if (stack == null || stack.getAmount() <= 0) { // Negative item counts appear as air on Java + if (InventoryUtils.isEmpty(stack)) { // Negative item counts appear as air on Java return NbtMap.EMPTY; } ItemMapping mapping = session.getItemMappings().getMapping(stack); diff --git a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java index f1bf03d90c9..4d91f853cbf 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java @@ -61,6 +61,7 @@ import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator; import org.geysermc.geyser.translator.inventory.chest.DoubleChestInventoryTranslator; +import org.jetbrains.annotations.Contract; import java.util.Arrays; import java.util.Collections; @@ -181,8 +182,9 @@ public static boolean canStack(GeyserItemStack item1, GeyserItemStack item2) { /** * Checks to see if an item stack represents air or has no count. */ + @Contract("null -> true") public static boolean isEmpty(@Nullable ItemStack itemStack) { - return itemStack == null || itemStack.getId() == Items.AIR.javaId() || itemStack.getAmount() <= 0; + return itemStack == null || itemStack.getId() == Items.AIR_ID || itemStack.getAmount() <= 0; } /** @@ -233,11 +235,10 @@ public static IntFunction getUpgradeTemplate() { * @param itemStack the item to try to find a match for. NBT will also be accounted for. */ public static void findOrCreateItem(GeyserSession session, ItemStack itemStack) { - PlayerInventory inventory = session.getPlayerInventory(); - - if (itemStack == null || itemStack.getId() == 0) { + if (isEmpty(itemStack)) { return; } + PlayerInventory inventory = session.getPlayerInventory(); // Check hotbar for item for (int i = 36; i < 45; i++) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 22332880a32..faacaca2af3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "00bce42" +mcprotocollib = "c6ba2fa" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" From 701e567818abc20e6ac549653284985337c0f56f Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 30 Nov 2023 02:51:48 -0500 Subject: [PATCH 24/54] Enable 1.21 experimental features --- .../org/geysermc/geyser/network/UpstreamPacketHandler.java | 3 +++ .../main/java/org/geysermc/geyser/session/GeyserSession.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index 358d8df5928..a0b104adb0c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -232,6 +232,9 @@ public PacketSignal handle(ResourcePackClientResponsePacket packet) { stackPacket.getExperiments().add(new ExperimentData("data_driven_items", true)); } + // Required for experimental 1.21 features + stackPacket.getExperiments().add(new ExperimentData("updateAnnouncedLive2023", true)); + session.sendUpstreamPacket(stackPacket); break; diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 265a978ffb0..28ad5887c42 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1544,6 +1544,8 @@ private void startGame() { startGamePacket.getExperiments().add(new ExperimentData("upcoming_creator_features", true)); // Needed for certain molang queries used in blocks and items startGamePacket.getExperiments().add(new ExperimentData("experimental_molang_features", true)); + // Required for experimental 1.21 features + startGamePacket.getExperiments().add(new ExperimentData("updateAnnouncedLive2023", true)); startGamePacket.setVanillaVersion("*"); startGamePacket.setInventoriesServerAuthoritative(true); From 9b53f2efd140846ccabba075d9785d60a26c10be Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 30 Nov 2023 02:53:05 -0500 Subject: [PATCH 25/54] Update 1.20.50 creative items to include experimental items also remove the old unused ones --- .../bedrock/creative_items.1_20_0.json | 6580 ----------------- .../bedrock/creative_items.1_20_10.json | 5793 --------------- .../bedrock/creative_items.1_20_30.json | 5787 --------------- .../bedrock/creative_items.1_20_50.json | 208 + 4 files changed, 208 insertions(+), 18160 deletions(-) delete mode 100644 core/src/main/resources/bedrock/creative_items.1_20_0.json delete mode 100644 core/src/main/resources/bedrock/creative_items.1_20_10.json delete mode 100644 core/src/main/resources/bedrock/creative_items.1_20_30.json diff --git a/core/src/main/resources/bedrock/creative_items.1_20_0.json b/core/src/main/resources/bedrock/creative_items.1_20_0.json deleted file mode 100644 index 0c37c88a0fd..00000000000 --- a/core/src/main/resources/bedrock/creative_items.1_20_0.json +++ /dev/null @@ -1,6580 +0,0 @@ -{ - "items": [ - { - "id": "minecraft:planks", - "blockRuntimeId": 10437 - }, - { - "id": "minecraft:planks", - "blockRuntimeId": 10438 - }, - { - "id": "minecraft:planks", - "blockRuntimeId": 10439 - }, - { - "id": "minecraft:planks", - "blockRuntimeId": 10440 - }, - { - "id": "minecraft:planks", - "blockRuntimeId": 10441 - }, - { - "id": "minecraft:planks", - "blockRuntimeId": 10442 - }, - { - "id": "minecraft:mangrove_planks", - "blockRuntimeId": 2068 - }, - { - "id": "minecraft:cherry_planks", - "blockRuntimeId": 12582 - }, - { - "id": "minecraft:bamboo_planks", - "blockRuntimeId": 8786 - }, - { - "id": "minecraft:bamboo_mosaic", - "blockRuntimeId": 13109 - }, - { - "id": "minecraft:crimson_planks", - "blockRuntimeId": 7977 - }, - { - "id": "minecraft:warped_planks", - "blockRuntimeId": 2039 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2296 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2297 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2298 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2299 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2300 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2301 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2308 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2303 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2304 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2302 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2305 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2309 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2306 - }, - { - "id": "minecraft:cobblestone_wall", - "blockRuntimeId": 2307 - }, - { - "id": "minecraft:blackstone_wall", - "blockRuntimeId": 6189 - }, - { - "id": "minecraft:polished_blackstone_wall", - "blockRuntimeId": 11115 - }, - { - "id": "minecraft:polished_blackstone_brick_wall", - "blockRuntimeId": 2077 - }, - { - "id": "minecraft:cobbled_deepslate_wall", - "blockRuntimeId": 12915 - }, - { - "id": "minecraft:deepslate_tile_wall", - "blockRuntimeId": 8217 - }, - { - "id": "minecraft:polished_deepslate_wall", - "blockRuntimeId": 12647 - }, - { - "id": "minecraft:deepslate_brick_wall", - "blockRuntimeId": 1154 - }, - { - "id": "minecraft:mud_brick_wall", - "blockRuntimeId": 1833 - }, - { - "id": "minecraft:oak_fence", - "blockRuntimeId": 8915 - }, - { - "id": "minecraft:spruce_fence", - "blockRuntimeId": 1116 - }, - { - "id": "minecraft:birch_fence", - "blockRuntimeId": 12910 - }, - { - "id": "minecraft:jungle_fence", - "blockRuntimeId": 1109 - }, - { - "id": "minecraft:acacia_fence", - "blockRuntimeId": 12913 - }, - { - "id": "minecraft:dark_oak_fence", - "blockRuntimeId": 11485 - }, - { - "id": "minecraft:mangrove_fence", - "blockRuntimeId": 11031 - }, - { - "id": "minecraft:cherry_fence", - "blockRuntimeId": 2067 - }, - { - "id": "minecraft:bamboo_fence", - "blockRuntimeId": 1337 - }, - { - "id": "minecraft:nether_brick_fence", - "blockRuntimeId": 6556 - }, - { - "id": "minecraft:crimson_fence", - "blockRuntimeId": 12826 - }, - { - "id": "minecraft:warped_fence", - "blockRuntimeId": 9420 - }, - { - "id": "minecraft:fence_gate", - "blockRuntimeId": 79 - }, - { - "id": "minecraft:spruce_fence_gate", - "blockRuntimeId": 10982 - }, - { - "id": "minecraft:birch_fence_gate", - "blockRuntimeId": 5658 - }, - { - "id": "minecraft:jungle_fence_gate", - "blockRuntimeId": 8528 - }, - { - "id": "minecraft:acacia_fence_gate", - "blockRuntimeId": 12406 - }, - { - "id": "minecraft:dark_oak_fence_gate", - "blockRuntimeId": 6432 - }, - { - "id": "minecraft:mangrove_fence_gate", - "blockRuntimeId": 6943 - }, - { - "id": "minecraft:cherry_fence_gate", - "blockRuntimeId": 13086 - }, - { - "id": "minecraft:bamboo_fence_gate", - "blockRuntimeId": 8192 - }, - { - "id": "minecraft:crimson_fence_gate", - "blockRuntimeId": 7395 - }, - { - "id": "minecraft:warped_fence_gate", - "blockRuntimeId": 8563 - }, - { - "id": "minecraft:normal_stone_stairs", - "blockRuntimeId": 1338 - }, - { - "id": "minecraft:stone_stairs", - "blockRuntimeId": 5584 - }, - { - "id": "minecraft:mossy_cobblestone_stairs", - "blockRuntimeId": 6351 - }, - { - "id": "minecraft:oak_stairs", - "blockRuntimeId": 702 - }, - { - "id": "minecraft:spruce_stairs", - "blockRuntimeId": 132 - }, - { - "id": "minecraft:birch_stairs", - "blockRuntimeId": 11403 - }, - { - "id": "minecraft:jungle_stairs", - "blockRuntimeId": 11364 - }, - { - "id": "minecraft:acacia_stairs", - "blockRuntimeId": 10582 - }, - { - "id": "minecraft:dark_oak_stairs", - "blockRuntimeId": 8209 - }, - { - "id": "minecraft:mangrove_stairs", - "blockRuntimeId": 6901 - }, - { - "id": "minecraft:cherry_stairs", - "blockRuntimeId": 11534 - }, - { - "id": "minecraft:bamboo_stairs", - "blockRuntimeId": 1819 - }, - { - "id": "minecraft:bamboo_mosaic_stairs", - "blockRuntimeId": 10590 - }, - { - "id": "minecraft:stone_brick_stairs", - "blockRuntimeId": 2051 - }, - { - "id": "minecraft:mossy_stone_brick_stairs", - "blockRuntimeId": 9850 - }, - { - "id": "minecraft:sandstone_stairs", - "blockRuntimeId": 5458 - }, - { - "id": "minecraft:smooth_sandstone_stairs", - "blockRuntimeId": 5503 - }, - { - "id": "minecraft:red_sandstone_stairs", - "blockRuntimeId": 8513 - }, - { - "id": "minecraft:smooth_red_sandstone_stairs", - "blockRuntimeId": 8711 - }, - { - "id": "minecraft:granite_stairs", - "blockRuntimeId": 5024 - }, - { - "id": "minecraft:polished_granite_stairs", - "blockRuntimeId": 6409 - }, - { - "id": "minecraft:diorite_stairs", - "blockRuntimeId": 6694 - }, - { - "id": "minecraft:polished_diorite_stairs", - "blockRuntimeId": 11100 - }, - { - "id": "minecraft:andesite_stairs", - "blockRuntimeId": 8470 - }, - { - "id": "minecraft:polished_andesite_stairs", - "blockRuntimeId": 11428 - }, - { - "id": "minecraft:brick_stairs", - "blockRuntimeId": 10928 - }, - { - "id": "minecraft:nether_brick_stairs", - "blockRuntimeId": 109 - }, - { - "id": "minecraft:red_nether_brick_stairs", - "blockRuntimeId": 11000 - }, - { - "id": "minecraft:end_brick_stairs", - "blockRuntimeId": 10776 - }, - { - "id": "minecraft:quartz_stairs", - "blockRuntimeId": 7509 - }, - { - "id": "minecraft:smooth_quartz_stairs", - "blockRuntimeId": 12521 - }, - { - "id": "minecraft:purpur_stairs", - "blockRuntimeId": 12584 - }, - { - "id": "minecraft:prismarine_stairs", - "blockRuntimeId": 12087 - }, - { - "id": "minecraft:dark_prismarine_stairs", - "blockRuntimeId": 12250 - }, - { - "id": "minecraft:prismarine_bricks_stairs", - "blockRuntimeId": 612 - }, - { - "id": "minecraft:crimson_stairs", - "blockRuntimeId": 10674 - }, - { - "id": "minecraft:warped_stairs", - "blockRuntimeId": 5594 - }, - { - "id": "minecraft:blackstone_stairs", - "blockRuntimeId": 11419 - }, - { - "id": "minecraft:polished_blackstone_stairs", - "blockRuntimeId": 6596 - }, - { - "id": "minecraft:polished_blackstone_brick_stairs", - "blockRuntimeId": 6783 - }, - { - "id": "minecraft:cut_copper_stairs", - "blockRuntimeId": 6910 - }, - { - "id": "minecraft:exposed_cut_copper_stairs", - "blockRuntimeId": 6893 - }, - { - "id": "minecraft:weathered_cut_copper_stairs", - "blockRuntimeId": 6604 - }, - { - "id": "minecraft:oxidized_cut_copper_stairs", - "blockRuntimeId": 1073 - }, - { - "id": "minecraft:waxed_cut_copper_stairs", - "blockRuntimeId": 1118 - }, - { - "id": "minecraft:waxed_exposed_cut_copper_stairs", - "blockRuntimeId": 6161 - }, - { - "id": "minecraft:waxed_weathered_cut_copper_stairs", - "blockRuntimeId": 10549 - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_stairs", - "blockRuntimeId": 9395 - }, - { - "id": "minecraft:cobbled_deepslate_stairs", - "blockRuntimeId": 552 - }, - { - "id": "minecraft:deepslate_tile_stairs", - "blockRuntimeId": 7387 - }, - { - "id": "minecraft:polished_deepslate_stairs", - "blockRuntimeId": 1014 - }, - { - "id": "minecraft:deepslate_brick_stairs", - "blockRuntimeId": 12242 - }, - { - "id": "minecraft:mud_brick_stairs", - "blockRuntimeId": 8687 - }, - { - "id": "minecraft:wooden_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spruce_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:birch_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:jungle_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:acacia_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dark_oak_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mangrove_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cherry_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bamboo_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:crimson_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:warped_door", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:trapdoor", - "blockRuntimeId": 640 - }, - { - "id": "minecraft:spruce_trapdoor", - "blockRuntimeId": 10950 - }, - { - "id": "minecraft:birch_trapdoor", - "blockRuntimeId": 11048 - }, - { - "id": "minecraft:jungle_trapdoor", - "blockRuntimeId": 8544 - }, - { - "id": "minecraft:acacia_trapdoor", - "blockRuntimeId": 8754 - }, - { - "id": "minecraft:dark_oak_trapdoor", - "blockRuntimeId": 12322 - }, - { - "id": "minecraft:mangrove_trapdoor", - "blockRuntimeId": 6791 - }, - { - "id": "minecraft:cherry_trapdoor", - "blockRuntimeId": 2013 - }, - { - "id": "minecraft:bamboo_trapdoor", - "blockRuntimeId": 8409 - }, - { - "id": "minecraft:iron_trapdoor", - "blockRuntimeId": 1041 - }, - { - "id": "minecraft:crimson_trapdoor", - "blockRuntimeId": 6635 - }, - { - "id": "minecraft:warped_trapdoor", - "blockRuntimeId": 7475 - }, - { - "id": "minecraft:iron_bars", - "blockRuntimeId": 7543 - }, - { - "id": "minecraft:glass", - "blockRuntimeId": 10546 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2239 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2247 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2246 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2254 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2251 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2253 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2240 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2243 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2244 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2252 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2248 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2242 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2250 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2249 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2241 - }, - { - "id": "minecraft:stained_glass", - "blockRuntimeId": 2245 - }, - { - "id": "minecraft:tinted_glass", - "blockRuntimeId": 9944 - }, - { - "id": "minecraft:glass_pane", - "blockRuntimeId": 8379 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7979 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7987 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7986 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7994 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7991 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7993 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7980 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7983 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7984 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7992 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7988 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7982 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7990 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7989 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7981 - }, - { - "id": "minecraft:stained_glass_pane", - "blockRuntimeId": 7985 - }, - { - "id": "minecraft:ladder", - "blockRuntimeId": 13114 - }, - { - "id": "minecraft:scaffolding", - "blockRuntimeId": 5442 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6534 - }, - { - "id": "minecraft:stone_block_slab4", - "blockRuntimeId": 8989 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6537 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8960 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8432 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8433 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8434 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8435 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8436 - }, - { - "id": "minecraft:wooden_slab", - "blockRuntimeId": 8437 - }, - { - "id": "minecraft:mangrove_slab", - "blockRuntimeId": 2255 - }, - { - "id": "minecraft:cherry_slab", - "blockRuntimeId": 10614 - }, - { - "id": "minecraft:bamboo_slab", - "blockRuntimeId": 10926 - }, - { - "id": "minecraft:bamboo_mosaic_slab", - "blockRuntimeId": 4572 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6539 - }, - { - "id": "minecraft:stone_block_slab4", - "blockRuntimeId": 8987 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6535 - }, - { - "id": "minecraft:stone_block_slab4", - "blockRuntimeId": 8990 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8961 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8955 - }, - { - "id": "minecraft:stone_block_slab4", - "blockRuntimeId": 8991 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8972 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8977 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8978 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8975 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8976 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8974 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8973 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6538 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6541 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8962 - }, - { - "id": "minecraft:stone_block_slab3", - "blockRuntimeId": 8971 - }, - { - "id": "minecraft:stone_block_slab", - "blockRuntimeId": 6540 - }, - { - "id": "minecraft:stone_block_slab4", - "blockRuntimeId": 8988 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8956 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8957 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8958 - }, - { - "id": "minecraft:stone_block_slab2", - "blockRuntimeId": 8959 - }, - { - "id": "minecraft:crimson_slab", - "blockRuntimeId": 9867 - }, - { - "id": "minecraft:warped_slab", - "blockRuntimeId": 10890 - }, - { - "id": "minecraft:blackstone_slab", - "blockRuntimeId": 2029 - }, - { - "id": "minecraft:polished_blackstone_slab", - "blockRuntimeId": 10372 - }, - { - "id": "minecraft:polished_blackstone_brick_slab", - "blockRuntimeId": 6453 - }, - { - "id": "minecraft:cut_copper_slab", - "blockRuntimeId": 8381 - }, - { - "id": "minecraft:exposed_cut_copper_slab", - "blockRuntimeId": 10998 - }, - { - "id": "minecraft:weathered_cut_copper_slab", - "blockRuntimeId": 10418 - }, - { - "id": "minecraft:oxidized_cut_copper_slab", - "blockRuntimeId": 8444 - }, - { - "id": "minecraft:waxed_cut_copper_slab", - "blockRuntimeId": 12645 - }, - { - "id": "minecraft:waxed_exposed_cut_copper_slab", - "blockRuntimeId": 660 - }, - { - "id": "minecraft:waxed_weathered_cut_copper_slab", - "blockRuntimeId": 10943 - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_slab", - "blockRuntimeId": 1803 - }, - { - "id": "minecraft:cobbled_deepslate_slab", - "blockRuntimeId": 12135 - }, - { - "id": "minecraft:polished_deepslate_slab", - "blockRuntimeId": 720 - }, - { - "id": "minecraft:deepslate_tile_slab", - "blockRuntimeId": 6557 - }, - { - "id": "minecraft:deepslate_brick_slab", - "blockRuntimeId": 5592 - }, - { - "id": "minecraft:mud_brick_slab", - "blockRuntimeId": 6169 - }, - { - "id": "minecraft:brick_block", - "blockRuntimeId": 7507 - }, - { - "id": "minecraft:chiseled_nether_bricks", - "blockRuntimeId": 12067 - }, - { - "id": "minecraft:cracked_nether_bricks", - "blockRuntimeId": 6858 - }, - { - "id": "minecraft:quartz_bricks", - "blockRuntimeId": 10745 - }, - { - "id": "minecraft:stonebrick", - "blockRuntimeId": 10945 - }, - { - "id": "minecraft:stonebrick", - "blockRuntimeId": 10946 - }, - { - "id": "minecraft:stonebrick", - "blockRuntimeId": 10947 - }, - { - "id": "minecraft:stonebrick", - "blockRuntimeId": 10948 - }, - { - "id": "minecraft:end_bricks", - "blockRuntimeId": 713 - }, - { - "id": "minecraft:prismarine", - "blockRuntimeId": 10469 - }, - { - "id": "minecraft:polished_blackstone_bricks", - "blockRuntimeId": 7414 - }, - { - "id": "minecraft:cracked_polished_blackstone_bricks", - "blockRuntimeId": 12016 - }, - { - "id": "minecraft:gilded_blackstone", - "blockRuntimeId": 6892 - }, - { - "id": "minecraft:chiseled_polished_blackstone", - "blockRuntimeId": 8208 - }, - { - "id": "minecraft:deepslate_tiles", - "blockRuntimeId": 6887 - }, - { - "id": "minecraft:cracked_deepslate_tiles", - "blockRuntimeId": 6419 - }, - { - "id": "minecraft:deepslate_bricks", - "blockRuntimeId": 8628 - }, - { - "id": "minecraft:cracked_deepslate_bricks", - "blockRuntimeId": 8527 - }, - { - "id": "minecraft:chiseled_deepslate", - "blockRuntimeId": 8380 - }, - { - "id": "minecraft:cobblestone", - "blockRuntimeId": 5489 - }, - { - "id": "minecraft:mossy_cobblestone", - "blockRuntimeId": 663 - }, - { - "id": "minecraft:cobbled_deepslate", - "blockRuntimeId": 11068 - }, - { - "id": "minecraft:smooth_stone", - "blockRuntimeId": 6888 - }, - { - "id": "minecraft:sandstone", - "blockRuntimeId": 5529 - }, - { - "id": "minecraft:sandstone", - "blockRuntimeId": 5530 - }, - { - "id": "minecraft:sandstone", - "blockRuntimeId": 5531 - }, - { - "id": "minecraft:sandstone", - "blockRuntimeId": 5532 - }, - { - "id": "minecraft:red_sandstone", - "blockRuntimeId": 10978 - }, - { - "id": "minecraft:red_sandstone", - "blockRuntimeId": 10979 - }, - { - "id": "minecraft:red_sandstone", - "blockRuntimeId": 10980 - }, - { - "id": "minecraft:red_sandstone", - "blockRuntimeId": 10981 - }, - { - "id": "minecraft:coal_block", - "blockRuntimeId": 8561 - }, - { - "id": "minecraft:dried_kelp_block", - "blockRuntimeId": 12809 - }, - { - "id": "minecraft:gold_block", - "blockRuntimeId": 755 - }, - { - "id": "minecraft:iron_block", - "blockRuntimeId": 13113 - }, - { - "id": "minecraft:copper_block", - "blockRuntimeId": 7385 - }, - { - "id": "minecraft:exposed_copper", - "blockRuntimeId": 1318 - }, - { - "id": "minecraft:weathered_copper", - "blockRuntimeId": 13079 - }, - { - "id": "minecraft:oxidized_copper", - "blockRuntimeId": 5424 - }, - { - "id": "minecraft:waxed_copper", - "blockRuntimeId": 12561 - }, - { - "id": "minecraft:waxed_exposed_copper", - "blockRuntimeId": 1789 - }, - { - "id": "minecraft:waxed_weathered_copper", - "blockRuntimeId": 1802 - }, - { - "id": "minecraft:waxed_oxidized_copper", - "blockRuntimeId": 12362 - }, - { - "id": "minecraft:cut_copper", - "blockRuntimeId": 7423 - }, - { - "id": "minecraft:exposed_cut_copper", - "blockRuntimeId": 10548 - }, - { - "id": "minecraft:weathered_cut_copper", - "blockRuntimeId": 11999 - }, - { - "id": "minecraft:oxidized_cut_copper", - "blockRuntimeId": 8642 - }, - { - "id": "minecraft:waxed_cut_copper", - "blockRuntimeId": 12118 - }, - { - "id": "minecraft:waxed_exposed_cut_copper", - "blockRuntimeId": 5690 - }, - { - "id": "minecraft:waxed_weathered_cut_copper", - "blockRuntimeId": 7978 - }, - { - "id": "minecraft:waxed_oxidized_cut_copper", - "blockRuntimeId": 620 - }, - { - "id": "minecraft:emerald_block", - "blockRuntimeId": 2265 - }, - { - "id": "minecraft:diamond_block", - "blockRuntimeId": 701 - }, - { - "id": "minecraft:lapis_block", - "blockRuntimeId": 6550 - }, - { - "id": "minecraft:raw_iron_block", - "blockRuntimeId": 13110 - }, - { - "id": "minecraft:raw_copper_block", - "blockRuntimeId": 8431 - }, - { - "id": "minecraft:raw_gold_block", - "blockRuntimeId": 1083 - }, - { - "id": "minecraft:quartz_block", - "blockRuntimeId": 5572 - }, - { - "id": "minecraft:quartz_block", - "blockRuntimeId": 5574 - }, - { - "id": "minecraft:quartz_block", - "blockRuntimeId": 5573 - }, - { - "id": "minecraft:quartz_block", - "blockRuntimeId": 5575 - }, - { - "id": "minecraft:prismarine", - "blockRuntimeId": 10467 - }, - { - "id": "minecraft:prismarine", - "blockRuntimeId": 10468 - }, - { - "id": "minecraft:slime", - "blockRuntimeId": 6494 - }, - { - "id": "minecraft:honey_block", - "blockRuntimeId": 1995 - }, - { - "id": "minecraft:honeycomb_block", - "blockRuntimeId": 6782 - }, - { - "id": "minecraft:hay_block", - "blockRuntimeId": 1790 - }, - { - "id": "minecraft:bone_block", - "blockRuntimeId": 6495 - }, - { - "id": "minecraft:nether_brick", - "blockRuntimeId": 12097 - }, - { - "id": "minecraft:red_nether_brick", - "blockRuntimeId": 551 - }, - { - "id": "minecraft:netherite_block", - "blockRuntimeId": 5655 - }, - { - "id": "minecraft:lodestone", - "blockRuntimeId": 13108 - }, - { - "id": "minecraft:white_wool", - "blockRuntimeId": 8562 - }, - { - "id": "minecraft:light_gray_wool", - "blockRuntimeId": 12885 - }, - { - "id": "minecraft:gray_wool", - "blockRuntimeId": 632 - }, - { - "id": "minecraft:black_wool", - "blockRuntimeId": 1084 - }, - { - "id": "minecraft:brown_wool", - "blockRuntimeId": 684 - }, - { - "id": "minecraft:red_wool", - "blockRuntimeId": 119 - }, - { - "id": "minecraft:orange_wool", - "blockRuntimeId": 1771 - }, - { - "id": "minecraft:yellow_wool", - "blockRuntimeId": 542 - }, - { - "id": "minecraft:lime_wool", - "blockRuntimeId": 10361 - }, - { - "id": "minecraft:green_wool", - "blockRuntimeId": 5603 - }, - { - "id": "minecraft:cyan_wool", - "blockRuntimeId": 8506 - }, - { - "id": "minecraft:light_blue_wool", - "blockRuntimeId": 11483 - }, - { - "id": "minecraft:blue_wool", - "blockRuntimeId": 8643 - }, - { - "id": "minecraft:purple_wool", - "blockRuntimeId": 13112 - }, - { - "id": "minecraft:magenta_wool", - "blockRuntimeId": 2070 - }, - { - "id": "minecraft:pink_wool", - "blockRuntimeId": 5656 - }, - { - "id": "minecraft:white_carpet", - "blockRuntimeId": 12095 - }, - { - "id": "minecraft:light_gray_carpet", - "blockRuntimeId": 13111 - }, - { - "id": "minecraft:gray_carpet", - "blockRuntimeId": 633 - }, - { - "id": "minecraft:black_carpet", - "blockRuntimeId": 10399 - }, - { - "id": "minecraft:brown_carpet", - "blockRuntimeId": 2046 - }, - { - "id": "minecraft:red_carpet", - "blockRuntimeId": 12240 - }, - { - "id": "minecraft:orange_carpet", - "blockRuntimeId": 11474 - }, - { - "id": "minecraft:yellow_carpet", - "blockRuntimeId": 9881 - }, - { - "id": "minecraft:lime_carpet", - "blockRuntimeId": 11109 - }, - { - "id": "minecraft:green_carpet", - "blockRuntimeId": 5604 - }, - { - "id": "minecraft:cyan_carpet", - "blockRuntimeId": 5491 - }, - { - "id": "minecraft:light_blue_carpet", - "blockRuntimeId": 7544 - }, - { - "id": "minecraft:blue_carpet", - "blockRuntimeId": 584 - }, - { - "id": "minecraft:purple_carpet", - "blockRuntimeId": 12578 - }, - { - "id": "minecraft:magenta_carpet", - "blockRuntimeId": 667 - }, - { - "id": "minecraft:pink_carpet", - "blockRuntimeId": 12520 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10657 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10665 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10664 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10672 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10669 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10671 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10658 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10661 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10662 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10670 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10666 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10660 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10668 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10667 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10659 - }, - { - "id": "minecraft:concrete_powder", - "blockRuntimeId": 10663 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1750 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1758 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1757 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1765 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1762 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1764 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1751 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1754 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1755 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1763 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1759 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1753 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1761 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1760 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1752 - }, - { - "id": "minecraft:concrete", - "blockRuntimeId": 1756 - }, - { - "id": "minecraft:clay", - "blockRuntimeId": 11533 - }, - { - "id": "minecraft:hardened_clay", - "blockRuntimeId": 1346 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10558 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10566 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10565 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10573 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10570 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10572 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10559 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10562 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10563 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10571 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10567 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10561 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10569 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10568 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10560 - }, - { - "id": "minecraft:stained_hardened_clay", - "blockRuntimeId": 10564 - }, - { - "id": "minecraft:white_glazed_terracotta", - "blockRuntimeId": 8738 - }, - { - "id": "minecraft:silver_glazed_terracotta", - "blockRuntimeId": 5018 - }, - { - "id": "minecraft:gray_glazed_terracotta", - "blockRuntimeId": 13102 - }, - { - "id": "minecraft:black_glazed_terracotta", - "blockRuntimeId": 9389 - }, - { - "id": "minecraft:brown_glazed_terracotta", - "blockRuntimeId": 5418 - }, - { - "id": "minecraft:red_glazed_terracotta", - "blockRuntimeId": 6426 - }, - { - "id": "minecraft:orange_glazed_terracotta", - "blockRuntimeId": 2257 - }, - { - "id": "minecraft:yellow_glazed_terracotta", - "blockRuntimeId": 2032 - }, - { - "id": "minecraft:lime_glazed_terracotta", - "blockRuntimeId": 634 - }, - { - "id": "minecraft:green_glazed_terracotta", - "blockRuntimeId": 11008 - }, - { - "id": "minecraft:cyan_glazed_terracotta", - "blockRuntimeId": 8521 - }, - { - "id": "minecraft:light_blue_glazed_terracotta", - "blockRuntimeId": 8635 - }, - { - "id": "minecraft:blue_glazed_terracotta", - "blockRuntimeId": 8629 - }, - { - "id": "minecraft:purple_glazed_terracotta", - "blockRuntimeId": 11411 - }, - { - "id": "minecraft:magenta_glazed_terracotta", - "blockRuntimeId": 2071 - }, - { - "id": "minecraft:pink_glazed_terracotta", - "blockRuntimeId": 10937 - }, - { - "id": "minecraft:purpur_block", - "blockRuntimeId": 12535 - }, - { - "id": "minecraft:purpur_block", - "blockRuntimeId": 12537 - }, - { - "id": "minecraft:packed_mud", - "blockRuntimeId": 715 - }, - { - "id": "minecraft:mud_bricks", - "blockRuntimeId": 11280 - }, - { - "id": "minecraft:nether_wart_block", - "blockRuntimeId": 6560 - }, - { - "id": "minecraft:warped_wart_block", - "blockRuntimeId": 9872 - }, - { - "id": "minecraft:shroomlight", - "blockRuntimeId": 8191 - }, - { - "id": "minecraft:crimson_nylium", - "blockRuntimeId": 6450 - }, - { - "id": "minecraft:warped_nylium", - "blockRuntimeId": 10743 - }, - { - "id": "minecraft:netherrack", - "blockRuntimeId": 11437 - }, - { - "id": "minecraft:basalt", - "blockRuntimeId": 6651 - }, - { - "id": "minecraft:polished_basalt", - "blockRuntimeId": 24 - }, - { - "id": "minecraft:smooth_basalt", - "blockRuntimeId": 2263 - }, - { - "id": "minecraft:soul_soil", - "blockRuntimeId": 8997 - }, - { - "id": "minecraft:dirt", - "blockRuntimeId": 8918 - }, - { - "id": "minecraft:dirt", - "blockRuntimeId": 8919 - }, - { - "id": "minecraft:farmland", - "blockRuntimeId": 6171 - }, - { - "id": "minecraft:grass", - "blockRuntimeId": 11372 - }, - { - "id": "minecraft:grass_path", - "blockRuntimeId": 12914 - }, - { - "id": "minecraft:podzol", - "blockRuntimeId": 7384 - }, - { - "id": "minecraft:mycelium", - "blockRuntimeId": 5559 - }, - { - "id": "minecraft:mud", - "blockRuntimeId": 11070 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1743 - }, - { - "id": "minecraft:iron_ore", - "blockRuntimeId": 7424 - }, - { - "id": "minecraft:gold_ore", - "blockRuntimeId": 2031 - }, - { - "id": "minecraft:diamond_ore", - "blockRuntimeId": 6663 - }, - { - "id": "minecraft:lapis_ore", - "blockRuntimeId": 12519 - }, - { - "id": "minecraft:redstone_ore", - "blockRuntimeId": 6553 - }, - { - "id": "minecraft:coal_ore", - "blockRuntimeId": 6551 - }, - { - "id": "minecraft:copper_ore", - "blockRuntimeId": 5425 - }, - { - "id": "minecraft:emerald_ore", - "blockRuntimeId": 12172 - }, - { - "id": "minecraft:quartz_ore", - "blockRuntimeId": 6807 - }, - { - "id": "minecraft:nether_gold_ore", - "blockRuntimeId": 27 - }, - { - "id": "minecraft:ancient_debris", - "blockRuntimeId": 10489 - }, - { - "id": "minecraft:deepslate_iron_ore", - "blockRuntimeId": 12098 - }, - { - "id": "minecraft:deepslate_gold_ore", - "blockRuntimeId": 10488 - }, - { - "id": "minecraft:deepslate_diamond_ore", - "blockRuntimeId": 12868 - }, - { - "id": "minecraft:deepslate_lapis_ore", - "blockRuntimeId": 12080 - }, - { - "id": "minecraft:deepslate_redstone_ore", - "blockRuntimeId": 11014 - }, - { - "id": "minecraft:deepslate_emerald_ore", - "blockRuntimeId": 10744 - }, - { - "id": "minecraft:deepslate_coal_ore", - "blockRuntimeId": 11998 - }, - { - "id": "minecraft:deepslate_copper_ore", - "blockRuntimeId": 108 - }, - { - "id": "minecraft:gravel", - "blockRuntimeId": 13139 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1744 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1746 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1748 - }, - { - "id": "minecraft:blackstone", - "blockRuntimeId": 12405 - }, - { - "id": "minecraft:deepslate", - "blockRuntimeId": 664 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1745 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1747 - }, - { - "id": "minecraft:stone", - "blockRuntimeId": 1749 - }, - { - "id": "minecraft:polished_blackstone", - "blockRuntimeId": 5558 - }, - { - "id": "minecraft:polished_deepslate", - "blockRuntimeId": 12583 - }, - { - "id": "minecraft:sand", - "blockRuntimeId": 6456 - }, - { - "id": "minecraft:sand", - "blockRuntimeId": 6457 - }, - { - "id": "minecraft:cactus", - "blockRuntimeId": 11383 - }, - { - "id": "minecraft:oak_log", - "blockRuntimeId": 710 - }, - { - "id": "minecraft:stripped_oak_log", - "blockRuntimeId": 12363 - }, - { - "id": "minecraft:spruce_log", - "blockRuntimeId": 6531 - }, - { - "id": "minecraft:stripped_spruce_log", - "blockRuntimeId": 10682 - }, - { - "id": "minecraft:birch_log", - "blockRuntimeId": 1766 - }, - { - "id": "minecraft:stripped_birch_log", - "blockRuntimeId": 9941 - }, - { - "id": "minecraft:jungle_log", - "blockRuntimeId": 625 - }, - { - "id": "minecraft:stripped_jungle_log", - "blockRuntimeId": 1731 - }, - { - "id": "minecraft:acacia_log", - "blockRuntimeId": 6632 - }, - { - "id": "minecraft:stripped_acacia_log", - "blockRuntimeId": 9415 - }, - { - "id": "minecraft:dark_oak_log", - "blockRuntimeId": 4574 - }, - { - "id": "minecraft:stripped_dark_oak_log", - "blockRuntimeId": 622 - }, - { - "id": "minecraft:mangrove_log", - "blockRuntimeId": 1070 - }, - { - "id": "minecraft:stripped_mangrove_log", - "blockRuntimeId": 13136 - }, - { - "id": "minecraft:cherry_log", - "blockRuntimeId": 12084 - }, - { - "id": "minecraft:stripped_cherry_log", - "blockRuntimeId": 6735 - }, - { - "id": "minecraft:crimson_stem", - "blockRuntimeId": 9864 - }, - { - "id": "minecraft:stripped_crimson_stem", - "blockRuntimeId": 11345 - }, - { - "id": "minecraft:warped_stem", - "blockRuntimeId": 10892 - }, - { - "id": "minecraft:stripped_warped_stem", - "blockRuntimeId": 12219 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4577 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4583 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4578 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4584 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4579 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4585 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4580 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4586 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4581 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4587 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4582 - }, - { - "id": "minecraft:wood", - "blockRuntimeId": 4588 - }, - { - "id": "minecraft:mangrove_wood", - "blockRuntimeId": 6420 - }, - { - "id": "minecraft:stripped_mangrove_wood", - "blockRuntimeId": 6490 - }, - { - "id": "minecraft:cherry_wood", - "blockRuntimeId": 11524 - }, - { - "id": "minecraft:stripped_cherry_wood", - "blockRuntimeId": 8002 - }, - { - "id": "minecraft:crimson_hyphae", - "blockRuntimeId": 6593 - }, - { - "id": "minecraft:stripped_crimson_hyphae", - "blockRuntimeId": 10895 - }, - { - "id": "minecraft:warped_hyphae", - "blockRuntimeId": 9869 - }, - { - "id": "minecraft:stripped_warped_hyphae", - "blockRuntimeId": 8744 - }, - { - "id": "minecraft:bamboo_block", - "blockRuntimeId": 60 - }, - { - "id": "minecraft:stripped_bamboo_block", - "blockRuntimeId": 5468 - }, - { - "id": "minecraft:leaves", - "blockRuntimeId": 10472 - }, - { - "id": "minecraft:leaves", - "blockRuntimeId": 10473 - }, - { - "id": "minecraft:leaves", - "blockRuntimeId": 10474 - }, - { - "id": "minecraft:leaves", - "blockRuntimeId": 10475 - }, - { - "id": "minecraft:leaves2", - "blockRuntimeId": 6655 - }, - { - "id": "minecraft:leaves2", - "blockRuntimeId": 6656 - }, - { - "id": "minecraft:mangrove_leaves", - "blockRuntimeId": 11064 - }, - { - "id": "minecraft:cherry_leaves", - "blockRuntimeId": 9385 - }, - { - "id": "minecraft:azalea_leaves", - "blockRuntimeId": 12531 - }, - { - "id": "minecraft:azalea_leaves_flowered", - "blockRuntimeId": 10733 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1807 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1808 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1809 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1810 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1811 - }, - { - "id": "minecraft:sapling", - "blockRuntimeId": 1812 - }, - { - "id": "minecraft:mangrove_propagule", - "blockRuntimeId": 11373 - }, - { - "id": "minecraft:cherry_sapling", - "blockRuntimeId": 12082 - }, - { - "id": "minecraft:bee_nest", - "blockRuntimeId": 8921 - }, - { - "id": "minecraft:wheat_seeds", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pumpkin_seeds", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:melon_seeds", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:beetroot_seeds", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:torchflower_seeds", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pitcher_pod", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wheat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:beetroot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potato", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:poisonous_potato", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:carrot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_carrot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:apple", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_apple", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:enchanted_golden_apple", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:melon_block", - "blockRuntimeId": 1117 - }, - { - "id": "minecraft:melon_slice", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glistering_melon_slice", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sweet_berries", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glow_berries", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pumpkin", - "blockRuntimeId": 6883 - }, - { - "id": "minecraft:carved_pumpkin", - "blockRuntimeId": 12197 - }, - { - "id": "minecraft:lit_pumpkin", - "blockRuntimeId": 11071 - }, - { - "id": "minecraft:honeycomb", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tallgrass", - "blockRuntimeId": 2049 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8619 - }, - { - "id": "minecraft:tallgrass", - "blockRuntimeId": 2048 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8618 - }, - { - "id": "minecraft:nether_sprouts", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:fire_coral", - "blockRuntimeId": 1742 - }, - { - "id": "minecraft:brain_coral", - "blockRuntimeId": 1770 - }, - { - "id": "minecraft:bubble_coral", - "blockRuntimeId": 10616 - }, - { - "id": "minecraft:tube_coral", - "blockRuntimeId": 12592 - }, - { - "id": "minecraft:horn_coral", - "blockRuntimeId": 5490 - }, - { - "id": "minecraft:dead_fire_coral", - "blockRuntimeId": 10673 - }, - { - "id": "minecraft:dead_brain_coral", - "blockRuntimeId": 11997 - }, - { - "id": "minecraft:dead_bubble_coral", - "blockRuntimeId": 12081 - }, - { - "id": "minecraft:dead_tube_coral", - "blockRuntimeId": 6559 - }, - { - "id": "minecraft:dead_horn_coral", - "blockRuntimeId": 9882 - }, - { - "id": "minecraft:coral_fan", - "blockRuntimeId": 6922 - }, - { - "id": "minecraft:coral_fan", - "blockRuntimeId": 6920 - }, - { - "id": "minecraft:coral_fan", - "blockRuntimeId": 6921 - }, - { - "id": "minecraft:coral_fan", - "blockRuntimeId": 6919 - }, - { - "id": "minecraft:coral_fan", - "blockRuntimeId": 6923 - }, - { - "id": "minecraft:coral_fan_dead", - "blockRuntimeId": 72 - }, - { - "id": "minecraft:coral_fan_dead", - "blockRuntimeId": 70 - }, - { - "id": "minecraft:coral_fan_dead", - "blockRuntimeId": 71 - }, - { - "id": "minecraft:coral_fan_dead", - "blockRuntimeId": 69 - }, - { - "id": "minecraft:coral_fan_dead", - "blockRuntimeId": 73 - }, - { - "id": "minecraft:crimson_roots", - "blockRuntimeId": 12393 - }, - { - "id": "minecraft:warped_roots", - "blockRuntimeId": 6664 - }, - { - "id": "minecraft:yellow_flower", - "blockRuntimeId": 1022 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5492 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5493 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5494 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5495 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5496 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5497 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5498 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5499 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5500 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5501 - }, - { - "id": "minecraft:red_flower", - "blockRuntimeId": 5502 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8616 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8617 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8620 - }, - { - "id": "minecraft:double_plant", - "blockRuntimeId": 8621 - }, - { - "id": "minecraft:pitcher_plant", - "blockRuntimeId": 5637 - }, - { - "id": "minecraft:pink_petals", - "blockRuntimeId": 6959 - }, - { - "id": "minecraft:wither_rose", - "blockRuntimeId": 10547 - }, - { - "id": "minecraft:torchflower", - "blockRuntimeId": 10436 - }, - { - "id": "minecraft:white_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:light_gray_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:gray_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:black_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brown_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:red_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:orange_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:yellow_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lime_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:green_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cyan_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:light_blue_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:blue_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:purple_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:magenta_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pink_dye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ink_sac", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glow_ink_sac", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cocoa_beans", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lapis_lazuli", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bone_meal", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:vine", - "blockRuntimeId": 1997 - }, - { - "id": "minecraft:weeping_vines", - "blockRuntimeId": 8644 - }, - { - "id": "minecraft:twisting_vines", - "blockRuntimeId": 8857 - }, - { - "id": "minecraft:waterlily", - "blockRuntimeId": 2264 - }, - { - "id": "minecraft:seagrass", - "blockRuntimeId": 657 - }, - { - "id": "minecraft:kelp", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:deadbush", - "blockRuntimeId": 7411 - }, - { - "id": "minecraft:bamboo", - "blockRuntimeId": 5560 - }, - { - "id": "minecraft:snow", - "blockRuntimeId": 6455 - }, - { - "id": "minecraft:ice", - "blockRuntimeId": 11075 - }, - { - "id": "minecraft:packed_ice", - "blockRuntimeId": 714 - }, - { - "id": "minecraft:blue_ice", - "blockRuntimeId": 11427 - }, - { - "id": "minecraft:snow_layer", - "blockRuntimeId": 560 - }, - { - "id": "minecraft:pointed_dripstone", - "blockRuntimeId": 12235 - }, - { - "id": "minecraft:dripstone_block", - "blockRuntimeId": 1996 - }, - { - "id": "minecraft:moss_carpet", - "blockRuntimeId": 718 - }, - { - "id": "minecraft:moss_block", - "blockRuntimeId": 10936 - }, - { - "id": "minecraft:dirt_with_roots", - "blockRuntimeId": 8560 - }, - { - "id": "minecraft:hanging_roots", - "blockRuntimeId": 611 - }, - { - "id": "minecraft:mangrove_roots", - "blockRuntimeId": 10557 - }, - { - "id": "minecraft:muddy_mangrove_roots", - "blockRuntimeId": 1065 - }, - { - "id": "minecraft:big_dripleaf", - "blockRuntimeId": 9949 - }, - { - "id": "minecraft:small_dripleaf_block", - "blockRuntimeId": 6619 - }, - { - "id": "minecraft:spore_blossom", - "blockRuntimeId": 12137 - }, - { - "id": "minecraft:azalea", - "blockRuntimeId": 11279 - }, - { - "id": "minecraft:flowering_azalea", - "blockRuntimeId": 8641 - }, - { - "id": "minecraft:glow_lichen", - "blockRuntimeId": 8850 - }, - { - "id": "minecraft:amethyst_block", - "blockRuntimeId": 754 - }, - { - "id": "minecraft:budding_amethyst", - "blockRuntimeId": 11399 - }, - { - "id": "minecraft:amethyst_cluster", - "blockRuntimeId": 12640 - }, - { - "id": "minecraft:large_amethyst_bud", - "blockRuntimeId": 7462 - }, - { - "id": "minecraft:medium_amethyst_bud", - "blockRuntimeId": 6678 - }, - { - "id": "minecraft:small_amethyst_bud", - "blockRuntimeId": 1024 - }, - { - "id": "minecraft:tuff", - "blockRuntimeId": 1069 - }, - { - "id": "minecraft:calcite", - "blockRuntimeId": 621 - }, - { - "id": "minecraft:chicken", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:porkchop", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:beef", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mutton", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rabbit", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cod", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:salmon", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tropical_fish", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pufferfish", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brown_mushroom", - "blockRuntimeId": 5417 - }, - { - "id": "minecraft:red_mushroom", - "blockRuntimeId": 6891 - }, - { - "id": "minecraft:crimson_fungus", - "blockRuntimeId": 12581 - }, - { - "id": "minecraft:warped_fungus", - "blockRuntimeId": 719 - }, - { - "id": "minecraft:brown_mushroom_block", - "blockRuntimeId": 12187 - }, - { - "id": "minecraft:red_mushroom_block", - "blockRuntimeId": 5485 - }, - { - "id": "minecraft:brown_mushroom_block", - "blockRuntimeId": 12188 - }, - { - "id": "minecraft:brown_mushroom_block", - "blockRuntimeId": 12173 - }, - { - "id": "minecraft:egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sugar_cane", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sugar", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rotten_flesh", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bone", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:web", - "blockRuntimeId": 11099 - }, - { - "id": "minecraft:spider_eye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mob_spawner", - "blockRuntimeId": 1126 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6403 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6404 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6405 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6406 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6407 - }, - { - "id": "minecraft:monster_egg", - "blockRuntimeId": 6408 - }, - { - "id": "minecraft:infested_deepslate", - "blockRuntimeId": 7375 - }, - { - "id": "minecraft:dragon_egg", - "blockRuntimeId": 12096 - }, - { - "id": "minecraft:turtle_egg", - "blockRuntimeId": 12827 - }, - { - "id": "minecraft:sniffer_egg", - "blockRuntimeId": 11400 - }, - { - "id": "minecraft:frog_spawn", - "blockRuntimeId": 6702 - }, - { - "id": "minecraft:pearlescent_froglight", - "blockRuntimeId": 10829 - }, - { - "id": "minecraft:verdant_froglight", - "blockRuntimeId": 10887 - }, - { - "id": "minecraft:ochre_froglight", - "blockRuntimeId": 4997 - }, - { - "id": "minecraft:chicken_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bee_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cow_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pig_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sheep_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wolf_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:polar_bear_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ocelot_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cat_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mooshroom_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bat_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:parrot_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rabbit_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:llama_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:horse_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:donkey_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mule_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skeleton_horse_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:zombie_horse_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tropical_fish_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cod_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pufferfish_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:salmon_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dolphin_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:turtle_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:panda_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:fox_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:creeper_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:enderman_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:silverfish_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skeleton_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wither_skeleton_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stray_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:slime_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spider_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:zombie_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:zombie_pigman_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:husk_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:drowned_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:squid_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glow_squid_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cave_spider_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:witch_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:guardian_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:elder_guardian_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:endermite_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:magma_cube_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:strider_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:hoglin_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:piglin_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:zoglin_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:piglin_brute_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:axolotl_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:warden_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:allay_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:frog_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tadpole_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:trader_llama_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:camel_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ghast_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:blaze_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shulker_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:vindicator_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:evoker_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:vex_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:villager_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wandering_trader_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:zombie_villager_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:phantom_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pillager_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ravager_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_golem_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:snow_golem_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sniffer_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:obsidian", - "blockRuntimeId": 1153 - }, - { - "id": "minecraft:crying_obsidian", - "blockRuntimeId": 11108 - }, - { - "id": "minecraft:bedrock", - "blockRuntimeId": 11417 - }, - { - "id": "minecraft:soul_sand", - "blockRuntimeId": 8998 - }, - { - "id": "minecraft:magma", - "blockRuntimeId": 12839 - }, - { - "id": "minecraft:nether_wart", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:end_stone", - "blockRuntimeId": 6095 - }, - { - "id": "minecraft:chorus_flower", - "blockRuntimeId": 6836 - }, - { - "id": "minecraft:chorus_plant", - "blockRuntimeId": 8670 - }, - { - "id": "minecraft:chorus_fruit", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:popped_chorus_fruit", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sponge", - "blockRuntimeId": 1333 - }, - { - "id": "minecraft:sponge", - "blockRuntimeId": 1334 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8383 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8384 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8385 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8386 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8387 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8388 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8389 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8390 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8391 - }, - { - "id": "minecraft:coral_block", - "blockRuntimeId": 8392 - }, - { - "id": "minecraft:sculk", - "blockRuntimeId": 11436 - }, - { - "id": "minecraft:sculk_vein", - "blockRuntimeId": 11933 - }, - { - "id": "minecraft:sculk_catalyst", - "blockRuntimeId": 5487 - }, - { - "id": "minecraft:sculk_shrieker", - "blockRuntimeId": 628 - }, - { - "id": "minecraft:sculk_sensor", - "blockRuntimeId": 6691 - }, - { - "id": "minecraft:calibrated_sculk_sensor", - "blockRuntimeId": 9403 - }, - { - "id": "minecraft:reinforced_deepslate", - "blockRuntimeId": 9383 - }, - { - "id": "minecraft:leather_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:chainmail_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:leather_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:chainmail_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_chestplate", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:leather_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:chainmail_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_leggings", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:leather_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:chainmail_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_boots", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wooden_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stone_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_sword", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wooden_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stone_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_axe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wooden_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stone_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_pickaxe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wooden_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stone_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_shovel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wooden_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stone_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_hoe", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bow", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:crossbow", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 16, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 17, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 18, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 19, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 20, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 21, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 22, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 23, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 24, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 25, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 26, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 27, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 28, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 29, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 30, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 31, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 32, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 33, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 34, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 35, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 36, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 37, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 38, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 39, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 40, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 41, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 42, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arrow", - "damage": 43, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shield", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_chicken", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_porkchop", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_beef", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_mutton", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_rabbit", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_cod", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cooked_salmon", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bread", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mushroom_stew", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:beetroot_soup", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rabbit_stew", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:baked_potato", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cookie", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pumpkin_pie", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cake", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dried_kelp", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:fishing_rod", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:carrot_on_a_stick", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:warped_fungus_on_a_stick", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:snowball", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shears", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:flint_and_steel", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lead", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:clock", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:compass", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:recovery_compass", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:goat_horn", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:empty_map", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:empty_map", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:saddle", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:leather_horse_armor", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_horse_armor", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:golden_horse_armor", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond_horse_armor", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:trident", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:turtle_helmet", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:elytra", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:totem_of_undying", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glass_bottle", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:experience_bottle", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 16, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 17, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 18, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 19, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 20, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 21, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 22, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 23, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 24, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 25, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 26, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 27, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 28, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 29, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 30, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 31, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 32, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 33, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 34, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 35, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 36, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 37, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 38, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 39, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 40, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 41, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:potion", - "damage": 42, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 16, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 17, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 18, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 19, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 20, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 21, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 22, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 23, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 24, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 25, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 26, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 27, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 28, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 29, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 30, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 31, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 32, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 33, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 34, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 35, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 36, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 37, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 38, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 39, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 40, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 41, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:splash_potion", - "damage": 42, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 16, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 17, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 18, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 19, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 20, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 21, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 22, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 23, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 24, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 25, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 26, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 27, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 28, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 29, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 30, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 31, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 32, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 33, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 34, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 35, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 36, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 37, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 38, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 39, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 40, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 41, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lingering_potion", - "damage": 42, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spyglass", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brush", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:stick", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bed", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:torch", - "blockRuntimeId": 1827 - }, - { - "id": "minecraft:soul_torch", - "blockRuntimeId": 7378 - }, - { - "id": "minecraft:sea_pickle", - "blockRuntimeId": 9422 - }, - { - "id": "minecraft:lantern", - "blockRuntimeId": 11475 - }, - { - "id": "minecraft:soul_lantern", - "blockRuntimeId": 8916 - }, - { - "id": "minecraft:candle", - "blockRuntimeId": 12222 - }, - { - "id": "minecraft:white_candle", - "blockRuntimeId": 8462 - }, - { - "id": "minecraft:orange_candle", - "blockRuntimeId": 1085 - }, - { - "id": "minecraft:magenta_candle", - "blockRuntimeId": 1143 - }, - { - "id": "minecraft:light_blue_candle", - "blockRuntimeId": 6875 - }, - { - "id": "minecraft:yellow_candle", - "blockRuntimeId": 10574 - }, - { - "id": "minecraft:lime_candle", - "blockRuntimeId": 10762 - }, - { - "id": "minecraft:pink_candle", - "blockRuntimeId": 12189 - }, - { - "id": "minecraft:gray_candle", - "blockRuntimeId": 2059 - }, - { - "id": "minecraft:light_gray_candle", - "blockRuntimeId": 10617 - }, - { - "id": "minecraft:cyan_candle", - "blockRuntimeId": 12553 - }, - { - "id": "minecraft:purple_candle", - "blockRuntimeId": 11438 - }, - { - "id": "minecraft:blue_candle", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brown_candle", - "blockRuntimeId": 9842 - }, - { - "id": "minecraft:green_candle", - "blockRuntimeId": 1781 - }, - { - "id": "minecraft:red_candle", - "blockRuntimeId": 7415 - }, - { - "id": "minecraft:black_candle", - "blockRuntimeId": 576 - }, - { - "id": "minecraft:crafting_table", - "blockRuntimeId": 9421 - }, - { - "id": "minecraft:cartography_table", - "blockRuntimeId": 13140 - }, - { - "id": "minecraft:fletching_table", - "blockRuntimeId": 9384 - }, - { - "id": "minecraft:smithing_table", - "blockRuntimeId": 5602 - }, - { - "id": "minecraft:beehive", - "blockRuntimeId": 10490 - }, - { - "id": "minecraft:suspicious_sand", - "blockRuntimeId": 2267 - }, - { - "id": "minecraft:suspicious_gravel", - "blockRuntimeId": 7468 - }, - { - "id": "minecraft:campfire", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:soul_campfire", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:furnace", - "blockRuntimeId": 12632 - }, - { - "id": "minecraft:blast_furnace", - "blockRuntimeId": 12387 - }, - { - "id": "minecraft:smoker", - "blockRuntimeId": 1736 - }, - { - "id": "minecraft:respawn_anchor", - "blockRuntimeId": 1776 - }, - { - "id": "minecraft:brewing_stand", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:anvil", - "blockRuntimeId": 11032 - }, - { - "id": "minecraft:anvil", - "blockRuntimeId": 11036 - }, - { - "id": "minecraft:anvil", - "blockRuntimeId": 11040 - }, - { - "id": "minecraft:grindstone", - "blockRuntimeId": 12869 - }, - { - "id": "minecraft:enchanting_table", - "blockRuntimeId": 11114 - }, - { - "id": "minecraft:bookshelf", - "blockRuntimeId": 11069 - }, - { - "id": "minecraft:chiseled_bookshelf", - "blockRuntimeId": 758 - }, - { - "id": "minecraft:lectern", - "blockRuntimeId": 11337 - }, - { - "id": "minecraft:cauldron", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:composter", - "blockRuntimeId": 8579 - }, - { - "id": "minecraft:chest", - "blockRuntimeId": 11518 - }, - { - "id": "minecraft:trapped_chest", - "blockRuntimeId": 8748 - }, - { - "id": "minecraft:ender_chest", - "blockRuntimeId": 6671 - }, - { - "id": "minecraft:barrel", - "blockRuntimeId": 6824 - }, - { - "id": "minecraft:undyed_shulker_box", - "blockRuntimeId": 5557 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8478 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8486 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8485 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8493 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8490 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8492 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8479 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8482 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8483 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8491 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8487 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8481 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8489 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8488 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8480 - }, - { - "id": "minecraft:shulker_box", - "blockRuntimeId": 8484 - }, - { - "id": "minecraft:armor_stand", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:noteblock", - "blockRuntimeId": 1068 - }, - { - "id": "minecraft:jukebox", - "blockRuntimeId": 8001 - }, - { - "id": "minecraft:music_disc_13", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_cat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_blocks", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_chirp", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_far", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_mall", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_mellohi", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_stal", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_strad", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_ward", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_11", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_wait", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_otherside", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_5", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_pigstep", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:music_disc_relic", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:disc_fragment_5", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glowstone_dust", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glowstone", - "blockRuntimeId": 6144 - }, - { - "id": "minecraft:redstone_lamp", - "blockRuntimeId": 662 - }, - { - "id": "minecraft:sea_lantern", - "blockRuntimeId": 12366 - }, - { - "id": "minecraft:oak_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spruce_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:birch_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:jungle_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:acacia_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dark_oak_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mangrove_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cherry_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bamboo_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:crimson_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:warped_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:oak_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spruce_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:birch_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:jungle_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:acacia_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dark_oak_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mangrove_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cherry_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bamboo_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:crimson_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:warped_hanging_sign", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:painting", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:frame", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:glow_frame", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:honey_bottle", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:flower_pot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bowl", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:milk_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:water_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:lava_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cod_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:salmon_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tropical_fish_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:pufferfish_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:powder_snow_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:axolotl_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tadpole_bucket", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:beacon", - "blockRuntimeId": 550 - }, - { - "id": "minecraft:bell", - "blockRuntimeId": 11305 - }, - { - "id": "minecraft:conduit", - "blockRuntimeId": 6493 - }, - { - "id": "minecraft:stonecutter_block", - "blockRuntimeId": 12394 - }, - { - "id": "minecraft:end_portal_frame", - "blockRuntimeId": 10443 - }, - { - "id": "minecraft:coal", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:charcoal", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:diamond", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_nugget", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:raw_iron", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:raw_gold", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:raw_copper", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:copper_ingot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:iron_ingot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_scrap", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_ingot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:gold_nugget", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:gold_ingot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:emerald", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:quartz", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:clay_ball", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brick", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherbrick", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:prismarine_shard", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:amethyst_shard", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:prismarine_crystals", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:nautilus_shell", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:heart_of_the_sea", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:scute", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:phantom_membrane", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:string", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:feather", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:flint", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:gunpowder", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:leather", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rabbit_hide", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rabbit_foot", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:fire_charge", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:blaze_rod", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:blaze_powder", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:magma_cream", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:fermented_spider_eye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:echo_shard", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dragon_breath", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shulker_shell", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ghast_tear", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:slime_ball", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ender_pearl", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ender_eye", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:nether_star", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:end_rod", - "blockRuntimeId": 9858 - }, - { - "id": "minecraft:lightning_rod", - "blockRuntimeId": 2290 - }, - { - "id": "minecraft:end_crystal", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:paper", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:book", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:writable_book", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "blockRuntimeId": 0, - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:oak_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spruce_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:birch_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:jungle_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:acacia_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dark_oak_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mangrove_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cherry_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bamboo_raft", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:oak_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spruce_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:birch_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:jungle_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:acacia_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dark_oak_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mangrove_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:cherry_chest_boat", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bamboo_chest_raft", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rail", - "blockRuntimeId": 6179 - }, - { - "id": "minecraft:golden_rail", - "blockRuntimeId": 8494 - }, - { - "id": "minecraft:detector_rail", - "blockRuntimeId": 6391 - }, - { - "id": "minecraft:activator_rail", - "blockRuntimeId": 1029 - }, - { - "id": "minecraft:minecart", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:chest_minecart", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:hopper_minecart", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tnt_minecart", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:redstone", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:redstone_block", - "blockRuntimeId": 5657 - }, - { - "id": "minecraft:redstone_torch", - "blockRuntimeId": 5012 - }, - { - "id": "minecraft:lever", - "blockRuntimeId": 10910 - }, - { - "id": "minecraft:wooden_button", - "blockRuntimeId": 10785 - }, - { - "id": "minecraft:spruce_button", - "blockRuntimeId": 6620 - }, - { - "id": "minecraft:birch_button", - "blockRuntimeId": 12596 - }, - { - "id": "minecraft:jungle_button", - "blockRuntimeId": 120 - }, - { - "id": "minecraft:acacia_button", - "blockRuntimeId": 12049 - }, - { - "id": "minecraft:dark_oak_button", - "blockRuntimeId": 96 - }, - { - "id": "minecraft:mangrove_button", - "blockRuntimeId": 11462 - }, - { - "id": "minecraft:cherry_button", - "blockRuntimeId": 6929 - }, - { - "id": "minecraft:bamboo_button", - "blockRuntimeId": 10874 - }, - { - "id": "minecraft:stone_button", - "blockRuntimeId": 1321 - }, - { - "id": "minecraft:crimson_button", - "blockRuntimeId": 6738 - }, - { - "id": "minecraft:warped_button", - "blockRuntimeId": 12068 - }, - { - "id": "minecraft:polished_blackstone_button", - "blockRuntimeId": 12620 - }, - { - "id": "minecraft:tripwire_hook", - "blockRuntimeId": 9883 - }, - { - "id": "minecraft:wooden_pressure_plate", - "blockRuntimeId": 12894 - }, - { - "id": "minecraft:spruce_pressure_plate", - "blockRuntimeId": 5639 - }, - { - "id": "minecraft:birch_pressure_plate", - "blockRuntimeId": 5426 - }, - { - "id": "minecraft:jungle_pressure_plate", - "blockRuntimeId": 5511 - }, - { - "id": "minecraft:acacia_pressure_plate", - "blockRuntimeId": 8393 - }, - { - "id": "minecraft:dark_oak_pressure_plate", - "blockRuntimeId": 9925 - }, - { - "id": "minecraft:mangrove_pressure_plate", - "blockRuntimeId": 6128 - }, - { - "id": "minecraft:cherry_pressure_plate", - "blockRuntimeId": 142 - }, - { - "id": "minecraft:bamboo_pressure_plate", - "blockRuntimeId": 10451 - }, - { - "id": "minecraft:crimson_pressure_plate", - "blockRuntimeId": 13120 - }, - { - "id": "minecraft:warped_pressure_plate", - "blockRuntimeId": 685 - }, - { - "id": "minecraft:stone_pressure_plate", - "blockRuntimeId": 6145 - }, - { - "id": "minecraft:light_weighted_pressure_plate", - "blockRuntimeId": 5541 - }, - { - "id": "minecraft:heavy_weighted_pressure_plate", - "blockRuntimeId": 2274 - }, - { - "id": "minecraft:polished_blackstone_pressure_plate", - "blockRuntimeId": 10625 - }, - { - "id": "minecraft:observer", - "blockRuntimeId": 5000 - }, - { - "id": "minecraft:daylight_detector", - "blockRuntimeId": 6458 - }, - { - "id": "minecraft:repeater", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:comparator", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:hopper", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dropper", - "blockRuntimeId": 12204 - }, - { - "id": "minecraft:dispenser", - "blockRuntimeId": 12843 - }, - { - "id": "minecraft:piston", - "blockRuntimeId": 2041 - }, - { - "id": "minecraft:sticky_piston", - "blockRuntimeId": 6666 - }, - { - "id": "minecraft:tnt", - "blockRuntimeId": 11093 - }, - { - "id": "minecraft:name_tag", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:loom", - "blockRuntimeId": 6091 - }, - { - "id": "minecraft:banner", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 8, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 7, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 15, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 12, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 14, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 1, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 4, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 5, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 13, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 9, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 3, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 11, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 10, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 2, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 6, - "blockRuntimeId": 0 - }, - { - "id": "minecraft:banner", - "damage": 15, - "blockRuntimeId": 0, - "nbt_b64": "CgAAAwQAVHlwZQEAAAAA" - }, - { - "id": "minecraft:creeper_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:flower_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mojang_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:field_masoned_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:bordure_indented_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:piglin_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:globe_banner_pattern", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:angler_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:archer_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:arms_up_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:blade_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:brewer_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:burn_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:danger_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:explorer_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:friend_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:heart_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:heartbreak_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:howl_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:miner_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:mourner_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:plenty_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:prize_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sheaf_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shelter_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:skull_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:snort_pottery_sherd", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:netherite_upgrade_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:sentry_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:vex_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wild_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:coast_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:dune_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wayfinder_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:shaper_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:raiser_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:host_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ward_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:silence_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:tide_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:snout_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:rib_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:eye_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:spire_armor_trim_smithing_template", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "blockRuntimeId": 0, - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_star", - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 8, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 7, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 15, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 12, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 14, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 1, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 4, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 5, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 13, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 9, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 3, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 11, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 10, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 2, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 6, - "blockRuntimeId": 0, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA=" - }, - { - "id": "minecraft:chain", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:target", - "blockRuntimeId": 10784 - }, - { - "id": "minecraft:decorated_pot", - "blockRuntimeId": 11110 - }, - { - "id": "minecraft:lodestone_compass", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:wither_spawn_egg", - "blockRuntimeId": 0 - }, - { - "id": "minecraft:ender_dragon_spawn_egg", - "blockRuntimeId": 0 - } - ] -} \ No newline at end of file diff --git a/core/src/main/resources/bedrock/creative_items.1_20_10.json b/core/src/main/resources/bedrock/creative_items.1_20_10.json deleted file mode 100644 index c531bf28e4f..00000000000 --- a/core/src/main/resources/bedrock/creative_items.1_20_10.json +++ /dev/null @@ -1,5793 +0,0 @@ -{ - "items": [ - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLUoAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUDAG9hawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLYoAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLcoAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLgoAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLkoAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZLooAAAKBgBzdGF0ZXMICQB3b29kX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mangrove_planks", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX3BsYW5rcwQJAG5hbWVfaGFzaPvLtcEA0F8xAwoAbmV0d29ya19pZAkIAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9wbGFua3MECQBuYW1lX2hhc2hNIvVh/lVW7gMKAG5ldHdvcmtfaWQlMQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19wbGFua3MECQBuYW1lX2hhc2gYnjNz7SCCjgMKAG5ldHdvcmtfaWQ/IgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_mosaic", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19tb3NhaWMECQBuYW1lX2hhc2izSEgiMKOp/AMKAG5ldHdvcmtfaWQ1MwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:crimson_planks", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fcGxhbmtzBAkAbmFtZV9oYXNoJc5IKqNXJnwDCgBuZXR3b3JrX2lkJR8AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9wbGFua3MECQBuYW1lX2hhc2g3yGXEWhe6LgMKAG5ldHdvcmtfaWTsBwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTtCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCwBjb2JibGVzdG9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTuCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEQBtb3NzeV9jb2JibGVzdG9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTvCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBwBncmFuaXRlCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTwCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBwBkaW9yaXRlCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTxCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCABhbmRlc2l0ZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTyCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCQBzYW5kc3RvbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT5CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlDQByZWRfc2FuZHN0b25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT0CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCwBzdG9uZV9icmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT1CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEQBtb3NzeV9zdG9uZV9icmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTzCAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBQBicmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT2CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlDABuZXRoZXJfYnJpY2sIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT6CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEAByZWRfbmV0aGVyX2JyaWNrCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT3CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCQBlbmRfYnJpY2sIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT4CAAACgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCgBwcmlzbWFyaW5lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:blackstone_wall", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJsYWNrc3RvbmVfd2FsbAQJAG5hbWVfaGFzaMP8XppUSU1RAwoAbmV0d29ya19pZCQYAAAKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_blackstone_wall", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfd2FsbAQJAG5hbWVfaGFzaP6SwV08YwzAAwoAbmV0d29ya19pZGErAAAKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_blackstone_brick_wall", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfd2FsbAQJAG5hbWVfaGFzaBBIDZbHxiEzAwoAbmV0d29ya19pZBIIAAAKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobbled_deepslate_wall", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3dhbGwECQBuYW1lX2hhc2iECY5oKxeT+gMKAG5ldHdvcmtfaWRzMgAACgYAc3RhdGVzCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_tile_wall", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3dhbGwECQBuYW1lX2hhc2jz7N+PeuEXgQMKAG5ldHdvcmtfaWQVIAAACgYAc3RhdGVzCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:polished_deepslate_wall", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV93YWxsBAkAbmFtZV9oYXNoHxjTdj9pevMDCgBuZXR3b3JrX2lkZjEAAAoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate_brick_wall", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja193YWxsBAkAbmFtZV9oYXNoEs3EQrjroyEDCgBuZXR3b3JrX2lkhgQAAAoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mud_brick_wall", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om11ZF9icmlja193YWxsBAkAbmFtZV9oYXNov9b98ATpUSwDCgBuZXR3b3JrX2lkHgcAAAoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:oak_fence", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Om9ha19mZW5jZQQJAG5hbWVfaGFzaGEmid7AaCWRAwoAbmV0d29ya19pZMAiAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:spruce_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNwcnVjZV9mZW5jZQQJAG5hbWVfaGFzaPQCm+aX1ZQeAwoAbmV0d29ya19pZGAEAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:birch_fence", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJpcmNoX2ZlbmNlBAkAbmFtZV9oYXNo6CJ2ATpANfgDCgBuZXR3b3JrX2lkbTIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:jungle_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Omp1bmdsZV9mZW5jZQQJAG5hbWVfaGFzaOX4cD9uAmsdAwoAbmV0d29ya19pZFkEAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:acacia_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmFjYWNpYV9mZW5jZQQJAG5hbWVfaGFzaGjn+RlKVDH6AwoAbmV0d29ya19pZHEyAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dark_oak_fence", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmRhcmtfb2FrX2ZlbmNlBAkAbmFtZV9oYXNoGPj0gCgM0c0DCgBuZXR3b3JrX2lk1iwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mangrove_fence", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlBAkAbmFtZV9oYXNowwAd7tPu9bsDCgBuZXR3b3JrX2lkCysAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cherry_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNoZXJyeV9mZW5jZQQJAG5hbWVfaGFzaFmtUfHfTxcxAwoAbmV0d29ya19pZAgIAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bamboo_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJhbWJvb19mZW5jZQQJAG5hbWVfaGFzaCKRbxfXsfkiAwoAbmV0d29ya19pZD0FAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:nether_brick_fence", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om5ldGhlcl9icmlja19mZW5jZQQJAG5hbWVfaGFzaA6030ngawxcAwoAbmV0d29ya19pZJQZAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_fence", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNyaW1zb25fZmVuY2UECQBuYW1lX2hhc2jhUhKv1HGj9AMKAG5ldHdvcmtfaWQZMgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:warped_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndhcnBlZF9mZW5jZQQJAG5hbWVfaGFzaJfb3/YuKmOWAwoAbmV0d29ya19pZLkkAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:fence_gate", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZlbmNlX2dhdGUECQBuYW1lX2hhc2hTxpjEDmRzAwMKAG5ldHdvcmtfaWRPAAAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:spruce_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnNwcnVjZV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoanTVB84HRbkDCgBuZXR3b3JrX2lk2ioAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:birch_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJpcmNoX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2jmfPklI8azSwMKAG5ldHdvcmtfaWQRFgAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:jungle_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Omp1bmdsZV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNobYVQkfBomIcDCgBuZXR3b3JrX2lkPSEAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:acacia_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmFjYWNpYV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoZnrLUx/XSekDCgBuZXR3b3JrX2lkdDAAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dark_oak_fence_gate", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRhcmtfb2FrX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2j2PTvdJJHcVQMKAG5ldHdvcmtfaWQXGQAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mangrove_fence_gate", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2i/kOhBKiI/dAMKAG5ldHdvcmtfaWQbGwAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cherry_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNoZXJyeV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoKWLgCk0z+PsDCgBuZXR3b3JrX2lkHjMAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bamboo_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJhbWJvb19mZW5jZV9nYXRlBAkAbmFtZV9oYXNopH1JrUgwdIADCgBuZXR3b3JrX2lk/B8AAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNyaW1zb25fZmVuY2VfZ2F0ZQQJAG5hbWVfaGFzaHE3Gfd0Z2d2AwoAbmV0d29ya19pZN8cAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQsAaW5fd2FsbF9iaXQAAQgAb3Blbl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:warped_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndhcnBlZF9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoy0oIBjDIG4kDCgBuZXR3b3JrX2lkYCEAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:normal_stone_stairs", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zdGFpcnMECQBuYW1lX2hhc2hAEktZZOkGIwMKAG5ldHdvcmtfaWQ+BQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnN0b25lX3N0YWlycwQJAG5hbWVfaGFzaNRjqVC5GRVDAwoAbmV0d29ya19pZMcVAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mossy_cobblestone_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3N0YWlycwQJAG5hbWVfaGFzaMVSTq5z9n1RAwoAbmV0d29ya19pZMYYAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:oak_stairs", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om9ha19zdGFpcnMECQBuYW1lX2hhc2jk/HFzdXy0FQMKAG5ldHdvcmtfaWS/AgAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:spruce_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwcnVjZV9zdGFpcnMECQBuYW1lX2hhc2iznygw7uBPBQMKAG5ldHdvcmtfaWSFAAAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:birch_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpcmNoX3N0YWlycwQJAG5hbWVfaGFzaPfhbL619a3GAwoAbmV0d29ya19pZIMsAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:jungle_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omp1bmdsZV9zdGFpcnMECQBuYW1lX2hhc2jodJsHUbOVxQMKAG5ldHdvcmtfaWRcLAAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:acacia_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmFjYWNpYV9zdGFpcnMECQBuYW1lX2hhc2h3x1NmD43IqQMKAG5ldHdvcmtfaWRGKQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dark_oak_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRhcmtfb2FrX3N0YWlycwQJAG5hbWVfaGFzaMfwkbYPbNmAAwoAbmV0d29ya19pZA0gAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mangrove_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX3N0YWlycwQJAG5hbWVfaGFzaNpUDY+uGMpyAwoAbmV0d29ya19pZPEaAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9zdGFpcnMECQBuYW1lX2hhc2jMtr0v9JY4zwMKAG5ldHdvcmtfaWQHLQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19zdGFpcnMECQBuYW1lX2hhc2jFOzWL8PalKwMKAG5ldHdvcmtfaWQQBwAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_mosaic_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc3RhaXJzBAkAbmFtZV9oYXNoNLPiveSHPaoDCgBuZXR3b3JrX2lkTikAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0b25lX2JyaWNrX3N0YWlycwQJAG5hbWVfaGFzaN6tQViRo5cwAwoAbmV0d29ya19pZPgHAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mossy_stone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrX3N0YWlycwQJAG5hbWVfaGFzaIB/Zv5YBPuYAwoAbmV0d29ya19pZGcmAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnNhbmRzdG9uZV9zdGFpcnMECQBuYW1lX2hhc2hOyA0BoYUOPQMKAG5ldHdvcmtfaWRIFQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:smooth_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnNtb290aF9zYW5kc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNoB+CuCd8Ruz8DCgBuZXR3b3JrX2lkdhUAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNoPs0LpHPL24YDCgBuZXR3b3JrX2lkLiEAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:smooth_red_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3N0YWlycwQJAG5hbWVfaGFzaBvjtQv5pf+MAwoAbmV0d29ya19pZPQhAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:granite_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmdyYW5pdGVfc3RhaXJzBAkAbmFtZV9oYXNoGzpvtoqKQjgDCgBuZXR3b3JrX2lklRMAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_granite_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc3RhaXJzBAkAbmFtZV9oYXNo3PvbSfEQklIDCgBuZXR3b3JrX2lkABkAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:diorite_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmRpb3JpdGVfc3RhaXJzBAkAbmFtZV9oYXNoi73T8VQuZmcDCgBuZXR3b3JrX2lkIBoAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_diorite_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2Rpb3JpdGVfc3RhaXJzBAkAbmFtZV9oYXNoFKRJd5Wk5L0DCgBuZXR3b3JrX2lkUSsAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:andesite_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmFuZGVzaXRlX3N0YWlycwQJAG5hbWVfaGFzaO5w2FKBw76EAwoAbmV0d29ya19pZBIhAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:polished_andesite_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlX3N0YWlycwQJAG5hbWVfaGFzaNcZZ/zmLInIAwoAbmV0d29ya19pZJ0sAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyaWNrX3N0YWlycwQJAG5hbWVfaGFzaMyt+cRDk5O2AwoAbmV0d29ya19pZKQqAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:nether_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om5ldGhlcl9icmlja19zdGFpcnMECQBuYW1lX2hhc2jRqIoOXgifBAMKAG5ldHdvcmtfaWRtAAAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_nether_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2tfc3RhaXJzBAkAbmFtZV9oYXNogQvosSbcj7kDCgBuZXR3b3JrX2lk7CoAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:end_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuZF9icmlja19zdGFpcnMECQBuYW1lX2hhc2hmlAk+QhsUsQMKAG5ldHdvcmtfaWQLKgAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:quartz_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnF1YXJ0el9zdGFpcnMECQBuYW1lX2hhc2hmvpvOqGi6egMKAG5ldHdvcmtfaWRRHQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:smooth_quartz_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnNtb290aF9xdWFydHpfc3RhaXJzBAkAbmFtZV9oYXNoNZZ9rX0qZOsDCgBuZXR3b3JrX2lk6DAAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:purpur_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnB1cl9zdGFpcnMECQBuYW1lX2hhc2ifwDxeezXD7gMKAG5ldHdvcmtfaWQnMQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:prismarine_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnByaXNtYXJpbmVfc3RhaXJzBAkAbmFtZV9oYXNooTHSZ+IrYtcDCgBuZXR3b3JrX2lkMC8AAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:dark_prismarine_stairs", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zdGFpcnMECQBuYW1lX2hhc2hIciLmam4o4AMKAG5ldHdvcmtfaWTXLwAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:prismarine_bricks_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnByaXNtYXJpbmVfYnJpY2tzX3N0YWlycwQJAG5hbWVfaGFzaNIjq1oBlZMMAwoAbmV0d29ya19pZGUCAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fc3RhaXJzBAkAbmFtZV9oYXNoZJqIzCBpCq4DCgBuZXR3b3JrX2lkpSkAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9zdGFpcnMECQBuYW1lX2hhc2hOkY27jLD4RQMKAG5ldHdvcmtfaWTRFQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blackstone_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJsYWNrc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNokdoUb76p9McDCgBuZXR3b3JrX2lkkywAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_blackstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNolCFtFIE8MmADCgBuZXR3b3JrX2lkvBkAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_blackstone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSoAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc3RhaXJzBAkAbmFtZV9oYXNonks6UlfpOmkDCgBuZXR3b3JrX2lkehoAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmN1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoHfoAXYq5G3MDCgBuZXR3b3JrX2lk+hoAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:exposed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zdGFpcnMECQBuYW1lX2hhc2howneQGtZ9cgMKAG5ldHdvcmtfaWTpGgAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:weathered_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlycwQJAG5hbWVfaGFzaP+R5loXxrVgAwoAbmV0d29ya19pZMQZAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:oxidized_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNo6Jeoq5rsPxsDCgBuZXR3b3JrX2lkNAQAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:waxed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoh07CQj0/SR8DCgBuZXR3b3JrX2lkYgQAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:waxed_exposed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zdGFpcnMECQBuYW1lX2hhc2guVct1ilmxTwMKAG5ldHdvcmtfaWQIGAAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_weathered_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSsAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlycwQJAG5hbWVfaGFzaPXC8Sz/phCpAwoAbmV0d29ya19pZCUpAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSoAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoaqGdkuhxVZUDCgBuZXR3b3JrX2lkoCQAAAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobbled_deepslate_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3N0YWlycwQJAG5hbWVfaGFzaPIfa+TpyJcIAwoAbmV0d29ya19pZCkCAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_tile_stairs", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3N0YWlycwQJAG5hbWVfaGFzaGFRFzB72mN2AwoAbmV0d29ya19pZNccAAAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:polished_deepslate_stairs", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zdGFpcnMECQBuYW1lX2hhc2iNCYxVik9sGAMKAG5ldHdvcmtfaWT4AwAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zdGFpcnMECQBuYW1lX2hhc2hIasOahEf83wMKAG5ldHdvcmtfaWTPLwAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mud_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0Om11ZF9icmlja19zdGFpcnMECQBuYW1lX2hhc2gt3qxK1NWajAMKAG5ldHdvcmtfaWTcIQAACgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:wooden_door" - }, - { - "id": "minecraft:spruce_door" - }, - { - "id": "minecraft:birch_door" - }, - { - "id": "minecraft:jungle_door" - }, - { - "id": "minecraft:acacia_door" - }, - { - "id": "minecraft:dark_oak_door" - }, - { - "id": "minecraft:mangrove_door" - }, - { - "id": "minecraft:cherry_door" - }, - { - "id": "minecraft:bamboo_door" - }, - { - "id": "minecraft:iron_door" - }, - { - "id": "minecraft:crimson_door" - }, - { - "id": "minecraft:warped_door" - }, - { - "id": "minecraft:trapdoor", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnRyYXBkb29yBAkAbmFtZV9oYXNotYiAJGtN0xADCgBuZXR3b3JrX2lkgQIAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:spruce_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnNwcnVjZV90cmFwZG9vcgQJAG5hbWVfaGFzaOwlfbgBkUW4AwoAbmV0d29ya19pZLoqAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:birch_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJpcmNoX3RyYXBkb29yBAkAbmFtZV9oYXNoSLtLweOLJ7wDCgBuZXR3b3JrX2lkHCsAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:jungle_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Omp1bmdsZV90cmFwZG9vcgQJAG5hbWVfaGFzaDP/TnM9wyCIAwoAbmV0d29ya19pZE0hAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:acacia_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmFjYWNpYV90cmFwZG9vcgQJAG5hbWVfaGFzaMj8xi3vmEKOAwoAbmV0d29ya19pZB8iAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:dark_oak_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRhcmtfb2FrX3RyYXBkb29yBAkAbmFtZV9oYXNomB2GGJQ2aOMDCgBuZXR3b3JrX2lkIDAAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mangrove_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om1hbmdyb3ZlX3RyYXBkb29yBAkAbmFtZV9oYXNooV3kQsQUUmkDCgBuZXR3b3JrX2lkghoAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cherry_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNoZXJyeV90cmFwZG9vcgQJAG5hbWVfaGFzaH/PefpfdHgtAwoAbmV0d29ya19pZNIHAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:bamboo_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJhbWJvb190cmFwZG9vcgQJAG5hbWVfaGFzaJrEOpsTwtKCAwoAbmV0d29ya19pZNUgAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:iron_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omlyb25fdHJhcGRvb3IECQBuYW1lX2hhc2gwA+IumsEiGQMKAG5ldHdvcmtfaWQUBAAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNyaW1zb25fdHJhcGRvb3IECQBuYW1lX2hhc2jHXufTnwUkYgMKAG5ldHdvcmtfaWTjGQAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:warped_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OndhcnBlZF90cmFwZG9vcgQJAG5hbWVfaGFzaA20wG/+vkd6AwoAbmV0d29ya19pZC8dAAAKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:iron_bars", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Omlyb25fYmFycwQJAG5hbWVfaGFzaPuefWSNAe56AwoAbmV0d29ya19pZHMdAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:glass", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmdsYXNzBAkAbmFtZV9oYXNowGJByfWff6gDCgBuZXR3b3JrX2lkIikAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS0CAAACgYAc3RhdGVzCAUAY29sb3IFAHdoaXRlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS8CAAACgYAc3RhdGVzCAUAY29sb3IGAHNpbHZlcgADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS7CAAACgYAc3RhdGVzCAUAY29sb3IEAGdyYXkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWTDCAAACgYAc3RhdGVzCAUAY29sb3IFAGJsYWNrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWTACAAACgYAc3RhdGVzCAUAY29sb3IFAGJyb3duAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWTCCAAACgYAc3RhdGVzCAUAY29sb3IDAHJlZAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS1CAAACgYAc3RhdGVzCAUAY29sb3IGAG9yYW5nZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS4CAAACgYAc3RhdGVzCAUAY29sb3IGAHllbGxvdwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS5CAAACgYAc3RhdGVzCAUAY29sb3IEAGxpbWUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWTBCAAACgYAc3RhdGVzCAUAY29sb3IFAGdyZWVuAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS9CAAACgYAc3RhdGVzCAUAY29sb3IEAGN5YW4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS3CAAACgYAc3RhdGVzCAUAY29sb3IKAGxpZ2h0X2JsdWUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS/CAAACgYAc3RhdGVzCAUAY29sb3IEAGJsdWUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS+CAAACgYAc3RhdGVzCAUAY29sb3IGAHB1cnBsZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS2CAAACgYAc3RhdGVzCAUAY29sb3IHAG1hZ2VudGEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2gZNhYJXm9IMwMKAG5ldHdvcmtfaWS6CAAACgYAc3RhdGVzCAUAY29sb3IEAHBpbmsAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:tinted_glass", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnRpbnRlZF9nbGFzcwQJAG5hbWVfaGFzaAFZWSamk6KdAwoAbmV0d29ya19pZMcmAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:glass_pane", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdsYXNzX3BhbmUECQBuYW1lX2hhc2gRSBHwNMQ4gQMKAG5ldHdvcmtfaWS3IAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCcfAAAKBgBzdGF0ZXMIBQBjb2xvcgUAd2hpdGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZC8fAAAKBgBzdGF0ZXMIBQBjb2xvcgYAc2lsdmVyAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZC4fAAAKBgBzdGF0ZXMIBQBjb2xvcgQAZ3JheQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDYfAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYmxhY2sAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDMfAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYnJvd24AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDUfAAAKBgBzdGF0ZXMIBQBjb2xvcgMAcmVkAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCgfAAAKBgBzdGF0ZXMIBQBjb2xvcgYAb3JhbmdlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCsfAAAKBgBzdGF0ZXMIBQBjb2xvcgYAeWVsbG93AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCwfAAAKBgBzdGF0ZXMIBQBjb2xvcgQAbGltZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDQfAAAKBgBzdGF0ZXMIBQBjb2xvcgUAZ3JlZW4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDAfAAAKBgBzdGF0ZXMIBQBjb2xvcgQAY3lhbgADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCofAAAKBgBzdGF0ZXMIBQBjb2xvcgoAbGlnaHRfYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDIfAAAKBgBzdGF0ZXMIBQBjb2xvcgQAYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZDEfAAAKBgBzdGF0ZXMIBQBjb2xvcgYAcHVycGxlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZCkfAAAKBgBzdGF0ZXMIBQBjb2xvcgcAbWFnZW50YQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLb5lzurQ119AwoAbmV0d29ya19pZC0fAAAKBgBzdGF0ZXMIBQBjb2xvcgQAcGluawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:ladder", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxhZGRlcgQJAG5hbWVfaGFzaKBhqheJVOz+AwoAbmV0d29ya19pZDozAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:scaffolding", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNjYWZmb2xkaW5nBAkAbmFtZV9oYXNoYrkevrqcljwDCgBuZXR3b3JrX2lkOBUAAAoGAHN0YXRlcwMJAHN0YWJpbGl0eQAAAAABDwBzdGFiaWxpdHlfY2hlY2sAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWR+GQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlDABzbW9vdGhfc3RvbmUBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkCiMAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV80BQBzdG9uZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSBGQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlCwBjb2JibGVzdG9uZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk7SIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yEQBtb3NzeV9jb2JibGVzdG9uZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk7CAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUDAG9hawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk7SAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk7iAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk7yAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk8CAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk8SAAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAICQB3b29kX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mangrove_slab", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om1hbmdyb3ZlX3NsYWIECQBuYW1lX2hhc2jYCcmhJPeNMwMKAG5ldHdvcmtfaWTECAAACgYAc3RhdGVzAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cherry_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNoZXJyeV9zbGFiBAkAbmFtZV9oYXNoTt0MmVn/mqoDCgBuZXR3b3JrX2lkZykAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bamboo_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJhbWJvb19zbGFiBAkAbmFtZV9oYXNoo1xuFqINeLYDCgBuZXR3b3JrX2lkoioAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bamboo_mosaic_slab", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc2xhYgQJAG5hbWVfaGFzaNbVRBZ/ChI3AwoAbmV0d29ya19pZNERAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSDGQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlCwBzdG9uZV9icmljawEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkCCMAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV80EQBtb3NzeV9zdG9uZV9icmljawEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWR/GQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlCQBzYW5kc3RvbmUBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkCyMAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV80DQBjdXRfc2FuZHN0b25lAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk7iIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yEABzbW9vdGhfc2FuZHN0b25lAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk6CIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yDQByZWRfc2FuZHN0b25lAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkDCMAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV80EQBjdXRfcmVkX3NhbmRzdG9uZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk+SIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zFABzbW9vdGhfcmVkX3NhbmRzdG9uZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk/iIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zBwBncmFuaXRlAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk/yIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zEABwb2xpc2hlZF9ncmFuaXRlAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk/CIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zBwBkaW9yaXRlAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk/SIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zEABwb2xpc2hlZF9kaW9yaXRlAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk+yIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zCABhbmRlc2l0ZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk+iIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zEQBwb2xpc2hlZF9hbmRlc2l0ZQEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSCGQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlBQBicmljawEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSFGQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlDABuZXRoZXJfYnJpY2sBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk7yIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yEAByZWRfbmV0aGVyX2JyaWNrAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lk+CIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8zDwBlbmRfc3RvbmVfYnJpY2sBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSEGQAACgYAc3RhdGVzCA8Ac3RvbmVfc2xhYl90eXBlBgBxdWFydHoBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkCSMAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV80DQBzbW9vdGhfcXVhcnR6AQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk6SIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yBgBwdXJwdXIBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk6iIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yEABwcmlzbWFyaW5lX3JvdWdoAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk6yIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yDwBwcmlzbWFyaW5lX2RhcmsBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk7CIAAAoGAHN0YXRlcwgRAHN0b25lX3NsYWJfdHlwZV8yEABwcmlzbWFyaW5lX2JyaWNrAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:crimson_slab", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNyaW1zb25fc2xhYgQJAG5hbWVfaGFzaKZ+EfP0ZYOZAwoAbmV0d29ya19pZHkmAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:warped_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndhcnBlZF9zbGFiBAkAbmFtZV9oYXNo/AT0e/Z9W7UDCgBuZXR3b3JrX2lkfSoAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:blackstone_slab", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJsYWNrc3RvbmVfc2xhYgQJAG5hbWVfaGFzaF/DD4ZUlNgtAwoAbmV0d29ya19pZOIHAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:polished_blackstone_slab", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc2xhYgQJAG5hbWVfaGFzaDYnuUs86EWfAwoAbmV0d29ya19pZHMoAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:polished_blackstone_brick_slab", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc2xhYgQJAG5hbWVfaGFzaKySLqvHc4xXAwoAbmV0d29ya19pZC0ZAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmN1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaDsNpb2qs4iBAwoAbmV0d29ya19pZLkgAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:exposed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zbGFiBAkAbmFtZV9oYXNoahQ5OwIQb7kDCgBuZXR3b3JrX2lk6ioAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:weathered_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWIECQBuYW1lX2hhc2hBIuGIOVVXogMKAG5ldHdvcmtfaWSiKAAACgYAc3RhdGVzAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:oxidized_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaOptj9ycfpaDAwoAbmV0d29ya19pZPggAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaAlx6DZOCTHzAwoAbmV0d29ya19pZGQxAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_exposed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zbGFiBAkAbmFtZV9oYXNo3KqS5OnhtRIDCgBuZXR3b3JrX2lklQIAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waxed_weathered_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWIECQBuYW1lX2hhc2gzZ1oX0HCFtwMKAG5ldHdvcmtfaWSzKgAACgYAc3RhdGVzAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaMjjTnLu1KcqAwoAbmV0d29ya19pZAAHAAAKBgBzdGF0ZXMBDAB0b3Bfc2xvdF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cobbled_deepslate_slab", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3NsYWIECQBuYW1lX2hhc2gwJIVWK1TM2QMKAG5ldHdvcmtfaWRiLwAACgYAc3RhdGVzAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_deepslate_slab", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zbGFiBAkAbmFtZV9oYXNoC/Adiz8k6RYDCgBuZXR3b3JrX2lk0gIAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_tile_slab", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3NsYWIECQBuYW1lX2hhc2hPydV6emzIXAMKAG5ldHdvcmtfaWSVGQAACgYAc3RhdGVzAQwAdG9wX3Nsb3RfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:deepslate_brick_slab", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zbGFiBAkAbmFtZV9oYXNoSv62V7iw10UDCgBuZXR3b3JrX2lkzxUAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mud_brick_slab", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om11ZF9icmlja19zbGFiBAkAbmFtZV9oYXNoq/tGBQWkv08DCgBuZXR3b3JrX2lkEBgAAAoGAHN0YXRlcwEMAHRvcF9zbG90X2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:brick_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJyaWNrX2Jsb2NrBAkAbmFtZV9oYXNo5Qc2E005S3oDCgBuZXR3b3JrX2lkTx0AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:chiseled_nether_bricks", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNoaXNlbGVkX25ldGhlcl9icmlja3MECQBuYW1lX2hhc2g31SBPTcUK1QMKAG5ldHdvcmtfaWQcLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cracked_nether_bricks", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmNyYWNrZWRfbmV0aGVyX2JyaWNrcwQJAG5hbWVfaGFzaAdC6eKzXT5tAwoAbmV0d29ya19pZMUaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:quartz_bricks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnF1YXJ0el9icmlja3MECQBuYW1lX2hhc2jSZO590dd8sAMKAG5ldHdvcmtfaWTsKQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWS1KgAACgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQcAZGVmYXVsdAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWS2KgAACgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQUAbW9zc3kAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWS3KgAACgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQcAY3JhY2tlZAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWS4KgAACgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQgAY2hpc2VsZWQAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:end_bricks", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmVuZF9icmlja3MECQBuYW1lX2hhc2hIUFfxNLZaFgMKAG5ldHdvcmtfaWTKAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWTVKAAACgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBgBicmlja3MAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:polished_blackstone_bricks", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzBAkAbmFtZV9oYXNoIHgsgIdzKXcDCgBuZXR3b3JrX2lk8hwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cracked_polished_blackstone_bricks", - "block_state_b64": "CgAACAQAbmFtZSwAbWluZWNyYWZ0OmNyYWNrZWRfcG9saXNoZWRfYmxhY2tzdG9uZV9icmlja3MECQBuYW1lX2hhc2jQIO1GQDk80AMKAG5ldHdvcmtfaWTpLgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:gilded_blackstone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmdpbGRlZF9ibGFja3N0b25lBAkAbmFtZV9oYXNoNoWt1ocG0HEDCgBuZXR3b3JrX2lk6BoAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:chiseled_polished_blackstone", - "block_state_b64": "CgAACAQAbmFtZSYAbWluZWNyYWZ0OmNoaXNlbGVkX3BvbGlzaGVkX2JsYWNrc3RvbmUECQBuYW1lX2hhc2gzFa+kEjCJgAMKAG5ldHdvcmtfaWQMIAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate_tiles", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlcwQJAG5hbWVfaGFzaGcLLx3NXAFvAwoAbmV0d29ya19pZOIaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cracked_deepslate_tiles", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX3RpbGVzBAkAbmFtZV9oYXNo9zWgkFuMM1QDCgBuZXR3b3JrX2lkChkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:deepslate_bricks", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja3MECQBuYW1lX2hhc2gucvFmPdZxigMKAG5ldHdvcmtfaWShIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cracked_deepslate_bricks", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX2JyaWNrcwQJAG5hbWVfaGFzaN40aqhh9WqHAwoAbmV0d29ya19pZDwhAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:chiseled_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNoaXNlbGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaEU7/uRG8HSBAwoAbmV0d29ya19pZLggAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cobblestone", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvYmJsZXN0b25lBAkAbmFtZV9oYXNoPoK7mGlSUz4DCgBuZXR3b3JrX2lkZxUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mossy_cobblestone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lBAkAbmFtZV9oYXNoGJ67FCbkChMDCgBuZXR3b3JrX2lkmAIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cobbled_deepslate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlBAkAbmFtZV9oYXNoLUz9Y/ywmLwDCgBuZXR3b3JrX2lkMCsAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:smooth_stone", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNtb290aF9zdG9uZQQJAG5hbWVfaGFzaMwf87/JaTNvAwoAbmV0d29ya19pZOMaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZJAVAAAKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUHAGRlZmF1bHQAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZJEVAAAKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGULAGhlaXJvZ2x5cGhzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZJIVAAAKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUDAGN1dAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZJMVAAAKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUGAHNtb290aAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTWKgAACgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTXKgAACgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlCwBoZWlyb2dseXBocwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTYKgAACgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlAwBjdXQAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTZKgAACgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlBgBzbW9vdGgAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coal_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNvYWxfYmxvY2sECQBuYW1lX2hhc2jH8QQP3t5PiAMKAG5ldHdvcmtfaWReIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dried_kelp_block", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRyaWVkX2tlbHBfYmxvY2sECQBuYW1lX2hhc2iRoucexkrl8wMKAG5ldHdvcmtfaWQIMgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:gold_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdvbGRfYmxvY2sECQBuYW1lX2hhc2iYLshvjtXzFwMKAG5ldHdvcmtfaWT1AgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:iron_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omlyb25fYmxvY2sECQBuYW1lX2hhc2jYINmJQbvV/gMKAG5ldHdvcmtfaWQ5MwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:copper_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNvcHBlcl9ibG9jawQJAG5hbWVfaGFzaDVxnehsGaZ1AwoAbmV0d29ya19pZNUcAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:exposed_copper", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoQH3Fukmu3CEDCgBuZXR3b3JrX2lkKgUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:weathered_copper", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2hJCQXbvobv+gMKAG5ldHdvcmtfaWQXMwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:oxidized_copper", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMDtJqR0G5Y7AwoAbmV0d29ya19pZCYVAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waxed_copper", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndheGVkX2NvcHBlcgQJAG5hbWVfaGFzaPF+FG6Eh5fsAwoAbmV0d29ya19pZBAxAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waxed_exposed_copper", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoig8IOc+SCikDCgBuZXR3b3JrX2lk8gYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:waxed_weathered_copper", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2gjtPq8MOdvKgMKAG5ldHdvcmtfaWT/BgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_oxidized_copper", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMaORhsO+LzjAwoAbmV0d29ya19pZEgwAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cut_copper", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmN1dF9jb3BwZXIECQBuYW1lX2hhc2hAfN3NGax3eAMKAG5ldHdvcmtfaWT7HAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:exposed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcgQJAG5hbWVfaGFzaA85G3yv/w6pAwoAbmV0d29ya19pZCQpAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:weathered_cut_copper", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyBAkAbmFtZV9oYXNoVgRV0fBaz88DCgBuZXR3b3JrX2lk2C4AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:oxidized_cut_copper", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2iP8WmFWOkriwMKAG5ldHdvcmtfaWSvIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2jumiwOZIqv2AMKAG5ldHdvcmtfaWRRLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:waxed_exposed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcgQJAG5hbWVfaGFzaPE/OfK6IoVMAwoAbmV0d29ya19pZDEWAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waxed_weathered_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyBAkAbmFtZV9oYXNoCA1xDp11bnwDCgBuZXR3b3JrX2lkJh8AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2i1pZAsZYHLDAMKAG5ldHdvcmtfaWRtAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:emerald_block", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmVtZXJhbGRfYmxvY2sECQBuYW1lX2hhc2hK6QunqJznNAMKAG5ldHdvcmtfaWTOCAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:diamond_block", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRpYW1vbmRfYmxvY2sECQBuYW1lX2hhc2iGKrxuvkytFQMKAG5ldHdvcmtfaWS+AgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:lapis_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxhcGlzX2Jsb2NrBAkAbmFtZV9oYXNoDZ44xdb2zVoDCgBuZXR3b3JrX2lkjhkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:raw_iron_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJhd19pcm9uX2Jsb2NrBAkAbmFtZV9oYXNo9XyzNIQXxvwDCgBuZXR3b3JrX2lkNjMAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:raw_copper_block", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnJhd19jb3BwZXJfYmxvY2sECQBuYW1lX2hhc2hw1KG0TNUGgwMKAG5ldHdvcmtfaWTrIAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:raw_gold_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJhd19nb2xkX2Jsb2NrBAkAbmFtZV9oYXNo6YuwuLwfOBwDCgBuZXR3b3JrX2lkPgQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZLsVAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQcAZGVmYXVsdAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZL0VAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQUAbGluZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZLwVAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQgAY2hpc2VsZWQICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZL4VAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQYAc21vb3RoCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWTTKAAACgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWTUKAAACgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBABkYXJrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:slime", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnNsaW1lBAkAbmFtZV9oYXNoHJiEEJx+JlkDCgBuZXR3b3JrX2lkVhkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:honey_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmhvbmV5X2Jsb2NrBAkAbmFtZV9oYXNo9zLYSUlelywDCgBuZXR3b3JrX2lkwAcAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:honeycomb_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmhvbmV5Y29tYl9ibG9jawQJAG5hbWVfaGFzaASIPuOCYd1oAwoAbmV0d29ya19pZHkaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:hay_block", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmhheV9ibG9jawQJAG5hbWVfaGFzaIB2VxKxX8EpAwoAbmV0d29ya19pZPMGAAAKBgBzdGF0ZXMDCgBkZXByZWNhdGVkAAAAAAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bone_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJvbmVfYmxvY2sECQBuYW1lX2hhc2i4ZX576W9AWgMKAG5ldHdvcmtfaWRXGQAACgYAc3RhdGVzAwoAZGVwcmVjYXRlZAAAAAAICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:nether_brick", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om5ldGhlcl9icmljawQJAG5hbWVfaGFzaMxcRiheU+nXAwoAbmV0d29ya19pZDwvAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_nether_brick", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2sECQBuYW1lX2hhc2j8pRO4LfoECAMKAG5ldHdvcmtfaWQoAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:netherite_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om5ldGhlcml0ZV9ibG9jawQJAG5hbWVfaGFzaMghh6Zib/ZKAwoAbmV0d29ya19pZA4WAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lodestone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxvZGVzdG9uZQQJAG5hbWVfaGFzaJ2gmHOTlXv8AwoAbmV0d29ya19pZDQzAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:white_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OndoaXRlX3dvb2wECQBuYW1lX2hhc2jRWB7vaIEDiQMKAG5ldHdvcmtfaWRfIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:light_gray_wool", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfd29vbAQJAG5hbWVfaGFzaOpdQ1a2v4b3AwoAbmV0d29ya19pZFQyAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:gray_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmdyYXlfd29vbAQJAG5hbWVfaGFzaLsc1Lp1xdIOAwoAbmV0d29ya19pZHkCAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:black_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJsYWNrX3dvb2wECQBuYW1lX2hhc2hP2HC6o0X4HAMKAG5ldHdvcmtfaWRABAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:brown_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJyb3duX3dvb2wECQBuYW1lX2hhc2ig5IW89PrREwMKAG5ldHdvcmtfaWStAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_wool", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnJlZF93b29sBAkAbmFtZV9oYXNoY4TBDq+mFgUDCgBuZXR3b3JrX2lkeAAAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:orange_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om9yYW5nZV93b29sBAkAbmFtZV9oYXNoFstfrTZfSCgDCgBuZXR3b3JrX2lk3wYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:yellow_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnllbGxvd193b29sBAkAbmFtZV9oYXNoTFyus2RHegcDCgBuZXR3b3JrX2lkHwIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:lime_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxpbWVfd29vbAQJAG5hbWVfaGFzaNVnnzKiMxmeAwoAbmV0d29ya19pZGgoAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:green_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyZWVuX3dvb2wECQBuYW1lX2hhc2i3mElRYHIcSQMKAG5ldHdvcmtfaWTaFQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cyan_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmN5YW5fd29vbAQJAG5hbWVfaGFzaBNDfvHn8dqFAwoAbmV0d29ya19pZCYhAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:light_blue_wool", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfd29vbAQJAG5hbWVfaGFzaLWFAUfyxFPNAwoAbmV0d29ya19pZNQsAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:blue_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJsdWVfd29vbAQJAG5hbWVfaGFzaLjHyxxbTWCLAwoAbmV0d29ya19pZLAhAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:purple_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnB1cnBsZV93b29sBAkAbmFtZV9oYXNojvFtqzjAf/4DCgBuZXR3b3JrX2lkODMAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:magenta_wool", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om1hZ2VudGFfd29vbAQJAG5hbWVfaGFzaGuOHvf+Pd4yAwoAbmV0d29ya19pZAsIAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:pink_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnBpbmtfd29vbAQJAG5hbWVfaGFzaPiVA2pFeoFLAwoAbmV0d29ya19pZA8WAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:white_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndoaXRlX2NhcnBldAQJAG5hbWVfaGFzaNeMHTI1fWPXAwoAbmV0d29ya19pZDgvAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:light_gray_carpet", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0BAkAbmFtZV9oYXNoHPw6ArBAsP0DCgBuZXR3b3JrX2lkNzMAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:gray_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdyYXlfY2FycGV0BAkAbmFtZV9oYXNoZVR0OI+1VRADCgBuZXR3b3JrX2lkegIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:black_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJsYWNrX2NhcnBldAQJAG5hbWVfaGFzaOk7LP9NptyhAwoAbmV0d29ya19pZI8oAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:brown_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyb3duX2NhcnBldAQJAG5hbWVfaGFzaNaXFyOsAvIvAwoAbmV0d29ya19pZPMHAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_carpet", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9jYXJwZXQECQBuYW1lX2hhc2i9eSKBf6SO3wMKAG5ldHdvcmtfaWTNLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:orange_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om9yYW5nZV9jYXJwZXQECQBuYW1lX2hhc2hIUkO4HlAdygMKAG5ldHdvcmtfaWTLLAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:yellow_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19jYXJwZXQECQBuYW1lX2hhc2hSDKX3scCamwMKAG5ldHdvcmtfaWSIJgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:lime_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpbWVfY2FycGV0BAkAbmFtZV9oYXNo+6KFOpzsib4DCgBuZXR3b3JrX2lkWysAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:green_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmdyZWVuX2NhcnBldAQJAG5hbWVfaGFzaCHPMP9ltqFJAwoAbmV0d29ya19pZNsVAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cyan_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmN5YW5fY2FycGV0BAkAbmFtZV9oYXNobXf62dQBJj8DCgBuZXR3b3JrX2lkahUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:light_blue_carpet", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0BAkAbmFtZV9oYXNo20l4oktdZ3sDCgBuZXR3b3JrX2lkdB0AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:blue_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJsdWVfY2FycGV0BAkAbmFtZV9oYXNo3p3lsW0eQwsDCgBuZXR3b3JrX2lkSQIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:purple_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnBsZV9jYXJwZXQECQBuYW1lX2hhc2jwIA9pW/qp7QMKAG5ldHdvcmtfaWQhMQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:magenta_carpet", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0BAkAbmFtZV9oYXNoFXT36YNNZhMDCgBuZXR3b3JrX2lknAIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:pink_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfY2FycGV0BAkAbmFtZV9oYXNoHll72oqk+OoDCgBuZXR3b3JrX2lk5zAAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJQpAAAKBgBzdGF0ZXMIBQBjb2xvcgUAd2hpdGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJwpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAc2lsdmVyAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJspAAAKBgBzdGF0ZXMIBQBjb2xvcgQAZ3JheQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZKMpAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYmxhY2sAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZKApAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYnJvd24AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZKIpAAAKBgBzdGF0ZXMIBQBjb2xvcgMAcmVkAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJUpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAb3JhbmdlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJgpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAeWVsbG93AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJkpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAbGltZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZKEpAAAKBgBzdGF0ZXMIBQBjb2xvcgUAZ3JlZW4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJ0pAAAKBgBzdGF0ZXMIBQBjb2xvcgQAY3lhbgADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJcpAAAKBgBzdGF0ZXMIBQBjb2xvcgoAbGlnaHRfYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJ8pAAAKBgBzdGF0ZXMIBQBjb2xvcgQAYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJ4pAAAKBgBzdGF0ZXMIBQBjb2xvcgYAcHVycGxlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJYpAAAKBgBzdGF0ZXMIBQBjb2xvcgcAbWFnZW50YQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:concrete_powder", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaJNKGQOSGsSsAwoAbmV0d29ya19pZJopAAAKBgBzdGF0ZXMIBQBjb2xvcgQAcGluawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:white_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlBAkAbmFtZV9oYXNo6zAp7lsLlvkDCgBuZXR3b3JrX2lkcDIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:light_gray_concrete", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGUECQBuYW1lX2hhc2hEtet5wuDIKAMKAG5ldHdvcmtfaWTpBgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:gray_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmdyYXlfY29uY3JldGUECQBuYW1lX2hhc2j92INnb0a83AMKAG5ldHdvcmtfaWSYLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:black_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJsYWNrX2NvbmNyZXRlBAkAbmFtZV9oYXNo2X7NDIQmZ70DCgBuZXR3b3JrX2lkSSsAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:brown_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlBAkAbmFtZV9oYXNoeka02BwXf6oDCgBuZXR3b3JrX2lkVikAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_concrete", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZF9jb25jcmV0ZQQJAG5hbWVfaGFzaPWmNowLGubqAwoAbmV0d29ya19pZOYwAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:orange_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZQQJAG5hbWVfaGFzaAgE8XmaAi6+AwoAbmV0d29ya19pZFkrAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:yellow_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZQQJAG5hbWVfaGFzaE6ONfJPBd0+AwoAbmV0d29ya19pZGkVAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lime_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmxpbWVfY29uY3JldGUECQBuYW1lX2hhc2gnd8JW6wmJcAMKAG5ldHdvcmtfaWTkGgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:green_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlBAkAbmFtZV9oYXNokbFxRKchQZkDCgBuZXR3b3JrX2lkeCYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cyan_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmN5YW5fY29uY3JldGUECQBuYW1lX2hhc2hFRrWJ33qj1wMKAG5ldHdvcmtfaWQ5LwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:light_blue_concrete", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY29uY3JldGUECQBuYW1lX2hhc2gHAe0kl0SE4AMKAG5ldHdvcmtfaWTfLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blue_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJsdWVfY29uY3JldGUECQBuYW1lX2hhc2hiay301nnj1wMKAG5ldHdvcmtfaWQ7LwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:purple_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZQQJAG5hbWVfaGFzaHBHflsPIwdXAwoAbmV0d29ya19pZCwZAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:magenta_concrete", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0Om1hZ2VudGFfY29uY3JldGUECQBuYW1lX2hhc2gN7LuB/OvdZAMKAG5ldHdvcmtfaWQBGgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:pink_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnBpbmtfY29uY3JldGUECQBuYW1lX2hhc2ii2G5F0u3SOAMKAG5ldHdvcmtfaWSdEwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:clay", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmNsYXkECQBuYW1lX2hhc2j/S6sKXRcpzwMKAG5ldHdvcmtfaWQGLQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:hardened_clay", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmhhcmRlbmVkX2NsYXkECQBuYW1lX2hhc2jrnRwCJ0krJAMKAG5ldHdvcmtfaWRGBQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZC4pAAAKBgBzdGF0ZXMIBQBjb2xvcgUAd2hpdGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDYpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAc2lsdmVyAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDUpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAZ3JheQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZD0pAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYmxhY2sAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDopAAAKBgBzdGF0ZXMIBQBjb2xvcgUAYnJvd24AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDwpAAAKBgBzdGF0ZXMIBQBjb2xvcgMAcmVkAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZC8pAAAKBgBzdGF0ZXMIBQBjb2xvcgYAb3JhbmdlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDIpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAeWVsbG93AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDMpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAbGltZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDspAAAKBgBzdGF0ZXMIBQBjb2xvcgUAZ3JlZW4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDcpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAY3lhbgADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDEpAAAKBgBzdGF0ZXMIBQBjb2xvcgoAbGlnaHRfYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDkpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAYmx1ZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDgpAAAKBgBzdGF0ZXMIBQBjb2xvcgYAcHVycGxlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDApAAAKBgBzdGF0ZXMIBQBjb2xvcgcAbWFnZW50YQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stained_hardened_clay", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0YWluZWRfaGFyZGVuZWRfY2xheQQJAG5hbWVfaGFzaNYbyvfAS3CpAwoAbmV0d29ya19pZDQpAAAKBgBzdGF0ZXMIBQBjb2xvcgQAcGluawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:white_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OndoaXRlX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoiVzCdoHAJo0DCgBuZXR3b3JrX2lkDyIAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:silver_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnNpbHZlcl9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaAVsA0CnhzA4AwoAbmV0d29ya19pZI8TAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:gray_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmdyYXlfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2jvLZt9u/lF/AMKAG5ldHdvcmtfaWQuMwAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:black_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmJsYWNrX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoe8I4xAXbO5UDCgBuZXR3b3JrX2lkmiQAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:brown_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmJyb3duX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoSiNZOobbpjoDCgBuZXR3b3JrX2lkIBUAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnJlZF9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaBdWFGLmCLFVAwoAbmV0d29ya19pZBEZAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:orange_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om9yYW5nZV9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaMyJMrnPr7szAwoAbmV0d29ya19pZMYIAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:yellow_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnllbGxvd19nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaN6NaIhf6m0uAwoAbmV0d29ya19pZOUHAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:lime_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpbWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2iF3E68/rB2EAMKAG5ldHdvcmtfaWR7AgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:green_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmdyZWVuX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNow5mo8aQDFboDCgBuZXR3b3JrX2lk9CoAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:cyan_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmN5YW5fZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2gnNB+cCFRJhwMKAG5ldHdvcmtfaWQ2IQAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:light_blue_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSYAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2gladnCDBKCigMKAG5ldHdvcmtfaWSoIQAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:blue_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmJsdWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2giOZK+2nB1igMKAG5ldHdvcmtfaWSiIQAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:purple_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnB1cnBsZV9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaIQU03txeAfHAwoAbmV0d29ya19pZIssAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:magenta_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0Om1hZ2VudGFfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2i/SNqDJbfjMgMKAG5ldHdvcmtfaWQMCAAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:pink_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnBpbmtfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2hik8DVt4g+twMKAG5ldHdvcmtfaWStKgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:purpur_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnB1cnB1cl9ibG9jawQJAG5hbWVfaGFzaAgLwnUZGlzsAwoAbmV0d29ya19pZPYwAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQcAZGVmYXVsdAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:purpur_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnB1cnB1cl9ibG9jawQJAG5hbWVfaGFzaAgLwnUZGlzsAwoAbmV0d29ya19pZPgwAAAKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQUAbGluZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:packed_mud", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnBhY2tlZF9tdWQECQBuYW1lX2hhc2gHOMa121h4FgMKAG5ldHdvcmtfaWTNAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mud_bricks", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om11ZF9icmlja3MECQBuYW1lX2hhc2iDL/SVl/PewQMKAG5ldHdvcmtfaWQHLAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:nether_wart_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om5ldGhlcl93YXJ0X2Jsb2NrBAkAbmFtZV9oYXNo9XGS4GNnlV4DCgBuZXR3b3JrX2lkmBkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_wart_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndhcnBlZF93YXJ0X2Jsb2NrBAkAbmFtZV9oYXNo9IqDS9yUPJoDCgBuZXR3b3JrX2lkfiYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:shroomlight", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNocm9vbWxpZ2h0BAkAbmFtZV9oYXNoZHCHcHX/HYADCgBuZXR3b3JrX2lk+x8AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:crimson_nylium", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fbnlsaXVtBAkAbmFtZV9oYXNoOr6DJYW2bFYDCgBuZXR3b3JrX2lkKRkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_nylium", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9ueWxpdW0ECQBuYW1lX2hhc2g0Zf89cfr3rwMKAG5ldHdvcmtfaWTqKQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:netherrack", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om5ldGhlcnJhY2sECQBuYW1lX2hhc2i/r5ZyRsvPyQMKAG5ldHdvcmtfaWSmLAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:basalt", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhc2FsdAQJAG5hbWVfaGFzaH+UQO2yWodiAwoAbmV0d29ya19pZPMZAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_basalt", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnBvbGlzaGVkX2Jhc2FsdAQJAG5hbWVfaGFzaMS+L0gMnRcBAwoAbmV0d29ya19pZBgAAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:smooth_basalt", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNtb290aF9iYXNhbHQECQBuYW1lX2hhc2jKPUdz89kuNAMKAG5ldHdvcmtfaWTMCAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:soul_soil", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNvdWxfc29pbAQJAG5hbWVfaGFzaC1/87ccutuTAwoAbmV0d29ya19pZBIjAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dirt", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmRpcnQECQBuYW1lX2hhc2hXp6jnXAe+kQMKAG5ldHdvcmtfaWTDIgAACgYAc3RhdGVzCAkAZGlydF90eXBlBgBub3JtYWwAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dirt", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmRpcnQECQBuYW1lX2hhc2hXp6jnXAe+kQMKAG5ldHdvcmtfaWTEIgAACgYAc3RhdGVzCAkAZGlydF90eXBlBgBjb2Fyc2UAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:farmland", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmZhcm1sYW5kBAkAbmFtZV9oYXNoxyQ5ag7LolADCgBuZXR3b3JrX2lkEhgAAAoGAHN0YXRlcwMSAG1vaXN0dXJpemVkX2Ftb3VudAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:grass", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmdyYXNzBAkAbmFtZV9oYXNosppASPWFlsUDCgBuZXR3b3JrX2lkZCwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:grass_path", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyYXNzX3BhdGgECQBuYW1lX2hhc2i0/KZV8Qsy+gMKAG5ldHdvcmtfaWRyMgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:podzol", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBvZHpvbAQJAG5hbWVfaGFzaBzqokRjH4Z1AwoAbmV0d29ya19pZNQcAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mycelium", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om15Y2VsaXVtBAkAbmFtZV9oYXNojTN09cKickIDCgBuZXR3b3JrX2lkrhUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mud", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0Om11ZAQJAG5hbWVfaGFzaPb/3P+uLy+9AwoAbmV0d29ya19pZDIrAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk0wYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUFAHN0b25lAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:iron_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Omlyb25fb3JlBAkAbmFtZV9oYXNoS7BYtLnfx3gDCgBuZXR3b3JrX2lk/BwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:gold_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmdvbGRfb3JlBAkAbmFtZV9oYXNoC5Y+DUGXLC4DCgBuZXR3b3JrX2lk5AcAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:diamond_ore", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmRpYW1vbmRfb3JlBAkAbmFtZV9oYXNokUOJ2wZZrGQDCgBuZXR3b3JrX2lk/xkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:lapis_ore", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxhcGlzX29yZQQJAG5hbWVfaGFzaMrmrUrSzb7qAwoAbmV0d29ya19pZOUwAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:redstone_ore", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZHN0b25lX29yZQQJAG5hbWVfaGFzaFHVnp8Wc4JbAwoAbmV0d29ya19pZJEZAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coal_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmNvYWxfb3JlBAkAbmFtZV9oYXNo1OjA+Iuy51oDCgBuZXR3b3JrX2lkjxkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:copper_ore", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNvcHBlcl9vcmUECQBuYW1lX2hhc2iSZduSntOzOwMKAG5ldHdvcmtfaWQnFQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:emerald_ore", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmVtZXJhbGRfb3JlBAkAbmFtZV9oYXNoJTovr+VgINsDCgBuZXR3b3JrX2lkhy8AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:quartz_ore", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnF1YXJ0el9vcmUECQBuYW1lX2hhc2g0yNHLMK9TaQMKAG5ldHdvcmtfaWSSGgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:nether_gold_ore", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om5ldGhlcl9nb2xkX29yZQQJAG5hbWVfaGFzaEJZ7segIBgBAwoAbmV0d29ya19pZBsAAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:ancient_debris", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFuY2llbnRfZGVicmlzBAkAbmFtZV9oYXNoNrbxMc9AwKcDCgBuZXR3b3JrX2lk6SgAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:deepslate_iron_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9pcm9uX29yZQQJAG5hbWVfaGFzaB/fDL9pgvXXAwoAbmV0d29ya19pZD0vAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_gold_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9nb2xkX29yZQQJAG5hbWVfaGFzaF9G7WYhKFinAwoAbmV0d29ya19pZOgoAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_diamond_ore", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV9kaWFtb25kX29yZQQJAG5hbWVfaGFzaEUH5USh+iD3AwoAbmV0d29ya19pZEMyAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_lapis_ore", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV9sYXBpc19vcmUECQBuYW1lX2hhc2j+yFxU/KZs1gMKAG5ldHdvcmtfaWQpLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate_redstone_ore", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRlZXBzbGF0ZV9yZWRzdG9uZV9vcmUECQBuYW1lX2hhc2iVgM3wWWD6ugMKAG5ldHdvcmtfaWT6KgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate_emerald_ore", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV9lbWVyYWxkX29yZQQJAG5hbWVfaGFzaNlfo5HTwS6wAwoAbmV0d29ya19pZOspAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_coal_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9jb2FsX29yZQQJAG5hbWVfaGFzaIjikmcbRrPPAwoAbmV0d29ya19pZNcuAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:deepslate_copper_ore", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9jb3BwZXJfb3JlBAkAbmFtZV9oYXNottjV4Ev5LAQDCgBuZXR3b3JrX2lkbAAAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:gravel", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmdyYXZlbAQJAG5hbWVfaGFzaOFxz8XJd2r/AwoAbmV0d29ya19pZFMzAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk1AYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUHAGdyYW5pdGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk1gYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUHAGRpb3JpdGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk2AYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUIAGFuZGVzaXRlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blackstone", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJsYWNrc3RvbmUECQBuYW1lX2hhc2iMFYziD80D6QMKAG5ldHdvcmtfaWRzMAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:deepslate", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmRlZXBzbGF0ZQQJAG5hbWVfaGFzaKX5pAblxz8TAwoAbmV0d29ya19pZJkCAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk1QYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUOAGdyYW5pdGVfc21vb3RoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk1wYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUOAGRpb3JpdGVfc21vb3RoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk2QYAAAoGAHN0YXRlcwgKAHN0b25lX3R5cGUPAGFuZGVzaXRlX3Ntb290aAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:polished_blackstone", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmUECQBuYW1lX2hhc2jT9fHCl6vWQQMKAG5ldHdvcmtfaWStFQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:polished_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaHC1edoaWF3uAwoAbmV0d29ya19pZCYxAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sand", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNhbmQECQBuYW1lX2hhc2i6lthXXbAyWAMKAG5ldHdvcmtfaWQwGQAACgYAc3RhdGVzCAkAc2FuZF90eXBlBgBub3JtYWwAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sand", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNhbmQECQBuYW1lX2hhc2i6lthXXbAyWAMKAG5ldHdvcmtfaWQxGQAACgYAc3RhdGVzCAkAc2FuZF90eXBlAwByZWQAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cactus", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmNhY3R1cwQJAG5hbWVfaGFzaCG9zL0N4wvGAwoAbmV0d29ya19pZG8sAAAKBgBzdGF0ZXMDAwBhZ2UAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:oak_log", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0Om9ha19sb2cECQBuYW1lX2hhc2ho6TS+K7PZFQMKAG5ldHdvcmtfaWTHAgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_oak_log", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0cmlwcGVkX29ha19sb2cECQBuYW1lX2hhc2h8dqh+OOHU4wMKAG5ldHdvcmtfaWRJMAAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:spruce_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNwcnVjZV9sb2cECQBuYW1lX2hhc2hZ03qaLoF3WgMKAG5ldHdvcmtfaWR7GQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_spruce_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX3NwcnVjZV9sb2cECQBuYW1lX2hhc2iNrhKjS5IyrgMKAG5ldHdvcmtfaWStKQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:birch_log", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJpcmNoX2xvZwQJAG5hbWVfaGFzaBUzT3NxsZAnAwoAbmV0d29ya19pZNoGAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_birch_log", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0cmlwcGVkX2JpcmNoX2xvZwQJAG5hbWVfaGFzaCFKS4AeuSidAwoAbmV0d29ya19pZMQmAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:jungle_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omp1bmdsZV9sb2cECQBuYW1lX2hhc2gkwW0KNulqDgMKAG5ldHdvcmtfaWRyAgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_jungle_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2p1bmdsZV9sb2cECQBuYW1lX2hhc2hAwMsgOk02JAMKAG5ldHdvcmtfaWTHBgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:acacia_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmFjYWNpYV9sb2cECQBuYW1lX2hhc2iV48VpYhjoYQMKAG5ldHdvcmtfaWTgGQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_acacia_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2FjYWNpYV9sb2cECQBuYW1lX2hhc2hJb0lQqnEqlgMKAG5ldHdvcmtfaWS0JAAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dark_oak_log", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRhcmtfb2FrX2xvZwQJAG5hbWVfaGFzaIWfVRd0XUo3AwoAbmV0d29ya19pZNMRAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_dark_oak_log", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2Rhcmtfb2FrX2xvZwQJAG5hbWVfaGFzaPFTdxRdPwkOAwoAbmV0d29ya19pZG8CAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mangrove_log", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om1hbmdyb3ZlX2xvZwQJAG5hbWVfaGFzaHZe6DzPZBobAwoAbmV0d29ya19pZDEEAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_mangrove_log", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX2xvZwQJAG5hbWVfaGFzaLqIBo4hwA//AwoAbmV0d29ya19pZFAzAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cherry_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNoZXJyeV9sb2cECQBuYW1lX2hhc2hwFlaioppB1wMKAG5ldHdvcmtfaWQtLwAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_cherry_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV9sb2cECQBuYW1lX2hhc2i85H6G+WhXaAMKAG5ldHdvcmtfaWRKGgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_stem", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNyaW1zb25fc3RlbQQJAG5hbWVfaGFzaM0FzfL0UTKZAwoAbmV0d29ya19pZHUmAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_crimson_stem", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25fc3RlbQQJAG5hbWVfaGFzaDlA6nood57EAwoAbmV0d29ya19pZEgsAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_stem", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndhcnBlZF9zdGVtBAkAbmFtZV9oYXNon7cKfPZxdrUDCgBuZXR3b3JrX2lkfyoAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stripped_warped_stem", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9zdGVtBAkAbmFtZV9oYXNoEw+y0dDPSd8DCgBuZXR3b3JrX2lkuC8AAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTWEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlAwBvYWsAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTcEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlAwBvYWsAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTXEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBzcHJ1Y2UAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTdEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBzcHJ1Y2UAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTYEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBQBiaXJjaAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTeEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBQBiaXJjaAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTZEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBqdW5nbGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTfEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBqdW5nbGUAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTaEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBhY2FjaWEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTgEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBhY2FjaWEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTbEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlCABkYXJrX29hawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWThEQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlCABkYXJrX29hawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mangrove_wood", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om1hbmdyb3ZlX3dvb2QECQBuYW1lX2hhc2iXVxG0JG2fVAMKAG5ldHdvcmtfaWQLGQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stripped_mangrove_wood", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX3dvb2QECQBuYW1lX2hhc2h7CkbaBF7/WAMKAG5ldHdvcmtfaWRSGQAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_wood", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNoZXJyeV93b29kBAkAbmFtZV9oYXNoAW8srlmpBM8DCgBuZXR3b3JrX2lk/SwAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AQwAc3RyaXBwZWRfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_cherry_wood", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV93b29kBAkAbmFtZV9oYXNo/e7KXv+CB38DCgBuZXR3b3JrX2lkPh8AAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:crimson_hyphae", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25faHlwaGFlBAkAbmFtZV9oYXNouRmKmfSqEWADCgBuZXR3b3JrX2lkuRkAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stripped_crimson_hyphae", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25faHlwaGFlBAkAbmFtZV9oYXNoFffwmABq4LUDCgBuZXR3b3JrX2lkgyoAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:warped_hyphae", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9oeXBoYWUECQBuYW1lX2hhc2hn8plQUr6pmQMKAG5ldHdvcmtfaWR7JgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:stripped_warped_hyphae", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9oeXBoYWUECQBuYW1lX2hhc2irKq+HYPSgjQMKAG5ldHdvcmtfaWQVIgAACgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bamboo_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJhbWJvb19ibG9jawQJAG5hbWVfaGFzaAbDeur6stIBAwoAbmV0d29ya19pZDwAAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:stripped_bamboo_block", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2JhbWJvb19ibG9jawQJAG5hbWVfaGFzaJpwytpZOZM9AwoAbmV0d29ya19pZFIVAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZNgoAAAKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlAwBvYWsBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZNkoAAAKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBgBzcHJ1Y2UBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZNooAAAKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBQBiaXJjaAEOAHBlcnNpc3RlbnRfYml0AAEKAHVwZGF0ZV9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZNsoAAAKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBgBqdW5nbGUBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:leaves2", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlYXZlczIECQBuYW1lX2hhc2gy/bgrncY1ZAMKAG5ldHdvcmtfaWT3GQAACgYAc3RhdGVzCA0AbmV3X2xlYWZfdHlwZQYAYWNhY2lhAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:leaves2", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlYXZlczIECQBuYW1lX2hhc2gy/bgrncY1ZAMKAG5ldHdvcmtfaWT4GQAACgYAc3RhdGVzCA0AbmV3X2xlYWZfdHlwZQgAZGFya19vYWsBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:mangrove_leaves", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX2xlYXZlcwQJAG5hbWVfaGFzaKyI/dWvhEG8AwoAbmV0d29ya19pZCwrAAAKBgBzdGF0ZXMBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cherry_leaves", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9sZWF2ZXMECQBuYW1lX2hhc2giTs9ChhYBlQMKAG5ldHdvcmtfaWSWJAAACgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:azalea_leaves", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXMECQBuYW1lX2hhc2iXFhD57wFS7AMKAG5ldHdvcmtfaWTyMAAACgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:azalea_leaves_flowered", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNfZmxvd2VyZWQECQBuYW1lX2hhc2gs8jxlS/pMrwMKAG5ldHdvcmtfaWTgKQAACgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQEBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUDAG9hawADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQFBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQGBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQHBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQIBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQJBwAACgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mangrove_propagule", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om1hbmdyb3ZlX3Byb3BhZ3VsZQQJAG5hbWVfaGFzaJGeox6hkfLFAwoAbmV0d29ya19pZGUsAAAKBgBzdGF0ZXMBBwBoYW5naW5nAAMPAHByb3BhZ3VsZV9zdGFnZQAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_sapling", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNoZXJyeV9zYXBsaW5nBAkAbmFtZV9oYXNoGrPpNMf1LtcDCgBuZXR3b3JrX2lkKy8AAAoGAHN0YXRlcwEHAGFnZV9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bee_nest", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmJlZV9uZXN0BAkAbmFtZV9oYXNo2R2WBxUHEZIDCgBuZXR3b3JrX2lkxiIAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAADCwBob25leV9sZXZlbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wheat_seeds" - }, - { - "id": "minecraft:pumpkin_seeds" - }, - { - "id": "minecraft:melon_seeds" - }, - { - "id": "minecraft:beetroot_seeds" - }, - { - "id": "minecraft:torchflower_seeds" - }, - { - "id": "minecraft:pitcher_pod" - }, - { - "id": "minecraft:wheat" - }, - { - "id": "minecraft:beetroot" - }, - { - "id": "minecraft:potato" - }, - { - "id": "minecraft:poisonous_potato" - }, - { - "id": "minecraft:carrot" - }, - { - "id": "minecraft:golden_carrot" - }, - { - "id": "minecraft:apple" - }, - { - "id": "minecraft:golden_apple" - }, - { - "id": "minecraft:enchanted_golden_apple" - }, - { - "id": "minecraft:melon_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1lbG9uX2Jsb2NrBAkAbmFtZV9oYXNoXxSm0iYpAx8DCgBuZXR3b3JrX2lkYQQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:melon_slice" - }, - { - "id": "minecraft:glistering_melon_slice" - }, - { - "id": "minecraft:sweet_berries" - }, - { - "id": "minecraft:glow_berries" - }, - { - "id": "minecraft:pumpkin", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnB1bXBraW4ECQBuYW1lX2hhc2gc8A3jaSzWbgMKAG5ldHdvcmtfaWTeGgAACgYAc3RhdGVzCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:carved_pumpkin", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNhcnZlZF9wdW1wa2luBAkAbmFtZV9oYXNoPu1T0MJuG90DCgBuZXR3b3JrX2lkoi8AAAoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:lit_pumpkin", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpdF9wdW1wa2luBAkAbmFtZV9oYXNo7gWtEm2uPL0DCgBuZXR3b3JrX2lkMysAAAoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:honeycomb" - }, - { - "id": "minecraft:tallgrass", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnRhbGxncmFzcwQJAG5hbWVfaGFzaC3PXpAXXYswAwoAbmV0d29ya19pZPYHAAAKBgBzdGF0ZXMIDwB0YWxsX2dyYXNzX3R5cGUEAGZlcm4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJghAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQQAZmVybgEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:tallgrass", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnRhbGxncmFzcwQJAG5hbWVfaGFzaC3PXpAXXYswAwoAbmV0d29ya19pZPUHAAAKBgBzdGF0ZXMIDwB0YWxsX2dyYXNzX3R5cGUEAHRhbGwAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJchAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQUAZ3Jhc3MBDwB1cHBlcl9ibG9ja19iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:nether_sprouts" - }, - { - "id": "minecraft:fire_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZpcmVfY29yYWwECQBuYW1lX2hhc2hOHyyECVQVJwMKAG5ldHdvcmtfaWTSBgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:brain_coral", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJyYWluX2NvcmFsBAkAbmFtZV9oYXNoRiWlLCwA2ycDCgBuZXR3b3JrX2lk3gYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:bubble_coral", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJ1YmJsZV9jb3JhbAQJAG5hbWVfaGFzaJz6rWnl+v2qAwoAbmV0d29ya19pZGkpAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:tube_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnR1YmVfY29yYWwECQBuYW1lX2hhc2iYa8oO/tgk7wMKAG5ldHdvcmtfaWQvMQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:horn_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omhvcm5fY29yYWwECQBuYW1lX2hhc2iZnRHjZbnLPgMKAG5ldHdvcmtfaWRoFQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dead_fire_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbAQJAG5hbWVfaGFzaEPU6tFy/latAwoAbmV0d29ya19pZKQpAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dead_brain_coral", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWwECQBuYW1lX2hhc2j5L6QJCISvzwMKAG5ldHdvcmtfaWTWLgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dead_bubble_coral", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsBAkAbmFtZV9oYXNoSTOZ/8wpeNYDCgBuZXR3b3JrX2lkKi8AAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:dead_tube_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbAQJAG5hbWVfaGFzaJGjNWhlaIJeAwoAbmV0d29ya19pZJcZAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:dead_horn_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbAQJAG5hbWVfaGFzaJBkz3qt+g2cAwoAbmV0d29ya19pZIkmAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZAYbAAAKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgMAcmVkAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZAQbAAAKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgQAcGluawMTAGNvcmFsX2Zhbl9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZAUbAAAKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgYAcHVycGxlAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZAMbAAAKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgQAYmx1ZQMTAGNvcmFsX2Zhbl9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZAcbAAAKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgYAeWVsbG93AxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkSAAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkRgAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkRwAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkRQAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkSQAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:crimson_roots", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNyaW1zb25fcm9vdHMECQBuYW1lX2hhc2j1fWgQLViv5QMKAG5ldHdvcmtfaWRnMAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:warped_roots", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndhcnBlZF9yb290cwQJAG5hbWVfaGFzaBc3WvbJOLlkAwoAbmV0d29ya19pZAAaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:yellow_flower", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19mbG93ZXIECQBuYW1lX2hhc2jWbU1pF0OUGAMKAG5ldHdvcmtfaWQABAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRrFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUFAHBvcHB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRsFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUGAG9yY2hpZAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRtFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUGAGFsbGl1bQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRuFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUJAGhvdXN0b25pYQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRvFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUJAHR1bGlwX3JlZAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRwFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUMAHR1bGlwX29yYW5nZQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRxFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGULAHR1bGlwX3doaXRlAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRyFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUKAHR1bGlwX3BpbmsAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRzFQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUFAG94ZXllAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWR0FQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUKAGNvcm5mbG93ZXIAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWR1FQAACgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUSAGxpbHlfb2ZfdGhlX3ZhbGxleQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJUhAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQkAc3VuZmxvd2VyAQ8AdXBwZXJfYmxvY2tfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJYhAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQcAc3lyaW5nYQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJkhAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQQAcm9zZQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZJohAAAKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQcAcGFlb25pYQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:pitcher_plant", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnBpdGNoZXJfcGxhbnQECQBuYW1lX2hhc2hRJHzsbDH+SQMKAG5ldHdvcmtfaWT8FQAACgYAc3RhdGVzAQ8AdXBwZXJfYmxvY2tfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:pink_petals", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfcGV0YWxzBAkAbmFtZV9oYXNo6DQwN9SwV3QDCgBuZXR3b3JrX2lkKxsAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAADBgBncm93dGgAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:wither_rose", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndpdGhlcl9yb3NlBAkAbmFtZV9oYXNoaSKxl3I516gDCgBuZXR3b3JrX2lkIykAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:torchflower", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnRvcmNoZmxvd2VyBAkAbmFtZV9oYXNoL+mHtElwbqQDCgBuZXR3b3JrX2lktCgAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:white_dye" - }, - { - "id": "minecraft:light_gray_dye" - }, - { - "id": "minecraft:gray_dye" - }, - { - "id": "minecraft:black_dye" - }, - { - "id": "minecraft:brown_dye" - }, - { - "id": "minecraft:red_dye" - }, - { - "id": "minecraft:orange_dye" - }, - { - "id": "minecraft:yellow_dye" - }, - { - "id": "minecraft:lime_dye" - }, - { - "id": "minecraft:green_dye" - }, - { - "id": "minecraft:cyan_dye" - }, - { - "id": "minecraft:light_blue_dye" - }, - { - "id": "minecraft:blue_dye" - }, - { - "id": "minecraft:purple_dye" - }, - { - "id": "minecraft:magenta_dye" - }, - { - "id": "minecraft:pink_dye" - }, - { - "id": "minecraft:ink_sac" - }, - { - "id": "minecraft:glow_ink_sac" - }, - { - "id": "minecraft:cocoa_beans" - }, - { - "id": "minecraft:lapis_lazuli" - }, - { - "id": "minecraft:bone_meal" - }, - { - "id": "minecraft:vine", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnZpbmUECQBuYW1lX2hhc2j0Sj8/XeXOLAMKAG5ldHdvcmtfaWTCBwAACgYAc3RhdGVzAxMAdmluZV9kaXJlY3Rpb25fYml0cwAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:weeping_vines", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndlZXBpbmdfdmluZXMECQBuYW1lX2hhc2jrLgLHkQygiwMKAG5ldHdvcmtfaWSxIQAACgYAc3RhdGVzAxEAd2VlcGluZ192aW5lc19hZ2UAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:twisting_vines", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnR3aXN0aW5nX3ZpbmVzBAkAbmFtZV9oYXNoDYR5QgVUQJADCgBuZXR3b3JrX2lkhiIAAAoGAHN0YXRlcwMSAHR3aXN0aW5nX3ZpbmVzX2FnZQAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:waterlily", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OndhdGVybGlseQQJAG5hbWVfaGFzaEHgC4c1SXg0AwoAbmV0d29ya19pZM0IAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:seagrass", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnNlYWdyYXNzBAkAbmFtZV9oYXNoHSBFtoHdWxIDCgBuZXR3b3JrX2lkkgIAAAoGAHN0YXRlcwgOAHNlYV9ncmFzc190eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:kelp" - }, - { - "id": "minecraft:deadbush", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmRlYWRidXNoBAkAbmFtZV9oYXNoPFODe4IScnYDCgBuZXR3b3JrX2lk7xwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:bamboo", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhbWJvbwQJAG5hbWVfaGFzaBgpGmyzhedCAwoAbmV0d29ya19pZK8VAAAKBgBzdGF0ZXMBBwBhZ2VfYml0AAgQAGJhbWJvb19sZWFmX3NpemUJAG5vX2xlYXZlcwgWAGJhbWJvb19zdGFsa190aGlja25lc3MEAHRoaW4AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:snow", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNub3cECQBuYW1lX2hhc2gVHr5XXdETWAMKAG5ldHdvcmtfaWQvGQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:ice", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OmljZQQJAG5hbWVfaGFzaNF26f+uUT29AwoAbmV0d29ya19pZDcrAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:packed_ice", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnBhY2tlZF9pY2UECQBuYW1lX2hhc2hk4bu123ZrFgMKAG5ldHdvcmtfaWTMAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blue_ice", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmJsdWVfaWNlBAkAbmFtZV9oYXNo+EKxYgFhKcgDCgBuZXR3b3JrX2lkmywAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:snow_layer", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNub3dfbGF5ZXIECQBuYW1lX2hhc2hXka6atMYUCQMKAG5ldHdvcmtfaWQxAgAACgYAc3RhdGVzAQsAY292ZXJlZF9iaXQAAwYAaGVpZ2h0AAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:pointed_dripstone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnBvaW50ZWRfZHJpcHN0b25lBAkAbmFtZV9oYXNoJMISzmHQgt8DCgBuZXR3b3JrX2lkyC8AAAoGAHN0YXRlcwgTAGRyaXBzdG9uZV90aGlja25lc3MDAHRpcAEHAGhhbmdpbmcBAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dripstone_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRyaXBzdG9uZV9ibG9jawQJAG5hbWVfaGFzaIIXnEqY77YsAwoAbmV0d29ya19pZMEHAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:moss_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vc3NfY2FycGV0BAkAbmFtZV9oYXNo/NEDxRPTshYDCgBuZXR3b3JrX2lk0AIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:moss_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om1vc3NfYmxvY2sECQBuYW1lX2hhc2iovcsPUYX2tgMKAG5ldHdvcmtfaWSsKgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dirt_with_roots", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRpcnRfd2l0aF9yb290cwQJAG5hbWVfaGFzaLCNDYPviDCIAwoAbmV0d29ya19pZF0hAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:hanging_roots", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omhhbmdpbmdfcm9vdHMECQBuYW1lX2hhc2jaXn+Y5UZpDAMKAG5ldHdvcmtfaWRkAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:mangrove_roots", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hbmdyb3ZlX3Jvb3RzBAkAbmFtZV9oYXNoa786PzQGZ6kDCgBuZXR3b3JrX2lkLSkAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:muddy_mangrove_roots", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0Om11ZGR5X21hbmdyb3ZlX3Jvb3RzBAkAbmFtZV9oYXNo9YApdHpo1RkDCgBuZXR3b3JrX2lkLAQAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:big_dripleaf", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpZ19kcmlwbGVhZgQJAG5hbWVfaGFzaGBEhXjo6qSdAwoAbmV0d29ya19pZMwmAAAKBgBzdGF0ZXMBEQBiaWdfZHJpcGxlYWZfaGVhZAEIEQBiaWdfZHJpcGxlYWZfdGlsdAQAbm9uZQMJAGRpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:small_dripleaf_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnNtYWxsX2RyaXBsZWFmX2Jsb2NrBAkAbmFtZV9oYXNojxRAgXP9uWADCgBuZXR3b3JrX2lk0xkAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgMAAAABDwB1cHBlcl9ibG9ja19iaXQBAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:spore_blossom", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwb3JlX2Jsb3Nzb20ECQBuYW1lX2hhc2il3U72Gbco2gMKAG5ldHdvcmtfaWRkLwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:azalea", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmF6YWxlYQQJAG5hbWVfaGFzaNyUl+BW9JrBAwoAbmV0d29ya19pZAYsAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:flowering_azalea", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmZsb3dlcmluZ19hemFsZWEECQBuYW1lX2hhc2ie9r33wz8kiwMKAG5ldHdvcmtfaWSuIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:glow_lichen", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Omdsb3dfbGljaGVuBAkAbmFtZV9oYXNobyPUrIYlo44DCgBuZXR3b3JrX2lkfyIAAAoGAHN0YXRlcwMZAG11bHRpX2ZhY2VfZGlyZWN0aW9uX2JpdHM/AAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:amethyst_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFtZXRoeXN0X2Jsb2NrBAkAbmFtZV9oYXNob+JK1iiAthcDCgBuZXR3b3JrX2lk9AIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:budding_amethyst", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJ1ZGRpbmdfYW1ldGh5c3QECQBuYW1lX2hhc2gJvAwfI14fxgMKAG5ldHdvcmtfaWR/LAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:amethyst_cluster", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmFtZXRoeXN0X2NsdXN0ZXIECQBuYW1lX2hhc2jK82S88Jgm8wMKAG5ldHdvcmtfaWRfMQAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgEAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:large_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmxhcmdlX2FtZXRoeXN0X2J1ZAQJAG5hbWVfaGFzaAHhdpWD+sd5AwoAbmV0d29ya19pZCIdAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAQAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:medium_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1lZGl1bV9hbWV0aHlzdF9idWQECQBuYW1lX2hhc2g5lBGtC0DzZQMKAG5ldHdvcmtfaWQPGgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgEAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:small_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnNtYWxsX2FtZXRoeXN0X2J1ZAQJAG5hbWVfaGFzaEnb4+q9PO4YAwoAbmV0d29ya19pZAMEAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAQAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:tuff", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnR1ZmYECQBuYW1lX2hhc2h1Rwc1XYsBGwMKAG5ldHdvcmtfaWQwBAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:calcite", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNhbGNpdGUECQBuYW1lX2hhc2ixKLu8ZIdzDQMKAG5ldHdvcmtfaWRuAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:chicken" - }, - { - "id": "minecraft:porkchop" - }, - { - "id": "minecraft:beef" - }, - { - "id": "minecraft:mutton" - }, - { - "id": "minecraft:rabbit" - }, - { - "id": "minecraft:cod" - }, - { - "id": "minecraft:salmon" - }, - { - "id": "minecraft:tropical_fish" - }, - { - "id": "minecraft:pufferfish" - }, - { - "id": "minecraft:brown_mushroom", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJyb3duX211c2hyb29tBAkAbmFtZV9oYXNonYw/FO78WDoDCgBuZXR3b3JrX2lkHxUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_mushroom", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZF9tdXNocm9vbQQJAG5hbWVfaGFzaPpzJua7669xAwoAbmV0d29ya19pZOcaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_fungus", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fZnVuZ3VzBAkAbmFtZV9oYXNolIcCUuFM2u0DCgBuZXR3b3JrX2lkJDEAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_fungus", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9mdW5ndXMECQBuYW1lX2hhc2gq8bSnRVTAFgMKAG5ldHdvcmtfaWTRAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkli8AAAoGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cw4AAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnJlZF9tdXNocm9vbV9ibG9jawQJAG5hbWVfaGFzaJTTyJbth9M9AwoAbmV0d29ya19pZGMVAAAKBgBzdGF0ZXMDEgBodWdlX211c2hyb29tX2JpdHMOAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkly8AAAoGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cw8AAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkiC8AAAoGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cwAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:egg" - }, - { - "id": "minecraft:sugar_cane" - }, - { - "id": "minecraft:sugar" - }, - { - "id": "minecraft:rotten_flesh" - }, - { - "id": "minecraft:bone" - }, - { - "id": "minecraft:web", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OndlYgQJAG5hbWVfaGFzaA4GKQCvG4i9AwoAbmV0d29ya19pZFArAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:spider_eye" - }, - { - "id": "minecraft:mob_spawner", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vYl9zcGF3bmVyBAkAbmFtZV9oYXNoNwGrCV/Fkh8DCgBuZXR3b3JrX2lkagQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk+hgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUFAHN0b25lAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk+xgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGULAGNvYmJsZXN0b25lAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk/BgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGULAHN0b25lX2JyaWNrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk/RgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGURAG1vc3N5X3N0b25lX2JyaWNrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk/hgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUTAGNyYWNrZWRfc3RvbmVfYnJpY2sAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lk/xgAAAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUUAGNoaXNlbGVkX3N0b25lX2JyaWNrAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:infested_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmluZmVzdGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaICF2VYccxF1AwoAbmV0d29ya19pZMscAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:dragon_egg", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmRyYWdvbl9lZ2cECQBuYW1lX2hhc2inMzXrV+/e1wMKAG5ldHdvcmtfaWQ6LwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:turtle_egg", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnR1cnRsZV9lZ2cECQBuYW1lX2hhc2iwSRcxOJIJ9gMKAG5ldHdvcmtfaWQaMgAACgYAc3RhdGVzCA0AY3JhY2tlZF9zdGF0ZQkAbm9fY3JhY2tzCBAAdHVydGxlX2VnZ19jb3VudAcAb25lX2VnZwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sniffer_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNuaWZmZXJfZWdnBAkAbmFtZV9oYXNoY1lozc8lPcYDCgBuZXR3b3JrX2lkgCwAAAoGAHN0YXRlcwgNAGNyYWNrZWRfc3RhdGUJAG5vX2NyYWNrcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:frog_spawn", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZyb2dfc3Bhd24ECQBuYW1lX2hhc2iWmd7idp3ZZwMKAG5ldHdvcmtfaWQoGgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:pearlescent_froglight", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnBlYXJsZXNjZW50X2Zyb2dsaWdodAQJAG5hbWVfaGFzaKkcFRyycYGyAwoAbmV0d29ya19pZEAqAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:verdant_froglight", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnZlcmRhbnRfZnJvZ2xpZ2h0BAkAbmFtZV9oYXNoA+eXuTBohrQDCgBuZXR3b3JrX2lkeioAAAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:ochre_froglight", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om9jaHJlX2Zyb2dsaWdodAQJAG5hbWVfaGFzaMY59kjPe+c3AwoAbmV0d29ya19pZHoTAAAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:chicken_spawn_egg" - }, - { - "id": "minecraft:bee_spawn_egg" - }, - { - "id": "minecraft:cow_spawn_egg" - }, - { - "id": "minecraft:pig_spawn_egg" - }, - { - "id": "minecraft:sheep_spawn_egg" - }, - { - "id": "minecraft:wolf_spawn_egg" - }, - { - "id": "minecraft:polar_bear_spawn_egg" - }, - { - "id": "minecraft:ocelot_spawn_egg" - }, - { - "id": "minecraft:cat_spawn_egg" - }, - { - "id": "minecraft:mooshroom_spawn_egg" - }, - { - "id": "minecraft:bat_spawn_egg" - }, - { - "id": "minecraft:parrot_spawn_egg" - }, - { - "id": "minecraft:rabbit_spawn_egg" - }, - { - "id": "minecraft:llama_spawn_egg" - }, - { - "id": "minecraft:horse_spawn_egg" - }, - { - "id": "minecraft:donkey_spawn_egg" - }, - { - "id": "minecraft:mule_spawn_egg" - }, - { - "id": "minecraft:skeleton_horse_spawn_egg" - }, - { - "id": "minecraft:zombie_horse_spawn_egg" - }, - { - "id": "minecraft:tropical_fish_spawn_egg" - }, - { - "id": "minecraft:cod_spawn_egg" - }, - { - "id": "minecraft:pufferfish_spawn_egg" - }, - { - "id": "minecraft:salmon_spawn_egg" - }, - { - "id": "minecraft:dolphin_spawn_egg" - }, - { - "id": "minecraft:turtle_spawn_egg" - }, - { - "id": "minecraft:panda_spawn_egg" - }, - { - "id": "minecraft:fox_spawn_egg" - }, - { - "id": "minecraft:creeper_spawn_egg" - }, - { - "id": "minecraft:enderman_spawn_egg" - }, - { - "id": "minecraft:silverfish_spawn_egg" - }, - { - "id": "minecraft:skeleton_spawn_egg" - }, - { - "id": "minecraft:wither_skeleton_spawn_egg" - }, - { - "id": "minecraft:stray_spawn_egg" - }, - { - "id": "minecraft:slime_spawn_egg" - }, - { - "id": "minecraft:spider_spawn_egg" - }, - { - "id": "minecraft:zombie_spawn_egg" - }, - { - "id": "minecraft:zombie_pigman_spawn_egg" - }, - { - "id": "minecraft:husk_spawn_egg" - }, - { - "id": "minecraft:drowned_spawn_egg" - }, - { - "id": "minecraft:squid_spawn_egg" - }, - { - "id": "minecraft:glow_squid_spawn_egg" - }, - { - "id": "minecraft:cave_spider_spawn_egg" - }, - { - "id": "minecraft:witch_spawn_egg" - }, - { - "id": "minecraft:guardian_spawn_egg" - }, - { - "id": "minecraft:elder_guardian_spawn_egg" - }, - { - "id": "minecraft:endermite_spawn_egg" - }, - { - "id": "minecraft:magma_cube_spawn_egg" - }, - { - "id": "minecraft:strider_spawn_egg" - }, - { - "id": "minecraft:hoglin_spawn_egg" - }, - { - "id": "minecraft:piglin_spawn_egg" - }, - { - "id": "minecraft:zoglin_spawn_egg" - }, - { - "id": "minecraft:piglin_brute_spawn_egg" - }, - { - "id": "minecraft:goat_spawn_egg" - }, - { - "id": "minecraft:axolotl_spawn_egg" - }, - { - "id": "minecraft:warden_spawn_egg" - }, - { - "id": "minecraft:allay_spawn_egg" - }, - { - "id": "minecraft:frog_spawn_egg" - }, - { - "id": "minecraft:tadpole_spawn_egg" - }, - { - "id": "minecraft:trader_llama_spawn_egg" - }, - { - "id": "minecraft:camel_spawn_egg" - }, - { - "id": "minecraft:ghast_spawn_egg" - }, - { - "id": "minecraft:blaze_spawn_egg" - }, - { - "id": "minecraft:shulker_spawn_egg" - }, - { - "id": "minecraft:vindicator_spawn_egg" - }, - { - "id": "minecraft:evoker_spawn_egg" - }, - { - "id": "minecraft:vex_spawn_egg" - }, - { - "id": "minecraft:villager_spawn_egg" - }, - { - "id": "minecraft:wandering_trader_spawn_egg" - }, - { - "id": "minecraft:zombie_villager_spawn_egg" - }, - { - "id": "minecraft:phantom_spawn_egg" - }, - { - "id": "minecraft:pillager_spawn_egg" - }, - { - "id": "minecraft:ravager_spawn_egg" - }, - { - "id": "minecraft:iron_golem_spawn_egg" - }, - { - "id": "minecraft:snow_golem_spawn_egg" - }, - { - "id": "minecraft:sniffer_spawn_egg" - }, - { - "id": "minecraft:obsidian", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om9ic2lkaWFuBAkAbmFtZV9oYXNoiz4qrb8QjyEDCgBuZXR3b3JrX2lkhQQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:crying_obsidian", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNyeWluZ19vYnNpZGlhbgQJAG5hbWVfaGFzaKT0JlA7Z1K+AwoAbmV0d29ya19pZForAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bedrock", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmJlZHJvY2sECQBuYW1lX2hhc2hWfFrh4LVtxwMKAG5ldHdvcmtfaWSRLAAACgYAc3RhdGVzAQ4AaW5maW5pYnVybl9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:soul_sand", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNvdWxfc2FuZAQJAG5hbWVfaGFzaMaf+bccu+KTAwoAbmV0d29ya19pZBMjAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:magma", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0Om1hZ21hBAkAbmFtZV9oYXNoqyTjKaIsWfYDCgBuZXR3b3JrX2lkJjIAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:nether_wart" - }, - { - "id": "minecraft:end_stone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmVuZF9zdG9uZQQJAG5hbWVfaGFzaH1J9jA39GJNAwoAbmV0d29ya19pZMYXAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:chorus_flower", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNob3J1c19mbG93ZXIECQBuYW1lX2hhc2iMpSodli5uawMKAG5ldHdvcmtfaWSvGgAACgYAc3RhdGVzAwMAYWdlAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:chorus_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNob3J1c19wbGFudAQJAG5hbWVfaGFzaJhSrmNGKwaMAwoAbmV0d29ya19pZMshAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:chorus_fruit" - }, - { - "id": "minecraft:popped_chorus_fruit" - }, - { - "id": "minecraft:sponge", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNwb25nZQQJAG5hbWVfaGFzaLrd2ScYRDMiAwoAbmV0d29ya19pZDkFAAAKBgBzdGF0ZXMICwBzcG9uZ2VfdHlwZQMAZHJ5AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:sponge", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNwb25nZQQJAG5hbWVfaGFzaLrd2ScYRDMiAwoAbmV0d29ya19pZDoFAAAKBgBzdGF0ZXMICwBzcG9uZ2VfdHlwZQMAd2V0AAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkuyAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAQgAZGVhZF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkvCAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAQgAZGVhZF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkvSAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUBCABkZWFkX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkviAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQBCABkZWFkX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkvyAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cBCABkZWFkX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkwCAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAQgAZGVhZF9iaXQBAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkwSAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAQgAZGVhZF9iaXQBAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkwiAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUBCABkZWFkX2JpdAEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkwyAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQBCABkZWFkX2JpdAEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkxCAAAAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cBCABkZWFkX2JpdAEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sculk", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnNjdWxrBAkAbmFtZV9oYXNo2Lq7T5yQF8kDCgBuZXR3b3JrX2lkpSwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sculk_vein", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNjdWxrX3ZlaW4ECQBuYW1lX2hhc2gJUdhVooV4zwMKAG5ldHdvcmtfaWSWLgAACgYAc3RhdGVzAxkAbXVsdGlfZmFjZV9kaXJlY3Rpb25fYml0cwAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:sculk_catalyst", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNjdWxrX2NhdGFseXN0BAkAbmFtZV9oYXNo+gCpbrCHST4DCgBuZXR3b3JrX2lkZRUAAAoGAHN0YXRlcwEFAGJsb29tAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sculk_shrieker", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNjdWxrX3Nocmlla2VyBAkAbmFtZV9oYXNo5OXtyObniQ4DCgBuZXR3b3JrX2lkdQIAAAoGAHN0YXRlcwEGAGFjdGl2ZQABCgBjYW5fc3VtbW9uAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sculk_sensor", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNjdWxrX3NlbnNvcgQJAG5hbWVfaGFzaCkmHreeTgNnAwoAbmV0d29ya19pZB0aAAAKBgBzdGF0ZXMDEgBzY3Vsa19zZW5zb3JfcGhhc2UAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:calibrated_sculk_sensor", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmNhbGlicmF0ZWRfc2N1bGtfc2Vuc29yBAkAbmFtZV9oYXNoffAcXXN/iJUDCgBuZXR3b3JrX2lkqCQAAAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAADEgBzY3Vsa19zZW5zb3JfcGhhc2UAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:reinforced_deepslate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnJlaW5mb3JjZWRfZGVlcHNsYXRlBAkAbmFtZV9oYXNoldDmj91EapQDCgBuZXR3b3JrX2lklCQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:leather_helmet" - }, - { - "id": "minecraft:chainmail_helmet" - }, - { - "id": "minecraft:iron_helmet" - }, - { - "id": "minecraft:golden_helmet" - }, - { - "id": "minecraft:diamond_helmet" - }, - { - "id": "minecraft:netherite_helmet" - }, - { - "id": "minecraft:leather_chestplate" - }, - { - "id": "minecraft:chainmail_chestplate" - }, - { - "id": "minecraft:iron_chestplate" - }, - { - "id": "minecraft:golden_chestplate" - }, - { - "id": "minecraft:diamond_chestplate" - }, - { - "id": "minecraft:netherite_chestplate" - }, - { - "id": "minecraft:leather_leggings" - }, - { - "id": "minecraft:chainmail_leggings" - }, - { - "id": "minecraft:iron_leggings" - }, - { - "id": "minecraft:golden_leggings" - }, - { - "id": "minecraft:diamond_leggings" - }, - { - "id": "minecraft:netherite_leggings" - }, - { - "id": "minecraft:leather_boots" - }, - { - "id": "minecraft:chainmail_boots" - }, - { - "id": "minecraft:iron_boots" - }, - { - "id": "minecraft:golden_boots" - }, - { - "id": "minecraft:diamond_boots" - }, - { - "id": "minecraft:netherite_boots" - }, - { - "id": "minecraft:wooden_sword" - }, - { - "id": "minecraft:stone_sword" - }, - { - "id": "minecraft:iron_sword" - }, - { - "id": "minecraft:golden_sword" - }, - { - "id": "minecraft:diamond_sword" - }, - { - "id": "minecraft:netherite_sword" - }, - { - "id": "minecraft:wooden_axe" - }, - { - "id": "minecraft:stone_axe" - }, - { - "id": "minecraft:iron_axe" - }, - { - "id": "minecraft:golden_axe" - }, - { - "id": "minecraft:diamond_axe" - }, - { - "id": "minecraft:netherite_axe" - }, - { - "id": "minecraft:wooden_pickaxe" - }, - { - "id": "minecraft:stone_pickaxe" - }, - { - "id": "minecraft:iron_pickaxe" - }, - { - "id": "minecraft:golden_pickaxe" - }, - { - "id": "minecraft:diamond_pickaxe" - }, - { - "id": "minecraft:netherite_pickaxe" - }, - { - "id": "minecraft:wooden_shovel" - }, - { - "id": "minecraft:stone_shovel" - }, - { - "id": "minecraft:iron_shovel" - }, - { - "id": "minecraft:golden_shovel" - }, - { - "id": "minecraft:diamond_shovel" - }, - { - "id": "minecraft:netherite_shovel" - }, - { - "id": "minecraft:wooden_hoe" - }, - { - "id": "minecraft:stone_hoe" - }, - { - "id": "minecraft:iron_hoe" - }, - { - "id": "minecraft:golden_hoe" - }, - { - "id": "minecraft:diamond_hoe" - }, - { - "id": "minecraft:netherite_hoe" - }, - { - "id": "minecraft:bow" - }, - { - "id": "minecraft:crossbow" - }, - { - "id": "minecraft:arrow" - }, - { - "id": "minecraft:arrow", - "damage": 6 - }, - { - "id": "minecraft:arrow", - "damage": 7 - }, - { - "id": "minecraft:arrow", - "damage": 8 - }, - { - "id": "minecraft:arrow", - "damage": 9 - }, - { - "id": "minecraft:arrow", - "damage": 10 - }, - { - "id": "minecraft:arrow", - "damage": 11 - }, - { - "id": "minecraft:arrow", - "damage": 12 - }, - { - "id": "minecraft:arrow", - "damage": 13 - }, - { - "id": "minecraft:arrow", - "damage": 14 - }, - { - "id": "minecraft:arrow", - "damage": 15 - }, - { - "id": "minecraft:arrow", - "damage": 16 - }, - { - "id": "minecraft:arrow", - "damage": 17 - }, - { - "id": "minecraft:arrow", - "damage": 18 - }, - { - "id": "minecraft:arrow", - "damage": 19 - }, - { - "id": "minecraft:arrow", - "damage": 20 - }, - { - "id": "minecraft:arrow", - "damage": 21 - }, - { - "id": "minecraft:arrow", - "damage": 22 - }, - { - "id": "minecraft:arrow", - "damage": 23 - }, - { - "id": "minecraft:arrow", - "damage": 24 - }, - { - "id": "minecraft:arrow", - "damage": 25 - }, - { - "id": "minecraft:arrow", - "damage": 26 - }, - { - "id": "minecraft:arrow", - "damage": 27 - }, - { - "id": "minecraft:arrow", - "damage": 28 - }, - { - "id": "minecraft:arrow", - "damage": 29 - }, - { - "id": "minecraft:arrow", - "damage": 30 - }, - { - "id": "minecraft:arrow", - "damage": 31 - }, - { - "id": "minecraft:arrow", - "damage": 32 - }, - { - "id": "minecraft:arrow", - "damage": 33 - }, - { - "id": "minecraft:arrow", - "damage": 34 - }, - { - "id": "minecraft:arrow", - "damage": 35 - }, - { - "id": "minecraft:arrow", - "damage": 36 - }, - { - "id": "minecraft:arrow", - "damage": 37 - }, - { - "id": "minecraft:arrow", - "damage": 38 - }, - { - "id": "minecraft:arrow", - "damage": 39 - }, - { - "id": "minecraft:arrow", - "damage": 40 - }, - { - "id": "minecraft:arrow", - "damage": 41 - }, - { - "id": "minecraft:arrow", - "damage": 42 - }, - { - "id": "minecraft:arrow", - "damage": 43 - }, - { - "id": "minecraft:shield" - }, - { - "id": "minecraft:cooked_chicken" - }, - { - "id": "minecraft:cooked_porkchop" - }, - { - "id": "minecraft:cooked_beef" - }, - { - "id": "minecraft:cooked_mutton" - }, - { - "id": "minecraft:cooked_rabbit" - }, - { - "id": "minecraft:cooked_cod" - }, - { - "id": "minecraft:cooked_salmon" - }, - { - "id": "minecraft:bread" - }, - { - "id": "minecraft:mushroom_stew" - }, - { - "id": "minecraft:beetroot_soup" - }, - { - "id": "minecraft:rabbit_stew" - }, - { - "id": "minecraft:baked_potato" - }, - { - "id": "minecraft:cookie" - }, - { - "id": "minecraft:pumpkin_pie" - }, - { - "id": "minecraft:cake" - }, - { - "id": "minecraft:dried_kelp" - }, - { - "id": "minecraft:fishing_rod" - }, - { - "id": "minecraft:carrot_on_a_stick" - }, - { - "id": "minecraft:warped_fungus_on_a_stick" - }, - { - "id": "minecraft:snowball" - }, - { - "id": "minecraft:shears" - }, - { - "id": "minecraft:flint_and_steel" - }, - { - "id": "minecraft:lead" - }, - { - "id": "minecraft:clock" - }, - { - "id": "minecraft:compass" - }, - { - "id": "minecraft:recovery_compass" - }, - { - "id": "minecraft:goat_horn" - }, - { - "id": "minecraft:goat_horn", - "damage": 1 - }, - { - "id": "minecraft:goat_horn", - "damage": 2 - }, - { - "id": "minecraft:goat_horn", - "damage": 3 - }, - { - "id": "minecraft:goat_horn", - "damage": 4 - }, - { - "id": "minecraft:goat_horn", - "damage": 5 - }, - { - "id": "minecraft:goat_horn", - "damage": 6 - }, - { - "id": "minecraft:goat_horn", - "damage": 7 - }, - { - "id": "minecraft:empty_map" - }, - { - "id": "minecraft:empty_map", - "damage": 2 - }, - { - "id": "minecraft:saddle" - }, - { - "id": "minecraft:leather_horse_armor" - }, - { - "id": "minecraft:iron_horse_armor" - }, - { - "id": "minecraft:golden_horse_armor" - }, - { - "id": "minecraft:diamond_horse_armor" - }, - { - "id": "minecraft:trident" - }, - { - "id": "minecraft:turtle_helmet" - }, - { - "id": "minecraft:elytra" - }, - { - "id": "minecraft:totem_of_undying" - }, - { - "id": "minecraft:glass_bottle" - }, - { - "id": "minecraft:experience_bottle" - }, - { - "id": "minecraft:potion" - }, - { - "id": "minecraft:potion", - "damage": 1 - }, - { - "id": "minecraft:potion", - "damage": 2 - }, - { - "id": "minecraft:potion", - "damage": 3 - }, - { - "id": "minecraft:potion", - "damage": 4 - }, - { - "id": "minecraft:potion", - "damage": 5 - }, - { - "id": "minecraft:potion", - "damage": 6 - }, - { - "id": "minecraft:potion", - "damage": 7 - }, - { - "id": "minecraft:potion", - "damage": 8 - }, - { - "id": "minecraft:potion", - "damage": 9 - }, - { - "id": "minecraft:potion", - "damage": 10 - }, - { - "id": "minecraft:potion", - "damage": 11 - }, - { - "id": "minecraft:potion", - "damage": 12 - }, - { - "id": "minecraft:potion", - "damage": 13 - }, - { - "id": "minecraft:potion", - "damage": 14 - }, - { - "id": "minecraft:potion", - "damage": 15 - }, - { - "id": "minecraft:potion", - "damage": 16 - }, - { - "id": "minecraft:potion", - "damage": 17 - }, - { - "id": "minecraft:potion", - "damage": 18 - }, - { - "id": "minecraft:potion", - "damage": 19 - }, - { - "id": "minecraft:potion", - "damage": 20 - }, - { - "id": "minecraft:potion", - "damage": 21 - }, - { - "id": "minecraft:potion", - "damage": 22 - }, - { - "id": "minecraft:potion", - "damage": 23 - }, - { - "id": "minecraft:potion", - "damage": 24 - }, - { - "id": "minecraft:potion", - "damage": 25 - }, - { - "id": "minecraft:potion", - "damage": 26 - }, - { - "id": "minecraft:potion", - "damage": 27 - }, - { - "id": "minecraft:potion", - "damage": 28 - }, - { - "id": "minecraft:potion", - "damage": 29 - }, - { - "id": "minecraft:potion", - "damage": 30 - }, - { - "id": "minecraft:potion", - "damage": 31 - }, - { - "id": "minecraft:potion", - "damage": 32 - }, - { - "id": "minecraft:potion", - "damage": 33 - }, - { - "id": "minecraft:potion", - "damage": 34 - }, - { - "id": "minecraft:potion", - "damage": 35 - }, - { - "id": "minecraft:potion", - "damage": 36 - }, - { - "id": "minecraft:potion", - "damage": 37 - }, - { - "id": "minecraft:potion", - "damage": 38 - }, - { - "id": "minecraft:potion", - "damage": 39 - }, - { - "id": "minecraft:potion", - "damage": 40 - }, - { - "id": "minecraft:potion", - "damage": 41 - }, - { - "id": "minecraft:potion", - "damage": 42 - }, - { - "id": "minecraft:splash_potion" - }, - { - "id": "minecraft:splash_potion", - "damage": 1 - }, - { - "id": "minecraft:splash_potion", - "damage": 2 - }, - { - "id": "minecraft:splash_potion", - "damage": 3 - }, - { - "id": "minecraft:splash_potion", - "damage": 4 - }, - { - "id": "minecraft:splash_potion", - "damage": 5 - }, - { - "id": "minecraft:splash_potion", - "damage": 6 - }, - { - "id": "minecraft:splash_potion", - "damage": 7 - }, - { - "id": "minecraft:splash_potion", - "damage": 8 - }, - { - "id": "minecraft:splash_potion", - "damage": 9 - }, - { - "id": "minecraft:splash_potion", - "damage": 10 - }, - { - "id": "minecraft:splash_potion", - "damage": 11 - }, - { - "id": "minecraft:splash_potion", - "damage": 12 - }, - { - "id": "minecraft:splash_potion", - "damage": 13 - }, - { - "id": "minecraft:splash_potion", - "damage": 14 - }, - { - "id": "minecraft:splash_potion", - "damage": 15 - }, - { - "id": "minecraft:splash_potion", - "damage": 16 - }, - { - "id": "minecraft:splash_potion", - "damage": 17 - }, - { - "id": "minecraft:splash_potion", - "damage": 18 - }, - { - "id": "minecraft:splash_potion", - "damage": 19 - }, - { - "id": "minecraft:splash_potion", - "damage": 20 - }, - { - "id": "minecraft:splash_potion", - "damage": 21 - }, - { - "id": "minecraft:splash_potion", - "damage": 22 - }, - { - "id": "minecraft:splash_potion", - "damage": 23 - }, - { - "id": "minecraft:splash_potion", - "damage": 24 - }, - { - "id": "minecraft:splash_potion", - "damage": 25 - }, - { - "id": "minecraft:splash_potion", - "damage": 26 - }, - { - "id": "minecraft:splash_potion", - "damage": 27 - }, - { - "id": "minecraft:splash_potion", - "damage": 28 - }, - { - "id": "minecraft:splash_potion", - "damage": 29 - }, - { - "id": "minecraft:splash_potion", - "damage": 30 - }, - { - "id": "minecraft:splash_potion", - "damage": 31 - }, - { - "id": "minecraft:splash_potion", - "damage": 32 - }, - { - "id": "minecraft:splash_potion", - "damage": 33 - }, - { - "id": "minecraft:splash_potion", - "damage": 34 - }, - { - "id": "minecraft:splash_potion", - "damage": 35 - }, - { - "id": "minecraft:splash_potion", - "damage": 36 - }, - { - "id": "minecraft:splash_potion", - "damage": 37 - }, - { - "id": "minecraft:splash_potion", - "damage": 38 - }, - { - "id": "minecraft:splash_potion", - "damage": 39 - }, - { - "id": "minecraft:splash_potion", - "damage": 40 - }, - { - "id": "minecraft:splash_potion", - "damage": 41 - }, - { - "id": "minecraft:splash_potion", - "damage": 42 - }, - { - "id": "minecraft:lingering_potion" - }, - { - "id": "minecraft:lingering_potion", - "damage": 1 - }, - { - "id": "minecraft:lingering_potion", - "damage": 2 - }, - { - "id": "minecraft:lingering_potion", - "damage": 3 - }, - { - "id": "minecraft:lingering_potion", - "damage": 4 - }, - { - "id": "minecraft:lingering_potion", - "damage": 5 - }, - { - "id": "minecraft:lingering_potion", - "damage": 6 - }, - { - "id": "minecraft:lingering_potion", - "damage": 7 - }, - { - "id": "minecraft:lingering_potion", - "damage": 8 - }, - { - "id": "minecraft:lingering_potion", - "damage": 9 - }, - { - "id": "minecraft:lingering_potion", - "damage": 10 - }, - { - "id": "minecraft:lingering_potion", - "damage": 11 - }, - { - "id": "minecraft:lingering_potion", - "damage": 12 - }, - { - "id": "minecraft:lingering_potion", - "damage": 13 - }, - { - "id": "minecraft:lingering_potion", - "damage": 14 - }, - { - "id": "minecraft:lingering_potion", - "damage": 15 - }, - { - "id": "minecraft:lingering_potion", - "damage": 16 - }, - { - "id": "minecraft:lingering_potion", - "damage": 17 - }, - { - "id": "minecraft:lingering_potion", - "damage": 18 - }, - { - "id": "minecraft:lingering_potion", - "damage": 19 - }, - { - "id": "minecraft:lingering_potion", - "damage": 20 - }, - { - "id": "minecraft:lingering_potion", - "damage": 21 - }, - { - "id": "minecraft:lingering_potion", - "damage": 22 - }, - { - "id": "minecraft:lingering_potion", - "damage": 23 - }, - { - "id": "minecraft:lingering_potion", - "damage": 24 - }, - { - "id": "minecraft:lingering_potion", - "damage": 25 - }, - { - "id": "minecraft:lingering_potion", - "damage": 26 - }, - { - "id": "minecraft:lingering_potion", - "damage": 27 - }, - { - "id": "minecraft:lingering_potion", - "damage": 28 - }, - { - "id": "minecraft:lingering_potion", - "damage": 29 - }, - { - "id": "minecraft:lingering_potion", - "damage": 30 - }, - { - "id": "minecraft:lingering_potion", - "damage": 31 - }, - { - "id": "minecraft:lingering_potion", - "damage": 32 - }, - { - "id": "minecraft:lingering_potion", - "damage": 33 - }, - { - "id": "minecraft:lingering_potion", - "damage": 34 - }, - { - "id": "minecraft:lingering_potion", - "damage": 35 - }, - { - "id": "minecraft:lingering_potion", - "damage": 36 - }, - { - "id": "minecraft:lingering_potion", - "damage": 37 - }, - { - "id": "minecraft:lingering_potion", - "damage": 38 - }, - { - "id": "minecraft:lingering_potion", - "damage": 39 - }, - { - "id": "minecraft:lingering_potion", - "damage": 40 - }, - { - "id": "minecraft:lingering_potion", - "damage": 41 - }, - { - "id": "minecraft:lingering_potion", - "damage": 42 - }, - { - "id": "minecraft:spyglass" - }, - { - "id": "minecraft:brush" - }, - { - "id": "minecraft:stick" - }, - { - "id": "minecraft:bed" - }, - { - "id": "minecraft:bed", - "damage": 8 - }, - { - "id": "minecraft:bed", - "damage": 7 - }, - { - "id": "minecraft:bed", - "damage": 15 - }, - { - "id": "minecraft:bed", - "damage": 12 - }, - { - "id": "minecraft:bed", - "damage": 14 - }, - { - "id": "minecraft:bed", - "damage": 1 - }, - { - "id": "minecraft:bed", - "damage": 4 - }, - { - "id": "minecraft:bed", - "damage": 5 - }, - { - "id": "minecraft:bed", - "damage": 13 - }, - { - "id": "minecraft:bed", - "damage": 9 - }, - { - "id": "minecraft:bed", - "damage": 3 - }, - { - "id": "minecraft:bed", - "damage": 11 - }, - { - "id": "minecraft:bed", - "damage": 10 - }, - { - "id": "minecraft:bed", - "damage": 2 - }, - { - "id": "minecraft:bed", - "damage": 6 - }, - { - "id": "minecraft:torch", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnRvcmNoBAkAbmFtZV9oYXNoagn7rmDBzisDCgBuZXR3b3JrX2lkGAcAAAoGAHN0YXRlcwgWAHRvcmNoX2ZhY2luZ19kaXJlY3Rpb24HAHVua25vd24AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:soul_torch", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNvdWxfdG9yY2gECQBuYW1lX2hhc2huixOT04BRdQMKAG5ldHdvcmtfaWTOHAAACgYAc3RhdGVzCBYAdG9yY2hfZmFjaW5nX2RpcmVjdGlvbgcAdW5rbm93bgADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sea_pickle", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNlYV9waWNrbGUECQBuYW1lX2hhc2iONEfZJB+glgMKAG5ldHdvcmtfaWS7JAAACgYAc3RhdGVzAw0AY2x1c3Rlcl9jb3VudAAAAAABCABkZWFkX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lantern", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxhbnRlcm4ECQBuYW1lX2hhc2hMw44VI2HWygMKAG5ldHdvcmtfaWTMLAAACgYAc3RhdGVzAQcAaGFuZ2luZwAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:soul_lantern", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNvdWxfbGFudGVybgQJAG5hbWVfaGFzaGjIpjxk9z+RAwoAbmV0d29ya19pZMEiAAAKBgBzdGF0ZXMBBwBoYW5naW5nAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:candle", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmNhbmRsZQQJAG5hbWVfaGFzaHPd+MsNdWTfAwoAbmV0d29ya19pZLsvAAAKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:white_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndoaXRlX2NhbmRsZQQJAG5hbWVfaGFzaN1EG5Q1mHiEAwoAbmV0d29ya19pZAohAAAKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:orange_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om9yYW5nZV9jYW5kbGUECQBuYW1lX2hhc2jySEVWHgUIHQMKAG5ldHdvcmtfaWRBBAAACgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:magenta_candle", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hZ2VudGFfY2FuZGxlBAkAbmFtZV9oYXNoG0u6YIOoBSEDCgBuZXR3b3JrX2lkewQAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:light_blue_candle", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FuZGxlBAkAbmFtZV9oYXNocXGeK0zgrG0DCgBuZXR3b3JrX2lk1hoAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:yellow_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19jYW5kbGUECQBuYW1lX2hhc2i00dtusU3CqQMKAG5ldHdvcmtfaWQ+KQAACgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:lime_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpbWVfY2FuZGxlBAkAbmFtZV9oYXNokcmrw5xvz7ADCgBuZXR3b3JrX2lk/SkAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:pink_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfY2FuZGxlBAkAbmFtZV9oYXNoQJdEY4sZ0dwDCgBuZXR3b3JrX2lkmS8AAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:gray_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdyYXlfY2FuZGxlBAkAbmFtZV9oYXNoS5poSo9wBDEDCgBuZXR3b3JrX2lkAAgAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:light_gray_candle", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FuZGxlBAkAbmFtZV9oYXNo9ruTZLBNMasDCgBuZXR3b3JrX2lkaykAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cyan_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmN5YW5fY2FuZGxlBAkAbmFtZV9oYXNoc/M8PNVcjOwDCgBuZXR3b3JrX2lkCDEAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:purple_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnBsZV9jYW5kbGUECQBuYW1lX2hhc2jaI3xUW0/myQMKAG5ldHdvcmtfaWSnLAAACgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blue_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJsdWVfY2FuZGxlBAkAbmFtZV9oYXNoAASSPW6TgQADCgBuZXR3b3JrX2lkAAAAAAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:brown_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyb3duX2NhbmRsZQQJAG5hbWVfaGFzaDia0l6s1+WYAwoAbmV0d29ya19pZF8mAAAKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:green_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmdyZWVuX2NhbmRsZQQJAG5hbWVfaGFzaLeFPO1l+fIoAwoAbmV0d29ya19pZOoGAAAKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:red_candle", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9jYW5kbGUECQBuYW1lX2hhc2jjAQpGf59ZdwMKAG5ldHdvcmtfaWTzHAAACgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:black_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJsYWNrX2NhbmRsZQQJAG5hbWVfaGFzaB+wRDpOqREKAwoAbmV0d29ya19pZEECAAAKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crafting_table", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyYWZ0aW5nX3RhYmxlBAkAbmFtZV9oYXNoe76VAmjvbpYDCgBuZXR3b3JrX2lkuiQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cartography_table", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNhcnRvZ3JhcGh5X3RhYmxlBAkAbmFtZV9oYXNomaWiiD/znP8DCgBuZXR3b3JrX2lkVDMAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:fletching_table", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmZsZXRjaGluZ190YWJsZQQJAG5hbWVfaGFzaPFibh8unKyUAwoAbmV0d29ya19pZJUkAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:smithing_table", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNtaXRoaW5nX3RhYmxlBAkAbmFtZV9oYXNo4tFES2xOXEYDCgBuZXR3b3JrX2lk2RUAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:beehive", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmJlZWhpdmUECQBuYW1lX2hhc2hCcqn12UbNpwMKAG5ldHdvcmtfaWTqKAAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAMLAGhvbmV5X2xldmVsAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:suspicious_sand", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnN1c3BpY2lvdXNfc2FuZAQJAG5hbWVfaGFzaL67QsuvLP00AwoAbmV0d29ya19pZNAIAAAKBgBzdGF0ZXMDEABicnVzaGVkX3Byb2dyZXNzAAAAAAEHAGhhbmdpbmcBAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:suspicious_gravel", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN1c3BpY2lvdXNfZ3JhdmVsBAkAbmFtZV9oYXNoJSVbGNk7C3oDCgBuZXR3b3JrX2lkKB0AAAoGAHN0YXRlcwMQAGJydXNoZWRfcHJvZ3Jlc3MAAAAAAQcAaGFuZ2luZwEAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:campfire" - }, - { - "id": "minecraft:soul_campfire" - }, - { - "id": "minecraft:furnace", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmZ1cm5hY2UECQBuYW1lX2hhc2ioOQrludYY8wMKAG5ldHdvcmtfaWRXMQAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:blast_furnace", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJsYXN0X2Z1cm5hY2UECQBuYW1lX2hhc2ivDbnjkpGm5QMKAG5ldHdvcmtfaWRhMAAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:smoker", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNtb2tlcgQJAG5hbWVfaGFzaJd1rDMkRWomAwoAbmV0d29ya19pZMwGAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:respawn_anchor", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlc3Bhd25fYW5jaG9yBAkAbmFtZV9oYXNoZOdcjW05qigDCgBuZXR3b3JrX2lk5AYAAAoGAHN0YXRlcwMVAHJlc3Bhd25fYW5jaG9yX2NoYXJnZQAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:brewing_stand" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lkDCsAAAoGAHN0YXRlcwgGAGRhbWFnZQkAdW5kYW1hZ2VkAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lkECsAAAoGAHN0YXRlcwgGAGRhbWFnZRAAc2xpZ2h0bHlfZGFtYWdlZAMJAGRpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lkFCsAAAoGAHN0YXRlcwgGAGRhbWFnZQwAdmVyeV9kYW1hZ2VkAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:grindstone", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyaW5kc3RvbmUECQBuYW1lX2hhc2id56zc0nk99wMKAG5ldHdvcmtfaWREMgAACgYAc3RhdGVzCAoAYXR0YWNobWVudAgAc3RhbmRpbmcDCQBkaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:enchanting_table", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuY2hhbnRpbmdfdGFibGUECQBuYW1lX2hhc2jgIx24VLvMvwMKAG5ldHdvcmtfaWRgKwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bookshelf", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJvb2tzaGVsZgQJAG5hbWVfaGFzaDU04DrgJCS9AwoAbmV0d29ya19pZDErAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:chiseled_bookshelf", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNoaXNlbGVkX2Jvb2tzaGVsZgQJAG5hbWVfaGFzaNXDBnsIsywYAwoAbmV0d29ya19pZPgCAAAKBgBzdGF0ZXMDDABib29rc19zdG9yZWQAAAAAAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:lectern", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlY3Rlcm4ECQBuYW1lX2hhc2j5Z4Mmi/1QxAMKAG5ldHdvcmtfaWRALAAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAHBvd2VyZWRfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cauldron" - }, - { - "id": "minecraft:composter", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvbXBvc3RlcgQJAG5hbWVfaGFzaPAADHptzeWJAwoAbmV0d29ya19pZHAhAAAKBgBzdGF0ZXMDFABjb21wb3N0ZXJfZmlsbF9sZXZlbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:chest", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmNoZXN0BAkAbmFtZV9oYXNog9ozMxlcA88DCgBuZXR3b3JrX2lk9ywAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:trapped_chest", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnRyYXBwZWRfY2hlc3QECQBuYW1lX2hhc2g2qpF9stsEjgMKAG5ldHdvcmtfaWQZIgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:ender_chest", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmVuZGVyX2NoZXN0BAkAbmFtZV9oYXNohEZzOFdg0WUDCgBuZXR3b3JrX2lkCBoAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:barrel", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhcnJlbAQJAG5hbWVfaGFzaHDkRPGymiRqAwoAbmV0d29ya19pZKMaAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:undyed_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnVuZHllZF9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaOC9mypm/MlBAwoAbmV0d29ya19pZKwVAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:white_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndoaXRlX3NodWxrZXJfYm94BAkAbmFtZV9oYXNosK79m1rPUBwDCgBuZXR3b3JrX2lkPwQAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:light_gray_shulker_box", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2iBe5zq7PxHmgMKAG5ldHdvcmtfaWR/JgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:gray_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmdyYXlfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2ga2s8ctjHUhgMKAG5ldHdvcmtfaWQtIQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:black_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJsYWNrX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoPm03OZphrp8DCgBuZXR3b3JrX2lkhSgAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:brown_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJyb3duX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoT3DD6qAL9cADCgBuZXR3b3JrX2lkBSwAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:red_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnJlZF9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaMIlKSCzqSZoAwoAbmV0d29ya19pZEkaAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:orange_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om9yYW5nZV9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaG2MAXU67wGrAwoAbmV0d29ya19pZGopAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:yellow_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnllbGxvd19zaHVsa2VyX2JveAQJAG5hbWVfaGFzaIsLwQHYjcIEAwoAbmV0d29ya19pZHUAAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lime_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmxpbWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2hUwBkg+faUGAMKAG5ldHdvcmtfaWQBBAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:green_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmdyZWVuX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoZgUeT3LupLUDCgBuZXR3b3JrX2lkgioAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:cyan_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmN5YW5fc2h1bGtlcl9ib3gECQBuYW1lX2hhc2gSfbjteXg5yAMKAG5ldHdvcmtfaWScLAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:light_blue_shulker_box", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2h0VFCX0qsRxQMKAG5ldHdvcmtfaWRbLAAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:blue_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJsdWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2hn9gS0XIe6rAMKAG5ldHdvcmtfaWSTKQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:purple_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnB1cnBsZV9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaEV/lkNPxRDdAwoAbmV0d29ya19pZKEvAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:magenta_shulker_box", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1hZ2VudGFfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2iqWM7IJHxcFgMKAG5ldHdvcmtfaWTLAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:pink_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnBpbmtfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2in1tkJ1GNcZgMKAG5ldHdvcmtfaWQUGgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:armor_stand" - }, - { - "id": "minecraft:noteblock", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Om5vdGVibG9jawQJAG5hbWVfaGFzaHPA8dBBH0UaAwoAbmV0d29ya19pZC8EAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:jukebox", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0Omp1a2Vib3gECQBuYW1lX2hhc2ieAIPExf/ZfgMKAG5ldHdvcmtfaWQ9HwAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:music_disc_13" - }, - { - "id": "minecraft:music_disc_cat" - }, - { - "id": "minecraft:music_disc_blocks" - }, - { - "id": "minecraft:music_disc_chirp" - }, - { - "id": "minecraft:music_disc_far" - }, - { - "id": "minecraft:music_disc_mall" - }, - { - "id": "minecraft:music_disc_mellohi" - }, - { - "id": "minecraft:music_disc_stal" - }, - { - "id": "minecraft:music_disc_strad" - }, - { - "id": "minecraft:music_disc_ward" - }, - { - "id": "minecraft:music_disc_11" - }, - { - "id": "minecraft:music_disc_wait" - }, - { - "id": "minecraft:music_disc_otherside" - }, - { - "id": "minecraft:music_disc_5" - }, - { - "id": "minecraft:music_disc_pigstep" - }, - { - "id": "minecraft:music_disc_relic" - }, - { - "id": "minecraft:disc_fragment_5" - }, - { - "id": "minecraft:glowstone_dust" - }, - { - "id": "minecraft:glowstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Omdsb3dzdG9uZQQJAG5hbWVfaGFzaFYqXNkefIlPAwoAbmV0d29ya19pZPcXAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:redstone_lamp", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZHN0b25lX2xhbXAECQBuYW1lX2hhc2hJ9V80caPvEgMKAG5ldHdvcmtfaWSXAgAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:sea_lantern", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNlYV9sYW50ZXJuBAkAbmFtZV9oYXNoLPsv1TX9M+QDCgBuZXR3b3JrX2lkTDAAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:oak_sign" - }, - { - "id": "minecraft:spruce_sign" - }, - { - "id": "minecraft:birch_sign" - }, - { - "id": "minecraft:jungle_sign" - }, - { - "id": "minecraft:acacia_sign" - }, - { - "id": "minecraft:dark_oak_sign" - }, - { - "id": "minecraft:mangrove_sign" - }, - { - "id": "minecraft:cherry_sign" - }, - { - "id": "minecraft:bamboo_sign" - }, - { - "id": "minecraft:crimson_sign" - }, - { - "id": "minecraft:warped_sign" - }, - { - "id": "minecraft:oak_hanging_sign" - }, - { - "id": "minecraft:spruce_hanging_sign" - }, - { - "id": "minecraft:birch_hanging_sign" - }, - { - "id": "minecraft:jungle_hanging_sign" - }, - { - "id": "minecraft:acacia_hanging_sign" - }, - { - "id": "minecraft:dark_oak_hanging_sign" - }, - { - "id": "minecraft:mangrove_hanging_sign" - }, - { - "id": "minecraft:cherry_hanging_sign" - }, - { - "id": "minecraft:bamboo_hanging_sign" - }, - { - "id": "minecraft:crimson_hanging_sign" - }, - { - "id": "minecraft:warped_hanging_sign" - }, - { - "id": "minecraft:painting" - }, - { - "id": "minecraft:frame" - }, - { - "id": "minecraft:glow_frame" - }, - { - "id": "minecraft:honey_bottle" - }, - { - "id": "minecraft:flower_pot" - }, - { - "id": "minecraft:bowl" - }, - { - "id": "minecraft:bucket" - }, - { - "id": "minecraft:milk_bucket" - }, - { - "id": "minecraft:water_bucket" - }, - { - "id": "minecraft:lava_bucket" - }, - { - "id": "minecraft:cod_bucket" - }, - { - "id": "minecraft:salmon_bucket" - }, - { - "id": "minecraft:tropical_fish_bucket" - }, - { - "id": "minecraft:pufferfish_bucket" - }, - { - "id": "minecraft:powder_snow_bucket" - }, - { - "id": "minecraft:axolotl_bucket" - }, - { - "id": "minecraft:tadpole_bucket" - }, - { - "id": "minecraft:skull", - "damage": 3 - }, - { - "id": "minecraft:skull", - "damage": 2 - }, - { - "id": "minecraft:skull", - "damage": 4 - }, - { - "id": "minecraft:skull", - "damage": 5 - }, - { - "id": "minecraft:skull" - }, - { - "id": "minecraft:skull", - "damage": 1 - }, - { - "id": "minecraft:skull", - "damage": 6 - }, - { - "id": "minecraft:beacon", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJlYWNvbgQJAG5hbWVfaGFzaACwhhfSkdkHAwoAbmV0d29ya19pZCcCAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:bell", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmJlbGwECQBuYW1lX2hhc2iPqsgDXRcsxAMKAG5ldHdvcmtfaWQgLAAACgYAc3RhdGVzCAoAYXR0YWNobWVudAgAc3RhbmRpbmcDCQBkaXJlY3Rpb24AAAAAAQoAdG9nZ2xlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:conduit", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNvbmR1aXQECQBuYW1lX2hhc2jqxKAxq2EaWQMKAG5ldHdvcmtfaWRVGQAACgYAc3RhdGVzAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stonecutter_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lY3V0dGVyX2Jsb2NrBAkAbmFtZV9oYXNoQAXTbAM3MeYDCgBuZXR3b3JrX2lkaDAAAAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:end_portal_frame", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuZF9wb3J0YWxfZnJhbWUECQBuYW1lX2hhc2gqofyUIjGOpQMKAG5ldHdvcmtfaWS7KAAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAESAGVuZF9wb3J0YWxfZXllX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:coal" - }, - { - "id": "minecraft:charcoal" - }, - { - "id": "minecraft:diamond" - }, - { - "id": "minecraft:iron_nugget" - }, - { - "id": "minecraft:raw_iron" - }, - { - "id": "minecraft:raw_gold" - }, - { - "id": "minecraft:raw_copper" - }, - { - "id": "minecraft:copper_ingot" - }, - { - "id": "minecraft:iron_ingot" - }, - { - "id": "minecraft:netherite_scrap" - }, - { - "id": "minecraft:netherite_ingot" - }, - { - "id": "minecraft:gold_nugget" - }, - { - "id": "minecraft:gold_ingot" - }, - { - "id": "minecraft:emerald" - }, - { - "id": "minecraft:quartz" - }, - { - "id": "minecraft:clay_ball" - }, - { - "id": "minecraft:brick" - }, - { - "id": "minecraft:netherbrick" - }, - { - "id": "minecraft:prismarine_shard" - }, - { - "id": "minecraft:amethyst_shard" - }, - { - "id": "minecraft:prismarine_crystals" - }, - { - "id": "minecraft:nautilus_shell" - }, - { - "id": "minecraft:heart_of_the_sea" - }, - { - "id": "minecraft:scute" - }, - { - "id": "minecraft:phantom_membrane" - }, - { - "id": "minecraft:string" - }, - { - "id": "minecraft:feather" - }, - { - "id": "minecraft:flint" - }, - { - "id": "minecraft:gunpowder" - }, - { - "id": "minecraft:leather" - }, - { - "id": "minecraft:rabbit_hide" - }, - { - "id": "minecraft:rabbit_foot" - }, - { - "id": "minecraft:fire_charge" - }, - { - "id": "minecraft:blaze_rod" - }, - { - "id": "minecraft:blaze_powder" - }, - { - "id": "minecraft:magma_cream" - }, - { - "id": "minecraft:fermented_spider_eye" - }, - { - "id": "minecraft:echo_shard" - }, - { - "id": "minecraft:dragon_breath" - }, - { - "id": "minecraft:shulker_shell" - }, - { - "id": "minecraft:ghast_tear" - }, - { - "id": "minecraft:slime_ball" - }, - { - "id": "minecraft:ender_pearl" - }, - { - "id": "minecraft:ender_eye" - }, - { - "id": "minecraft:nether_star" - }, - { - "id": "minecraft:end_rod", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmVuZF9yb2QECQBuYW1lX2hhc2jx/q5cEA0hmQMKAG5ldHdvcmtfaWRvJgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lightning_rod", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmxpZ2h0bmluZ19yb2QECQBuYW1lX2hhc2ioXQF1xvfHNQMKAG5ldHdvcmtfaWTnCAAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:end_crystal" - }, - { - "id": "minecraft:paper" - }, - { - "id": "minecraft:book" - }, - { - "id": "minecraft:writable_book" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:oak_boat" - }, - { - "id": "minecraft:spruce_boat" - }, - { - "id": "minecraft:birch_boat" - }, - { - "id": "minecraft:jungle_boat" - }, - { - "id": "minecraft:acacia_boat" - }, - { - "id": "minecraft:dark_oak_boat" - }, - { - "id": "minecraft:mangrove_boat" - }, - { - "id": "minecraft:cherry_boat" - }, - { - "id": "minecraft:bamboo_raft" - }, - { - "id": "minecraft:oak_chest_boat" - }, - { - "id": "minecraft:spruce_chest_boat" - }, - { - "id": "minecraft:birch_chest_boat" - }, - { - "id": "minecraft:jungle_chest_boat" - }, - { - "id": "minecraft:acacia_chest_boat" - }, - { - "id": "minecraft:dark_oak_chest_boat" - }, - { - "id": "minecraft:mangrove_chest_boat" - }, - { - "id": "minecraft:cherry_chest_boat" - }, - { - "id": "minecraft:bamboo_chest_raft" - }, - { - "id": "minecraft:rail", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnJhaWwECQBuYW1lX2hhc2hUzmhUXYJDUQMKAG5ldHdvcmtfaWQaGAAACgYAc3RhdGVzAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:golden_rail", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdvbGRlbl9yYWlsBAkAbmFtZV9oYXNoOoV5MaKipoUDCgBuZXR3b3JrX2lkGiEAAAoGAHN0YXRlcwENAHJhaWxfZGF0YV9iaXQAAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:detector_rail", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRldGVjdG9yX3JhaWwECQBuYW1lX2hhc2gVUk31qOysUQMKAG5ldHdvcmtfaWTuGAAACgYAc3RhdGVzAQ0AcmFpbF9kYXRhX2JpdAADDgByYWlsX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:activator_rail", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFjdGl2YXRvcl9yYWlsBAkAbmFtZV9oYXNosIL91qriCRkDCgBuZXR3b3JrX2lkCAQAAAoGAHN0YXRlcwENAHJhaWxfZGF0YV9iaXQAAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:minecart" - }, - { - "id": "minecraft:chest_minecart" - }, - { - "id": "minecraft:hopper_minecart" - }, - { - "id": "minecraft:tnt_minecart" - }, - { - "id": "minecraft:redstone" - }, - { - "id": "minecraft:redstone_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlZHN0b25lX2Jsb2NrBAkAbmFtZV9oYXNoRhULL0r8o0sDCgBuZXR3b3JrX2lkEBYAAAoGAHN0YXRlcwADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:redstone_torch", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlZHN0b25lX3RvcmNoBAkAbmFtZV9oYXNoizFRjpYMIDgDCgBuZXR3b3JrX2lkiRMAAAoGAHN0YXRlcwgWAHRvcmNoX2ZhY2luZ19kaXJlY3Rpb24HAHVua25vd24AAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:lever", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmxldmVyBAkAbmFtZV9oYXNoGMJeLJsUMLYDCgBuZXR3b3JrX2lkkioAAAoGAHN0YXRlcwgPAGxldmVyX2RpcmVjdGlvbg4AZG93bl9lYXN0X3dlc3QBCABvcGVuX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wooden_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Ondvb2Rlbl9idXR0b24ECQBuYW1lX2hhc2hR7PgSTQt0sQMKAG5ldHdvcmtfaWQUKgAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:spruce_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwcnVjZV9idXR0b24ECQBuYW1lX2hhc2jBW9Z8aYE7YQMKAG5ldHdvcmtfaWTUGQAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:birch_button", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpcmNoX2J1dHRvbgQJAG5hbWVfaGFzaJXYgGuSHbTwAwoAbmV0d29ya19pZDMxAAAKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:jungle_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omp1bmdsZV9idXR0b24ECQBuYW1lX2hhc2iCgNANcJs+BQMKAG5ldHdvcmtfaWR5AAAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:acacia_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmFjYWNpYV9idXR0b24ECQBuYW1lX2hhc2gVvmcT7LTO0wMKAG5ldHdvcmtfaWQKLwAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dark_oak_button", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRhcmtfb2FrX2J1dHRvbgQJAG5hbWVfaGFzaIV10ZGGrCIEAwoAbmV0d29ya19pZGAAAAAKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mangrove_button", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX2J1dHRvbgQJAG5hbWVfaGFzaNzeYYKLgOzJAwoAbmV0d29ya19pZL8sAAAKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9idXR0b24ECQBuYW1lX2hhc2j2/IHjeAbUcwMKAG5ldHdvcmtfaWQNGwAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19idXR0b24ECQBuYW1lX2hhc2j7AddMi+6nsgMKAG5ldHdvcmtfaWRtKgAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_button", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnN0b25lX2J1dHRvbgQJAG5hbWVfaGFzaM4ejMctmvohAwoAbmV0d29ya19pZC0FAAAKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:crimson_button", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fYnV0dG9uBAkAbmFtZV9oYXNofnjYHaYIeWgDCgBuZXR3b3JrX2lkTRoAAAoGAHN0YXRlcwESAGJ1dHRvbl9wcmVzc2VkX2JpdAADEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9idXR0b24ECQBuYW1lX2hhc2jwkV2EU6Cn1QMKAG5ldHdvcmtfaWQdLwAACgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:polished_blackstone_button", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnV0dG9uBAkAbmFtZV9oYXNojmxzQKS0S/EDCgBuZXR3b3JrX2lkSzEAAAoGAHN0YXRlcwESAGJ1dHRvbl9wcmVzc2VkX2JpdAADEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:tripwire_hook", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnRyaXB3aXJlX2hvb2sECQBuYW1lX2hhc2gQdp+oGZLNnAMKAG5ldHdvcmtfaWSKJgAACgYAc3RhdGVzAQwAYXR0YWNoZWRfYml0AAMJAGRpcmVjdGlvbgAAAAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:wooden_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Ondvb2Rlbl9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaGkGs5kCuA74AwoAbmV0d29ya19pZF0yAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:spruce_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnNwcnVjZV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaNmwuq549fJKAwoAbmV0d29ya19pZP4VAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:birch_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJpcmNoX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNorQkT9kDdlTwDCgBuZXR3b3JrX2lkKBUAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:jungle_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Omp1bmdsZV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaJ7DcteCkb8/AwoAbmV0d29ya19pZH4VAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:acacia_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmFjYWNpYV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaC2frZtfoYqCAwoAbmV0d29ya19pZMUgAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:dark_oak_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmRhcmtfb2FrX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoHUCJsTy52pwDCgBuZXR3b3JrX2lktCYAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:mangrove_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0Om1hbmdyb3ZlX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoiDsTfJaX100DCgBuZXR3b3JrX2lk5xcAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:cherry_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmNoZXJyeV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaALMqYEZDUQHAwoAbmV0d29ya19pZI8AAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:bamboo_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmJhbWJvb19wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaNvxJ7NIAaqlAwoAbmV0d29ya19pZMMoAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:crimson_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNyaW1zb25fcHJlc3N1cmVfcGxhdGUECQBuYW1lX2hhc2hqBDVDAd31/gMKAG5ldHdvcmtfaWRAMwAACgYAc3RhdGVzAw8AcmVkc3RvbmVfc2lnbmFsAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:warped_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndhcnBlZF9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaBxFoQksWtYUAwoAbmV0d29ya19pZK4CAAAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:stone_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0b25lX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNounJuTBUTrU8DCgBuZXR3b3JrX2lk+BcAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:light_weighted_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmxpZ2h0X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoOyOJkNxLtkEDCgBuZXR3b3JrX2lknBUAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:heavy_weighted_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmhlYXZ5X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoltgDmDvTajUDCgBuZXR3b3JrX2lk1wgAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:polished_blackstone_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSwAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfcHJlc3N1cmVfcGxhdGUECQBuYW1lX2hhc2h65Ci6/CeGqwMKAG5ldHdvcmtfaWRzKQAACgYAc3RhdGVzAw8AcmVkc3RvbmVfc2lnbmFsAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:observer", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om9ic2VydmVyBAkAbmFtZV9oYXNoYhlh1lpmHTgDCgBuZXR3b3JrX2lkfRMAAAoGAHN0YXRlcwgaAG1pbmVjcmFmdDpmYWNpbmdfZGlyZWN0aW9uBABkb3duAQsAcG93ZXJlZF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:daylight_detector", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRheWxpZ2h0X2RldGVjdG9yBAkAbmFtZV9oYXNoV0F0s7B7PVgDCgBuZXR3b3JrX2lkMhkAAAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:repeater" - }, - { - "id": "minecraft:comparator" - }, - { - "id": "minecraft:hopper" - }, - { - "id": "minecraft:dropper", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmRyb3BwZXIECQBuYW1lX2hhc2joXP7XqU0l3QMKAG5ldHdvcmtfaWSpLwAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgMAAAABDQB0cmlnZ2VyZWRfYml0AAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:dispenser", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmRpc3BlbnNlcgQJAG5hbWVfaGFzaP1RR+zAbYP2AwoAbmV0d29ya19pZCoyAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAwAAAAENAHRyaWdnZXJlZF9iaXQAAAMHAHZlcnNpb24gChQBAA==" - }, - { - "id": "minecraft:piston", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBpc3RvbgQJAG5hbWVfaGFzaDs3AFh1fL0uAwoAbmV0d29ya19pZO4HAAAKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAQAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:sticky_piston", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0aWNreV9waXN0b24ECQBuYW1lX2hhc2hPFJFJSiJ0ZQMKAG5ldHdvcmtfaWQDGgAACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgEAAAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:tnt", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OnRudAQJAG5hbWVfaGFzaEYOHwCvJH29AwoAbmV0d29ya19pZEorAAAKBgBzdGF0ZXMBFABhbGxvd191bmRlcndhdGVyX2JpdAABCwBleHBsb2RlX2JpdAAAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:name_tag" - }, - { - "id": "minecraft:loom", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Omxvb20ECQBuYW1lX2hhc2i7DKjAXNq8TAMKAG5ldHdvcmtfaWTCFwAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:banner" - }, - { - "id": "minecraft:banner", - "damage": 8 - }, - { - "id": "minecraft:banner", - "damage": 7 - }, - { - "id": "minecraft:banner", - "damage": 15 - }, - { - "id": "minecraft:banner", - "damage": 12 - }, - { - "id": "minecraft:banner", - "damage": 14 - }, - { - "id": "minecraft:banner", - "damage": 1 - }, - { - "id": "minecraft:banner", - "damage": 4 - }, - { - "id": "minecraft:banner", - "damage": 5 - }, - { - "id": "minecraft:banner", - "damage": 13 - }, - { - "id": "minecraft:banner", - "damage": 9 - }, - { - "id": "minecraft:banner", - "damage": 3 - }, - { - "id": "minecraft:banner", - "damage": 11 - }, - { - "id": "minecraft:banner", - "damage": 10 - }, - { - "id": "minecraft:banner", - "damage": 2 - }, - { - "id": "minecraft:banner", - "damage": 6 - }, - { - "id": "minecraft:banner", - "damage": 15, - "nbt_b64": "CgAAAwQAVHlwZQEAAAAA" - }, - { - "id": "minecraft:creeper_banner_pattern" - }, - { - "id": "minecraft:skull_banner_pattern" - }, - { - "id": "minecraft:flower_banner_pattern" - }, - { - "id": "minecraft:mojang_banner_pattern" - }, - { - "id": "minecraft:field_masoned_banner_pattern" - }, - { - "id": "minecraft:bordure_indented_banner_pattern" - }, - { - "id": "minecraft:piglin_banner_pattern" - }, - { - "id": "minecraft:globe_banner_pattern" - }, - { - "id": "minecraft:angler_pottery_sherd" - }, - { - "id": "minecraft:archer_pottery_sherd" - }, - { - "id": "minecraft:arms_up_pottery_sherd" - }, - { - "id": "minecraft:blade_pottery_sherd" - }, - { - "id": "minecraft:brewer_pottery_sherd" - }, - { - "id": "minecraft:burn_pottery_sherd" - }, - { - "id": "minecraft:danger_pottery_sherd" - }, - { - "id": "minecraft:explorer_pottery_sherd" - }, - { - "id": "minecraft:friend_pottery_sherd" - }, - { - "id": "minecraft:heart_pottery_sherd" - }, - { - "id": "minecraft:heartbreak_pottery_sherd" - }, - { - "id": "minecraft:howl_pottery_sherd" - }, - { - "id": "minecraft:miner_pottery_sherd" - }, - { - "id": "minecraft:mourner_pottery_sherd" - }, - { - "id": "minecraft:plenty_pottery_sherd" - }, - { - "id": "minecraft:prize_pottery_sherd" - }, - { - "id": "minecraft:sheaf_pottery_sherd" - }, - { - "id": "minecraft:shelter_pottery_sherd" - }, - { - "id": "minecraft:skull_pottery_sherd" - }, - { - "id": "minecraft:snort_pottery_sherd" - }, - { - "id": "minecraft:netherite_upgrade_smithing_template" - }, - { - "id": "minecraft:sentry_armor_trim_smithing_template" - }, - { - "id": "minecraft:vex_armor_trim_smithing_template" - }, - { - "id": "minecraft:wild_armor_trim_smithing_template" - }, - { - "id": "minecraft:coast_armor_trim_smithing_template" - }, - { - "id": "minecraft:dune_armor_trim_smithing_template" - }, - { - "id": "minecraft:wayfinder_armor_trim_smithing_template" - }, - { - "id": "minecraft:shaper_armor_trim_smithing_template" - }, - { - "id": "minecraft:raiser_armor_trim_smithing_template" - }, - { - "id": "minecraft:host_armor_trim_smithing_template" - }, - { - "id": "minecraft:ward_armor_trim_smithing_template" - }, - { - "id": "minecraft:silence_armor_trim_smithing_template" - }, - { - "id": "minecraft:tide_armor_trim_smithing_template" - }, - { - "id": "minecraft:snout_armor_trim_smithing_template" - }, - { - "id": "minecraft:rib_armor_trim_smithing_template" - }, - { - "id": "minecraft:eye_armor_trim_smithing_template" - }, - { - "id": "minecraft:spire_armor_trim_smithing_template" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_star", - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 8, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 7, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 15, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 12, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 14, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 1, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 4, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 5, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 13, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 9, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 3, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 11, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 10, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 2, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 6, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA=" - }, - { - "id": "minecraft:chain" - }, - { - "id": "minecraft:target", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnRhcmdldAQJAG5hbWVfaGFzaJc66SVbYlaxAwoAbmV0d29ya19pZBMqAAAKBgBzdGF0ZXMAAwcAdmVyc2lvbiAKFAEA" - }, - { - "id": "minecraft:decorated_pot", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRlY29yYXRlZF9wb3QECQBuYW1lX2hhc2jjQgckn8VTvwMKAG5ldHdvcmtfaWRcKwAACgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uIAoUAQA=" - }, - { - "id": "minecraft:lodestone_compass" - }, - { - "id": "minecraft:wither_spawn_egg" - }, - { - "id": "minecraft:ender_dragon_spawn_egg" - }, - { - "id": "minecraft:debug_stick" - }, - { - "id": "minecraft:suspicious_stew" - } - ] -} \ No newline at end of file diff --git a/core/src/main/resources/bedrock/creative_items.1_20_30.json b/core/src/main/resources/bedrock/creative_items.1_20_30.json deleted file mode 100644 index cce3f8a50f7..00000000000 --- a/core/src/main/resources/bedrock/creative_items.1_20_30.json +++ /dev/null @@ -1,5787 +0,0 @@ -{ - "items": [ - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZE/NqzcKBgBzdGF0ZXMICQB3b29kX3R5cGUDAG9hawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZHl/r2YKBgBzdGF0ZXMICQB3b29kX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZL6SoXYKBgBzdGF0ZXMICQB3b29kX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZKYD6L0KBgBzdGF0ZXMICQB3b29kX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZJ0zTHYKBgBzdGF0ZXMICQB3b29kX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:planks", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBsYW5rcwQJAG5hbWVfaGFzaA+7EGxL5oikAwoAbmV0d29ya19pZOf6hVkKBgBzdGF0ZXMICQB3b29kX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mangrove_planks", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX3BsYW5rcwQJAG5hbWVfaGFzaPvLtcEA0F8xAwoAbmV0d29ya19pZEvnlCYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9wbGFua3MECQBuYW1lX2hhc2hNIvVh/lVW7gMKAG5ldHdvcmtfaWQTXpRoCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19wbGFua3MECQBuYW1lX2hhc2gYnjNz7SCCjgMKAG5ldHdvcmtfaWTi8ySSCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_mosaic", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19tb3NhaWMECQBuYW1lX2hhc2izSEgiMKOp/AMKAG5ldHdvcmtfaWQZ/p8xCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:crimson_planks", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fcGxhbmtzBAkAbmFtZV9oYXNoJc5IKqNXJnwDCgBuZXR3b3JrX2lkwtJDdQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_planks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9wbGFua3MECQBuYW1lX2hhc2g3yGXEWhe6LgMKAG5ldHdvcmtfaWStTABvCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWSE4JosCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCwBjb2JibGVzdG9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWTUvV6XCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEQBtb3NzeV9jb2JibGVzdG9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWT4opb2CgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBwBncmFuaXRlCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWQAMQTVCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBwBkaW9yaXRlCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWQIbDOcCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCABhbmRlc2l0ZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWSZKhusCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCQBzYW5kc3RvbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWSp4zgCCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlDQByZWRfc2FuZHN0b25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWRbqVHTCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCwBzdG9uZV9icmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWRr0ZT/CgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEQBtb3NzeV9zdG9uZV9icmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWRnLis3CgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlBQBicmljawgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWQNLzfSCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlDABuZXRoZXJfYnJpY2sIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWQ5h0xwCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlEAByZWRfbmV0aGVyX2JyaWNrCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWS9J0B2CgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCQBlbmRfYnJpY2sIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobblestone_wall", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGwECQBuYW1lX2hhc2hZu/xE7lYtNgMKAG5ldHdvcmtfaWRPbkJeCgYAc3RhdGVzCA8Ad2FsbF9ibG9ja190eXBlCgBwcmlzbWFyaW5lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blackstone_wall", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJsYWNrc3RvbmVfd2FsbAQJAG5hbWVfaGFzaMP8XppUSU1RAwoAbmV0d29ya19pZMbeBBsKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_blackstone_wall", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfd2FsbAQJAG5hbWVfaGFzaP6SwV08YwzAAwoAbmV0d29ya19pZAJLsz8KBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_blackstone_brick_wall", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfd2FsbAQJAG5hbWVfaGFzaBBIDZbHxiEzAwoAbmV0d29ya19pZEbLV8cKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobbled_deepslate_wall", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3dhbGwECQBuYW1lX2hhc2iECY5oKxeT+gMKAG5ldHdvcmtfaWRCnPrFCgYAc3RhdGVzCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_tile_wall", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3dhbGwECQBuYW1lX2hhc2jz7N+PeuEXgQMKAG5ldHdvcmtfaWTqw4s4CgYAc3RhdGVzCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfZWFzdAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX25vcnRoBABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfc291dGgEAG5vbmUIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV93ZXN0BABub25lAQ0Ad2FsbF9wb3N0X2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:polished_deepslate_wall", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV93YWxsBAkAbmFtZV9oYXNoHxjTdj9pevMDCgBuZXR3b3JrX2lkIvBYYwoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate_brick_wall", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja193YWxsBAkAbmFtZV9oYXNoEs3EQrjroyEDCgBuZXR3b3JrX2lkwlrCGwoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mud_brick_wall", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om11ZF9icmlja193YWxsBAkAbmFtZV9oYXNov9b98ATpUSwDCgBuZXR3b3JrX2lkH/1WZQoGAHN0YXRlcwgZAHdhbGxfY29ubmVjdGlvbl90eXBlX2Vhc3QEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9ub3J0aAQAbm9uZQgaAHdhbGxfY29ubmVjdGlvbl90eXBlX3NvdXRoBABub25lCBkAd2FsbF9jb25uZWN0aW9uX3R5cGVfd2VzdAQAbm9uZQENAHdhbGxfcG9zdF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:oak_fence", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Om9ha19mZW5jZQQJAG5hbWVfaGFzaGEmid7AaCWRAwoAbmV0d29ya19pZDvPEXcKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:spruce_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNwcnVjZV9mZW5jZQQJAG5hbWVfaGFzaPQCm+aX1ZQeAwoAbmV0d29ya19pZD1QUEoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:birch_fence", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJpcmNoX2ZlbmNlBAkAbmFtZV9oYXNo6CJ2ATpANfgDCgBuZXR3b3JrX2lkmCUV2QoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:jungle_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Omp1bmdsZV9mZW5jZQQJAG5hbWVfaGFzaOX4cD9uAmsdAwoAbmV0d29ya19pZHz1VxkKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:acacia_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmFjYWNpYV9mZW5jZQQJAG5hbWVfaGFzaGjn+RlKVDH6AwoAbmV0d29ya19pZNVGubwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dark_oak_fence", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmRhcmtfb2FrX2ZlbmNlBAkAbmFtZV9oYXNoGPj0gCgM0c0DCgBuZXR3b3JrX2lk2w+gEwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mangrove_fence", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlBAkAbmFtZV9oYXNowwAd7tPu9bsDCgBuZXR3b3JrX2lkKEcd0goGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cherry_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNoZXJyeV9mZW5jZQQJAG5hbWVfaGFzaFmtUfHfTxcxAwoAbmV0d29ya19pZPCBxAIKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bamboo_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJhbWJvb19mZW5jZQQJAG5hbWVfaGFzaCKRbxfXsfkiAwoAbmV0d29ya19pZJNXKFcKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:nether_brick_fence", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om5ldGhlcl9icmlja19mZW5jZQQJAG5hbWVfaGFzaA6030ngawxcAwoAbmV0d29ya19pZLnjLF4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_fence", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNyaW1zb25fZmVuY2UECQBuYW1lX2hhc2jhUhKv1HGj9AMKAG5ldHdvcmtfaWR3OH3OCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:warped_fence", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndhcnBlZF9mZW5jZQQJAG5hbWVfaGFzaJfb3/YuKmOWAwoAbmV0d29ya19pZCpaGC8KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:fence_gate", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZlbmNlX2dhdGUECQBuYW1lX2hhc2hTxpjEDmRzAwMKAG5ldHdvcmtfaWR+T9kTCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:spruce_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnNwcnVjZV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoanTVB84HRbkDCgBuZXR3b3JrX2lkEnw5egoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:birch_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJpcmNoX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2jmfPklI8azSwMKAG5ldHdvcmtfaWQL77/BCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:jungle_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Omp1bmdsZV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNobYVQkfBomIcDCgBuZXR3b3JrX2lkA1zgtgoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:acacia_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmFjYWNpYV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoZnrLUx/XSekDCgBuZXR3b3JrX2lkHg/kTgoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dark_oak_fence_gate", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRhcmtfb2FrX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2j2PTvdJJHcVQMKAG5ldHdvcmtfaWTwjOCeCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mangrove_fence_gate", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlX2dhdGUECQBuYW1lX2hhc2i/kOhBKiI/dAMKAG5ldHdvcmtfaWSfweCSCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAELAGluX3dhbGxfYml0AAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cherry_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNoZXJyeV9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoKWLgCk0z+PsDCgBuZXR3b3JrX2lk/9bTZQoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bamboo_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJhbWJvb19mZW5jZV9nYXRlBAkAbmFtZV9oYXNopH1JrUgwdIADCgBuZXR3b3JrX2lkzIpPywoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNyaW1zb25fZmVuY2VfZ2F0ZQQJAG5hbWVfaGFzaHE3Gfd0Z2d2AwoAbmV0d29ya19pZDQzVbEKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQsAaW5fd2FsbF9iaXQAAQgAb3Blbl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:warped_fence_gate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndhcnBlZF9mZW5jZV9nYXRlBAkAbmFtZV9oYXNoy0oIBjDIG4kDCgBuZXR3b3JrX2lkkf+/3QoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCwBpbl93YWxsX2JpdAABCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:normal_stone_stairs", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9zdGFpcnMECQBuYW1lX2hhc2hAEktZZOkGIwMKAG5ldHdvcmtfaWQeH1ALCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnN0b25lX3N0YWlycwQJAG5hbWVfaGFzaNRjqVC5GRVDAwoAbmV0d29ya19pZDcCv+MKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mossy_cobblestone_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3N0YWlycwQJAG5hbWVfaGFzaMVSTq5z9n1RAwoAbmV0d29ya19pZFIfrhkKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:oak_stairs", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om9ha19zdGFpcnMECQBuYW1lX2hhc2jk/HFzdXy0FQMKAG5ldHdvcmtfaWQJjyzBCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:spruce_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwcnVjZV9zdGFpcnMECQBuYW1lX2hhc2iznygw7uBPBQMKAG5ldHdvcmtfaWTv+is3CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:birch_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpcmNoX3N0YWlycwQJAG5hbWVfaGFzaPfhbL619a3GAwoAbmV0d29ya19pZFyPlHAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:jungle_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omp1bmdsZV9zdGFpcnMECQBuYW1lX2hhc2jodJsHUbOVxQMKAG5ldHdvcmtfaWR0z5d4CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:acacia_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmFjYWNpYV9zdGFpcnMECQBuYW1lX2hhc2h3x1NmD43IqQMKAG5ldHdvcmtfaWS7Jwz6CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dark_oak_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRhcmtfb2FrX3N0YWlycwQJAG5hbWVfaGFzaMfwkbYPbNmAAwoAbmV0d29ya19pZCmBYKAKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mangrove_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX3N0YWlycwQJAG5hbWVfaGFzaNpUDY+uGMpyAwoAbmV0d29ya19pZChzUAsKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9zdGFpcnMECQBuYW1lX2hhc2jMtr0v9JY4zwMKAG5ldHdvcmtfaWRQwq31CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19zdGFpcnMECQBuYW1lX2hhc2jFOzWL8PalKwMKAG5ldHdvcmtfaWTVPh42CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_mosaic_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc3RhaXJzBAkAbmFtZV9oYXNoNLPiveSHPaoDCgBuZXR3b3JrX2lk44PHjgoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0b25lX2JyaWNrX3N0YWlycwQJAG5hbWVfaGFzaN6tQViRo5cwAwoAbmV0d29ya19pZDMyMgIKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mossy_stone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrX3N0YWlycwQJAG5hbWVfaGFzaIB/Zv5YBPuYAwoAbmV0d29ya19pZANTOsMKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnNhbmRzdG9uZV9zdGFpcnMECQBuYW1lX2hhc2hOyA0BoYUOPQMKAG5ldHdvcmtfaWSV/834CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:smooth_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnNtb290aF9zYW5kc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNoB+CuCd8Ruz8DCgBuZXR3b3JrX2lksR+m8QoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNoPs0LpHPL24YDCgBuZXR3b3JrX2lkLYVt3woGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:smooth_red_sandstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OnNtb290aF9yZWRfc2FuZHN0b25lX3N0YWlycwQJAG5hbWVfaGFzaBvjtQv5pf+MAwoAbmV0d29ya19pZMHNND8KBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:granite_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmdyYW5pdGVfc3RhaXJzBAkAbmFtZV9oYXNoGzpvtoqKQjgDCgBuZXR3b3JrX2lkPkcB1goGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_granite_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc3RhaXJzBAkAbmFtZV9oYXNo3PvbSfEQklIDCgBuZXR3b3JrX2lkMmEm3AoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:diorite_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmRpb3JpdGVfc3RhaXJzBAkAbmFtZV9oYXNoi73T8VQuZmcDCgBuZXR3b3JrX2lk6i6nBQoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_diorite_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2Rpb3JpdGVfc3RhaXJzBAkAbmFtZV9oYXNoFKRJd5Wk5L0DCgBuZXR3b3JrX2lkbt2ioAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:andesite_stairs", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmFuZGVzaXRlX3N0YWlycwQJAG5hbWVfaGFzaO5w2FKBw76EAwoAbmV0d29ya19pZKhXEgUKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:polished_andesite_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2FuZGVzaXRlX3N0YWlycwQJAG5hbWVfaGFzaNcZZ/zmLInIAwoAbmV0d29ya19pZJTHrlEKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyaWNrX3N0YWlycwQJAG5hbWVfaGFzaMyt+cRDk5O2AwoAbmV0d29ya19pZNeMh58KBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:nether_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om5ldGhlcl9icmlja19zdGFpcnMECQBuYW1lX2hhc2jRqIoOXgifBAMKAG5ldHdvcmtfaWQDiw5yCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_nether_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2tfc3RhaXJzBAkAbmFtZV9oYXNogQvosSbcj7kDCgBuZXR3b3JrX2lkx2IMtAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:end_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuZF9icmlja19zdGFpcnMECQBuYW1lX2hhc2hmlAk+QhsUsQMKAG5ldHdvcmtfaWTN7KFaCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:quartz_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnF1YXJ0el9zdGFpcnMECQBuYW1lX2hhc2hmvpvOqGi6egMKAG5ldHdvcmtfaWRmUTh7CgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:smooth_quartz_stairs", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnNtb290aF9xdWFydHpfc3RhaXJzBAkAbmFtZV9oYXNoNZZ9rX0qZOsDCgBuZXR3b3JrX2lkzsgQyQoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:purpur_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnB1cl9zdGFpcnMECQBuYW1lX2hhc2ifwDxeezXD7gMKAG5ldHdvcmtfaWTT+rxiCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:prismarine_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnByaXNtYXJpbmVfc3RhaXJzBAkAbmFtZV9oYXNooTHSZ+IrYtcDCgBuZXR3b3JrX2lkxTJfeAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:dark_prismarine_stairs", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zdGFpcnMECQBuYW1lX2hhc2hIciLmam4o4AMKAG5ldHdvcmtfaWTVu7TCCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:prismarine_bricks_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnByaXNtYXJpbmVfYnJpY2tzX3N0YWlycwQJAG5hbWVfaGFzaNIjq1oBlZMMAwoAbmV0d29ya19pZGEFwLYKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_stairs", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fc3RhaXJzBAkAbmFtZV9oYXNoZJqIzCBpCq4DCgBuZXR3b3JrX2lktXE00AoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_stairs", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9zdGFpcnMECQBuYW1lX2hhc2hOkY27jLD4RQMKAG5ldHdvcmtfaWQ+E5VrCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blackstone_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJsYWNrc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNokdoUb76p9McDCgBuZXR3b3JrX2lk5fWI5goGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_blackstone_stairs", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc3RhaXJzBAkAbmFtZV9oYXNolCFtFIE8MmADCgBuZXR3b3JrX2lkGTf7sgoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_blackstone_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSoAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc3RhaXJzBAkAbmFtZV9oYXNonks6UlfpOmkDCgBuZXR3b3JrX2lkgYeOdAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmN1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoHfoAXYq5G3MDCgBuZXR3b3JrX2lkeetf7woGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:exposed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zdGFpcnMECQBuYW1lX2hhc2howneQGtZ9cgMKAG5ldHdvcmtfaWSg73zdCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:weathered_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlycwQJAG5hbWVfaGFzaP+R5loXxrVgAwoAbmV0d29ya19pZOnbRf4KBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:oxidized_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNo6Jeoq5rsPxsDCgBuZXR3b3JrX2lkmRjDnQoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:waxed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoh07CQj0/SR8DCgBuZXR3b3JrX2lkmYqoqAoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:waxed_exposed_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zdGFpcnMECQBuYW1lX2hhc2guVct1ilmxTwMKAG5ldHdvcmtfaWQgCPROCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_weathered_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSsAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlycwQJAG5hbWVfaGFzaPXC8Sz/phCpAwoAbmV0d29ya19pZHlwHVsKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_stairs", - "block_state_b64": "CgAACAQAbmFtZSoAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc3RhaXJzBAkAbmFtZV9oYXNoaqGdkuhxVZUDCgBuZXR3b3JrX2lkYQXzzgoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobbled_deepslate_stairs", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3N0YWlycwQJAG5hbWVfaGFzaPIfa+TpyJcIAwoAbmV0d29ya19pZJUvOYIKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_tile_stairs", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3N0YWlycwQJAG5hbWVfaGFzaGFRFzB72mN2AwoAbmV0d29ya19pZJEOgIsKBgBzdGF0ZXMBDwB1cHNpZGVfZG93bl9iaXQAAxAAd2VpcmRvX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:polished_deepslate_stairs", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zdGFpcnMECQBuYW1lX2hhc2iNCYxVik9sGAMKAG5ldHdvcmtfaWSRVPnYCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zdGFpcnMECQBuYW1lX2hhc2hIasOahEf83wMKAG5ldHdvcmtfaWQ1qEDCCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mud_brick_stairs", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0Om11ZF9icmlja19zdGFpcnMECQBuYW1lX2hhc2gt3qxK1NWajAMKAG5ldHdvcmtfaWSm9N3MCgYAc3RhdGVzAQ8AdXBzaWRlX2Rvd25fYml0AAMQAHdlaXJkb19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:wooden_door" - }, - { - "id": "minecraft:spruce_door" - }, - { - "id": "minecraft:birch_door" - }, - { - "id": "minecraft:jungle_door" - }, - { - "id": "minecraft:acacia_door" - }, - { - "id": "minecraft:dark_oak_door" - }, - { - "id": "minecraft:mangrove_door" - }, - { - "id": "minecraft:cherry_door" - }, - { - "id": "minecraft:bamboo_door" - }, - { - "id": "minecraft:iron_door" - }, - { - "id": "minecraft:crimson_door" - }, - { - "id": "minecraft:warped_door" - }, - { - "id": "minecraft:trapdoor", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnRyYXBkb29yBAkAbmFtZV9oYXNotYiAJGtN0xADCgBuZXR3b3JrX2lkyTAWkAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:spruce_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnNwcnVjZV90cmFwZG9vcgQJAG5hbWVfaGFzaOwlfbgBkUW4AwoAbmV0d29ya19pZPHy1K0KBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:birch_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJpcmNoX3RyYXBkb29yBAkAbmFtZV9oYXNoSLtLweOLJ7wDCgBuZXR3b3JrX2lkeJWDfgoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:jungle_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Omp1bmdsZV90cmFwZG9vcgQJAG5hbWVfaGFzaDP/TnM9wyCIAwoAbmV0d29ya19pZEy2fJoKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:acacia_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmFjYWNpYV90cmFwZG9vcgQJAG5hbWVfaGFzaMj8xi3vmEKOAwoAbmV0d29ya19pZOHj8E8KBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:dark_oak_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRhcmtfb2FrX3RyYXBkb29yBAkAbmFtZV9oYXNomB2GGJQ2aOMDCgBuZXR3b3JrX2lko5ZHTwoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mangrove_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om1hbmdyb3ZlX3RyYXBkb29yBAkAbmFtZV9oYXNooV3kQsQUUmkDCgBuZXR3b3JrX2lkkF/mxAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cherry_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNoZXJyeV90cmFwZG9vcgQJAG5hbWVfaGFzaH/PefpfdHgtAwoAbmV0d29ya19pZOA7eNgKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:bamboo_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJhbWJvb190cmFwZG9vcgQJAG5hbWVfaGFzaJrEOpsTwtKCAwoAbmV0d29ya19pZLvbPz8KBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:iron_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omlyb25fdHJhcGRvb3IECQBuYW1lX2hhc2gwA+IumsEiGQMKAG5ldHdvcmtfaWTvSVl/CgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmNyaW1zb25fdHJhcGRvb3IECQBuYW1lX2hhc2jHXufTnwUkYgMKAG5ldHdvcmtfaWQLjMYVCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:warped_trapdoor", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OndhcnBlZF90cmFwZG9vcgQJAG5hbWVfaGFzaA20wG/+vkd6AwoAbmV0d29ya19pZHKR/hYKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:iron_bars", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Omlyb25fYmFycwQJAG5hbWVfaGFzaPuefWSNAe56AwoAbmV0d29ya19pZN2LB5IKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:glass", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmdsYXNzBAkAbmFtZV9oYXNowGJByfWff6gDCgBuZXR3b3JrX2lk0hdLNwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:white_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2iHubqoMbu9fAMKAG5ldHdvcmtfaWRndBrUCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:light_gray_stained_glass", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaKKa+LrRsHQhAwoAbmV0d29ya19pZEv2giYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:gray_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaIETy7Y/HZREAwoAbmV0d29ya19pZDomVrUKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:black_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmJsYWNrX3N0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2iV6BCwpfDMmwMKAG5ldHdvcmtfaWSV7doJCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmJyb3duX3N0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2igsEiq5np8JgMKAG5ldHdvcmtfaWRMzE/lCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnJlZF9zdGFpbmVkX2dsYXNzBAkAbmFtZV9oYXNoCa2J12/lQoIDCgBuZXR3b3JrX2lk283lWAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:orange_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzBAkAbmFtZV9oYXNozgjAuvzhxGsDCgBuZXR3b3JrX2lkW5CkhQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:yellow_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnllbGxvd19zdGFpbmVkX2dsYXNzBAkAbmFtZV9oYXNo7EbHMd5WVugDCgBuZXR3b3JrX2lkkdDyXQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lime_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmxpbWVfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaBtZA1nZtwcFAwoAbmV0d29ya19pZDxX85UKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:green_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmdyZWVuX3N0YWluZWRfZ2xhc3MECQBuYW1lX2hhc2h91ptDgbehWwMKAG5ldHdvcmtfaWTlDhnECgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cyan_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmN5YW5fc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaBkIYQ8nQLqbAwoAbmV0d29ya19pZOL1lHsKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_blue_stained_glass", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaLt05n1G0fiSAwoAbmV0d29ya19pZNbwulIKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blue_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmJsdWVfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaPhLocSfzduRAwoAbmV0d29ya19pZENsjFwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:purple_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnB1cnBsZV9zdGFpbmVkX2dsYXNzBAkAbmFtZV9oYXNoJk0DhRO0szUDCgBuZXR3b3JrX2lkD98ZxgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:magenta_stained_glass", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Om1hZ2VudGFfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaFEDeFiJj3zSAwoAbmV0d29ya19pZG+iFRoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:pink_stained_glass", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnBpbmtfc3RhaW5lZF9nbGFzcwQJAG5hbWVfaGFzaDijTX87ywxhAwoAbmV0d29ya19pZKdEricKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:tinted_glass", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnRpbnRlZF9nbGFzcwQJAG5hbWVfaGFzaAFZWSamk6KdAwoAbmV0d29ya19pZGSvWX8KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:glass_pane", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdsYXNzX3BhbmUECQBuYW1lX2hhc2gRSBHwNMQ4gQMKAG5ldHdvcmtfaWRGwixuCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:white_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaHgxQmgJVtRrAwoAbmV0d29ya19pZBEr/DYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_gray_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNon0aQw9lNkSEDCgBuZXR3b3JrX2lk9dp5VgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gray_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNors74IIw+2MMDCgBuZXR3b3JrX2lkmrGO5woGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:black_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmJsYWNrX3N0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaOK/5ZRRd+M1AwoAbmV0d29ya19pZDv++oQKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brown_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmJyb3duX3N0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaLHeGJyRFTIWAwoAbmV0d29ya19pZMz9L0wKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnJlZF9zdGFpbmVkX2dsYXNzX3BhbmUECQBuYW1lX2hhc2gGr4x6JheAywMKAG5ldHdvcmtfaWQBjCTmCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:orange_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzX3BhbmUECQBuYW1lX2hhc2hbHxPD2gEbEAMKAG5ldHdvcmtfaWSt/7a5CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:yellow_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OnllbGxvd19zdGFpbmVkX2dsYXNzX3BhbmUECQBuYW1lX2hhc2g9tl4aOCyZBwMKAG5ldHdvcmtfaWTXRAS7CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lime_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmxpbWVfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNo3CtUyLwoGegDCgBuZXR3b3JrX2lkYJDnggoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:green_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmdyZWVuX3N0YWluZWRfZ2xhc3NfcGFuZQQJAG5hbWVfaGFzaJo6YP7IMy9SAwoAbmV0d29ya19pZHOnixoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cyan_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmN5YW5fc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNoti97c6QrbLQDCgBuZXR3b3JrX2lkUqFUeQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_blue_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNovDg/gQle104DCgBuZXR3b3JrX2lkFuy4MQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:blue_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmJsdWVfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNoGc57tiexbQMDCgBuZXR3b3JrX2lk1eBLUAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:purple_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OnB1cnBsZV9zdGFpbmVkX2dsYXNzX3BhbmUECQBuYW1lX2hhc2hDJHYdd0FdfQMKAG5ldHdvcmtfaWSNsdK5CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:magenta_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0Om1hZ2VudGFfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNo3pcOw5bs5XoDCgBuZXR3b3JrX2lkVbOR7AoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pink_stained_glass_pane", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBpbmtfc3RhaW5lZF9nbGFzc19wYW5lBAkAbmFtZV9oYXNoWRhSACMWgswDCgBuZXR3b3JrX2lkIR92xwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:ladder", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxhZGRlcgQJAG5hbWVfaGFzaKBhqheJVOz+AwoAbmV0d29ya19pZCgvzlsKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:scaffolding", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNjYWZmb2xkaW5nBAkAbmFtZV9oYXNoYrkevrqcljwDCgBuZXR3b3JrX2lkD13mlAoGAHN0YXRlcwMJAHN0YWJpbGl0eQAAAAABDwBzdGFiaWxpdHlfY2hlY2sAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWTkNl0JCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQwAc21vb3RoX3N0b25lAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkQJoxlgoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfNAUAc3RvbmUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWRHh04KCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQsAY29iYmxlc3RvbmUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lkVRZB+woGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMhEAbW9zc3lfY29iYmxlc3RvbmUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lkBaobgAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUDAG9hawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lkhz9TeQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lk3HkwowoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lkDIBqVQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lkL5hFYAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wooden_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Ondvb2Rlbl9zbGFiBAkAbmFtZV9oYXNoBVBkRBCCh4MDCgBuZXR3b3JrX2lkKRUHSQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20ICQB3b29kX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mangrove_slab", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om1hbmdyb3ZlX3NsYWIECQBuYW1lX2hhc2jYCcmhJPeNMwMKAG5ldHdvcmtfaWQx6U1yCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cherry_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNoZXJyeV9zbGFiBAkAbmFtZV9oYXNoTt0MmVn/mqoDCgBuZXR3b3JrX2lk2VVsZQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bamboo_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJhbWJvb19zbGFiBAkAbmFtZV9oYXNoo1xuFqINeLYDCgBuZXR3b3JrX2lkVC+0twoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bamboo_mosaic_slab", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc2xhYgQJAG5hbWVfaGFzaNbVRBZ/ChI3AwoAbmV0d29ya19pZOLZHFMKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWQSiInOCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQsAc3RvbmVfYnJpY2sAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkoF89tgoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfNBEAbW9zc3lfc3RvbmVfYnJpY2sAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWSkoAE4CgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQkAc2FuZHN0b25lAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkWfF7pgoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfNA0AY3V0X3NhbmRzdG9uZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lkbKRChAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMhAAc21vb3RoX3NhbmRzdG9uZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lkBlrvqAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMg0AcmVkX3NhbmRzdG9uZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkRWFXuwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfNBEAY3V0X3JlZF9zYW5kc3RvbmUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkom8neQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMxQAc21vb3RoX3JlZF9zYW5kc3RvbmUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkd1ZaWgoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMwcAZ3Jhbml0ZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkISH4iwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMxAAcG9saXNoZWRfZ3Jhbml0ZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkqxEDMwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMwcAZGlvcml0ZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkSYs86QoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMxAAcG9saXNoZWRfZGlvcml0ZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkq6BU6goGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMwgAYW5kZXNpdGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkTSXY8AoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMxEAcG9saXNoZWRfYW5kZXNpdGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWQiYHKTCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQUAYnJpY2sAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWTk/0LfCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQwAbmV0aGVyX2JyaWNrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk/hXQ7AoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMhAAcmVkX25ldGhlcl9icmljawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab3", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIzBAkAbmFtZV9oYXNoMw3274NQmpMDCgBuZXR3b3JrX2lkYJNxrwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMw8AZW5kX3N0b25lX2JyaWNrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIECQBuYW1lX2hhc2gAP8n+Ya6BWgMKAG5ldHdvcmtfaWRlj0/sCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQgPAHN0b25lX3NsYWJfdHlwZQYAcXVhcnR6AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab4", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWI0BAkAbmFtZV9oYXNoNA3274NQmpMDCgBuZXR3b3JrX2lkMae+2goGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfNA0Ac21vb3RoX3F1YXJ0egADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk+kMHGAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMgYAcHVycHVyAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lkKOSOMAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMhAAcHJpc21hcmluZV9yb3VnaAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lk8igLCQoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMg8AcHJpc21hcmluZV9kYXJrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_block_slab2", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lX2Jsb2NrX3NsYWIyBAkAbmFtZV9oYXNoMg3274NQmpMDCgBuZXR3b3JrX2lkSFbyEwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20IEQBzdG9uZV9zbGFiX3R5cGVfMhAAcHJpc21hcmluZV9icmljawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:crimson_slab", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNyaW1zb25fc2xhYgQJAG5hbWVfaGFzaKZ+EfP0ZYOZAwoAbmV0d29ya19pZAxRUWAKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:warped_slab", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndhcnBlZF9zbGFiBAkAbmFtZV9oYXNo/AT0e/Z9W7UDCgBuZXR3b3JrX2lk1yq11AoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blackstone_slab", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJsYWNrc3RvbmVfc2xhYgQJAG5hbWVfaGFzaF/DD4ZUlNgtAwoAbmV0d29ya19pZGy1DjwKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:polished_blackstone_slab", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc2xhYgQJAG5hbWVfaGFzaDYnuUs86EWfAwoAbmV0d29ya19pZJj2bXIKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:polished_blackstone_brick_slab", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc2xhYgQJAG5hbWVfaGFzaKySLqvHc4xXAwoAbmV0d29ya19pZOyWX94KBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmN1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaDsNpb2qs4iBAwoAbmV0d29ya19pZOTm2nsKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:exposed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zbGFiBAkAbmFtZV9oYXNoahQ5OwIQb7kDCgBuZXR3b3JrX2lkrUlZLwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:weathered_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWIECQBuYW1lX2hhc2hBIuGIOVVXogMKAG5ldHdvcmtfaWQgnaDiCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:oxidized_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaOptj9ycfpaDAwoAbmV0d29ya19pZMzFSRgKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaAlx6DZOCTHzAwoAbmV0d29ya19pZFRBvDAKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_exposed_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zbGFiBAkAbmFtZV9oYXNo3KqS5OnhtRIDCgBuZXR3b3JrX2lkHTGcTgoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waxed_weathered_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWIECQBuYW1lX2hhc2gzZ1oX0HCFtwMKAG5ldHdvcmtfaWSgJR+XCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper_slab", - "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXJfc2xhYgQJAG5hbWVfaGFzaMjjTnLu1KcqAwoAbmV0d29ya19pZIxsnFYKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cobbled_deepslate_slab", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3NsYWIECQBuYW1lX2hhc2gwJIVWK1TM2QMKAG5ldHdvcmtfaWTYAoX5CgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_deepslate_slab", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zbGFiBAkAbmFtZV9oYXNoC/Adiz8k6RYDCgBuZXR3b3JrX2lkuFYMAAoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_tile_slab", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3NsYWIECQBuYW1lX2hhc2hPydV6emzIXAMKAG5ldHdvcmtfaWQwlbFCCgYAc3RhdGVzCBcAbWluZWNyYWZ0OnZlcnRpY2FsX2hhbGYGAGJvdHRvbQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:deepslate_brick_slab", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zbGFiBAkAbmFtZV9oYXNoSv62V7iw10UDCgBuZXR3b3JrX2lkWMoragoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mud_brick_slab", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om11ZF9icmlja19zbGFiBAkAbmFtZV9oYXNoq/tGBQWkv08DCgBuZXR3b3JrX2lkl4nnMwoGAHN0YXRlcwgXAG1pbmVjcmFmdDp2ZXJ0aWNhbF9oYWxmBgBib3R0b20AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brick_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJyaWNrX2Jsb2NrBAkAbmFtZV9oYXNo5Qc2E005S3oDCgBuZXR3b3JrX2lkqeGWRgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:chiseled_nether_bricks", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNoaXNlbGVkX25ldGhlcl9icmlja3MECQBuYW1lX2hhc2g31SBPTcUK1QMKAG5ldHdvcmtfaWS8TJ+TCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cracked_nether_bricks", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmNyYWNrZWRfbmV0aGVyX2JyaWNrcwQJAG5hbWVfaGFzaAdC6eKzXT5tAwoAbmV0d29ya19pZIUSejwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:quartz_bricks", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnF1YXJ0el9icmlja3MECQBuYW1lX2hhc2jSZO590dd8sAMKAG5ldHdvcmtfaWSc5xCLCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWQ5kni1CgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQcAZGVmYXVsdAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWTDw813CgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQUAbW9zc3kAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWSTvQGECgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQcAY3JhY2tlZAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stonebrick", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnN0b25lYnJpY2sECQBuYW1lX2hhc2ii9DAAVXKptwMKAG5ldHdvcmtfaWQIM0OwCgYAc3RhdGVzCBAAc3RvbmVfYnJpY2tfdHlwZQgAY2hpc2VsZWQAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:end_bricks", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmVuZF9icmlja3MECQBuYW1lX2hhc2hIUFfxNLZaFgMKAG5ldHdvcmtfaWQ/vDihCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWSH021WCgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBgBicmlja3MAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:polished_blackstone_bricks", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzBAkAbmFtZV9oYXNoIHgsgIdzKXcDCgBuZXR3b3JrX2lkUw9b3woGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cracked_polished_blackstone_bricks", - "block_state_b64": "CgAACAQAbmFtZSwAbWluZWNyYWZ0OmNyYWNrZWRfcG9saXNoZWRfYmxhY2tzdG9uZV9icmlja3MECQBuYW1lX2hhc2jQIO1GQDk80AMKAG5ldHdvcmtfaWQ3UlRYCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:gilded_blackstone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmdpbGRlZF9ibGFja3N0b25lBAkAbmFtZV9oYXNoNoWt1ocG0HEDCgBuZXR3b3JrX2lktL8gUwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:chiseled_polished_blackstone", - "block_state_b64": "CgAACAQAbmFtZSYAbWluZWNyYWZ0OmNoaXNlbGVkX3BvbGlzaGVkX2JsYWNrc3RvbmUECQBuYW1lX2hhc2gzFa+kEjCJgAMKAG5ldHdvcmtfaWR2NJX2CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate_tiles", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlcwQJAG5hbWVfaGFzaGcLLx3NXAFvAwoAbmV0d29ya19pZI/G/xYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cracked_deepslate_tiles", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX3RpbGVzBAkAbmFtZV9oYXNo9zWgkFuMM1QDCgBuZXR3b3JrX2lkGwY6OgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:deepslate_bricks", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja3MECQBuYW1lX2hhc2gucvFmPdZxigMKAG5ldHdvcmtfaWSH4HDPCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cracked_deepslate_bricks", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX2JyaWNrcwQJAG5hbWVfaGFzaN40aqhh9WqHAwoAbmV0d29ya19pZO9GPBQKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:chiseled_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNoaXNlbGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaEU7/uRG8HSBAwoAbmV0d29ya19pZEqmI0EKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cobblestone", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvYmJsZXN0b25lBAkAbmFtZV9oYXNoPoK7mGlSUz4DCgBuZXR3b3JrX2lkLm7RZwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mossy_cobblestone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lBAkAbmFtZV9oYXNoGJ67FCbkChMDCgBuZXR3b3JrX2lk/pYs1AoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cobbled_deepslate", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlBAkAbmFtZV9oYXNoLUz9Y/ywmLwDCgBuZXR3b3JrX2lkNwzZ+AoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:smooth_stone", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNtb290aF9zdG9uZQQJAG5hbWVfaGFzaMwf87/JaTNvAwoAbmV0d29ya19pZLkZICEKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZB2wApMKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUHAGRlZmF1bHQAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZB7E+eQKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGULAGhlaXJvZ2x5cGhzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZFQnDaEKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUDAGN1dAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sandstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNhbmRzdG9uZQQJAG5hbWVfaGFzaFEmWsEHFI1AAwoAbmV0d29ya19pZPO4A3IKBgBzdGF0ZXMIDwBzYW5kX3N0b25lX3R5cGUGAHNtb290aAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWRhNYiFCgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTqXJr1CgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlCwBoZWlyb2dseXBocwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTQRGkFCgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlAwBjdXQAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_sandstone", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZF9zYW5kc3RvbmUECQBuYW1lX2hhc2jBO4Gv2v59uAMKAG5ldHdvcmtfaWTvAHWDCgYAc3RhdGVzCA8Ac2FuZF9zdG9uZV90eXBlBgBzbW9vdGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coal_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNvYWxfYmxvY2sECQBuYW1lX2hhc2jH8QQP3t5PiAMKAG5ldHdvcmtfaWRo+sR+CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dried_kelp_block", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRyaWVkX2tlbHBfYmxvY2sECQBuYW1lX2hhc2iRoucexkrl8wMKAG5ldHdvcmtfaWQQCCrvCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:gold_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdvbGRfYmxvY2sECQBuYW1lX2hhc2iYLshvjtXzFwMKAG5ldHdvcmtfaWTDJGBcCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:iron_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omlyb25fYmxvY2sECQBuYW1lX2hhc2jYINmJQbvV/gMKAG5ldHdvcmtfaWRf7AbICgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:copper_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNvcHBlcl9ibG9jawQJAG5hbWVfaGFzaDVxnehsGaZ1AwoAbmV0d29ya19pZIiUodwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:exposed_copper", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoQH3Fukmu3CEDCgBuZXR3b3JrX2lk72jFIwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:weathered_copper", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2hJCQXbvobv+gMKAG5ldHdvcmtfaWQwM0lJCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:oxidized_copper", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMDtJqR0G5Y7AwoAbmV0d29ya19pZGjN8bUKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waxed_copper", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndheGVkX2NvcHBlcgQJAG5hbWVfaGFzaPF+FG6Eh5fsAwoAbmV0d29ya19pZIjtz/0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waxed_exposed_copper", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoig8IOc+SCikDCgBuZXR3b3JrX2lklz8yWQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:waxed_weathered_copper", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2gjtPq8MOdvKgMKAG5ldHdvcmtfaWSQ9Ln9CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_oxidized_copper", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMaORhsO+LzjAwoAbmV0d29ya19pZJhGfLEKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cut_copper", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmN1dF9jb3BwZXIECQBuYW1lX2hhc2hAfN3NGax3eAMKAG5ldHdvcmtfaWTnFBtYCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:exposed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcgQJAG5hbWVfaGFzaA85G3yv/w6pAwoAbmV0d29ya19pZMQhr0QKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:weathered_cut_copper", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyBAkAbmFtZV9oYXNoVgRV0fBaz88DCgBuZXR3b3JrX2lk/0cYugoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:oxidized_cut_copper", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om94aWRpemVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2iP8WmFWOkriwMKAG5ldHdvcmtfaWQPdce7CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndheGVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2jumiwOZIqv2AMKAG5ldHdvcmtfaWQvuxx9CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:waxed_exposed_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcgQJAG5hbWVfaGFzaPE/OfK6IoVMAwoAbmV0d29ya19pZHy5HkcKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waxed_weathered_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyBAkAbmFtZV9oYXNoCA1xDp11bnwDCgBuZXR3b3JrX2lkDyEDVQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:waxed_oxidized_cut_copper", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2i1pZAsZYHLDAMKAG5ldHdvcmtfaWQ/wSkCCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:emerald_block", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmVtZXJhbGRfYmxvY2sECQBuYW1lX2hhc2hK6QunqJznNAMKAG5ldHdvcmtfaWRk5+otCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:diamond_block", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRpYW1vbmRfYmxvY2sECQBuYW1lX2hhc2iGKrxuvkytFQMKAG5ldHdvcmtfaWQQeQZXCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lapis_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxhcGlzX2Jsb2NrBAkAbmFtZV9oYXNoDZ44xdb2zVoDCgBuZXR3b3JrX2lktVy0BAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:raw_iron_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJhd19pcm9uX2Jsb2NrBAkAbmFtZV9oYXNo9XyzNIQXxvwDCgBuZXR3b3JrX2lknms1QAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:raw_copper_block", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnJhd19jb3BwZXJfYmxvY2sECQBuYW1lX2hhc2hw1KG0TNUGgwMKAG5ldHdvcmtfaWS1vGo/CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:raw_gold_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJhd19nb2xkX2Jsb2NrBAkAbmFtZV9oYXNo6YuwuLwfOBwDCgBuZXR3b3JrX2lkLiQ5gQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZEupC1AKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQcAZGVmYXVsdAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZM97+l0KBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQUAbGluZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZCbTfssKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQgAY2hpc2VsZWQICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:quartz_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnF1YXJ0el9ibG9jawQJAG5hbWVfaGFzaCfpbqyIIvZCAwoAbmV0d29ya19pZJss8V0KBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQYAc21vb3RoCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWRFIsoGCgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:prismarine", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnByaXNtYXJpbmUECQBuYW1lX2hhc2jcnQCHi9CspQMKAG5ldHdvcmtfaWTDNWOvCgYAc3RhdGVzCBUAcHJpc21hcmluZV9ibG9ja190eXBlBABkYXJrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:slime", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnNsaW1lBAkAbmFtZV9oYXNoHJiEEJx+JlkDCgBuZXR3b3JrX2lkfgfVzAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:honey_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmhvbmV5X2Jsb2NrBAkAbmFtZV9oYXNo9zLYSUlelywDCgBuZXR3b3JrX2lko+dyWgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:honeycomb_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmhvbmV5Y29tYl9ibG9jawQJAG5hbWVfaGFzaASIPuOCYd1oAwoAbmV0d29ya19pZKys4n4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:hay_block", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmhheV9ibG9jawQJAG5hbWVfaGFzaIB2VxKxX8EpAwoAbmV0d29ya19pZKuQSloKBgBzdGF0ZXMDCgBkZXByZWNhdGVkAAAAAAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bone_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJvbmVfYmxvY2sECQBuYW1lX2hhc2i4ZX576W9AWgMKAG5ldHdvcmtfaWTWGacQCgYAc3RhdGVzAwoAZGVwcmVjYXRlZAAAAAAICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:nether_brick", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om5ldGhlcl9icmljawQJAG5hbWVfaGFzaMxcRiheU+nXAwoAbmV0d29ya19pZMkmzloKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_nether_brick", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2sECQBuYW1lX2hhc2j8pRO4LfoECAMKAG5ldHdvcmtfaWRpdF0YCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:netherite_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om5ldGhlcml0ZV9ibG9jawQJAG5hbWVfaGFzaMghh6Zib/ZKAwoAbmV0d29ya19pZIz0mq0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lodestone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxvZGVzdG9uZQQJAG5hbWVfaGFzaJ2gmHOTlXv8AwoAbmV0d29ya19pZEfgB4wKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:white_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OndoaXRlX3dvb2wECQBuYW1lX2hhc2jRWB7vaIEDiQMKAG5ldHdvcmtfaWSO8paQCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:light_gray_wool", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfd29vbAQJAG5hbWVfaGFzaOpdQ1a2v4b3AwoAbmV0d29ya19pZIqZCYEKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:gray_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmdyYXlfd29vbAQJAG5hbWVfaGFzaLsc1Lp1xdIOAwoAbmV0d29ya19pZFUs+HgKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:black_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJsYWNrX3dvb2wECQBuYW1lX2hhc2hP2HC6o0X4HAMKAG5ldHdvcmtfaWRUbORcCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJyb3duX3dvb2wECQBuYW1lX2hhc2ig5IW89PrREwMKAG5ldHdvcmtfaWRjT9j8CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_wool", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnJlZF93b29sBAkAbmFtZV9oYXNoY4TBDq+mFgUDCgBuZXR3b3JrX2lktn9lcAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:orange_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om9yYW5nZV93b29sBAkAbmFtZV9oYXNoFstfrTZfSCgDCgBuZXR3b3JrX2lk+rqywwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:yellow_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnllbGxvd193b29sBAkAbmFtZV9oYXNoTFyus2RHegcDCgBuZXR3b3JrX2lkkKBhXAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lime_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxpbWVfd29vbAQJAG5hbWVfaGFzaNVnnzKiMxmeAwoAbmV0d29ya19pZG9b32kKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:green_wool", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyZWVuX3dvb2wECQBuYW1lX2hhc2i3mElRYHIcSQMKAG5ldHdvcmtfaWSssprwCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cyan_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmN5YW5fd29vbAQJAG5hbWVfaGFzaBNDfvHn8dqFAwoAbmV0d29ya19pZK0hAbgKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_blue_wool", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfd29vbAQJAG5hbWVfaGFzaLWFAUfyxFPNAwoAbmV0d29ya19pZL2oEugKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blue_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJsdWVfd29vbAQJAG5hbWVfaGFzaLjHyxxbTWCLAwoAbmV0d29ya19pZPaLdFQKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:purple_wool", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnB1cnBsZV93b29sBAkAbmFtZV9oYXNojvFtqzjAf/4DCgBuZXR3b3JrX2lklqASNQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:magenta_wool", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om1hZ2VudGFfd29vbAQJAG5hbWVfaGFzaGuOHvf+Pd4yAwoAbmV0d29ya19pZI4UoDQKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:pink_wool", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnBpbmtfd29vbAQJAG5hbWVfaGFzaPiVA2pFeoFLAwoAbmV0d29ya19pZOZRO6oKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:white_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndoaXRlX2NhcnBldAQJAG5hbWVfaGFzaNeMHTI1fWPXAwoAbmV0d29ya19pZEahDFcKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_gray_carpet", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0BAkAbmFtZV9oYXNoHPw6ArBAsP0DCgBuZXR3b3JrX2lkQoAeUAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gray_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdyYXlfY2FycGV0BAkAbmFtZV9oYXNoZVR0OI+1VRADCgBuZXR3b3JrX2lkETF4WwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:black_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJsYWNrX2NhcnBldAQJAG5hbWVfaGFzaOk7LP9NptyhAwoAbmV0d29ya19pZFjmXtIKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brown_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyb3duX2NhcnBldAQJAG5hbWVfaGFzaNaXFyOsAvIvAwoAbmV0d29ya19pZHPjFuoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_carpet", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9jYXJwZXQECQBuYW1lX2hhc2i9eSKBf6SO3wMKAG5ldHdvcmtfaWQuhI/KCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:orange_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om9yYW5nZV9jYXJwZXQECQBuYW1lX2hhc2hIUkO4HlAdygMKAG5ldHdvcmtfaWSyKV9OCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:yellow_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19jYXJwZXQECQBuYW1lX2hhc2hSDKX3scCamwMKAG5ldHdvcmtfaWT8nq+ECgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lime_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpbWVfY2FycGV0BAkAbmFtZV9oYXNo+6KFOpzsib4DCgBuZXR3b3JrX2lkT+DS4woGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:green_carpet", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmdyZWVuX2NhcnBldAQJAG5hbWVfaGFzaCHPMP9ltqFJAwoAbmV0d29ya19pZBgwAvAKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cyan_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmN5YW5fY2FycGV0BAkAbmFtZV9oYXNobXf62dQBJj8DCgBuZXR3b3JrX2lkKVppLgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_blue_carpet", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0BAkAbmFtZV9oYXNo20l4oktdZ3sDCgBuZXR3b3JrX2lkjdeMiwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:blue_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJsdWVfY2FycGV0BAkAbmFtZV9oYXNo3p3lsW0eQwsDCgBuZXR3b3JrX2lkAovdPQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:purple_carpet", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnBsZV9jYXJwZXQECQBuYW1lX2hhc2jwIA9pW/qp7QMKAG5ldHdvcmtfaWTqJqhjCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:magenta_carpet", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0BAkAbmFtZV9oYXNoFXT36YNNZhMDCgBuZXR3b3JrX2lk+tqsGAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pink_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfY2FycGV0BAkAbmFtZV9oYXNoHll72oqk+OoDCgBuZXR3b3JrX2lkrnBYDwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:white_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaFUk9iXVjwV8AwoAbmV0d29ya19pZJPZY8AKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_gray_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNo7EUk30hmUtYDCgBuZXR3b3JrX2lkh8jVIwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gray_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmdyYXlfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNoW77af6WihdwDCgBuZXR3b3JrX2lkSsqC1woGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:black_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmJsYWNrX2NvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaAfWYp0xtgcfAwoAbmV0d29ya19pZMWTC8EKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brown_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaB74EeiLO46XAwoAbmV0d29ya19pZEDHKqwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnJlZF9jb25jcmV0ZV9wb3dkZXIECQBuYW1lX2hhc2gjFut6Z/VH1gMKAG5ldHdvcmtfaWSvcmwYCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:orange_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZV9wb3dkZXIECQBuYW1lX2hhc2gADDj2IJiw+gMKAG5ldHdvcmtfaWTHph0FCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:yellow_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZV9wb3dkZXIECQBuYW1lX2hhc2iy6qKNn3ob5wMKAG5ldHdvcmtfaWQZAI39CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lime_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmxpbWVfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNo4dYIPslbXPUDCgBuZXR3b3JrX2lk2O8X0AoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:green_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlX3Bvd2RlcgQJAG5hbWVfaGFzaM/c9x2aJh3HAwoAbmV0d29ya19pZA0VfBMKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cyan_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmN5YW5fY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNok+xKAe7XXjoDCgBuZXR3b3JrX2lkmkn6uwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_blue_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNogScpIQceyAEDCgBuZXR3b3JrX2lkOmVSbgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:blue_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJsdWVfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNoFp7mmeL86r0DCgBuZXR3b3JrX2lkS3b3RQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:purple_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZV9wb3dkZXIECQBuYW1lX2hhc2iYcVU04hoStwMKAG5ldHdvcmtfaWQXimEjCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:magenta_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0Om1hZ2VudGFfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNoy/70q6VPsWgDCgBuZXR3b3JrX2lkf9mxQwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pink_concrete_powder", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnBpbmtfY29uY3JldGVfcG93ZGVyBAkAbmFtZV9oYXNoVikSAf8DwV0DCgBuZXR3b3JrX2lku2MivwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:white_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlBAkAbmFtZV9oYXNo6zAp7lsLlvkDCgBuZXR3b3JrX2lk3MAYQAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_gray_concrete", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGUECQBuYW1lX2hhc2hEtet5wuDIKAMKAG5ldHdvcmtfaWQISs02CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:gray_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmdyYXlfY29uY3JldGUECQBuYW1lX2hhc2j92INnb0a83AMKAG5ldHdvcmtfaWQj8RHwCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:black_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJsYWNrX2NvbmNyZXRlBAkAbmFtZV9oYXNo2X7NDIQmZ70DCgBuZXR3b3JrX2lk2uiVDQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:brown_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlBAkAbmFtZV9oYXNoeka02BwXf6oDCgBuZXR3b3JrX2lkYf+xDQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_concrete", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZF9jb25jcmV0ZQQJAG5hbWVfaGFzaPWmNowLGubqAwoAbmV0d29ya19pZKwyx58KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:orange_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZQQJAG5hbWVfaGFzaAgE8XmaAi6+AwoAbmV0d29ya19pZMDQNz8KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:yellow_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZQQJAG5hbWVfaGFzaE6ONfJPBd0+AwoAbmV0d29ya19pZMarutwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lime_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmxpbWVfY29uY3JldGUECQBuYW1lX2hhc2gnd8JW6wmJcAMKAG5ldHdvcmtfaWTd47aoCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:green_concrete", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlBAkAbmFtZV9oYXNokbFxRKchQZkDCgBuZXR3b3JrX2lkmhZWUgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cyan_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmN5YW5fY29uY3JldGUECQBuYW1lX2hhc2hFRrWJ33qj1wMKAG5ldHdvcmtfaWQbi5b8CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:light_blue_concrete", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY29uY3JldGUECQBuYW1lX2hhc2gHAe0kl0SE4AMKAG5ldHdvcmtfaWRL/GbSCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blue_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJsdWVfY29uY3JldGUECQBuYW1lX2hhc2hiay301nnj1wMKAG5ldHdvcmtfaWRMvFXNCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:purple_concrete", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZQQJAG5hbWVfaGFzaHBHflsPIwdXAwoAbmV0d29ya19pZCyKA5gKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:magenta_concrete", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0Om1hZ2VudGFfY29uY3JldGUECQBuYW1lX2hhc2gN7LuB/OvdZAMKAG5ldHdvcmtfaWTc6ZOdCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:pink_concrete", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnBpbmtfY29uY3JldGUECQBuYW1lX2hhc2ii2G5F0u3SOAMKAG5ldHdvcmtfaWSszGgrCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:clay", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmNsYXkECQBuYW1lX2hhc2j/S6sKXRcpzwMKAG5ldHdvcmtfaWRmsb8nCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:hardened_clay", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmhhcmRlbmVkX2NsYXkECQBuYW1lX2hhc2jrnRwCJ0krJAMKAG5ldHdvcmtfaWRBCOrrCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:white_terracotta", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndoaXRlX3RlcnJhY290dGEECQBuYW1lX2hhc2j3RSdgmnAIewMKAG5ldHdvcmtfaWSimKw+CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:light_gray_terracotta", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmxpZ2h0X2dyYXlfdGVycmFjb3R0YQQJAG5hbWVfaGFzaAz1Ri3wIxomAwoAbmV0d29ya19pZH5qgOcKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:gray_terracotta", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmdyYXlfdGVycmFjb3R0YQQJAG5hbWVfaGFzaAXdSLAaNZ9vAwoAbmV0d29ya19pZM1QDV0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:black_terracotta", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJsYWNrX3RlcnJhY290dGEECQBuYW1lX2hhc2jxssdv5vlbpgMKAG5ldHdvcmtfaWRE3Ru/CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_terracotta", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJyb3duX3RlcnJhY290dGEECQBuYW1lX2hhc2gG4kPenmOF9gMKAG5ldHdvcmtfaWQ/i0iNCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_terracotta", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNo7fX56HXFejEDCgBuZXR3b3JrX2lk8tTF8QoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:orange_terracotta", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om9yYW5nZV90ZXJyYWNvdHRhBAkAbmFtZV9oYXNo0Hjmql3sruMDCgBuZXR3b3JrX2lklmqmkAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:yellow_terracotta", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnllbGxvd190ZXJyYWNvdHRhBAkAbmFtZV9oYXNoqkyKKrmA3VcDCgBuZXR3b3JrX2lkaM/orAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lime_terracotta", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmxpbWVfdGVycmFjb3R0YQQJAG5hbWVfaGFzaANjADFOF9v7AwoAbmV0d29ya19pZJt0XsgKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:green_terracotta", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmdyZWVuX3RlcnJhY290dGEECQBuYW1lX2hhc2j5Ybq36yYwRQMKAG5ldHdvcmtfaWQ8kGdHCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cyan_terracotta", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmN5YW5fdGVycmFjb3R0YQQJAG5hbWVfaGFzaN09COzMuHwAAwoAbmV0d29ya19pZIWPCzoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_blue_terracotta", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmxpZ2h0X2JsdWVfdGVycmFjb3R0YQQJAG5hbWVfaGFzaOMytez7cOZiAwoAbmV0d29ya19pZFHK1UsKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blue_terracotta", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmJsdWVfdGVycmFjb3R0YQQJAG5hbWVfaGFzaF6inyTK5RpAAwoAbmV0d29ya19pZF5mVZIKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:purple_terracotta", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnB1cnBsZV90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoKF7YG61yTbEDCgBuZXR3b3JrX2lkhtRDlwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:magenta_terracotta", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om1hZ2VudGFfdGVycmFjb3R0YQQJAG5hbWVfaGFzaLWvtpAVtztyAwoAbmV0d29ya19pZN5SoakKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:pink_terracotta", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnBpbmtfdGVycmFjb3R0YQQJAG5hbWVfaGFzaJ7mzvyzSQZTAwoAbmV0d29ya19pZDJWe4YKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:white_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OndoaXRlX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoiVzCdoHAJo0DCgBuZXR3b3JrX2lkIlj9AAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:silver_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnNpbHZlcl9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaAVsA0CnhzA4AwoAbmV0d29ya19pZPnxtJEKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gray_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmdyYXlfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2jvLZt9u/lF/AMKAG5ldHdvcmtfaWQVU8eFCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:black_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmJsYWNrX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoe8I4xAXbO5UDCgBuZXR3b3JrX2lk2Icb9AoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmJyb3duX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNoSiNZOobbpjoDCgBuZXR3b3JrX2lkJy0jwgoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnJlZF9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaBdWFGLmCLFVAwoAbmV0d29ya19pZMYBJSEKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:orange_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om9yYW5nZV9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaMyJMrnPr7szAwoAbmV0d29ya19pZN6+7TUKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:yellow_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnllbGxvd19nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaN6NaIhf6m0uAwoAbmV0d29ya19pZKRHXeoKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lime_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpbWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2iF3E68/rB2EAMKAG5ldHdvcmtfaWSP7qQWCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:green_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmdyZWVuX2dsYXplZF90ZXJyYWNvdHRhBAkAbmFtZV9oYXNow5mo8aQDFboDCgBuZXR3b3JrX2lkoF11kgoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:cyan_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmN5YW5fZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2gnNB+cCFRJhwMKAG5ldHdvcmtfaWT9buMtCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_blue_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSYAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2gladnCDBKCigMKAG5ldHdvcmtfaWS5CszFCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blue_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmJsdWVfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2giOZK+2nB1igMKAG5ldHdvcmtfaWR+e22CCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:purple_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0OnB1cnBsZV9nbGF6ZWRfdGVycmFjb3R0YQQJAG5hbWVfaGFzaIQU03txeAfHAwoAbmV0d29ya19pZLKbSE4KBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:magenta_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0Om1hZ2VudGFfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2i/SNqDJbfjMgMKAG5ldHdvcmtfaWQKf9UvCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:pink_glazed_terracotta", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnBpbmtfZ2xhemVkX3RlcnJhY290dGEECQBuYW1lX2hhc2hik8DVt4g+twMKAG5ldHdvcmtfaWTKzav2CgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:purpur_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnB1cnB1cl9ibG9jawQJAG5hbWVfaGFzaAgLwnUZGlzsAwoAbmV0d29ya19pZLD8ox4KBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQcAZGVmYXVsdAgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:purpur_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnB1cnB1cl9ibG9jawQJAG5hbWVfaGFzaAgLwnUZGlzsAwoAbmV0d29ya19pZPSAFFsKBgBzdGF0ZXMICwBjaGlzZWxfdHlwZQUAbGluZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:packed_mud", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnBhY2tlZF9tdWQECQBuYW1lX2hhc2gHOMa121h4FgMKAG5ldHdvcmtfaWTUb6LyCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mud_bricks", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om11ZF9icmlja3MECQBuYW1lX2hhc2iDL/SVl/PewQMKAG5ldHdvcmtfaWSkBjaDCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:nether_wart_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0Om5ldGhlcl93YXJ0X2Jsb2NrBAkAbmFtZV9oYXNo9XGS4GNnlV4DCgBuZXR3b3JrX2lkh3apIgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_wart_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndhcnBlZF93YXJ0X2Jsb2NrBAkAbmFtZV9oYXNo9IqDS9yUPJoDCgBuZXR3b3JrX2lkMpKAbAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:shroomlight", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNocm9vbWxpZ2h0BAkAbmFtZV9oYXNoZHCHcHX/HYADCgBuZXR3b3JrX2lkLG2JiwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:crimson_nylium", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fbnlsaXVtBAkAbmFtZV9oYXNoOr6DJYW2bFYDCgBuZXR3b3JrX2lkuWpRDgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_nylium", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9ueWxpdW0ECQBuYW1lX2hhc2g0Zf89cfr3rwMKAG5ldHdvcmtfaWSu/kekCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:netherrack", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om5ldGhlcnJhY2sECQBuYW1lX2hhc2i/r5ZyRsvPyQMKAG5ldHdvcmtfaWTAiTOACgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:basalt", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhc2FsdAQJAG5hbWVfaGFzaH+UQO2yWodiAwoAbmV0d29ya19pZBPNSV4KBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_basalt", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnBvbGlzaGVkX2Jhc2FsdAQJAG5hbWVfaGFzaMS+L0gMnRcBAwoAbmV0d29ya19pZF+/mHwKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:smooth_basalt", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNtb290aF9iYXNhbHQECQBuYW1lX2hhc2jKPUdz89kuNAMKAG5ldHdvcmtfaWTkb/oVCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:soul_soil", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNvdWxfc29pbAQJAG5hbWVfaGFzaC1/87ccutuTAwoAbmV0d29ya19pZKc63SMKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dirt", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmRpcnQECQBuYW1lX2hhc2hXp6jnXAe+kQMKAG5ldHdvcmtfaWQmkQtoCgYAc3RhdGVzCAkAZGlydF90eXBlBgBub3JtYWwAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dirt", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmRpcnQECQBuYW1lX2hhc2hXp6jnXAe+kQMKAG5ldHdvcmtfaWQId9pLCgYAc3RhdGVzCAkAZGlydF90eXBlBgBjb2Fyc2UAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:farmland", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmZhcm1sYW5kBAkAbmFtZV9oYXNoxyQ5ag7LolADCgBuZXR3b3JrX2lkX618FQoGAHN0YXRlcwMSAG1vaXN0dXJpemVkX2Ftb3VudAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:grass", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmdyYXNzBAkAbmFtZV9oYXNosppASPWFlsUDCgBuZXR3b3JrX2lkhLLQkQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:grass_path", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyYXNzX3BhdGgECQBuYW1lX2hhc2i0/KZV8Qsy+gMKAG5ldHdvcmtfaWT7CcdzCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:podzol", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBvZHpvbAQJAG5hbWVfaGFzaBzqokRjH4Z1AwoAbmV0d29ya19pZPPS/GUKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mycelium", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om15Y2VsaXVtBAkAbmFtZV9oYXNojTN09cKickIDCgBuZXR3b3JrX2lkLNPxXQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mud", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0Om11ZAQJAG5hbWVfaGFzaPb/3P+uLy+9AwoAbmV0d29ya19pZPIUlUkKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lky8FPmgoGAHN0YXRlcwgKAHN0b25lX3R5cGUFAHN0b25lAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:iron_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Omlyb25fb3JlBAkAbmFtZV9oYXNoS7BYtLnfx3gDCgBuZXR3b3JrX2lk3loneQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gold_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmdvbGRfb3JlBAkAbmFtZV9oYXNoC5Y+DUGXLC4DCgBuZXR3b3JrX2lkNhvMfwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:diamond_ore", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmRpYW1vbmRfb3JlBAkAbmFtZV9oYXNokUOJ2wZZrGQDCgBuZXR3b3JrX2lk/dChVAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lapis_ore", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmxhcGlzX29yZQQJAG5hbWVfaGFzaMrmrUrSzb7qAwoAbmV0d29ya19pZMg+qK4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:redstone_ore", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZHN0b25lX29yZQQJAG5hbWVfaGFzaFHVnp8Wc4JbAwoAbmV0d29ya19pZKDYvQoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coal_ore", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmNvYWxfb3JlBAkAbmFtZV9oYXNo1OjA+Iuy51oDCgBuZXR3b3JrX2lk+R/aKAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:copper_ore", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNvcHBlcl9vcmUECQBuYW1lX2hhc2iSZduSntOzOwMKAG5ldHdvcmtfaWQtIuCnCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:emerald_ore", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmVtZXJhbGRfb3JlBAkAbmFtZV9oYXNoJTovr+VgINsDCgBuZXR3b3JrX2lknbkqCgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:quartz_ore", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnF1YXJ0el9vcmUECQBuYW1lX2hhc2g0yNHLMK9TaQMKAG5ldHdvcmtfaWSzN7nzCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:nether_gold_ore", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om5ldGhlcl9nb2xkX29yZQQJAG5hbWVfaGFzaEJZ7segIBgBAwoAbmV0d29ya19pZNI9pDgKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:ancient_debris", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFuY2llbnRfZGVicmlzBAkAbmFtZV9oYXNoNrbxMc9AwKcDCgBuZXR3b3JrX2lkrSNjEAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:deepslate_iron_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9pcm9uX29yZQQJAG5hbWVfaGFzaB/fDL9pgvXXAwoAbmV0d29ya19pZFA0bz4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_gold_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9nb2xkX29yZQQJAG5hbWVfaGFzaF9G7WYhKFinAwoAbmV0d29ya19pZHQTfBUKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_diamond_ore", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV9kaWFtb25kX29yZQQJAG5hbWVfaGFzaEUH5USh+iD3AwoAbmV0d29ya19pZHP6VzAKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_lapis_ore", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmRlZXBzbGF0ZV9sYXBpc19vcmUECQBuYW1lX2hhc2j+yFxU/KZs1gMKAG5ldHdvcmtfaWRKINzICgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate_redstone_ore", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmRlZXBzbGF0ZV9yZWRzdG9uZV9vcmUECQBuYW1lX2hhc2iVgM3wWWD6ugMKAG5ldHdvcmtfaWReBdYRCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate_emerald_ore", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmRlZXBzbGF0ZV9lbWVyYWxkX29yZQQJAG5hbWVfaGFzaNlfo5HTwS6wAwoAbmV0d29ya19pZNeie6sKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_coal_ore", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmRlZXBzbGF0ZV9jb2FsX29yZQQJAG5hbWVfaGFzaIjikmcbRrPPAwoAbmV0d29ya19pZD9TiygKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:deepslate_copper_ore", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmRlZXBzbGF0ZV9jb3BwZXJfb3JlBAkAbmFtZV9oYXNottjV4Ev5LAQDCgBuZXR3b3JrX2lkP23rgQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gravel", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmdyYXZlbAQJAG5hbWVfaGFzaOFxz8XJd2r/AwoAbmV0d29ya19pZBpfI1sKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lkbtgs0goGAHN0YXRlcwgKAHN0b25lX3R5cGUHAGdyYW5pdGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk3sDePAoGAHN0YXRlcwgKAHN0b25lX3R5cGUHAGRpb3JpdGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lkYG+0YwoGAHN0YXRlcwgKAHN0b25lX3R5cGUIAGFuZGVzaXRlAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blackstone", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmJsYWNrc3RvbmUECQBuYW1lX2hhc2iMFYziD80D6QMKAG5ldHdvcmtfaWSrUryHCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:deepslate", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmRlZXBzbGF0ZQQJAG5hbWVfaGFzaKX5pAblxz8TAwoAbmV0d29ya19pZOJoQjsKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lkREbyhwoGAHN0YXRlcwgKAHN0b25lX3R5cGUOAGdyYW5pdGVfc21vb3RoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lk/EZ3UwoGAHN0YXRlcwgKAHN0b25lX3R5cGUOAGRpb3JpdGVfc21vb3RoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnN0b25lBAkAbmFtZV9oYXNoE3mqhJxzJycDCgBuZXR3b3JrX2lkmjeVIwoGAHN0YXRlcwgKAHN0b25lX3R5cGUPAGFuZGVzaXRlX3Ntb290aAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:polished_blackstone", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmUECQBuYW1lX2hhc2jT9fHCl6vWQQMKAG5ldHdvcmtfaWR/Ho6oCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:polished_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaHC1edoaWF3uAwoAbmV0d29ya19pZCPeQsEKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sand", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNhbmQECQBuYW1lX2hhc2i6lthXXbAyWAMKAG5ldHdvcmtfaWTekU/mCgYAc3RhdGVzCAkAc2FuZF90eXBlBgBub3JtYWwAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sand", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNhbmQECQBuYW1lX2hhc2i6lthXXbAyWAMKAG5ldHdvcmtfaWSTgcqmCgYAc3RhdGVzCAkAc2FuZF90eXBlAwByZWQAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cactus", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmNhY3R1cwQJAG5hbWVfaGFzaCG9zL0N4wvGAwoAbmV0d29ya19pZDeCERAKBgBzdGF0ZXMDAwBhZ2UAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:oak_log", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0Om9ha19sb2cECQBuYW1lX2hhc2ho6TS+K7PZFQMKAG5ldHdvcmtfaWQjfjoxCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_oak_log", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnN0cmlwcGVkX29ha19sb2cECQBuYW1lX2hhc2h8dqh+OOHU4wMKAG5ldHdvcmtfaWSYKjdrCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:spruce_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNwcnVjZV9sb2cECQBuYW1lX2hhc2hZ03qaLoF3WgMKAG5ldHdvcmtfaWRlFD8eCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_spruce_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX3NwcnVjZV9sb2cECQBuYW1lX2hhc2iNrhKjS5IyrgMKAG5ldHdvcmtfaWRQcEC3CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:birch_log", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJpcmNoX2xvZwQJAG5hbWVfaGFzaBUzT3NxsZAnAwoAbmV0d29ya19pZBKN3VQKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_birch_log", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnN0cmlwcGVkX2JpcmNoX2xvZwQJAG5hbWVfaGFzaCFKS4AeuSidAwoAbmV0d29ya19pZN0IONIKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:jungle_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omp1bmdsZV9sb2cECQBuYW1lX2hhc2gkwW0KNulqDgMKAG5ldHdvcmtfaWQaziU/CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_jungle_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2p1bmdsZV9sb2cECQBuYW1lX2hhc2hAwMsgOk02JAMKAG5ldHdvcmtfaWQvls0eCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:acacia_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmFjYWNpYV9sb2cECQBuYW1lX2hhc2iV48VpYhjoYQMKAG5ldHdvcmtfaWRxEqe0CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_acacia_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2FjYWNpYV9sb2cECQBuYW1lX2hhc2hJb0lQqnEqlgMKAG5ldHdvcmtfaWRg3IdRCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dark_oak_log", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRhcmtfb2FrX2xvZwQJAG5hbWVfaGFzaIWfVRd0XUo3AwoAbmV0d29ya19pZPMM7LYKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_dark_oak_log", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2Rhcmtfb2FrX2xvZwQJAG5hbWVfaGFzaPFTdxRdPwkOAwoAbmV0d29ya19pZDIzenIKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mangrove_log", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0Om1hbmdyb3ZlX2xvZwQJAG5hbWVfaGFzaHZe6DzPZBobAwoAbmV0d29ya19pZG6DuYkKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_mangrove_log", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX2xvZwQJAG5hbWVfaGFzaLqIBo4hwA//AwoAbmV0d29ya19pZPtRn7UKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cherry_log", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmNoZXJyeV9sb2cECQBuYW1lX2hhc2hwFlaioppB1wMKAG5ldHdvcmtfaWS2sdXECgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_cherry_log", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV9sb2cECQBuYW1lX2hhc2i85H6G+WhXaAMKAG5ldHdvcmtfaWRjzoglCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_stem", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNyaW1zb25fc3RlbQQJAG5hbWVfaGFzaM0FzfL0UTKZAwoAbmV0d29ya19pZKvzID0KBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_crimson_stem", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25fc3RlbQQJAG5hbWVfaGFzaDlA6nood57EAwoAbmV0d29ya19pZHrIqjIKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_stem", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndhcnBlZF9zdGVtBAkAbmFtZV9oYXNon7cKfPZxdrUDCgBuZXR3b3JrX2lkerWyMwoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stripped_warped_stem", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9zdGVtBAkAbmFtZV9oYXNoEw+y0dDPSd8DCgBuZXR3b3JrX2lkIQ9vBAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWSYGFlqCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlAwBvYWsAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWSxnUzvCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlAwBvYWsAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWToyw4RCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBzcHJ1Y2UAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWTL0a3ZCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBzcHJ1Y2UAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWQV99vJCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBQBiaXJjaAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWQYDJk1CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBQBiaXJjaAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWSfH48gCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBqdW5nbGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWQ44auiCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBqdW5nbGUAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWSogpPYCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlBgBhY2FjaWEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWSD7hT1CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlBgBhY2FjaWEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWQagb3gCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQACAkAd29vZF90eXBlCABkYXJrX29hawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wood", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Ondvb2QECQBuYW1lX2hhc2gbHdJFXQ1vNwMKAG5ldHdvcmtfaWQdnWU+CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQBCAkAd29vZF90eXBlCABkYXJrX29hawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mangrove_wood", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om1hbmdyb3ZlX3dvb2QECQBuYW1lX2hhc2iXVxG0JG2fVAMKAG5ldHdvcmtfaWTok1JCCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkBDABzdHJpcHBlZF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stripped_mangrove_wood", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX3dvb2QECQBuYW1lX2hhc2h7CkbaBF7/WAMKAG5ldHdvcmtfaWQLAX88CgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_wood", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNoZXJyeV93b29kBAkAbmFtZV9oYXNoAW8srlmpBM8DCgBuZXR3b3JrX2lkEALMfAoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AQwAc3RyaXBwZWRfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_cherry_wood", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV93b29kBAkAbmFtZV9oYXNo/e7KXv+CB38DCgBuZXR3b3JrX2lkg5aVtQoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:crimson_hyphae", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25faHlwaGFlBAkAbmFtZV9oYXNouRmKmfSqEWADCgBuZXR3b3JrX2lk+Tm5rQoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stripped_crimson_hyphae", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25faHlwaGFlBAkAbmFtZV9oYXNoFffwmABq4LUDCgBuZXR3b3JrX2lkZAlUbgoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:warped_hyphae", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9oeXBoYWUECQBuYW1lX2hhc2hn8plQUr6pmQMKAG5ldHdvcmtfaWRU2AIBCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:stripped_warped_hyphae", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OnN0cmlwcGVkX3dhcnBlZF9oeXBoYWUECQBuYW1lX2hhc2irKq+HYPSgjQMKAG5ldHdvcmtfaWSbrOPDCgYAc3RhdGVzCAsAcGlsbGFyX2F4aXMBAHkAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bamboo_block", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJhbWJvb19ibG9jawQJAG5hbWVfaGFzaAbDeur6stIBAwoAbmV0d29ya19pZCJAwn0KBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:stripped_bamboo_block", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnN0cmlwcGVkX2JhbWJvb19ibG9jawQJAG5hbWVfaGFzaJpwytpZOZM9AwoAbmV0d29ya19pZKuRbNEKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZOmqtzMKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlAwBvYWsBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZFMVNEQKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBgBzcHJ1Y2UBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZKCZEm8KBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBQBiaXJjaAEOAHBlcnNpc3RlbnRfYml0AAEKAHVwZGF0ZV9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:leaves", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmxlYXZlcwQJAG5hbWVfaGFzaACPIsusW0mnAwoAbmV0d29ya19pZABprGgKBgBzdGF0ZXMIDQBvbGRfbGVhZl90eXBlBgBqdW5nbGUBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:leaves2", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlYXZlczIECQBuYW1lX2hhc2gy/bgrncY1ZAMKAG5ldHdvcmtfaWSFh3olCgYAc3RhdGVzCA0AbmV3X2xlYWZfdHlwZQYAYWNhY2lhAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:leaves2", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlYXZlczIECQBuYW1lX2hhc2gy/bgrncY1ZAMKAG5ldHdvcmtfaWTvEAyeCgYAc3RhdGVzCA0AbmV3X2xlYWZfdHlwZQgAZGFya19vYWsBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:mangrove_leaves", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX2xlYXZlcwQJAG5hbWVfaGFzaKyI/dWvhEG8AwoAbmV0d29ya19pZPQxCZ8KBgBzdGF0ZXMBDgBwZXJzaXN0ZW50X2JpdAABCgB1cGRhdGVfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cherry_leaves", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9sZWF2ZXMECQBuYW1lX2hhc2giTs9ChhYBlQMKAG5ldHdvcmtfaWR8bPpwCgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:azalea_leaves", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXMECQBuYW1lX2hhc2iXFhD57wFS7AMKAG5ldHdvcmtfaWTNB/9ECgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:azalea_leaves_flowered", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmF6YWxlYV9sZWF2ZXNfZmxvd2VyZWQECQBuYW1lX2hhc2gs8jxlS/pMrwMKAG5ldHdvcmtfaWQ7W4PyCgYAc3RhdGVzAQ4AcGVyc2lzdGVudF9iaXQAAQoAdXBkYXRlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQmoOEvCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUDAG9hawADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQO8pAmCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAHNwcnVjZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWQDHhokCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUFAGJpcmNoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWTdQrcyCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAGp1bmdsZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWRCDffNCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUGAGFjYWNpYQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sapling", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnNhcGxpbmcECQBuYW1lX2hhc2goZxi1oICLKwMKAG5ldHdvcmtfaWR0BRzPCgYAc3RhdGVzAQcAYWdlX2JpdAAIDABzYXBsaW5nX3R5cGUIAGRhcmtfb2FrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mangrove_propagule", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om1hbmdyb3ZlX3Byb3BhZ3VsZQQJAG5hbWVfaGFzaJGeox6hkfLFAwoAbmV0d29ya19pZAIpvpYKBgBzdGF0ZXMBBwBoYW5naW5nAAMPAHByb3BhZ3VsZV9zdGFnZQAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_sapling", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNoZXJyeV9zYXBsaW5nBAkAbmFtZV9oYXNoGrPpNMf1LtcDCgBuZXR3b3JrX2lkypakXQoGAHN0YXRlcwEHAGFnZV9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bee_nest", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmJlZV9uZXN0BAkAbmFtZV9oYXNo2R2WBxUHEZIDCgBuZXR3b3JrX2lkiXWLEAoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAADCwBob25leV9sZXZlbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wheat_seeds" - }, - { - "id": "minecraft:pumpkin_seeds" - }, - { - "id": "minecraft:melon_seeds" - }, - { - "id": "minecraft:beetroot_seeds" - }, - { - "id": "minecraft:torchflower_seeds" - }, - { - "id": "minecraft:pitcher_pod" - }, - { - "id": "minecraft:wheat" - }, - { - "id": "minecraft:beetroot" - }, - { - "id": "minecraft:potato" - }, - { - "id": "minecraft:poisonous_potato" - }, - { - "id": "minecraft:carrot" - }, - { - "id": "minecraft:golden_carrot" - }, - { - "id": "minecraft:apple" - }, - { - "id": "minecraft:golden_apple" - }, - { - "id": "minecraft:enchanted_golden_apple" - }, - { - "id": "minecraft:melon_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1lbG9uX2Jsb2NrBAkAbmFtZV9oYXNoXxSm0iYpAx8DCgBuZXR3b3JrX2lkC9rqygoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:melon_slice" - }, - { - "id": "minecraft:glistering_melon_slice" - }, - { - "id": "minecraft:sweet_berries" - }, - { - "id": "minecraft:glow_berries" - }, - { - "id": "minecraft:pumpkin", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OnB1bXBraW4ECQBuYW1lX2hhc2gc8A3jaSzWbgMKAG5ldHdvcmtfaWRFGA+xCgYAc3RhdGVzCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:carved_pumpkin", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNhcnZlZF9wdW1wa2luBAkAbmFtZV9oYXNoPu1T0MJuG90DCgBuZXR3b3JrX2lkXNNn5QoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lit_pumpkin", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpdF9wdW1wa2luBAkAbmFtZV9oYXNo7gWtEm2uPL0DCgBuZXR3b3JrX2lki8sU4AoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:honeycomb" - }, - { - "id": "minecraft:tallgrass", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnRhbGxncmFzcwQJAG5hbWVfaGFzaC3PXpAXXYswAwoAbmV0d29ya19pZOh33DMKBgBzdGF0ZXMIDwB0YWxsX2dyYXNzX3R5cGUEAGZlcm4AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZMx1sfgKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQQAZmVybgEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:tallgrass", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnRhbGxncmFzcwQJAG5hbWVfaGFzaC3PXpAXXYswAwoAbmV0d29ya19pZErptfIKBgBzdGF0ZXMIDwB0YWxsX2dyYXNzX3R5cGUEAHRhbGwAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZAbadmIKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQUAZ3Jhc3MBDwB1cHBlcl9ibG9ja19iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:nether_sprouts" - }, - { - "id": "minecraft:fire_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZpcmVfY29yYWwECQBuYW1lX2hhc2hOHyyECVQVJwMKAG5ldHdvcmtfaWS9vF0UCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brain_coral", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJyYWluX2NvcmFsBAkAbmFtZV9oYXNoRiWlLCwA2ycDCgBuZXR3b3JrX2lkrjAuhgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:bubble_coral", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJ1YmJsZV9jb3JhbAQJAG5hbWVfaGFzaJz6rWnl+v2qAwoAbmV0d29ya19pZImIWy0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:tube_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnR1YmVfY29yYWwECQBuYW1lX2hhc2iYa8oO/tgk7wMKAG5ldHdvcmtfaWRTfND5CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:horn_coral", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Omhvcm5fY29yYWwECQBuYW1lX2hhc2iZnRHjZbnLPgMKAG5ldHdvcmtfaWR+GGp8CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dead_fire_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbAQJAG5hbWVfaGFzaEPU6tFy/latAwoAbmV0d29ya19pZNMa7V4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dead_brain_coral", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWwECQBuYW1lX2hhc2j5L6QJCISvzwMKAG5ldHdvcmtfaWQkKzeiCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dead_bubble_coral", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsBAkAbmFtZV9oYXNoSTOZ/8wpeNYDCgBuZXR3b3JrX2lka6w9DAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:dead_tube_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfdHViZV9jb3JhbAQJAG5hbWVfaGFzaJGjNWhlaIJeAwoAbmV0d29ya19pZO3Z0ygKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:dead_horn_coral", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbAQJAG5hbWVfaGFzaJBkz3qt+g2cAwoAbmV0d29ya19pZBAN+eYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZOg7iS4KBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgMAcmVkAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZIDj8HMKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgQAcGluawMTAGNvcmFsX2Zhbl9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZLCJP0kKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgYAcHVycGxlAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZFz2ly4KBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgQAYmx1ZQMTAGNvcmFsX2Zhbl9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_fan", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvcmFsX2ZhbgQJAG5hbWVfaGFzaAFROjbTm8JzAwoAbmV0d29ya19pZE4TgnYKBgBzdGF0ZXMICwBjb3JhbF9jb2xvcgYAeWVsbG93AxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkdhLQzwoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkSi6srQoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkGiGSzAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lkmvZKOgoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAxMAY29yYWxfZmFuX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_fan_dead", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNvcmFsX2Zhbl9kZWFkBAkAbmFtZV9oYXNo3kgokLV4uQIDCgBuZXR3b3JrX2lknLw+4QoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cDEwBjb3JhbF9mYW5fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:crimson_roots", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNyaW1zb25fcm9vdHMECQBuYW1lX2hhc2j1fWgQLViv5QMKAG5ldHdvcmtfaWRLh5DXCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:warped_roots", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndhcnBlZF9yb290cwQJAG5hbWVfaGFzaBc3WvbJOLlkAwoAbmV0d29ya19pZNLgDnAKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:yellow_flower", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19mbG93ZXIECQBuYW1lX2hhc2jWbU1pF0OUGAMKAG5ldHdvcmtfaWQgO3hpCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWSqsqQGCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUFAHBvcHB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWTqDajjCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUGAG9yY2hpZAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWT5CjveCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUGAGFsbGl1bQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWTORIBJCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUJAGhvdXN0b25pYQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWTuNhmYCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUJAHR1bGlwX3JlZAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWT0O4nfCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUMAHR1bGlwX29yYW5nZQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWTqkthyCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGULAHR1bGlwX3doaXRlAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRMbBA7CgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUKAHR1bGlwX3BpbmsAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRexMAuCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUFAG94ZXllAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWQgs7BECgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUKAGNvcm5mbG93ZXIAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_flower", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9mbG93ZXIECQBuYW1lX2hhc2ixeWoRT8FNPwMKAG5ldHdvcmtfaWRvDuNbCgYAc3RhdGVzCAsAZmxvd2VyX3R5cGUSAGxpbHlfb2ZfdGhlX3ZhbGxleQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZOemRt4KBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQkAc3VuZmxvd2VyAQ8AdXBwZXJfYmxvY2tfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZOFugoEKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQcAc3lyaW5nYQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZN4O+/gKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQQAcm9zZQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:double_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmRvdWJsZV9wbGFudAQJAG5hbWVfaGFzaHVcUQvyXwGKAwoAbmV0d29ya19pZI3w4GMKBgBzdGF0ZXMIEQBkb3VibGVfcGxhbnRfdHlwZQcAcGFlb25pYQEPAHVwcGVyX2Jsb2NrX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:pitcher_plant", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnBpdGNoZXJfcGxhbnQECQBuYW1lX2hhc2hRJHzsbDH+SQMKAG5ldHdvcmtfaWRnY76VCgYAc3RhdGVzAQ8AdXBwZXJfYmxvY2tfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pink_petals", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfcGV0YWxzBAkAbmFtZV9oYXNo6DQwN9SwV3QDCgBuZXR3b3JrX2lkNWneGgoGAHN0YXRlcwMGAGdyb3d0aAAAAAAIHABtaW5lY3JhZnQ6Y2FyZGluYWxfZGlyZWN0aW9uBQBzb3V0aAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:wither_rose", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OndpdGhlcl9yb3NlBAkAbmFtZV9oYXNoaSKxl3I516gDCgBuZXR3b3JrX2lkATXLPwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:torchflower", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnRvcmNoZmxvd2VyBAkAbmFtZV9oYXNoL+mHtElwbqQDCgBuZXR3b3JrX2lkI34O+AoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:white_dye" - }, - { - "id": "minecraft:light_gray_dye" - }, - { - "id": "minecraft:gray_dye" - }, - { - "id": "minecraft:black_dye" - }, - { - "id": "minecraft:brown_dye" - }, - { - "id": "minecraft:red_dye" - }, - { - "id": "minecraft:orange_dye" - }, - { - "id": "minecraft:yellow_dye" - }, - { - "id": "minecraft:lime_dye" - }, - { - "id": "minecraft:green_dye" - }, - { - "id": "minecraft:cyan_dye" - }, - { - "id": "minecraft:light_blue_dye" - }, - { - "id": "minecraft:blue_dye" - }, - { - "id": "minecraft:purple_dye" - }, - { - "id": "minecraft:magenta_dye" - }, - { - "id": "minecraft:pink_dye" - }, - { - "id": "minecraft:ink_sac" - }, - { - "id": "minecraft:glow_ink_sac" - }, - { - "id": "minecraft:cocoa_beans" - }, - { - "id": "minecraft:lapis_lazuli" - }, - { - "id": "minecraft:bone_meal" - }, - { - "id": "minecraft:vine", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnZpbmUECQBuYW1lX2hhc2j0Sj8/XeXOLAMKAG5ldHdvcmtfaWSUkDtbCgYAc3RhdGVzAxMAdmluZV9kaXJlY3Rpb25fYml0cwAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:weeping_vines", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndlZXBpbmdfdmluZXMECQBuYW1lX2hhc2jrLgLHkQygiwMKAG5ldHdvcmtfaWQ8NHSJCgYAc3RhdGVzAxEAd2VlcGluZ192aW5lc19hZ2UAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:twisting_vines", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnR3aXN0aW5nX3ZpbmVzBAkAbmFtZV9oYXNoDYR5QgVUQJADCgBuZXR3b3JrX2lk5kYVIQoGAHN0YXRlcwMSAHR3aXN0aW5nX3ZpbmVzX2FnZQAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:waterlily", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OndhdGVybGlseQQJAG5hbWVfaGFzaEHgC4c1SXg0AwoAbmV0d29ya19pZOOerp8KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:seagrass", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OnNlYWdyYXNzBAkAbmFtZV9oYXNoHSBFtoHdWxIDCgBuZXR3b3JrX2lkd3lhEAoGAHN0YXRlcwgOAHNlYV9ncmFzc190eXBlBwBkZWZhdWx0AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:kelp" - }, - { - "id": "minecraft:deadbush", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmRlYWRidXNoBAkAbmFtZV9oYXNoPFODe4IScnYDCgBuZXR3b3JrX2lkVfnl+goGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:bamboo", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhbWJvbwQJAG5hbWVfaGFzaBgpGmyzhedCAwoAbmV0d29ya19pZIZv1nYKBgBzdGF0ZXMBBwBhZ2VfYml0AAgQAGJhbWJvb19sZWFmX3NpemUJAG5vX2xlYXZlcwgWAGJhbWJvb19zdGFsa190aGlja25lc3MEAHRoaW4AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:snow", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnNub3cECQBuYW1lX2hhc2gVHr5XXdETWAMKAG5ldHdvcmtfaWQ0zCeHCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:ice", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OmljZQQJAG5hbWVfaGFzaNF26f+uUT29AwoAbmV0d29ya19pZOUMaQYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:packed_ice", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnBhY2tlZF9pY2UECQBuYW1lX2hhc2hk4bu123ZrFgMKAG5ldHdvcmtfaWTr/ooaCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blue_ice", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0OmJsdWVfaWNlBAkAbmFtZV9oYXNo+EKxYgFhKcgDCgBuZXR3b3JrX2lkxfsA8goGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:snow_layer", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNub3dfbGF5ZXIECQBuYW1lX2hhc2hXka6atMYUCQMKAG5ldHdvcmtfaWRCrIPcCgYAc3RhdGVzAQsAY292ZXJlZF9iaXQAAwYAaGVpZ2h0AAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pointed_dripstone", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnBvaW50ZWRfZHJpcHN0b25lBAkAbmFtZV9oYXNoJMISzmHQgt8DCgBuZXR3b3JrX2lkbWrtYgoGAHN0YXRlcwgTAGRyaXBzdG9uZV90aGlja25lc3MDAHRpcAEHAGhhbmdpbmcBAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dripstone_block", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRyaXBzdG9uZV9ibG9jawQJAG5hbWVfaGFzaIIXnEqY77YsAwoAbmV0d29ya19pZMZi2kwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:moss_carpet", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vc3NfY2FycGV0BAkAbmFtZV9oYXNo/NEDxRPTshYDCgBuZXR3b3JrX2lkaGG3QwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:moss_block", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0Om1vc3NfYmxvY2sECQBuYW1lX2hhc2iovcsPUYX2tgMKAG5ldHdvcmtfaWT3JSbfCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dirt_with_roots", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRpcnRfd2l0aF9yb290cwQJAG5hbWVfaGFzaLCNDYPviDCIAwoAbmV0d29ya19pZNCkwzoKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:hanging_roots", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omhhbmdpbmdfcm9vdHMECQBuYW1lX2hhc2jaXn+Y5UZpDAMKAG5ldHdvcmtfaWRU4c2vCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:mangrove_roots", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hbmdyb3ZlX3Jvb3RzBAkAbmFtZV9oYXNoa786PzQGZ6kDCgBuZXR3b3JrX2lklA0AHgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:muddy_mangrove_roots", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0Om11ZGR5X21hbmdyb3ZlX3Jvb3RzBAkAbmFtZV9oYXNo9YApdHpo1RkDCgBuZXR3b3JrX2lkH0Oc4woGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:big_dripleaf", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpZ19kcmlwbGVhZgQJAG5hbWVfaGFzaGBEhXjo6qSdAwoAbmV0d29ya19pZMETsb8KBgBzdGF0ZXMBEQBiaWdfZHJpcGxlYWZfaGVhZAEIEQBiaWdfZHJpcGxlYWZfdGlsdAQAbm9uZQgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:small_dripleaf_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnNtYWxsX2RyaXBsZWFmX2Jsb2NrBAkAbmFtZV9oYXNojxRAgXP9uWADCgBuZXR3b3JrX2lkozbVPwoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24EAGVhc3QBDwB1cHBlcl9ibG9ja19iaXQBAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:spore_blossom", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwb3JlX2Jsb3Nzb20ECQBuYW1lX2hhc2il3U72Gbco2gMKAG5ldHdvcmtfaWSbbbgcCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:azalea", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmF6YWxlYQQJAG5hbWVfaGFzaNyUl+BW9JrBAwoAbmV0d29ya19pZO/XZtQKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:flowering_azalea", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmZsb3dlcmluZ19hemFsZWEECQBuYW1lX2hhc2ie9r33wz8kiwMKAG5ldHdvcmtfaWQ3ij0VCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:glow_lichen", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Omdsb3dfbGljaGVuBAkAbmFtZV9oYXNobyPUrIYlo44DCgBuZXR3b3JrX2lkCh8lSAoGAHN0YXRlcwMZAG11bHRpX2ZhY2VfZGlyZWN0aW9uX2JpdHM/AAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:amethyst_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFtZXRoeXN0X2Jsb2NrBAkAbmFtZV9oYXNob+JK1iiAthcDCgBuZXR3b3JrX2lk8HtpzgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:budding_amethyst", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJ1ZGRpbmdfYW1ldGh5c3QECQBuYW1lX2hhc2gJvAwfI14fxgMKAG5ldHdvcmtfaWTQYqfACgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:amethyst_cluster", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmFtZXRoeXN0X2NsdXN0ZXIECQBuYW1lX2hhc2jK82S88Jgm8wMKAG5ldHdvcmtfaWSCPMPGCgYAc3RhdGVzCBQAbWluZWNyYWZ0OmJsb2NrX2ZhY2UCAHVwAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:large_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmxhcmdlX2FtZXRoeXN0X2J1ZAQJAG5hbWVfaGFzaAHhdpWD+sd5AwoAbmV0d29ya19pZKkQxOcKBgBzdGF0ZXMIFABtaW5lY3JhZnQ6YmxvY2tfZmFjZQIAdXAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:medium_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1lZGl1bV9hbWV0aHlzdF9idWQECQBuYW1lX2hhc2g5lBGtC0DzZQMKAG5ldHdvcmtfaWSYiP4gCgYAc3RhdGVzCBQAbWluZWNyYWZ0OmJsb2NrX2ZhY2UCAHVwAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:small_amethyst_bud", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnNtYWxsX2FtZXRoeXN0X2J1ZAQJAG5hbWVfaGFzaEnb4+q9PO4YAwoAbmV0d29ya19pZGWzxrQKBgBzdGF0ZXMIFABtaW5lY3JhZnQ6YmxvY2tfZmFjZQIAdXAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:tuff", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnR1ZmYECQBuYW1lX2hhc2h1Rwc1XYsBGwMKAG5ldHdvcmtfaWRwQGn0CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:calcite", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNhbGNpdGUECQBuYW1lX2hhc2ixKLu8ZIdzDQMKAG5ldHdvcmtfaWQlSbJDCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:chicken" - }, - { - "id": "minecraft:porkchop" - }, - { - "id": "minecraft:beef" - }, - { - "id": "minecraft:mutton" - }, - { - "id": "minecraft:rabbit" - }, - { - "id": "minecraft:cod" - }, - { - "id": "minecraft:salmon" - }, - { - "id": "minecraft:tropical_fish" - }, - { - "id": "minecraft:pufferfish" - }, - { - "id": "minecraft:brown_mushroom", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmJyb3duX211c2hyb29tBAkAbmFtZV9oYXNonYw/FO78WDoDCgBuZXR3b3JrX2lkLh1OXAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_mushroom", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnJlZF9tdXNocm9vbQQJAG5hbWVfaGFzaPpzJua7669xAwoAbmV0d29ya19pZCvWPYkKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_fungus", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fZnVuZ3VzBAkAbmFtZV9oYXNolIcCUuFM2u0DCgBuZXR3b3JrX2lkD2NN0QoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_fungus", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9mdW5ndXMECQBuYW1lX2hhc2gq8bSnRVTAFgMKAG5ldHdvcmtfaWTkwS+rCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkdOMhDAoGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cw4AAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnJlZF9tdXNocm9vbV9ibG9jawQJAG5hbWVfaGFzaJTTyJbth9M9AwoAbmV0d29ya19pZM+AyboKBgBzdGF0ZXMDEgBodWdlX211c2hyb29tX2JpdHMOAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkbdt3CAoGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cw8AAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brown_mushroom_block", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJyb3duX211c2hyb29tX2Jsb2NrBAkAbmFtZV9oYXNoIyjnbI6xy9sDCgBuZXR3b3JrX2lkSrMl9goGAHN0YXRlcwMSAGh1Z2VfbXVzaHJvb21fYml0cwAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:egg" - }, - { - "id": "minecraft:sugar_cane" - }, - { - "id": "minecraft:sugar" - }, - { - "id": "minecraft:rotten_flesh" - }, - { - "id": "minecraft:bone" - }, - { - "id": "minecraft:web", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OndlYgQJAG5hbWVfaGFzaA4GKQCvG4i9AwoAbmV0d29ya19pZApt+jgKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:spider_eye" - }, - { - "id": "minecraft:mob_spawner", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vYl9zcGF3bmVyBAkAbmFtZV9oYXNoNwGrCV/Fkh8DCgBuZXR3b3JrX2lkM1wTmgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkqXH7RgoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUFAHN0b25lAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkeIBb6QoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGULAGNvYmJsZXN0b25lAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkDZ2cFQoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGULAHN0b25lX2JyaWNrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkOR/cTAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGURAG1vc3N5X3N0b25lX2JyaWNrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkqdwlHAoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUTAGNyYWNrZWRfc3RvbmVfYnJpY2sAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:monster_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0Om1vbnN0ZXJfZWdnBAkAbmFtZV9oYXNoFMxMALksxVEDCgBuZXR3b3JrX2lkFqqPggoGAHN0YXRlcwgWAG1vbnN0ZXJfZWdnX3N0b25lX3R5cGUUAGNoaXNlbGVkX3N0b25lX2JyaWNrAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:infested_deepslate", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmluZmVzdGVkX2RlZXBzbGF0ZQQJAG5hbWVfaGFzaICF2VYccxF1AwoAbmV0d29ya19pZDa/624KBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:dragon_egg", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmRyYWdvbl9lZ2cECQBuYW1lX2hhc2inMzXrV+/e1wMKAG5ldHdvcmtfaWTgO1yRCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:turtle_egg", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnR1cnRsZV9lZ2cECQBuYW1lX2hhc2iwSRcxOJIJ9gMKAG5ldHdvcmtfaWSIRNUhCgYAc3RhdGVzCA0AY3JhY2tlZF9zdGF0ZQkAbm9fY3JhY2tzCBAAdHVydGxlX2VnZ19jb3VudAcAb25lX2VnZwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sniffer_egg", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNuaWZmZXJfZWdnBAkAbmFtZV9oYXNoY1lozc8lPcYDCgBuZXR3b3JrX2lk7yb/2QoGAHN0YXRlcwgNAGNyYWNrZWRfc3RhdGUJAG5vX2NyYWNrcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:frog_spawn", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmZyb2dfc3Bhd24ECQBuYW1lX2hhc2iWmd7idp3ZZwMKAG5ldHdvcmtfaWRFzJudCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:pearlescent_froglight", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnBlYXJsZXNjZW50X2Zyb2dsaWdodAQJAG5hbWVfaGFzaKkcFRyycYGyAwoAbmV0d29ya19pZJqYakAKBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:verdant_froglight", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnZlcmRhbnRfZnJvZ2xpZ2h0BAkAbmFtZV9oYXNoA+eXuTBohrQDCgBuZXR3b3JrX2lkDIVnsQoGAHN0YXRlcwgLAHBpbGxhcl9heGlzAQB5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:ochre_froglight", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om9jaHJlX2Zyb2dsaWdodAQJAG5hbWVfaGFzaMY59kjPe+c3AwoAbmV0d29ya19pZO2TD50KBgBzdGF0ZXMICwBwaWxsYXJfYXhpcwEAeQADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:chicken_spawn_egg" - }, - { - "id": "minecraft:bee_spawn_egg" - }, - { - "id": "minecraft:cow_spawn_egg" - }, - { - "id": "minecraft:pig_spawn_egg" - }, - { - "id": "minecraft:sheep_spawn_egg" - }, - { - "id": "minecraft:wolf_spawn_egg" - }, - { - "id": "minecraft:polar_bear_spawn_egg" - }, - { - "id": "minecraft:ocelot_spawn_egg" - }, - { - "id": "minecraft:cat_spawn_egg" - }, - { - "id": "minecraft:mooshroom_spawn_egg" - }, - { - "id": "minecraft:bat_spawn_egg" - }, - { - "id": "minecraft:parrot_spawn_egg" - }, - { - "id": "minecraft:rabbit_spawn_egg" - }, - { - "id": "minecraft:llama_spawn_egg" - }, - { - "id": "minecraft:horse_spawn_egg" - }, - { - "id": "minecraft:donkey_spawn_egg" - }, - { - "id": "minecraft:mule_spawn_egg" - }, - { - "id": "minecraft:skeleton_horse_spawn_egg" - }, - { - "id": "minecraft:zombie_horse_spawn_egg" - }, - { - "id": "minecraft:tropical_fish_spawn_egg" - }, - { - "id": "minecraft:cod_spawn_egg" - }, - { - "id": "minecraft:pufferfish_spawn_egg" - }, - { - "id": "minecraft:salmon_spawn_egg" - }, - { - "id": "minecraft:dolphin_spawn_egg" - }, - { - "id": "minecraft:turtle_spawn_egg" - }, - { - "id": "minecraft:panda_spawn_egg" - }, - { - "id": "minecraft:fox_spawn_egg" - }, - { - "id": "minecraft:creeper_spawn_egg" - }, - { - "id": "minecraft:enderman_spawn_egg" - }, - { - "id": "minecraft:silverfish_spawn_egg" - }, - { - "id": "minecraft:skeleton_spawn_egg" - }, - { - "id": "minecraft:wither_skeleton_spawn_egg" - }, - { - "id": "minecraft:stray_spawn_egg" - }, - { - "id": "minecraft:slime_spawn_egg" - }, - { - "id": "minecraft:spider_spawn_egg" - }, - { - "id": "minecraft:zombie_spawn_egg" - }, - { - "id": "minecraft:zombie_pigman_spawn_egg" - }, - { - "id": "minecraft:husk_spawn_egg" - }, - { - "id": "minecraft:drowned_spawn_egg" - }, - { - "id": "minecraft:squid_spawn_egg" - }, - { - "id": "minecraft:glow_squid_spawn_egg" - }, - { - "id": "minecraft:cave_spider_spawn_egg" - }, - { - "id": "minecraft:witch_spawn_egg" - }, - { - "id": "minecraft:guardian_spawn_egg" - }, - { - "id": "minecraft:elder_guardian_spawn_egg" - }, - { - "id": "minecraft:endermite_spawn_egg" - }, - { - "id": "minecraft:magma_cube_spawn_egg" - }, - { - "id": "minecraft:strider_spawn_egg" - }, - { - "id": "minecraft:hoglin_spawn_egg" - }, - { - "id": "minecraft:piglin_spawn_egg" - }, - { - "id": "minecraft:zoglin_spawn_egg" - }, - { - "id": "minecraft:piglin_brute_spawn_egg" - }, - { - "id": "minecraft:goat_spawn_egg" - }, - { - "id": "minecraft:axolotl_spawn_egg" - }, - { - "id": "minecraft:warden_spawn_egg" - }, - { - "id": "minecraft:allay_spawn_egg" - }, - { - "id": "minecraft:frog_spawn_egg" - }, - { - "id": "minecraft:tadpole_spawn_egg" - }, - { - "id": "minecraft:trader_llama_spawn_egg" - }, - { - "id": "minecraft:camel_spawn_egg" - }, - { - "id": "minecraft:ghast_spawn_egg" - }, - { - "id": "minecraft:blaze_spawn_egg" - }, - { - "id": "minecraft:shulker_spawn_egg" - }, - { - "id": "minecraft:vindicator_spawn_egg" - }, - { - "id": "minecraft:evoker_spawn_egg" - }, - { - "id": "minecraft:vex_spawn_egg" - }, - { - "id": "minecraft:villager_spawn_egg" - }, - { - "id": "minecraft:wandering_trader_spawn_egg" - }, - { - "id": "minecraft:zombie_villager_spawn_egg" - }, - { - "id": "minecraft:phantom_spawn_egg" - }, - { - "id": "minecraft:pillager_spawn_egg" - }, - { - "id": "minecraft:ravager_spawn_egg" - }, - { - "id": "minecraft:iron_golem_spawn_egg" - }, - { - "id": "minecraft:snow_golem_spawn_egg" - }, - { - "id": "minecraft:sniffer_spawn_egg" - }, - { - "id": "minecraft:obsidian", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om9ic2lkaWFuBAkAbmFtZV9oYXNoiz4qrb8QjyEDCgBuZXR3b3JrX2lkuqnPpQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:crying_obsidian", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNyeWluZ19vYnNpZGlhbgQJAG5hbWVfaGFzaKT0JlA7Z1K+AwoAbmV0d29ya19pZCjbPV4KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bedrock", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmJlZHJvY2sECQBuYW1lX2hhc2hWfFrh4LVtxwMKAG5ldHdvcmtfaWT7fKz1CgYAc3RhdGVzAQ4AaW5maW5pYnVybl9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:soul_sand", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnNvdWxfc2FuZAQJAG5hbWVfaGFzaMaf+bccu+KTAwoAbmV0d29ya19pZBQSHrMKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:magma", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0Om1hZ21hBAkAbmFtZV9oYXNoqyTjKaIsWfYDCgBuZXR3b3JrX2lkyfWAZgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:nether_wart" - }, - { - "id": "minecraft:end_stone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmVuZF9zdG9uZQQJAG5hbWVfaGFzaH1J9jA39GJNAwoAbmV0d29ya19pZFeFQ7UKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:chorus_flower", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNob3J1c19mbG93ZXIECQBuYW1lX2hhc2iMpSodli5uawMKAG5ldHdvcmtfaWRnd1ZWCgYAc3RhdGVzAwMAYWdlAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:chorus_plant", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNob3J1c19wbGFudAQJAG5hbWVfaGFzaJhSrmNGKwaMAwoAbmV0d29ya19pZA3uVqMKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:chorus_fruit" - }, - { - "id": "minecraft:popped_chorus_fruit" - }, - { - "id": "minecraft:sponge", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNwb25nZQQJAG5hbWVfaGFzaLrd2ScYRDMiAwoAbmV0d29ya19pZF01rO0KBgBzdGF0ZXMICwBzcG9uZ2VfdHlwZQMAZHJ5AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:sponge", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNwb25nZQQJAG5hbWVfaGFzaLrd2ScYRDMiAwoAbmV0d29ya19pZPiOc4QKBgBzdGF0ZXMICwBzcG9uZ2VfdHlwZQMAd2V0AAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkGnlaAwoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAQgAZGVhZF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkSnHuagoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAQgAZGVhZF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkmkHyegoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUBCABkZWFkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkdpUDxgoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQBCABkZWFkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkYNWvYgoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cBCABkZWFkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkZSxBQgoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABibHVlAQgAZGVhZF9iaXQBAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lklSTVqQoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBABwaW5rAQgAZGVhZF9iaXQBAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lk5fTYuQoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgBwdXJwbGUBCABkZWFkX2JpdAEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkwUjqBAoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yAwByZWQBCABkZWFkX2JpdAEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:coral_block", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcmFsX2Jsb2NrBAkAbmFtZV9oYXNoxTOVIjqYOYIDCgBuZXR3b3JrX2lkq4iWoQoGAHN0YXRlcwgLAGNvcmFsX2NvbG9yBgB5ZWxsb3cBCABkZWFkX2JpdAEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sculk", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnNjdWxrBAkAbmFtZV9oYXNo2Lq7T5yQF8kDCgBuZXR3b3JrX2lkyqUPPgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sculk_vein", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNjdWxrX3ZlaW4ECQBuYW1lX2hhc2gJUdhVooV4zwMKAG5ldHdvcmtfaWSUfn1XCgYAc3RhdGVzAxkAbXVsdGlfZmFjZV9kaXJlY3Rpb25fYml0cwAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:sculk_catalyst", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNjdWxrX2NhdGFseXN0BAkAbmFtZV9oYXNo+gCpbrCHST4DCgBuZXR3b3JrX2lkMJ2n/woGAHN0YXRlcwEFAGJsb29tAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sculk_shrieker", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNjdWxrX3Nocmlla2VyBAkAbmFtZV9oYXNo5OXtyObniQ4DCgBuZXR3b3JrX2lkxapoNAoGAHN0YXRlcwEGAGFjdGl2ZQABCgBjYW5fc3VtbW9uAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sculk_sensor", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNjdWxrX3NlbnNvcgQJAG5hbWVfaGFzaCkmHreeTgNnAwoAbmV0d29ya19pZLj2WPcKBgBzdGF0ZXMDEgBzY3Vsa19zZW5zb3JfcGhhc2UAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:calibrated_sculk_sensor", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmNhbGlicmF0ZWRfc2N1bGtfc2Vuc29yBAkAbmFtZV9oYXNoffAcXXN/iJUDCgBuZXR3b3JrX2lkwOx3QQoGAHN0YXRlcwgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAxIAc2N1bGtfc2Vuc29yX3BoYXNlAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:reinforced_deepslate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnJlaW5mb3JjZWRfZGVlcHNsYXRlBAkAbmFtZV9oYXNoldDmj91EapQDCgBuZXR3b3JrX2lkHIt+aQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:leather_helmet" - }, - { - "id": "minecraft:chainmail_helmet" - }, - { - "id": "minecraft:iron_helmet" - }, - { - "id": "minecraft:golden_helmet" - }, - { - "id": "minecraft:diamond_helmet" - }, - { - "id": "minecraft:netherite_helmet" - }, - { - "id": "minecraft:leather_chestplate" - }, - { - "id": "minecraft:chainmail_chestplate" - }, - { - "id": "minecraft:iron_chestplate" - }, - { - "id": "minecraft:golden_chestplate" - }, - { - "id": "minecraft:diamond_chestplate" - }, - { - "id": "minecraft:netherite_chestplate" - }, - { - "id": "minecraft:leather_leggings" - }, - { - "id": "minecraft:chainmail_leggings" - }, - { - "id": "minecraft:iron_leggings" - }, - { - "id": "minecraft:golden_leggings" - }, - { - "id": "minecraft:diamond_leggings" - }, - { - "id": "minecraft:netherite_leggings" - }, - { - "id": "minecraft:leather_boots" - }, - { - "id": "minecraft:chainmail_boots" - }, - { - "id": "minecraft:iron_boots" - }, - { - "id": "minecraft:golden_boots" - }, - { - "id": "minecraft:diamond_boots" - }, - { - "id": "minecraft:netherite_boots" - }, - { - "id": "minecraft:wooden_sword" - }, - { - "id": "minecraft:stone_sword" - }, - { - "id": "minecraft:iron_sword" - }, - { - "id": "minecraft:golden_sword" - }, - { - "id": "minecraft:diamond_sword" - }, - { - "id": "minecraft:netherite_sword" - }, - { - "id": "minecraft:wooden_axe" - }, - { - "id": "minecraft:stone_axe" - }, - { - "id": "minecraft:iron_axe" - }, - { - "id": "minecraft:golden_axe" - }, - { - "id": "minecraft:diamond_axe" - }, - { - "id": "minecraft:netherite_axe" - }, - { - "id": "minecraft:wooden_pickaxe" - }, - { - "id": "minecraft:stone_pickaxe" - }, - { - "id": "minecraft:iron_pickaxe" - }, - { - "id": "minecraft:golden_pickaxe" - }, - { - "id": "minecraft:diamond_pickaxe" - }, - { - "id": "minecraft:netherite_pickaxe" - }, - { - "id": "minecraft:wooden_shovel" - }, - { - "id": "minecraft:stone_shovel" - }, - { - "id": "minecraft:iron_shovel" - }, - { - "id": "minecraft:golden_shovel" - }, - { - "id": "minecraft:diamond_shovel" - }, - { - "id": "minecraft:netherite_shovel" - }, - { - "id": "minecraft:wooden_hoe" - }, - { - "id": "minecraft:stone_hoe" - }, - { - "id": "minecraft:iron_hoe" - }, - { - "id": "minecraft:golden_hoe" - }, - { - "id": "minecraft:diamond_hoe" - }, - { - "id": "minecraft:netherite_hoe" - }, - { - "id": "minecraft:bow" - }, - { - "id": "minecraft:crossbow" - }, - { - "id": "minecraft:arrow" - }, - { - "id": "minecraft:arrow", - "damage": 6 - }, - { - "id": "minecraft:arrow", - "damage": 7 - }, - { - "id": "minecraft:arrow", - "damage": 8 - }, - { - "id": "minecraft:arrow", - "damage": 9 - }, - { - "id": "minecraft:arrow", - "damage": 10 - }, - { - "id": "minecraft:arrow", - "damage": 11 - }, - { - "id": "minecraft:arrow", - "damage": 12 - }, - { - "id": "minecraft:arrow", - "damage": 13 - }, - { - "id": "minecraft:arrow", - "damage": 14 - }, - { - "id": "minecraft:arrow", - "damage": 15 - }, - { - "id": "minecraft:arrow", - "damage": 16 - }, - { - "id": "minecraft:arrow", - "damage": 17 - }, - { - "id": "minecraft:arrow", - "damage": 18 - }, - { - "id": "minecraft:arrow", - "damage": 19 - }, - { - "id": "minecraft:arrow", - "damage": 20 - }, - { - "id": "minecraft:arrow", - "damage": 21 - }, - { - "id": "minecraft:arrow", - "damage": 22 - }, - { - "id": "minecraft:arrow", - "damage": 23 - }, - { - "id": "minecraft:arrow", - "damage": 24 - }, - { - "id": "minecraft:arrow", - "damage": 25 - }, - { - "id": "minecraft:arrow", - "damage": 26 - }, - { - "id": "minecraft:arrow", - "damage": 27 - }, - { - "id": "minecraft:arrow", - "damage": 28 - }, - { - "id": "minecraft:arrow", - "damage": 29 - }, - { - "id": "minecraft:arrow", - "damage": 30 - }, - { - "id": "minecraft:arrow", - "damage": 31 - }, - { - "id": "minecraft:arrow", - "damage": 32 - }, - { - "id": "minecraft:arrow", - "damage": 33 - }, - { - "id": "minecraft:arrow", - "damage": 34 - }, - { - "id": "minecraft:arrow", - "damage": 35 - }, - { - "id": "minecraft:arrow", - "damage": 36 - }, - { - "id": "minecraft:arrow", - "damage": 37 - }, - { - "id": "minecraft:arrow", - "damage": 38 - }, - { - "id": "minecraft:arrow", - "damage": 39 - }, - { - "id": "minecraft:arrow", - "damage": 40 - }, - { - "id": "minecraft:arrow", - "damage": 41 - }, - { - "id": "minecraft:arrow", - "damage": 42 - }, - { - "id": "minecraft:arrow", - "damage": 43 - }, - { - "id": "minecraft:shield" - }, - { - "id": "minecraft:cooked_chicken" - }, - { - "id": "minecraft:cooked_porkchop" - }, - { - "id": "minecraft:cooked_beef" - }, - { - "id": "minecraft:cooked_mutton" - }, - { - "id": "minecraft:cooked_rabbit" - }, - { - "id": "minecraft:cooked_cod" - }, - { - "id": "minecraft:cooked_salmon" - }, - { - "id": "minecraft:bread" - }, - { - "id": "minecraft:mushroom_stew" - }, - { - "id": "minecraft:beetroot_soup" - }, - { - "id": "minecraft:rabbit_stew" - }, - { - "id": "minecraft:baked_potato" - }, - { - "id": "minecraft:cookie" - }, - { - "id": "minecraft:pumpkin_pie" - }, - { - "id": "minecraft:cake" - }, - { - "id": "minecraft:dried_kelp" - }, - { - "id": "minecraft:fishing_rod" - }, - { - "id": "minecraft:carrot_on_a_stick" - }, - { - "id": "minecraft:warped_fungus_on_a_stick" - }, - { - "id": "minecraft:snowball" - }, - { - "id": "minecraft:shears" - }, - { - "id": "minecraft:flint_and_steel" - }, - { - "id": "minecraft:lead" - }, - { - "id": "minecraft:clock" - }, - { - "id": "minecraft:compass" - }, - { - "id": "minecraft:recovery_compass" - }, - { - "id": "minecraft:goat_horn" - }, - { - "id": "minecraft:goat_horn", - "damage": 1 - }, - { - "id": "minecraft:goat_horn", - "damage": 2 - }, - { - "id": "minecraft:goat_horn", - "damage": 3 - }, - { - "id": "minecraft:goat_horn", - "damage": 4 - }, - { - "id": "minecraft:goat_horn", - "damage": 5 - }, - { - "id": "minecraft:goat_horn", - "damage": 6 - }, - { - "id": "minecraft:goat_horn", - "damage": 7 - }, - { - "id": "minecraft:empty_map" - }, - { - "id": "minecraft:empty_map", - "damage": 2 - }, - { - "id": "minecraft:saddle" - }, - { - "id": "minecraft:leather_horse_armor" - }, - { - "id": "minecraft:iron_horse_armor" - }, - { - "id": "minecraft:golden_horse_armor" - }, - { - "id": "minecraft:diamond_horse_armor" - }, - { - "id": "minecraft:trident" - }, - { - "id": "minecraft:turtle_helmet" - }, - { - "id": "minecraft:elytra" - }, - { - "id": "minecraft:totem_of_undying" - }, - { - "id": "minecraft:glass_bottle" - }, - { - "id": "minecraft:experience_bottle" - }, - { - "id": "minecraft:potion" - }, - { - "id": "minecraft:potion", - "damage": 1 - }, - { - "id": "minecraft:potion", - "damage": 2 - }, - { - "id": "minecraft:potion", - "damage": 3 - }, - { - "id": "minecraft:potion", - "damage": 4 - }, - { - "id": "minecraft:potion", - "damage": 5 - }, - { - "id": "minecraft:potion", - "damage": 6 - }, - { - "id": "minecraft:potion", - "damage": 7 - }, - { - "id": "minecraft:potion", - "damage": 8 - }, - { - "id": "minecraft:potion", - "damage": 9 - }, - { - "id": "minecraft:potion", - "damage": 10 - }, - { - "id": "minecraft:potion", - "damage": 11 - }, - { - "id": "minecraft:potion", - "damage": 12 - }, - { - "id": "minecraft:potion", - "damage": 13 - }, - { - "id": "minecraft:potion", - "damage": 14 - }, - { - "id": "minecraft:potion", - "damage": 15 - }, - { - "id": "minecraft:potion", - "damage": 16 - }, - { - "id": "minecraft:potion", - "damage": 17 - }, - { - "id": "minecraft:potion", - "damage": 18 - }, - { - "id": "minecraft:potion", - "damage": 19 - }, - { - "id": "minecraft:potion", - "damage": 20 - }, - { - "id": "minecraft:potion", - "damage": 21 - }, - { - "id": "minecraft:potion", - "damage": 22 - }, - { - "id": "minecraft:potion", - "damage": 23 - }, - { - "id": "minecraft:potion", - "damage": 24 - }, - { - "id": "minecraft:potion", - "damage": 25 - }, - { - "id": "minecraft:potion", - "damage": 26 - }, - { - "id": "minecraft:potion", - "damage": 27 - }, - { - "id": "minecraft:potion", - "damage": 28 - }, - { - "id": "minecraft:potion", - "damage": 29 - }, - { - "id": "minecraft:potion", - "damage": 30 - }, - { - "id": "minecraft:potion", - "damage": 31 - }, - { - "id": "minecraft:potion", - "damage": 32 - }, - { - "id": "minecraft:potion", - "damage": 33 - }, - { - "id": "minecraft:potion", - "damage": 34 - }, - { - "id": "minecraft:potion", - "damage": 35 - }, - { - "id": "minecraft:potion", - "damage": 36 - }, - { - "id": "minecraft:potion", - "damage": 37 - }, - { - "id": "minecraft:potion", - "damage": 38 - }, - { - "id": "minecraft:potion", - "damage": 39 - }, - { - "id": "minecraft:potion", - "damage": 40 - }, - { - "id": "minecraft:potion", - "damage": 41 - }, - { - "id": "minecraft:potion", - "damage": 42 - }, - { - "id": "minecraft:splash_potion" - }, - { - "id": "minecraft:splash_potion", - "damage": 1 - }, - { - "id": "minecraft:splash_potion", - "damage": 2 - }, - { - "id": "minecraft:splash_potion", - "damage": 3 - }, - { - "id": "minecraft:splash_potion", - "damage": 4 - }, - { - "id": "minecraft:splash_potion", - "damage": 5 - }, - { - "id": "minecraft:splash_potion", - "damage": 6 - }, - { - "id": "minecraft:splash_potion", - "damage": 7 - }, - { - "id": "minecraft:splash_potion", - "damage": 8 - }, - { - "id": "minecraft:splash_potion", - "damage": 9 - }, - { - "id": "minecraft:splash_potion", - "damage": 10 - }, - { - "id": "minecraft:splash_potion", - "damage": 11 - }, - { - "id": "minecraft:splash_potion", - "damage": 12 - }, - { - "id": "minecraft:splash_potion", - "damage": 13 - }, - { - "id": "minecraft:splash_potion", - "damage": 14 - }, - { - "id": "minecraft:splash_potion", - "damage": 15 - }, - { - "id": "minecraft:splash_potion", - "damage": 16 - }, - { - "id": "minecraft:splash_potion", - "damage": 17 - }, - { - "id": "minecraft:splash_potion", - "damage": 18 - }, - { - "id": "minecraft:splash_potion", - "damage": 19 - }, - { - "id": "minecraft:splash_potion", - "damage": 20 - }, - { - "id": "minecraft:splash_potion", - "damage": 21 - }, - { - "id": "minecraft:splash_potion", - "damage": 22 - }, - { - "id": "minecraft:splash_potion", - "damage": 23 - }, - { - "id": "minecraft:splash_potion", - "damage": 24 - }, - { - "id": "minecraft:splash_potion", - "damage": 25 - }, - { - "id": "minecraft:splash_potion", - "damage": 26 - }, - { - "id": "minecraft:splash_potion", - "damage": 27 - }, - { - "id": "minecraft:splash_potion", - "damage": 28 - }, - { - "id": "minecraft:splash_potion", - "damage": 29 - }, - { - "id": "minecraft:splash_potion", - "damage": 30 - }, - { - "id": "minecraft:splash_potion", - "damage": 31 - }, - { - "id": "minecraft:splash_potion", - "damage": 32 - }, - { - "id": "minecraft:splash_potion", - "damage": 33 - }, - { - "id": "minecraft:splash_potion", - "damage": 34 - }, - { - "id": "minecraft:splash_potion", - "damage": 35 - }, - { - "id": "minecraft:splash_potion", - "damage": 36 - }, - { - "id": "minecraft:splash_potion", - "damage": 37 - }, - { - "id": "minecraft:splash_potion", - "damage": 38 - }, - { - "id": "minecraft:splash_potion", - "damage": 39 - }, - { - "id": "minecraft:splash_potion", - "damage": 40 - }, - { - "id": "minecraft:splash_potion", - "damage": 41 - }, - { - "id": "minecraft:splash_potion", - "damage": 42 - }, - { - "id": "minecraft:lingering_potion" - }, - { - "id": "minecraft:lingering_potion", - "damage": 1 - }, - { - "id": "minecraft:lingering_potion", - "damage": 2 - }, - { - "id": "minecraft:lingering_potion", - "damage": 3 - }, - { - "id": "minecraft:lingering_potion", - "damage": 4 - }, - { - "id": "minecraft:lingering_potion", - "damage": 5 - }, - { - "id": "minecraft:lingering_potion", - "damage": 6 - }, - { - "id": "minecraft:lingering_potion", - "damage": 7 - }, - { - "id": "minecraft:lingering_potion", - "damage": 8 - }, - { - "id": "minecraft:lingering_potion", - "damage": 9 - }, - { - "id": "minecraft:lingering_potion", - "damage": 10 - }, - { - "id": "minecraft:lingering_potion", - "damage": 11 - }, - { - "id": "minecraft:lingering_potion", - "damage": 12 - }, - { - "id": "minecraft:lingering_potion", - "damage": 13 - }, - { - "id": "minecraft:lingering_potion", - "damage": 14 - }, - { - "id": "minecraft:lingering_potion", - "damage": 15 - }, - { - "id": "minecraft:lingering_potion", - "damage": 16 - }, - { - "id": "minecraft:lingering_potion", - "damage": 17 - }, - { - "id": "minecraft:lingering_potion", - "damage": 18 - }, - { - "id": "minecraft:lingering_potion", - "damage": 19 - }, - { - "id": "minecraft:lingering_potion", - "damage": 20 - }, - { - "id": "minecraft:lingering_potion", - "damage": 21 - }, - { - "id": "minecraft:lingering_potion", - "damage": 22 - }, - { - "id": "minecraft:lingering_potion", - "damage": 23 - }, - { - "id": "minecraft:lingering_potion", - "damage": 24 - }, - { - "id": "minecraft:lingering_potion", - "damage": 25 - }, - { - "id": "minecraft:lingering_potion", - "damage": 26 - }, - { - "id": "minecraft:lingering_potion", - "damage": 27 - }, - { - "id": "minecraft:lingering_potion", - "damage": 28 - }, - { - "id": "minecraft:lingering_potion", - "damage": 29 - }, - { - "id": "minecraft:lingering_potion", - "damage": 30 - }, - { - "id": "minecraft:lingering_potion", - "damage": 31 - }, - { - "id": "minecraft:lingering_potion", - "damage": 32 - }, - { - "id": "minecraft:lingering_potion", - "damage": 33 - }, - { - "id": "minecraft:lingering_potion", - "damage": 34 - }, - { - "id": "minecraft:lingering_potion", - "damage": 35 - }, - { - "id": "minecraft:lingering_potion", - "damage": 36 - }, - { - "id": "minecraft:lingering_potion", - "damage": 37 - }, - { - "id": "minecraft:lingering_potion", - "damage": 38 - }, - { - "id": "minecraft:lingering_potion", - "damage": 39 - }, - { - "id": "minecraft:lingering_potion", - "damage": 40 - }, - { - "id": "minecraft:lingering_potion", - "damage": 41 - }, - { - "id": "minecraft:lingering_potion", - "damage": 42 - }, - { - "id": "minecraft:spyglass" - }, - { - "id": "minecraft:brush" - }, - { - "id": "minecraft:stick" - }, - { - "id": "minecraft:bed" - }, - { - "id": "minecraft:bed", - "damage": 8 - }, - { - "id": "minecraft:bed", - "damage": 7 - }, - { - "id": "minecraft:bed", - "damage": 15 - }, - { - "id": "minecraft:bed", - "damage": 12 - }, - { - "id": "minecraft:bed", - "damage": 14 - }, - { - "id": "minecraft:bed", - "damage": 1 - }, - { - "id": "minecraft:bed", - "damage": 4 - }, - { - "id": "minecraft:bed", - "damage": 5 - }, - { - "id": "minecraft:bed", - "damage": 13 - }, - { - "id": "minecraft:bed", - "damage": 9 - }, - { - "id": "minecraft:bed", - "damage": 3 - }, - { - "id": "minecraft:bed", - "damage": 11 - }, - { - "id": "minecraft:bed", - "damage": 10 - }, - { - "id": "minecraft:bed", - "damage": 2 - }, - { - "id": "minecraft:bed", - "damage": 6 - }, - { - "id": "minecraft:torch", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OnRvcmNoBAkAbmFtZV9oYXNoagn7rmDBzisDCgBuZXR3b3JrX2lk+BwwuQoGAHN0YXRlcwgWAHRvcmNoX2ZhY2luZ19kaXJlY3Rpb24HAHVua25vd24AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:soul_torch", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNvdWxfdG9yY2gECQBuYW1lX2hhc2huixOT04BRdQMKAG5ldHdvcmtfaWShbFILCgYAc3RhdGVzCBYAdG9yY2hfZmFjaW5nX2RpcmVjdGlvbgcAdW5rbm93bgADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sea_pickle", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnNlYV9waWNrbGUECQBuYW1lX2hhc2iONEfZJB+glgMKAG5ldHdvcmtfaWSINWQyCgYAc3RhdGVzAw0AY2x1c3Rlcl9jb3VudAAAAAABCABkZWFkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lantern", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxhbnRlcm4ECQBuYW1lX2hhc2hMw44VI2HWygMKAG5ldHdvcmtfaWRkjQvzCgYAc3RhdGVzAQcAaGFuZ2luZwAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:soul_lantern", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnNvdWxfbGFudGVybgQJAG5hbWVfaGFzaGjIpjxk9z+RAwoAbmV0d29ya19pZGfoP8cKBgBzdGF0ZXMBBwBoYW5naW5nAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:candle", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmNhbmRsZQQJAG5hbWVfaGFzaHPd+MsNdWTfAwoAbmV0d29ya19pZHsBMA0KBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:white_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndoaXRlX2NhbmRsZQQJAG5hbWVfaGFzaN1EG5Q1mHiEAwoAbmV0d29ya19pZKN1mmgKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:orange_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Om9yYW5nZV9jYW5kbGUECQBuYW1lX2hhc2jySEVWHgUIHQMKAG5ldHdvcmtfaWSfVz82CgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:magenta_candle", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0Om1hZ2VudGFfY2FuZGxlBAkAbmFtZV9oYXNoG0u6YIOoBSEDCgBuZXR3b3JrX2lk9xGNkQoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_blue_candle", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FuZGxlBAkAbmFtZV9oYXNocXGeK0zgrG0DCgBuZXR3b3JrX2lk2m1y8goGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:yellow_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnllbGxvd19jYW5kbGUECQBuYW1lX2hhc2i00dtusU3CqQMKAG5ldHdvcmtfaWR9LTmpCgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:lime_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmxpbWVfY2FuZGxlBAkAbmFtZV9oYXNokcmrw5xvz7ADCgBuZXR3b3JrX2lkIAUu6QoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:pink_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnBpbmtfY2FuZGxlBAkAbmFtZV9oYXNoQJdEY4sZ0dwDCgBuZXR3b3JrX2lk23Rn5AoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:gray_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdyYXlfY2FuZGxlBAkAbmFtZV9oYXNoS5poSo9wBDEDCgBuZXR3b3JrX2lk3trRCAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_gray_candle", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FuZGxlBAkAbmFtZV9oYXNo9ruTZLBNMasDCgBuZXR3b3JrX2lkb6DOegoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cyan_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmN5YW5fY2FuZGxlBAkAbmFtZV9oYXNoc/M8PNVcjOwDCgBuZXR3b3JrX2lkZoIQOQoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:purple_candle", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnB1cnBsZV9jYW5kbGUECQBuYW1lX2hhc2jaI3xUW0/myQMKAG5ldHdvcmtfaWSnLI2BCgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blue_candle", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmJsdWVfY2FuZGxlBAkAbmFtZV9oYXNoAASSPW6TgQADCgBuZXR3b3JrX2lkrxrjQAoGAHN0YXRlcwMHAGNhbmRsZXMAAAAAAQMAbGl0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:brown_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJyb3duX2NhbmRsZQQJAG5hbWVfaGFzaDia0l6s1+WYAwoAbmV0d29ya19pZKSkBXYKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:green_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmdyZWVuX2NhbmRsZQQJAG5hbWVfaGFzaLeFPO1l+fIoAwoAbmV0d29ya19pZBkznDsKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:red_candle", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OnJlZF9jYW5kbGUECQBuYW1lX2hhc2jjAQpGf59ZdwMKAG5ldHdvcmtfaWRbb88GCgYAc3RhdGVzAwcAY2FuZGxlcwAAAAABAwBsaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:black_candle", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJsYWNrX2NhbmRsZQQJAG5hbWVfaGFzaB+wRDpOqREKAwoAbmV0d29ya19pZNnOnuEKBgBzdGF0ZXMDBwBjYW5kbGVzAAAAAAEDAGxpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crafting_table", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyYWZ0aW5nX3RhYmxlBAkAbmFtZV9oYXNoe76VAmjvbpYDCgBuZXR3b3JrX2lkwCxwaAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cartography_table", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmNhcnRvZ3JhcGh5X3RhYmxlBAkAbmFtZV9oYXNomaWiiD/znP8DCgBuZXR3b3JrX2lkI6FzMwoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:fletching_table", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmZsZXRjaGluZ190YWJsZQQJAG5hbWVfaGFzaPFibh8unKyUAwoAbmV0d29ya19pZJ2mW0oKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:smithing_table", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnNtaXRoaW5nX3RhYmxlBAkAbmFtZV9oYXNo4tFES2xOXEYDCgBuZXR3b3JrX2lkXWMBzQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:beehive", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmJlZWhpdmUECQBuYW1lX2hhc2hCcqn12UbNpwMKAG5ldHdvcmtfaWR/idcaCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAMLAGhvbmV5X2xldmVsAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:suspicious_sand", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnN1c3BpY2lvdXNfc2FuZAQJAG5hbWVfaGFzaL67QsuvLP00AwoAbmV0d29ya19pZKnkaIAKBgBzdGF0ZXMDEABicnVzaGVkX3Byb2dyZXNzAAAAAAEHAGhhbmdpbmcBAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:suspicious_gravel", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN1c3BpY2lvdXNfZ3JhdmVsBAkAbmFtZV9oYXNoJSVbGNk7C3oDCgBuZXR3b3JrX2lkvIEJAAoGAHN0YXRlcwMQAGJydXNoZWRfcHJvZ3Jlc3MAAAAAAQcAaGFuZ2luZwEAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:campfire" - }, - { - "id": "minecraft:soul_campfire" - }, - { - "id": "minecraft:furnace", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmZ1cm5hY2UECQBuYW1lX2hhc2ioOQrludYY8wMKAG5ldHdvcmtfaWRZxnDOCgYAc3RhdGVzCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:blast_furnace", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJsYXN0X2Z1cm5hY2UECQBuYW1lX2hhc2ivDbnjkpGm5QMKAG5ldHdvcmtfaWTcEbV/CgYAc3RhdGVzCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:smoker", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnNtb2tlcgQJAG5hbWVfaGFzaJd1rDMkRWomAwoAbmV0d29ya19pZGWswMwKBgBzdGF0ZXMIHABtaW5lY3JhZnQ6Y2FyZGluYWxfZGlyZWN0aW9uBQBzb3V0aAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:respawn_anchor", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlc3Bhd25fYW5jaG9yBAkAbmFtZV9oYXNoZOdcjW05qigDCgBuZXR3b3JrX2lkmhMcaQoGAHN0YXRlcwMVAHJlc3Bhd25fYW5jaG9yX2NoYXJnZQAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:brewing_stand" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lk8Z3VowoGAHN0YXRlcwgGAGRhbWFnZQkAdW5kYW1hZ2VkCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lkpiv8BAoGAHN0YXRlcwgGAGRhbWFnZRAAc2xpZ2h0bHlfZGFtYWdlZAgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:anvil", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmFudmlsBAkAbmFtZV9oYXNoNqB3fgcUCbwDCgBuZXR3b3JrX2lkFu+pdwoGAHN0YXRlcwgGAGRhbWFnZQwAdmVyeV9kYW1hZ2VkCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:grindstone", - "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmdyaW5kc3RvbmUECQBuYW1lX2hhc2id56zc0nk99wMKAG5ldHdvcmtfaWS4Es07CgYAc3RhdGVzCAoAYXR0YWNobWVudAgAc3RhbmRpbmcDCQBkaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:enchanting_table", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuY2hhbnRpbmdfdGFibGUECQBuYW1lX2hhc2jgIx24VLvMvwMKAG5ldHdvcmtfaWRliFFJCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bookshelf", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmJvb2tzaGVsZgQJAG5hbWVfaGFzaDU04DrgJCS9AwoAbmV0d29ya19pZBcWwIwKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:chiseled_bookshelf", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OmNoaXNlbGVkX2Jvb2tzaGVsZgQJAG5hbWVfaGFzaNXDBnsIsywYAwoAbmV0d29ya19pZIprt5IKBgBzdGF0ZXMDDABib29rc19zdG9yZWQAAAAAAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lectern", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmxlY3Rlcm4ECQBuYW1lX2hhc2j5Z4Mmi/1QxAMKAG5ldHdvcmtfaWR4JfDHCgYAc3RhdGVzCBwAbWluZWNyYWZ0OmNhcmRpbmFsX2RpcmVjdGlvbgUAc291dGgBCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cauldron" - }, - { - "id": "minecraft:composter", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmNvbXBvc3RlcgQJAG5hbWVfaGFzaPAADHptzeWJAwoAbmV0d29ya19pZHIL6i4KBgBzdGF0ZXMDFABjb21wb3N0ZXJfZmlsbF9sZXZlbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:chest", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmNoZXN0BAkAbmFtZV9oYXNog9ozMxlcA88DCgBuZXR3b3JrX2lkcrctxAoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:trapped_chest", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnRyYXBwZWRfY2hlc3QECQBuYW1lX2hhc2g2qpF9stsEjgMKAG5ldHdvcmtfaWSdRfncCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:ender_chest", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmVuZGVyX2NoZXN0BAkAbmFtZV9oYXNohEZzOFdg0WUDCgBuZXR3b3JrX2lkOc75awoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:barrel", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJhcnJlbAQJAG5hbWVfaGFzaHDkRPGymiRqAwoAbmV0d29ya19pZPnxzgsKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:undyed_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnVuZHllZF9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaOC9mypm/MlBAwoAbmV0d29ya19pZJ8rxp0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:white_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndoaXRlX3NodWxrZXJfYm94BAkAbmFtZV9oYXNosK79m1rPUBwDCgBuZXR3b3JrX2lkjrET6goGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:light_gray_shulker_box", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpZ2h0X2dyYXlfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2iBe5zq7PxHmgMKAG5ldHdvcmtfaWSCVJv0CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:gray_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmdyYXlfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2ga2s8ctjHUhgMKAG5ldHdvcmtfaWS3WMsWCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:black_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJsYWNrX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoPm03OZphrp8DCgBuZXR3b3JrX2lkXHztNAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:brown_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmJyb3duX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoT3DD6qAL9cADCgBuZXR3b3JrX2lkaXxpYQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:red_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnJlZF9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaMIlKSCzqSZoAwoAbmV0d29ya19pZNrf+icKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:orange_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0Om9yYW5nZV9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaG2MAXU67wGrAwoAbmV0d29ya19pZGoO05gKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:yellow_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnllbGxvd19zaHVsa2VyX2JveAQJAG5hbWVfaGFzaIsLwQHYjcIEAwoAbmV0d29ya19pZBCBSiYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lime_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmxpbWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2hUwBkg+faUGAMKAG5ldHdvcmtfaWRJeKqqCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:green_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmdyZWVuX3NodWxrZXJfYm94BAkAbmFtZV9oYXNoZgUeT3LupLUDCgBuZXR3b3JrX2lkzJiohQoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:cyan_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmN5YW5fc2h1bGtlcl9ib3gECQBuYW1lX2hhc2gSfbjteXg5yAMKAG5ldHdvcmtfaWTHeliECgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:light_blue_shulker_box", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmxpZ2h0X2JsdWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2h0VFCX0qsRxQMKAG5ldHdvcmtfaWQXD8U0CgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:blue_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmJsdWVfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2hn9gS0XIe6rAMKAG5ldHdvcmtfaWTO4PJaCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:purple_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnB1cnBsZV9zaHVsa2VyX2JveAQJAG5hbWVfaGFzaEV/lkNPxRDdAwoAbmV0d29ya19pZFK25GAKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:magenta_shulker_box", - "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0Om1hZ2VudGFfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2iqWM7IJHxcFgMKAG5ldHdvcmtfaWTyyudTCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:pink_shulker_box", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OnBpbmtfc2h1bGtlcl9ib3gECQBuYW1lX2hhc2in1tkJ1GNcZgMKAG5ldHdvcmtfaWQOEGXjCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:armor_stand" - }, - { - "id": "minecraft:noteblock", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Om5vdGVibG9jawQJAG5hbWVfaGFzaHPA8dBBH0UaAwoAbmV0d29ya19pZH1U5QkKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:jukebox", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0Omp1a2Vib3gECQBuYW1lX2hhc2ieAIPExf/ZfgMKAG5ldHdvcmtfaWSmR7JfCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:music_disc_13" - }, - { - "id": "minecraft:music_disc_cat" - }, - { - "id": "minecraft:music_disc_blocks" - }, - { - "id": "minecraft:music_disc_chirp" - }, - { - "id": "minecraft:music_disc_far" - }, - { - "id": "minecraft:music_disc_mall" - }, - { - "id": "minecraft:music_disc_mellohi" - }, - { - "id": "minecraft:music_disc_stal" - }, - { - "id": "minecraft:music_disc_strad" - }, - { - "id": "minecraft:music_disc_ward" - }, - { - "id": "minecraft:music_disc_11" - }, - { - "id": "minecraft:music_disc_wait" - }, - { - "id": "minecraft:music_disc_otherside" - }, - { - "id": "minecraft:music_disc_5" - }, - { - "id": "minecraft:music_disc_pigstep" - }, - { - "id": "minecraft:music_disc_relic" - }, - { - "id": "minecraft:disc_fragment_5" - }, - { - "id": "minecraft:glowstone_dust" - }, - { - "id": "minecraft:glowstone", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0Omdsb3dzdG9uZQQJAG5hbWVfaGFzaFYqXNkefIlPAwoAbmV0d29ya19pZGT7WYYKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:redstone_lamp", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnJlZHN0b25lX2xhbXAECQBuYW1lX2hhc2hJ9V80caPvEgMKAG5ldHdvcmtfaWRvNPwnCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:sea_lantern", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnNlYV9sYW50ZXJuBAkAbmFtZV9oYXNoLPsv1TX9M+QDCgBuZXR3b3JrX2lk1PPVyAoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:oak_sign" - }, - { - "id": "minecraft:spruce_sign" - }, - { - "id": "minecraft:birch_sign" - }, - { - "id": "minecraft:jungle_sign" - }, - { - "id": "minecraft:acacia_sign" - }, - { - "id": "minecraft:dark_oak_sign" - }, - { - "id": "minecraft:mangrove_sign" - }, - { - "id": "minecraft:cherry_sign" - }, - { - "id": "minecraft:bamboo_sign" - }, - { - "id": "minecraft:crimson_sign" - }, - { - "id": "minecraft:warped_sign" - }, - { - "id": "minecraft:oak_hanging_sign" - }, - { - "id": "minecraft:spruce_hanging_sign" - }, - { - "id": "minecraft:birch_hanging_sign" - }, - { - "id": "minecraft:jungle_hanging_sign" - }, - { - "id": "minecraft:acacia_hanging_sign" - }, - { - "id": "minecraft:dark_oak_hanging_sign" - }, - { - "id": "minecraft:mangrove_hanging_sign" - }, - { - "id": "minecraft:cherry_hanging_sign" - }, - { - "id": "minecraft:bamboo_hanging_sign" - }, - { - "id": "minecraft:crimson_hanging_sign" - }, - { - "id": "minecraft:warped_hanging_sign" - }, - { - "id": "minecraft:painting" - }, - { - "id": "minecraft:frame" - }, - { - "id": "minecraft:glow_frame" - }, - { - "id": "minecraft:honey_bottle" - }, - { - "id": "minecraft:flower_pot" - }, - { - "id": "minecraft:bowl" - }, - { - "id": "minecraft:bucket" - }, - { - "id": "minecraft:milk_bucket" - }, - { - "id": "minecraft:water_bucket" - }, - { - "id": "minecraft:lava_bucket" - }, - { - "id": "minecraft:cod_bucket" - }, - { - "id": "minecraft:salmon_bucket" - }, - { - "id": "minecraft:tropical_fish_bucket" - }, - { - "id": "minecraft:pufferfish_bucket" - }, - { - "id": "minecraft:powder_snow_bucket" - }, - { - "id": "minecraft:axolotl_bucket" - }, - { - "id": "minecraft:tadpole_bucket" - }, - { - "id": "minecraft:skull", - "damage": 3 - }, - { - "id": "minecraft:skull", - "damage": 2 - }, - { - "id": "minecraft:skull", - "damage": 4 - }, - { - "id": "minecraft:skull", - "damage": 5 - }, - { - "id": "minecraft:skull" - }, - { - "id": "minecraft:skull", - "damage": 1 - }, - { - "id": "minecraft:skull", - "damage": 6 - }, - { - "id": "minecraft:beacon", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OmJlYWNvbgQJAG5hbWVfaGFzaACwhhfSkdkHAwoAbmV0d29ya19pZF8jfiEKBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:bell", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OmJlbGwECQBuYW1lX2hhc2iPqsgDXRcsxAMKAG5ldHdvcmtfaWT7zhOoCgYAc3RhdGVzCAoAYXR0YWNobWVudAgAc3RhbmRpbmcDCQBkaXJlY3Rpb24AAAAAAQoAdG9nZ2xlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:conduit", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNvbmR1aXQECQBuYW1lX2hhc2jqxKAxq2EaWQMKAG5ldHdvcmtfaWTWcBVnCgYAc3RhdGVzAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stonecutter_block", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnN0b25lY3V0dGVyX2Jsb2NrBAkAbmFtZV9oYXNoQAXTbAM3MeYDCgBuZXR3b3JrX2lk18KHygoGAHN0YXRlcwMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:end_portal_frame", - "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OmVuZF9wb3J0YWxfZnJhbWUECQBuYW1lX2hhc2gqofyUIjGOpQMKAG5ldHdvcmtfaWRbGHf8CgYAc3RhdGVzARIAZW5kX3BvcnRhbF9leWVfYml0AAgcAG1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb24FAHNvdXRoAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:coal" - }, - { - "id": "minecraft:charcoal" - }, - { - "id": "minecraft:diamond" - }, - { - "id": "minecraft:iron_nugget" - }, - { - "id": "minecraft:raw_iron" - }, - { - "id": "minecraft:raw_gold" - }, - { - "id": "minecraft:raw_copper" - }, - { - "id": "minecraft:copper_ingot" - }, - { - "id": "minecraft:iron_ingot" - }, - { - "id": "minecraft:netherite_scrap" - }, - { - "id": "minecraft:netherite_ingot" - }, - { - "id": "minecraft:gold_nugget" - }, - { - "id": "minecraft:gold_ingot" - }, - { - "id": "minecraft:emerald" - }, - { - "id": "minecraft:quartz" - }, - { - "id": "minecraft:clay_ball" - }, - { - "id": "minecraft:brick" - }, - { - "id": "minecraft:netherbrick" - }, - { - "id": "minecraft:prismarine_shard" - }, - { - "id": "minecraft:amethyst_shard" - }, - { - "id": "minecraft:prismarine_crystals" - }, - { - "id": "minecraft:nautilus_shell" - }, - { - "id": "minecraft:heart_of_the_sea" - }, - { - "id": "minecraft:scute" - }, - { - "id": "minecraft:phantom_membrane" - }, - { - "id": "minecraft:string" - }, - { - "id": "minecraft:feather" - }, - { - "id": "minecraft:flint" - }, - { - "id": "minecraft:gunpowder" - }, - { - "id": "minecraft:leather" - }, - { - "id": "minecraft:rabbit_hide" - }, - { - "id": "minecraft:rabbit_foot" - }, - { - "id": "minecraft:fire_charge" - }, - { - "id": "minecraft:blaze_rod" - }, - { - "id": "minecraft:blaze_powder" - }, - { - "id": "minecraft:magma_cream" - }, - { - "id": "minecraft:fermented_spider_eye" - }, - { - "id": "minecraft:echo_shard" - }, - { - "id": "minecraft:dragon_breath" - }, - { - "id": "minecraft:shulker_shell" - }, - { - "id": "minecraft:ghast_tear" - }, - { - "id": "minecraft:slime_ball" - }, - { - "id": "minecraft:ender_pearl" - }, - { - "id": "minecraft:ender_eye" - }, - { - "id": "minecraft:nether_star" - }, - { - "id": "minecraft:end_rod", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmVuZF9yb2QECQBuYW1lX2hhc2jx/q5cEA0hmQMKAG5ldHdvcmtfaWQ2eM8kCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lightning_rod", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmxpZ2h0bmluZ19yb2QECQBuYW1lX2hhc2ioXQF1xvfHNQMKAG5ldHdvcmtfaWRLuHyACgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:end_crystal" - }, - { - "id": "minecraft:paper" - }, - { - "id": "minecraft:book" - }, - { - "id": "minecraft:writable_book" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQAAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQBAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQCAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQDAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQEAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQFAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQGAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQHAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQIAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQJAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQKAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQLAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQMAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQNAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQOAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQPAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQQAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQRAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQSAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQTAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQUAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQVAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQWAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQXAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQYAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQZAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQaAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQbAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQcAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQdAAIDAGx2bAUAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQeAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQfAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQgAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQhAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQiAAIDAGx2bAQAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQjAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQkAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAEAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAIAAAA=" - }, - { - "id": "minecraft:enchanted_book", - "nbt_b64": "CgAACQQAZW5jaAoBAAAAAgIAaWQlAAIDAGx2bAMAAAA=" - }, - { - "id": "minecraft:oak_boat" - }, - { - "id": "minecraft:spruce_boat" - }, - { - "id": "minecraft:birch_boat" - }, - { - "id": "minecraft:jungle_boat" - }, - { - "id": "minecraft:acacia_boat" - }, - { - "id": "minecraft:dark_oak_boat" - }, - { - "id": "minecraft:mangrove_boat" - }, - { - "id": "minecraft:cherry_boat" - }, - { - "id": "minecraft:bamboo_raft" - }, - { - "id": "minecraft:oak_chest_boat" - }, - { - "id": "minecraft:spruce_chest_boat" - }, - { - "id": "minecraft:birch_chest_boat" - }, - { - "id": "minecraft:jungle_chest_boat" - }, - { - "id": "minecraft:acacia_chest_boat" - }, - { - "id": "minecraft:dark_oak_chest_boat" - }, - { - "id": "minecraft:mangrove_chest_boat" - }, - { - "id": "minecraft:cherry_chest_boat" - }, - { - "id": "minecraft:bamboo_chest_raft" - }, - { - "id": "minecraft:rail", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnJhaWwECQBuYW1lX2hhc2hUzmhUXYJDUQMKAG5ldHdvcmtfaWR+Sp6YCgYAc3RhdGVzAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:golden_rail", - "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmdvbGRlbl9yYWlsBAkAbmFtZV9oYXNoOoV5MaKipoUDCgBuZXR3b3JrX2lkfAcxLwoGAHN0YXRlcwENAHJhaWxfZGF0YV9iaXQAAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:detector_rail", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRldGVjdG9yX3JhaWwECQBuYW1lX2hhc2gVUk31qOysUQMKAG5ldHdvcmtfaWRVW/aICgYAc3RhdGVzAQ0AcmFpbF9kYXRhX2JpdAADDgByYWlsX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:activator_rail", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmFjdGl2YXRvcl9yYWlsBAkAbmFtZV9oYXNosIL91qriCRkDCgBuZXR3b3JrX2lkZfckmwoGAHN0YXRlcwENAHJhaWxfZGF0YV9iaXQAAw4AcmFpbF9kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:minecart" - }, - { - "id": "minecraft:chest_minecart" - }, - { - "id": "minecraft:hopper_minecart" - }, - { - "id": "minecraft:tnt_minecart" - }, - { - "id": "minecraft:redstone" - }, - { - "id": "minecraft:redstone_block", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlZHN0b25lX2Jsb2NrBAkAbmFtZV9oYXNoRhULL0r8o0sDCgBuZXR3b3JrX2lklayOHgoGAHN0YXRlcwADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:redstone_torch", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OnJlZHN0b25lX3RvcmNoBAkAbmFtZV9oYXNoizFRjpYMIDgDCgBuZXR3b3JrX2lkuHz7yAoGAHN0YXRlcwgWAHRvcmNoX2ZhY2luZ19kaXJlY3Rpb24HAHVua25vd24AAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:lever", - "block_state_b64": "CgAACAQAbmFtZQ8AbWluZWNyYWZ0OmxldmVyBAkAbmFtZV9oYXNoGMJeLJsUMLYDCgBuZXR3b3JrX2lkEF/GuAoGAHN0YXRlcwgPAGxldmVyX2RpcmVjdGlvbg4AZG93bl9lYXN0X3dlc3QBCABvcGVuX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wooden_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Ondvb2Rlbl9idXR0b24ECQBuYW1lX2hhc2hR7PgSTQt0sQMKAG5ldHdvcmtfaWSU07kYCgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:spruce_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnNwcnVjZV9idXR0b24ECQBuYW1lX2hhc2jBW9Z8aYE7YQMKAG5ldHdvcmtfaWTkUIGuCgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:birch_button", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmJpcmNoX2J1dHRvbgQJAG5hbWVfaGFzaJXYgGuSHbTwAwoAbmV0d29ya19pZGWp3yoKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:jungle_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0Omp1bmdsZV9idXR0b24ECQBuYW1lX2hhc2iCgNANcJs+BQMKAG5ldHdvcmtfaWT9fImWCgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:acacia_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmFjYWNpYV9idXR0b24ECQBuYW1lX2hhc2gVvmcT7LTO0wMKAG5ldHdvcmtfaWRQnxIJCgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dark_oak_button", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmRhcmtfb2FrX2J1dHRvbgQJAG5hbWVfaGFzaIV10ZGGrCIEAwoAbmV0d29ya19pZN5vAmIKBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mangrove_button", - "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om1hbmdyb3ZlX2J1dHRvbgQJAG5hbWVfaGFzaNzeYYKLgOzJAwoAbmV0d29ya19pZAFEGQ0KBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoZXJyeV9idXR0b24ECQBuYW1lX2hhc2j2/IHjeAbUcwMKAG5ldHdvcmtfaWRJ1irQCgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmJhbWJvb19idXR0b24ECQBuYW1lX2hhc2j7AddMi+6nsgMKAG5ldHdvcmtfaWSa9w4/CgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_button", - "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OnN0b25lX2J1dHRvbgQJAG5hbWVfaGFzaM4ejMctmvohAwoAbmV0d29ya19pZMw+aC0KBgBzdGF0ZXMBEgBidXR0b25fcHJlc3NlZF9iaXQAAxAAZmFjaW5nX2RpcmVjdGlvbgAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:crimson_button", - "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmNyaW1zb25fYnV0dG9uBAkAbmFtZV9oYXNofnjYHaYIeWgDCgBuZXR3b3JrX2lk+n1vyQoGAHN0YXRlcwESAGJ1dHRvbl9wcmVzc2VkX2JpdAADEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_button", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OndhcnBlZF9idXR0b24ECQBuYW1lX2hhc2jwkV2EU6Cn1QMKAG5ldHdvcmtfaWTnHnk1CgYAc3RhdGVzARIAYnV0dG9uX3ByZXNzZWRfYml0AAMQAGZhY2luZ19kaXJlY3Rpb24AAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:polished_blackstone_button", - "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnV0dG9uBAkAbmFtZV9oYXNojmxzQKS0S/EDCgBuZXR3b3JrX2lkDtQ95woGAHN0YXRlcwESAGJ1dHRvbl9wcmVzc2VkX2JpdAADEABmYWNpbmdfZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:tripwire_hook", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnRyaXB3aXJlX2hvb2sECQBuYW1lX2hhc2gQdp+oGZLNnAMKAG5ldHdvcmtfaWSy+1KJCgYAc3RhdGVzAQwAYXR0YWNoZWRfYml0AAMJAGRpcmVjdGlvbgAAAAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:wooden_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Ondvb2Rlbl9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaGkGs5kCuA74AwoAbmV0d29ya19pZDRzPNwKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:spruce_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OnNwcnVjZV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaNmwuq549fJKAwoAbmV0d29ya19pZLQMCw0KBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:birch_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmJpcmNoX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNorQkT9kDdlTwDCgBuZXR3b3JrX2lkH0G97AoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:jungle_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Omp1bmdsZV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaJ7DcteCkb8/AwoAbmV0d29ya19pZLdPBSAKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:acacia_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmFjYWNpYV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaC2frZtfoYqCAwoAbmV0d29ya19pZIDdI18KBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:dark_oak_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmRhcmtfb2FrX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoHUCJsTy52pwDCgBuZXR3b3JrX2lkKpi8rAoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:mangrove_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0Om1hbmdyb3ZlX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoiDsTfJaX100DCgBuZXR3b3JrX2lkuwWDyQoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:cherry_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmNoZXJyeV9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaALMqYEZDUQHAwoAbmV0d29ya19pZPNT+r0KBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:bamboo_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OmJhbWJvb19wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaNvxJ7NIAaqlAwoAbmV0d29ya19pZIZ8XnYKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:crimson_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OmNyaW1zb25fcHJlc3N1cmVfcGxhdGUECQBuYW1lX2hhc2hqBDVDAd31/gMKAG5ldHdvcmtfaWRmV18LCgYAc3RhdGVzAw8AcmVkc3RvbmVfc2lnbmFsAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:warped_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndhcnBlZF9wcmVzc3VyZV9wbGF0ZQQJAG5hbWVfaGFzaBxFoQksWtYUAwoAbmV0d29ya19pZJVRoIcKBgBzdGF0ZXMDDwByZWRzdG9uZV9zaWduYWwAAAAAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:stone_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnN0b25lX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNounJuTBUTrU8DCgBuZXR3b3JrX2lkjDydwQoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:light_weighted_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmxpZ2h0X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoOyOJkNxLtkEDCgBuZXR3b3JrX2lkrr2AjgoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:heavy_weighted_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OmhlYXZ5X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlBAkAbmFtZV9oYXNoltgDmDvTajUDCgBuZXR3b3JrX2lkFxVKuQoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:polished_blackstone_pressure_plate", - "block_state_b64": "CgAACAQAbmFtZSwAbWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfcHJlc3N1cmVfcGxhdGUECQBuYW1lX2hhc2h65Ci6/CeGqwMKAG5ldHdvcmtfaWTaSW5xCgYAc3RhdGVzAw8AcmVkc3RvbmVfc2lnbmFsAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:observer", - "block_state_b64": "CgAACAQAbmFtZRIAbWluZWNyYWZ0Om9ic2VydmVyBAkAbmFtZV9oYXNoYhlh1lpmHTgDCgBuZXR3b3JrX2lkQEh55goGAHN0YXRlcwgaAG1pbmVjcmFmdDpmYWNpbmdfZGlyZWN0aW9uBABkb3duAQsAcG93ZXJlZF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:daylight_detector", - "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OmRheWxpZ2h0X2RldGVjdG9yBAkAbmFtZV9oYXNoV0F0s7B7PVgDCgBuZXR3b3JrX2lkri5afQoGAHN0YXRlcwMPAHJlZHN0b25lX3NpZ25hbAAAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:repeater" - }, - { - "id": "minecraft:comparator" - }, - { - "id": "minecraft:hopper" - }, - { - "id": "minecraft:dropper", - "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmRyb3BwZXIECQBuYW1lX2hhc2joXP7XqU0l3QMKAG5ldHdvcmtfaWQfQN6zCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgMAAAABDQB0cmlnZ2VyZWRfYml0AAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:dispenser", - "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmRpc3BlbnNlcgQJAG5hbWVfaGFzaP1RR+zAbYP2AwoAbmV0d29ya19pZGAayD0KBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAwAAAAENAHRyaWdnZXJlZF9iaXQAAAMHAHZlcnNpb24yHhQBAA==" - }, - { - "id": "minecraft:piston", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBpc3RvbgQJAG5hbWVfaGFzaDs3AFh1fL0uAwoAbmV0d29ya19pZLD/5XQKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAQAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:sticky_piston", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnN0aWNreV9waXN0b24ECQBuYW1lX2hhc2hPFJFJSiJ0ZQMKAG5ldHdvcmtfaWT/MzCJCgYAc3RhdGVzAxAAZmFjaW5nX2RpcmVjdGlvbgEAAAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:tnt", - "block_state_b64": "CgAACAQAbmFtZQ0AbWluZWNyYWZ0OnRudAQJAG5hbWVfaGFzaEYOHwCvJH29AwoAbmV0d29ya19pZCGfjU4KBgBzdGF0ZXMBFABhbGxvd191bmRlcndhdGVyX2JpdAABCwBleHBsb2RlX2JpdAAAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:name_tag" - }, - { - "id": "minecraft:loom", - "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0Omxvb20ECQBuYW1lX2hhc2i7DKjAXNq8TAMKAG5ldHdvcmtfaWR/49HXCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:banner" - }, - { - "id": "minecraft:banner", - "damage": 8 - }, - { - "id": "minecraft:banner", - "damage": 7 - }, - { - "id": "minecraft:banner", - "damage": 15 - }, - { - "id": "minecraft:banner", - "damage": 12 - }, - { - "id": "minecraft:banner", - "damage": 14 - }, - { - "id": "minecraft:banner", - "damage": 1 - }, - { - "id": "minecraft:banner", - "damage": 4 - }, - { - "id": "minecraft:banner", - "damage": 5 - }, - { - "id": "minecraft:banner", - "damage": 13 - }, - { - "id": "minecraft:banner", - "damage": 9 - }, - { - "id": "minecraft:banner", - "damage": 3 - }, - { - "id": "minecraft:banner", - "damage": 11 - }, - { - "id": "minecraft:banner", - "damage": 10 - }, - { - "id": "minecraft:banner", - "damage": 2 - }, - { - "id": "minecraft:banner", - "damage": 6 - }, - { - "id": "minecraft:banner", - "damage": 15, - "nbt_b64": "CgAAAwQAVHlwZQEAAAAA" - }, - { - "id": "minecraft:creeper_banner_pattern" - }, - { - "id": "minecraft:skull_banner_pattern" - }, - { - "id": "minecraft:flower_banner_pattern" - }, - { - "id": "minecraft:mojang_banner_pattern" - }, - { - "id": "minecraft:field_masoned_banner_pattern" - }, - { - "id": "minecraft:bordure_indented_banner_pattern" - }, - { - "id": "minecraft:piglin_banner_pattern" - }, - { - "id": "minecraft:globe_banner_pattern" - }, - { - "id": "minecraft:angler_pottery_sherd" - }, - { - "id": "minecraft:archer_pottery_sherd" - }, - { - "id": "minecraft:arms_up_pottery_sherd" - }, - { - "id": "minecraft:blade_pottery_sherd" - }, - { - "id": "minecraft:brewer_pottery_sherd" - }, - { - "id": "minecraft:burn_pottery_sherd" - }, - { - "id": "minecraft:danger_pottery_sherd" - }, - { - "id": "minecraft:explorer_pottery_sherd" - }, - { - "id": "minecraft:friend_pottery_sherd" - }, - { - "id": "minecraft:heart_pottery_sherd" - }, - { - "id": "minecraft:heartbreak_pottery_sherd" - }, - { - "id": "minecraft:howl_pottery_sherd" - }, - { - "id": "minecraft:miner_pottery_sherd" - }, - { - "id": "minecraft:mourner_pottery_sherd" - }, - { - "id": "minecraft:plenty_pottery_sherd" - }, - { - "id": "minecraft:prize_pottery_sherd" - }, - { - "id": "minecraft:sheaf_pottery_sherd" - }, - { - "id": "minecraft:shelter_pottery_sherd" - }, - { - "id": "minecraft:skull_pottery_sherd" - }, - { - "id": "minecraft:snort_pottery_sherd" - }, - { - "id": "minecraft:netherite_upgrade_smithing_template" - }, - { - "id": "minecraft:sentry_armor_trim_smithing_template" - }, - { - "id": "minecraft:vex_armor_trim_smithing_template" - }, - { - "id": "minecraft:wild_armor_trim_smithing_template" - }, - { - "id": "minecraft:coast_armor_trim_smithing_template" - }, - { - "id": "minecraft:dune_armor_trim_smithing_template" - }, - { - "id": "minecraft:wayfinder_armor_trim_smithing_template" - }, - { - "id": "minecraft:shaper_armor_trim_smithing_template" - }, - { - "id": "minecraft:raiser_armor_trim_smithing_template" - }, - { - "id": "minecraft:host_armor_trim_smithing_template" - }, - { - "id": "minecraft:ward_armor_trim_smithing_template" - }, - { - "id": "minecraft:silence_armor_trim_smithing_template" - }, - { - "id": "minecraft:tide_armor_trim_smithing_template" - }, - { - "id": "minecraft:snout_armor_trim_smithing_template" - }, - { - "id": "minecraft:rib_armor_trim_smithing_template" - }, - { - "id": "minecraft:eye_armor_trim_smithing_template" - }, - { - "id": "minecraft:spire_armor_trim_smithing_template" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwAAAAAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAABwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAIBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAHBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAPBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAMBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAOBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAABBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAEBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAFBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAANBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAJBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAADBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAALBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAKBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAACBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_rocket", - "nbt_b64": "CgAACgkARmlyZXdvcmtzCQoARXhwbG9zaW9ucwoBAAAABw0ARmlyZXdvcmtDb2xvcgEAAAAGBwwARmlyZXdvcmtGYWRlAAAAAAEPAEZpcmV3b3JrRmxpY2tlcgABDQBGaXJld29ya1RyYWlsAAEMAEZpcmV3b3JrVHlwZQAAAQYARmxpZ2h0AQAA" - }, - { - "id": "minecraft:firework_star", - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yIR0d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 8, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yUk9H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 7, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yl52d/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 15, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y8PDw/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 12, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9y2rM6/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 14, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yHYD5/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 1, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yJi6w/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 4, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABAcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqkQ8/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 5, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yuDKJ/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 13, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAADQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yvU7H/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 9, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACQcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yqovz/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 3, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yMlSD/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 11, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACwcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yPdj+/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 10, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAACgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yH8eA/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 2, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAAAgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9yFnxe/wA=" - }, - { - "id": "minecraft:firework_star", - "damage": 6, - "nbt_b64": "CgAACg0ARmlyZXdvcmtzSXRlbQcNAEZpcmV3b3JrQ29sb3IBAAAABgcMAEZpcmV3b3JrRmFkZQAAAAABDwBGaXJld29ya0ZsaWNrZXIAAQ0ARmlyZXdvcmtUcmFpbAABDABGaXJld29ya1R5cGUAAAMLAGN1c3RvbUNvbG9ynJwW/wA=" - }, - { - "id": "minecraft:chain" - }, - { - "id": "minecraft:target", - "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnRhcmdldAQJAG5hbWVfaGFzaJc66SVbYlaxAwoAbmV0d29ya19pZPBozs0KBgBzdGF0ZXMAAwcAdmVyc2lvbjIeFAEA" - }, - { - "id": "minecraft:decorated_pot", - "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmRlY29yYXRlZF9wb3QECQBuYW1lX2hhc2jjQgckn8VTvwMKAG5ldHdvcmtfaWRwvkUUCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uMh4UAQA=" - }, - { - "id": "minecraft:lodestone_compass" - }, - { - "id": "minecraft:wither_spawn_egg" - }, - { - "id": "minecraft:ender_dragon_spawn_egg" - } - ] -} \ No newline at end of file diff --git a/core/src/main/resources/bedrock/creative_items.1_20_50.json b/core/src/main/resources/bedrock/creative_items.1_20_50.json index c72695a4241..d93aa4c0093 100644 --- a/core/src/main/resources/bedrock/creative_items.1_20_50.json +++ b/core/src/main/resources/bedrock/creative_items.1_20_50.json @@ -1044,34 +1044,122 @@ "id": "minecraft:copper_block", "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNvcHBlcl9ibG9jawQJAG5hbWVfaGFzaDVxnehsGaZ1AwoAbmV0d29ya19pZIiUodwKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" }, + { + "id": "minecraft:copper_door" + }, + { + "id": "minecraft:copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNvcHBlcl90cmFwZG9vcgQJAG5hbWVfaGFzaO9fXio+svKVAwoAbmV0d29ya19pZMCoRjEKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:copper_grate", + "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OmNvcHBlcl9ncmF0ZQQJAG5hbWVfaGFzaC/JEFOWnmEcAwoAbmV0d29ya19pZC6YiiMKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, { "id": "minecraft:exposed_copper", "block_state_b64": "CgAACAQAbmFtZRgAbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoQH3Fukmu3CEDCgBuZXR3b3JrX2lk72jFIwoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" }, + { + "id": "minecraft:exposed_copper_door" + }, + { + "id": "minecraft:exposed_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX3RyYXBkb29yBAkAbmFtZV9oYXNoYhDFUysN7qUDCgBuZXR3b3JrX2lkMzwGJgoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:exposed_copper_grate", + "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2dyYXRlBAkAbmFtZV9oYXNolFIBYLYU0IcDCgBuZXR3b3JrX2lk4UqptAoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, { "id": "minecraft:weathered_copper", "block_state_b64": "CgAACAQAbmFtZRoAbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2hJCQXbvobv+gMKAG5ldHdvcmtfaWQwM0lJCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" }, + { + "id": "minecraft:weathered_copper_door" + }, + { + "id": "minecraft:weathered_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfdHJhcGRvb3IECQBuYW1lX2hhc2hFnEC282a1tgMKAG5ldHdvcmtfaWTk70oiCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:weathered_copper_grate", + "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfZ3JhdGUECQBuYW1lX2hhc2jB3o8enlv1RgMKAG5ldHdvcmtfaWRih2pOCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, { "id": "minecraft:oxidized_copper", "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMDtJqR0G5Y7AwoAbmV0d29ya19pZGjN8bUKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" }, + { + "id": "minecraft:oxidized_copper_door" + }, + { + "id": "minecraft:oxidized_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl90cmFwZG9vcgQJAG5hbWVfaGFzaOJpG/XFexVwAwoAbmV0d29ya19pZPhi0J4KBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:oxidized_copper_grate", + "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9ncmF0ZQQJAG5hbWVfaGFzaBRfNhyndve7AwoAbmV0d29ya19pZKY2cnEKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, { "id": "minecraft:waxed_copper", "block_state_b64": "CgAACAQAbmFtZRYAbWluZWNyYWZ0OndheGVkX2NvcHBlcgQJAG5hbWVfaGFzaPF+FG6Eh5fsAwoAbmV0d29ya19pZIjtz/0KBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" }, + { + "id": "minecraft:waxed_copper_door" + }, + { + "id": "minecraft:waxed_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX2NvcHBlcl90cmFwZG9vcgQJAG5hbWVfaGFzaO0JUKUHqNU6AwoAbmV0d29ya19pZJC3ZuMKBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:waxed_copper_grate", + "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OndheGVkX2NvcHBlcl9ncmF0ZQQJAG5hbWVfaGFzaDmC92M2RO+HAwoAbmV0d29ya19pZH4og2AKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, { "id": "minecraft:waxed_exposed_copper", "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyBAkAbmFtZV9oYXNoig8IOc+SCikDCgBuZXR3b3JrX2lklz8yWQoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" }, + { + "id": "minecraft:waxed_exposed_copper_door" + }, + { + "id": "minecraft:waxed_exposed_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX3RyYXBkb29yBAkAbmFtZV9oYXNoBHHxCpkUzpgDCgBuZXR3b3JrX2lkw2XBGQoGAHN0YXRlcwMJAGRpcmVjdGlvbgAAAAABCABvcGVuX2JpdAABDwB1cHNpZGVfZG93bl9iaXQAAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:waxed_exposed_copper_grate", + "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2dyYXRlBAkAbmFtZV9oYXNoWmd6B+hWwiEDCgBuZXR3b3JrX2lk8d4ZQwoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, { "id": "minecraft:waxed_weathered_copper", "block_state_b64": "CgAACAQAbmFtZSAAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXIECQBuYW1lX2hhc2gjtPq8MOdvKgMKAG5ldHdvcmtfaWSQ9Ln9CgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" }, + { + "id": "minecraft:waxed_weathered_copper_door" + }, + { + "id": "minecraft:waxed_weathered_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfdHJhcGRvb3IECQBuYW1lX2hhc2gH9Fi3JCF4egMKAG5ldHdvcmtfaWRkGU6TCgYAc3RhdGVzAwkAZGlyZWN0aW9uAAAAAAEIAG9wZW5fYml0AAEPAHVwc2lkZV9kb3duX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_weathered_copper_grate", + "block_state_b64": "CgAACAQAbmFtZSYAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfZ3JhdGUECQBuYW1lX2hhc2hXfilVFDAiYQMKAG5ldHdvcmtfaWQqTGC1CgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, { "id": "minecraft:waxed_oxidized_copper", "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcgQJAG5hbWVfaGFzaMaORhsO+LzjAwoAbmV0d29ya19pZJhGfLEKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" }, + { + "id": "minecraft:waxed_oxidized_copper_door" + }, + { + "id": "minecraft:waxed_oxidized_copper_trapdoor", + "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl90cmFwZG9vcgQJAG5hbWVfaGFzaNA/q9qAy6Z9AwoAbmV0d29ya19pZDgExS8KBgBzdGF0ZXMDCQBkaXJlY3Rpb24AAAAAAQgAb3Blbl9iaXQAAQ8AdXBzaWRlX2Rvd25fYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:waxed_oxidized_copper_grate", + "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9ncmF0ZQQJAG5hbWVfaGFzaEbeMT605GP4AwoAbmV0d29ya19pZOZjpkkKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, { "id": "minecraft:cut_copper", "block_state_b64": "CgAACAQAbmFtZRQAbWluZWNyYWZ0OmN1dF9jb3BwZXIECQBuYW1lX2hhc2hAfN3NGax3eAMKAG5ldHdvcmtfaWTnFBtYCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" @@ -1104,6 +1192,70 @@ "id": "minecraft:waxed_oxidized_cut_copper", "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2N1dF9jb3BwZXIECQBuYW1lX2hhc2i1pZAsZYHLDAMKAG5ldHdvcmtfaWQ/wSkCCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" }, + { + "id": "minecraft:chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OmNoaXNlbGVkX2NvcHBlcgQJAG5hbWVfaGFzaIsW5pmpJEuQAwoAbmV0d29ya19pZHetwrkKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:exposed_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZSEAbWluZWNyYWZ0OmV4cG9zZWRfY2hpc2VsZWRfY29wcGVyBAkAbmFtZV9oYXNoOvrLJ0UowbgDCgBuZXR3b3JrX2lkZj7cPwoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:weathered_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndlYXRoZXJlZF9jaGlzZWxlZF9jb3BwZXIECQBuYW1lX2hhc2hh+42XlsWvGAMKAG5ldHdvcmtfaWS7Cy59CgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:oxidized_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZSIAbWluZWNyYWZ0Om94aWRpemVkX2NoaXNlbGVkX2NvcHBlcgQJAG5hbWVfaGFzaLpTIsnfluiCAwoAbmV0d29ya19pZB9/jS8KBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndheGVkX2NoaXNlbGVkX2NvcHBlcgQJAG5hbWVfaGFzaFnXvXY5OinzAwoAbmV0d29ya19pZAcKtHsKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_exposed_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZScAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY2hpc2VsZWRfY29wcGVyBAkAbmFtZV9oYXNoHJdq+Pph6hMDCgBuZXR3b3JrX2lkdge7IAoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:waxed_oxidized_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZSgAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NoaXNlbGVkX2NvcHBlcgQJAG5hbWVfaGFzaMj49OvlTpgCAwoAbmV0d29ya19pZN/r+roKBgBzdGF0ZXMAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_weathered_chiseled_copper", + "block_state_b64": "CgAACAQAbmFtZSkAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jaGlzZWxlZF9jb3BwZXIECQBuYW1lX2hhc2hzuO+Sg9LYQwMKAG5ldHdvcmtfaWQ7AN7iCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:copper_bulb", + "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OmNvcHBlcl9idWxiBAkAbmFtZV9oYXNo41TimHOsMWcDCgBuZXR3b3JrX2lkJnZvAgoGAHN0YXRlcwEDAGxpdAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:exposed_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZR0AbWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2J1bGIECQBuYW1lX2hhc2g++f1wYLLCrAMKAG5ldHdvcmtfaWRLdMmGCgYAc3RhdGVzAQMAbGl0AAELAHBvd2VyZWRfYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:weathered_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZR8AbWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfYnVsYgQJAG5hbWVfaGFzaMEtsYfwRTXlAwoAbmV0d29ya19pZAp51LQKBgBzdGF0ZXMBAwBsaXQAAQsAcG93ZXJlZF9iaXQAAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:oxidized_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9idWxiBAkAbmFtZV9oYXNovnrBQZs8nDIDCgBuZXR3b3JrX2lkPsj0AAoGAHN0YXRlcwEDAGxpdAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OndheGVkX2NvcHBlcl9idWxiBAkAbmFtZV9oYXNoGTg6TYllMiIDCgBuZXR3b3JrX2lk9m0WhgoGAHN0YXRlcwEDAGxpdAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, + { + "id": "minecraft:waxed_exposed_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZSMAbWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2J1bGIECQBuYW1lX2hhc2gI6xkPcvBDVwMKAG5ldHdvcmtfaWR7BRcACgYAc3RhdGVzAQMAbGl0AAELAHBvd2VyZWRfYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:waxed_weathered_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZSUAbWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfYnVsYgQJAG5hbWVfaGFzaMsUnmp3/VqVAwoAbmV0d29ya19pZEoworoKBgBzdGF0ZXMBAwBsaXQAAQsAcG93ZXJlZF9iaXQAAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:waxed_oxidized_copper_bulb", + "block_state_b64": "CgAACAQAbmFtZSQAbWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9idWxiBAkAbmFtZV9oYXNoBFKxY3fjVq4DCgBuZXR3b3JrX2lkzrJ6aAoGAHN0YXRlcwEDAGxpdAABCwBwb3dlcmVkX2JpdAAAAwcAdmVyc2lvbgEyFAEA" + }, { "id": "minecraft:emerald_block", "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmVtZXJhbGRfYmxvY2sECQBuYW1lX2hhc2hK6QunqJznNAMKAG5ldHdvcmtfaWRk5+otCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" @@ -2509,6 +2661,58 @@ "id": "minecraft:tuff", "block_state_b64": "CgAACAQAbmFtZQ4AbWluZWNyYWZ0OnR1ZmYECQBuYW1lX2hhc2h1Rwc1XYsBGwMKAG5ldHdvcmtfaWRwQGn0CgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" }, + { + "id": "minecraft:tuff_stairs", + "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnR1ZmZfc3RhaXJzBAkAbmFtZV9oYXNoKjyNUBjcfZsDCgBuZXR3b3JrX2lk+LsycgoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:tuff_slab", + "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnR1ZmZfc2xhYgQJAG5hbWVfaGFzaIhCGdlIsnMUAwoAbmV0d29ya19pZN1dUL4KBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:tuff_wall", + "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OnR1ZmZfd2FsbAQJAG5hbWVfaGFzaMyeeu1IRf03AwoAbmV0d29ya19pZDkIrosKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:chiseled_tuff", + "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OmNoaXNlbGVkX3R1ZmYECQBuYW1lX2hhc2iVliOT8OTQ9AMKAG5ldHdvcmtfaWTLNKOiCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:polished_tuff", + "block_state_b64": "CgAACAQAbmFtZRcAbWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmYECQBuYW1lX2hhc2hyaLe/KEVZ0gMKAG5ldHdvcmtfaWTcX3NrCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:polished_tuff_stairs", + "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfc3RhaXJzBAkAbmFtZV9oYXNo8yuah8QI1dcDCgBuZXR3b3JrX2lkjLoU4AoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:polished_tuff_slab", + "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfc2xhYgQJAG5hbWVfaGFzaLXdb48YvAsHAwoAbmV0d29ya19pZAnJ7W0KBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:polished_tuff_wall", + "block_state_b64": "CgAACAQAbmFtZRwAbWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfd2FsbAQJAG5hbWVfaGFzaJVZj6QYWXUrAwoAbmV0d29ya19pZLU7dooKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:tuff_bricks", + "block_state_b64": "CgAACAQAbmFtZRUAbWluZWNyYWZ0OnR1ZmZfYnJpY2tzBAkAbmFtZV9oYXNo/hbQ+mXSK7wDCgBuZXR3b3JrX2lk6gmIwQoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:tuff_brick_stairs", + "block_state_b64": "CgAACAQAbmFtZRsAbWluZWNyYWZ0OnR1ZmZfYnJpY2tfc3RhaXJzBAkAbmFtZV9oYXNoWJpkAurUfKwDCgBuZXR3b3JrX2lkUMcjiwoGAHN0YXRlcwEPAHVwc2lkZV9kb3duX2JpdAADEAB3ZWlyZG9fZGlyZWN0aW9uAAAAAAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:tuff_brick_slab", + "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnR1ZmZfYnJpY2tfc2xhYgQJAG5hbWVfaGFzaLqPMjVCv5dIAwoAbmV0d29ya19pZOmeRhcKBgBzdGF0ZXMIFwBtaW5lY3JhZnQ6dmVydGljYWxfaGFsZgYAYm90dG9tAAMHAHZlcnNpb24BMhQBAA==" + }, + { + "id": "minecraft:tuff_brick_wall", + "block_state_b64": "CgAACAQAbmFtZRkAbWluZWNyYWZ0OnR1ZmZfYnJpY2tfd2FsbAQJAG5hbWVfaGFzaIL0IyNCOsonAwoAbmV0d29ya19pZJW4T5UKBgBzdGF0ZXMIGQB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9lYXN0BABub25lCBoAd2FsbF9jb25uZWN0aW9uX3R5cGVfbm9ydGgEAG5vbmUIGgB3YWxsX2Nvbm5lY3Rpb25fdHlwZV9zb3V0aAQAbm9uZQgZAHdhbGxfY29ubmVjdGlvbl90eXBlX3dlc3QEAG5vbmUBDQB3YWxsX3Bvc3RfYml0AAADBwB2ZXJzaW9uATIUAQA=" + }, + { + "id": "minecraft:chiseled_tuff_bricks", + "block_state_b64": "CgAACAQAbmFtZR4AbWluZWNyYWZ0OmNoaXNlbGVkX3R1ZmZfYnJpY2tzBAkAbmFtZV9oYXNo3oQw6gmxYuADCgBuZXR3b3JrX2lkm3D8AgoGAHN0YXRlcwADBwB2ZXJzaW9uATIUAQA=" + }, { "id": "minecraft:calcite", "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNhbGNpdGUECQBuYW1lX2hhc2ixKLu8ZIdzDQMKAG5ldHdvcmtfaWQlSbJDCgYAc3RhdGVzAAMHAHZlcnNpb24BMhQBAA==" @@ -5394,6 +5598,10 @@ "id": "minecraft:dispenser", "block_state_b64": "CgAACAQAbmFtZRMAbWluZWNyYWZ0OmRpc3BlbnNlcgQJAG5hbWVfaGFzaP1RR+zAbYP2AwoAbmV0d29ya19pZGAayD0KBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAwAAAAENAHRyaWdnZXJlZF9iaXQAAAMHAHZlcnNpb24BMhQBAA==" }, + { + "id": "minecraft:crafter", + "block_state_b64": "CgAACAQAbmFtZREAbWluZWNyYWZ0OmNyYWZ0ZXIECQBuYW1lX2hhc2iLCT/rJmRN8QMKAG5ldHdvcmtfaWTPTbvrCgYAc3RhdGVzAQgAY3JhZnRpbmcACAsAb3JpZW50YXRpb24JAGRvd25fZWFzdAENAHRyaWdnZXJlZF9iaXQAAAMHAHZlcnNpb24BMhQBAA==" + }, { "id": "minecraft:piston", "block_state_b64": "CgAACAQAbmFtZRAAbWluZWNyYWZ0OnBpc3RvbgQJAG5hbWVfaGFzaDs3AFh1fL0uAwoAbmV0d29ya19pZLD/5XQKBgBzdGF0ZXMDEABmYWNpbmdfZGlyZWN0aW9uAQAAAAADBwB2ZXJzaW9uATIUAQA=" From e2062dd1827cd288aa67a95db473a81a7e219300 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:17:41 -0500 Subject: [PATCH 26/54] Reimplement support for 1.20.40 --- README.md | 2 +- .../geysermc/geyser/network/GameProtocol.java | 3 +- .../populator/BlockRegistryPopulator.java | 11 +- .../registry/populator/Conversion630_622.java | 213 ++++++++++++++++++ .../populator/ItemRegistryPopulator.java | 20 +- .../registry/type/GeyserMappingItem.java | 2 - core/src/main/resources/mappings | 2 +- 7 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java diff --git a/README.md b/README.md index b3471b4d7e1..1663c493ad3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! -### Currently supporting Minecraft Bedrock 1.20.0 - 1.20.50 and Minecraft Java 1.20.3 +### Currently supporting Minecraft Bedrock 1.20.40 - 1.20.50 and Minecraft Java 1.20.3 ## Setting Up Take a look [here](https://wiki.geysermc.org/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 92377909509..e22d1da970c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.codec.PacketCodec; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; @@ -58,11 +59,9 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { - /* SUPPORTED_BEDROCK_CODECS.add(Bedrock_v622.CODEC.toBuilder() .minecraftVersion("1.20.40/1.20.41") .build()); - */ SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index f185119ca99..415e61ac230 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -34,18 +34,11 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.*; import org.cloudburstmc.blockstateupdater.BlockStateUpdater; -import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_10; -import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_30; -import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_40; -import org.cloudburstmc.blockstateupdater.BlockStateUpdater_1_20_50; import org.cloudburstmc.blockstateupdater.util.tagupdater.CompoundTagUpdaterContext; import org.cloudburstmc.nbt.NBTInputStream; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; -import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; -import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; -import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; @@ -83,7 +76,7 @@ public enum Stage { } @FunctionalInterface - private interface Remapper { + interface Remapper { NbtMap remap(NbtMap tag); @@ -123,7 +116,7 @@ private static void nullifyBlocksNode() { private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() - //.put(ObjectIntPair.of("1_20_40", Bedrock_v622.CODEC.getProtocolVersion()), mapper622) + .put(ObjectIntPair.of("1_20_40", Bedrock_v622.CODEC.getProtocolVersion()), Conversion630_622::remapBlock) .put(ObjectIntPair.of("1_20_50", Bedrock_v630.CODEC.getProtocolVersion()), tag -> tag) .build(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java new file mode 100644 index 00000000000..9404774b8a5 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.registry.populator; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.registry.type.GeyserMappingItem; + +import java.util.List; +import java.util.Map; + +/** + * Backwards-maps the blocks and items of 1.20.50 (630) to 1.20.40 (622) + */ +public class Conversion630_622 { + + private static final List NEW_STONES = List.of("minecraft:stone", "minecraft:granite", "minecraft:polished_granite", "minecraft:diorite", "minecraft:polished_diorite", "minecraft:andesite", "minecraft:polished_andesite"); + private static final List NEW_WOODS = List.of("minecraft:oak_planks", "minecraft:spruce_planks", "minecraft:birch_planks", "minecraft:jungle_planks", "minecraft:acacia_planks", "minecraft:dark_oak_planks"); + + private static final Map ITEMS = new Object2ObjectOpenHashMap<>(); + + static { + ITEMS.put("minecraft:acacia_planks", "minecraft:planks"); + ITEMS.put("minecraft:birch_planks", "minecraft:planks"); + ITEMS.put("minecraft:dark_oak_planks", "minecraft:planks"); + ITEMS.put("minecraft:jungle_planks", "minecraft:planks"); + ITEMS.put("minecraft:oak_planks", "minecraft:planks"); + ITEMS.put("minecraft:spruce_planks", "minecraft:planks"); + + ITEMS.put("minecraft:diorite", "minecraft:stone"); + ITEMS.put("minecraft:andesite", "minecraft:stone"); + ITEMS.put("minecraft:granite", "minecraft:stone"); + ITEMS.put("minecraft:polished_andesite", "minecraft:stone"); + ITEMS.put("minecraft:polished_diorite", "minecraft:stone"); + ITEMS.put("minecraft:polished_granite", "minecraft:stone"); + + ITEMS.put("minecraft:chiseled_tuff", "minecraft:chiseled_deepslate"); + ITEMS.put("minecraft:chiseled_tuff_bricks", "minecraft:chiseled_deepslate"); + ITEMS.put("minecraft:polished_tuff", "minecraft:polished_deepslate"); + ITEMS.put("minecraft:polished_tuff_double_slab", "minecraft:polished_deepslate_double_slab"); + ITEMS.put("minecraft:polished_tuff_slab", "minecraft:polished_deepslate_slab"); + ITEMS.put("minecraft:polished_tuff_stairs", "minecraft:polished_deepslate_stairs"); + ITEMS.put("minecraft:polished_tuff_wall", "minecraft:polished_deepslate_wall"); + ITEMS.put("minecraft:tuff_brick_double_slab", "minecraft:deepslate_brick_double_slab"); + ITEMS.put("minecraft:tuff_brick_slab", "minecraft:deepslate_brick_slab"); + ITEMS.put("minecraft:tuff_brick_stairs", "minecraft:deepslate_brick_stairs"); + ITEMS.put("minecraft:tuff_brick_wall", "minecraft:deepslate_brick_wall"); + ITEMS.put("minecraft:tuff_bricks", "minecraft:deepslate_bricks"); + ITEMS.put("minecraft:tuff_double_slab", "minecraft:cobbled_deepslate_double_slab"); + ITEMS.put("minecraft:tuff_slab", "minecraft:cobbled_deepslate_slab"); + ITEMS.put("minecraft:tuff_stairs", "minecraft:cobbled_deepslate_stairs"); + ITEMS.put("minecraft:tuff_wall", "minecraft:cobbled_deepslate_wall"); + + ITEMS.put("minecraft:chiseled_copper", "minecraft:copper_block"); + ITEMS.put("minecraft:copper_bulb", "minecraft:copper_block"); + ITEMS.put("minecraft:copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:exposed_chiseled_copper", "minecraft:exposed_copper"); + ITEMS.put("minecraft:exposed_copper_bulb", "minecraft:exposed_copper"); + ITEMS.put("minecraft:exposed_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:exposed_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:exposed_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:oxidized_chiseled_copper", "minecraft:oxidized_copper"); + ITEMS.put("minecraft:oxidized_copper_bulb", "minecraft:oxidized_copper"); + ITEMS.put("minecraft:oxidized_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:oxidized_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:oxidized_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:waxed_chiseled_copper", "minecraft:waxed_copper"); + ITEMS.put("minecraft:waxed_copper_bulb", "minecraft:waxed_copper"); + ITEMS.put("minecraft:waxed_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:waxed_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:waxed_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:waxed_exposed_chiseled_copper", "minecraft:waxed_exposed_copper"); + ITEMS.put("minecraft:waxed_exposed_copper_bulb", "minecraft:waxed_exposed_copper"); + ITEMS.put("minecraft:waxed_exposed_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:waxed_exposed_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:waxed_exposed_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:waxed_oxidized_chiseled_copper", "minecraft:waxed_oxidized_copper"); + ITEMS.put("minecraft:waxed_oxidized_copper_bulb", "minecraft:waxed_oxidized_copper"); + ITEMS.put("minecraft:waxed_oxidized_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:waxed_oxidized_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:waxed_oxidized_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:waxed_weathered_chiseled_copper", "minecraft:waxed_weathered_copper"); + ITEMS.put("minecraft:waxed_weathered_copper_bulb", "minecraft:waxed_weathered_copper"); + ITEMS.put("minecraft:waxed_weathered_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:waxed_weathered_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:waxed_weathered_copper_trapdoor", "minecraft:iron_trapdoor"); + ITEMS.put("minecraft:weathered_chiseled_copper", "minecraft:weathered_copper"); + ITEMS.put("minecraft:weathered_copper_bulb", "minecraft:weathered_copper"); + ITEMS.put("minecraft:weathered_copper_door", "minecraft:iron_door"); + ITEMS.put("minecraft:weathered_copper_grate", "minecraft:raw_iron_block"); + ITEMS.put("minecraft:weathered_copper_trapdoor", "minecraft:iron_trapdoor"); + + ITEMS.put("minecraft:crafter", "minecraft:crafting_table"); + } + + static GeyserMappingItem remapItem(@SuppressWarnings("unused") Item item, GeyserMappingItem mapping) { + String replacement = ITEMS.get(mapping.getBedrockIdentifier()); + if (replacement == null) { + return mapping; + } else { + return mapping.withBedrockIdentifier(replacement); + } + } + + static NbtMap remapBlock(NbtMap tag) { + final String name = tag.getString("name"); + + String replacement; + if (NEW_STONES.contains(name) || NEW_WOODS.contains(name)) { + + String typeKey; + String type = name.substring(10); + if (NEW_STONES.contains(name)) { + replacement = "minecraft:stone"; + typeKey = "stone_type"; + if (type.startsWith("polished_")) { + type = type.substring(9) + "_smooth"; + } + } else { + replacement = "minecraft:planks"; + typeKey = "wood_type"; + type = type.substring(0, type.indexOf("_planks")); + } + + return tag.toBuilder() + .putString("name", replacement) + .putCompound("states", NbtMap.builder().putString(typeKey, type).build()) + .build(); + } else if (name.contains("tuff") && !name.equals("minecraft:tuff")) { + + if (name.contains("brick") || name.contains("polished") || name.contains("chiseled")) { + replacement = name.replace("tuff", "deepslate"); + + if (name.contains("chiseled")) { + // chiseled deepslate bricks don't exist. just use chiseled deepslate instead + replacement = replacement.replace("_bricks", ""); + } + } else { + replacement = name.replace("tuff", "cobbled_deepslate"); + } + + return tag.toBuilder() + .putString("name", replacement) + .build(); + } else if (name.contains("copper")) { + + boolean removeStates = false; + if (name.contains("chiseled")) { + replacement = name.replace("_chiseled", ""); // special chiseled + replacement = replacement.replace("chiseled_", ""); // plain chiseled + } else if (name.endsWith("bulb")) { + replacement = name.replace("_bulb", ""); + removeStates = true; + } else if (name.endsWith("grate")) { + replacement = "minecraft:raw_iron_block"; + } else if (name.endsWith("door")) { + if (name.contains("trap")) { + replacement = "minecraft:iron_trapdoor"; + } else { + replacement = "minecraft:iron_door"; + } + } else { + return tag; + } + + if (replacement.endsWith(":copper")) { + // case for plain chiseled copper and plain bulb + replacement = replacement + "_block"; + } + + NbtMapBuilder builder = tag.toBuilder(); + builder.putString("name", replacement); + if (removeStates) { + builder.putCompound("states", NbtMap.EMPTY); + } + return builder.build(); + } else if (name.equals("minecraft:crafter")) { + NbtMapBuilder builder = tag.toBuilder(); + builder.put("name", "minecraft:crafting_table"); + builder.put("states", NbtMap.EMPTY); + return builder.build(); + } + + return tag; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 5aa24de1f41..74c0432b577 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -38,9 +38,6 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; -import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; -import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; -import org.cloudburstmc.protocol.bedrock.codec.v618.Bedrock_v618; import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; @@ -89,21 +86,8 @@ interface Remapper { } public static void populate() { - /* - Remapper remapper630 = (item, mapping) -> { - String id = item.javaIdentifier(); - // 1.20.50 replaced stone & planks to individual stone types - // E.g.: granite, diorite, andesite, polished variants, dark_oak_planks etc - if (mapping.getBedrockIdentifier().equals("minecraft:stone") || mapping.getBedrockIdentifier().equals("minecraft:planks")) { - return mapping.withBedrockIdentifier(id); - } - - return mapping; - }; - */ - List paletteVersions = new ArrayList<>(3); - //paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), remapper618)); // NO item changes between 1.20.30 and 1.20.40 + paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion630_622::remapItem)); // NO item changes between 1.20.30 and 1.20.40 paletteVersions.add(new PaletteVersion("1_20_50", Bedrock_v630.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); @@ -371,7 +355,7 @@ public static void populate() { if (customBlockItemOverride != null && customBlockData != null) { // Assuming this is a valid custom block override we'll just register it now while we have the creative item int customProtocolId = nextFreeBedrockId++; - mappingItem.setBedrockData(customProtocolId); + mappingItem = mappingItem.withBedrockData(customProtocolId); bedrockIdentifier = customBlockData.identifier(); definition = new SimpleItemDefinition(bedrockIdentifier, customProtocolId, true); registry.put(customProtocolId, definition); diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/GeyserMappingItem.java b/core/src/main/java/org/geysermc/geyser/registry/type/GeyserMappingItem.java index c1ef09b8718..ab8c52bf6f4 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/GeyserMappingItem.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/GeyserMappingItem.java @@ -30,7 +30,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import lombok.ToString; import lombok.With; @@ -40,7 +39,6 @@ @ToString @EqualsAndHashCode @Getter -@Setter @With @NoArgsConstructor @AllArgsConstructor diff --git a/core/src/main/resources/mappings b/core/src/main/resources/mappings index ad4b7952e99..2393a655595 160000 --- a/core/src/main/resources/mappings +++ b/core/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit ad4b7952e997aaff144e2ce80e9552c8db93b8f1 +Subproject commit 2393a655595abd8e0b93e88553d9d8d7cdbde95b From 22009054ab572eedf22122e200890d23cdd6b30b Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Sun, 3 Dec 2023 10:03:59 -0500 Subject: [PATCH 27/54] Crafter translation --- .../geyser/inventory/CrafterContainer.java | 61 +++++++ .../updater/CrafterInventoryUpdater.java | 94 ++++++++++ .../geysermc/geyser/network/GameProtocol.java | 5 + .../geyser/network/LoggingPacketHandler.java | 7 + .../inventory/CrafterInventoryTranslator.java | 168 ++++++++++++++++++ .../inventory/InventoryTranslator.java | 1 + .../DecoratedPotBlockEntityTranslator.java | 1 - .../TrialSpawnerBlockEntityTranslator.java | 42 +++++ ...ockToggleCrafterSlotRequestTranslator.java | 48 +++++ .../inventory/JavaOpenScreenTranslator.java | 10 +- gradle/libs.versions.toml | 2 +- 11 files changed, 436 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/inventory/CrafterContainer.java create mode 100644 core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/inventory/CrafterInventoryTranslator.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockToggleCrafterSlotRequestTranslator.java diff --git a/core/src/main/java/org/geysermc/geyser/inventory/CrafterContainer.java b/core/src/main/java/org/geysermc/geyser/inventory/CrafterContainer.java new file mode 100644 index 00000000000..bcacd3587dc --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/inventory/CrafterContainer.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.inventory; + +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; +import lombok.Getter; +import lombok.Setter; +import org.geysermc.geyser.GeyserImpl; + +@Getter +public class CrafterContainer extends Container { + + @Setter + private boolean triggered = false; + + /** + * Bedrock Edition bitmask of the *disabled* slots. + * Disabled slots are 1, enabled slots are 0 - same as Java Edition + */ + private short disabledSlotsMask = 0; + + public CrafterContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) { + super(title, id, size, containerType, playerInventory); + } + + public void setSlot(int slot, boolean enabled) { + if (slot < 0 || slot > 8) { + GeyserImpl.getInstance().getLogger().warning("Crafter slot out of bounds: " + slot); + return; + } + + if (enabled) { + disabledSlotsMask = (short) (disabledSlotsMask & ~(1 << slot)); + } else { + disabledSlotsMask = (short) (disabledSlotsMask | (1 << slot)); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java new file mode 100644 index 00000000000..4474d420ca5 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.inventory.updater; + +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; +import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; +import org.geysermc.geyser.inventory.Inventory; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.inventory.CrafterInventoryTranslator; +import org.geysermc.geyser.translator.inventory.InventoryTranslator; + +import java.util.Arrays; + +/** + * Read {@link CrafterInventoryTranslator} for context on the complete custom implementation here + */ +public class CrafterInventoryUpdater extends InventoryUpdater { + + public static final CrafterInventoryUpdater INSTANCE = new CrafterInventoryUpdater(); + + @Override + public void updateInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) { + ItemData[] bedrockItems; + InventoryContentPacket contentPacket; + + // crafter grid - but excluding the result slot + bedrockItems = new ItemData[CrafterInventoryTranslator.GRID_SIZE]; + for (int i = 0; i < bedrockItems.length; i++) { + bedrockItems[translator.javaSlotToBedrock(i)] = inventory.getItem(i).getItemData(session); + } + contentPacket = new InventoryContentPacket(); + contentPacket.setContainerId(inventory.getBedrockId()); + contentPacket.setContents(Arrays.asList(bedrockItems)); + session.sendUpstreamPacket(contentPacket); + + // inventory and hotbar + bedrockItems = new ItemData[36]; + for (int i = 0; i < 36; i++) { + final int offset = i < 9 ? 27 : -9; + bedrockItems[i] = inventory.getItem(CrafterInventoryTranslator.GRID_SIZE + i + offset).getItemData(session); + } + contentPacket = new InventoryContentPacket(); + contentPacket.setContainerId(ContainerId.INVENTORY); + contentPacket.setContents(Arrays.asList(bedrockItems)); + session.sendUpstreamPacket(contentPacket); + + // Crafter result - it doesn't come after the grid, as explained elsewhere. + updateSlot(translator, session, inventory, CrafterInventoryTranslator.JAVA_RESULT_SLOT); + } + + @Override + public boolean updateSlot(InventoryTranslator translator, GeyserSession session, Inventory inventory, int javaSlot) { + int containerId; + if (javaSlot < CrafterInventoryTranslator.GRID_SIZE || javaSlot == CrafterInventoryTranslator.JAVA_RESULT_SLOT) { + // Parts of the Crafter UI + // It doesn't seem like BDS sends the result slot, but sending it as slot 50 does actually work (it doesn't seem to show otherwise) + containerId = inventory.getBedrockId(); + } else { + containerId = ContainerId.INVENTORY; + } + + InventorySlotPacket packet = new InventorySlotPacket(); + packet.setContainerId(containerId); + packet.setSlot(translator.javaSlotToBedrock(javaSlot)); + packet.setItem(inventory.getItem(javaSlot).getItemData(session)); + session.sendUpstreamPacket(packet); + return true; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index e22d1da970c..c811afd2e10 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; +import org.geysermc.geyser.session.GeyserSession; import java.util.ArrayList; import java.util.List; @@ -81,6 +82,10 @@ public final class GameProtocol { /* Bedrock convenience methods to gatekeep features and easily remove the check on version removal */ + public static boolean isPre1_20_50(GeyserSession session) { + return session.getUpstream().getProtocolVersion() < Bedrock_v630.CODEC.getProtocolVersion(); + } + /** * Gets the {@link PacketCodec} for Minecraft: Java Edition. * diff --git a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java index 80e62489597..5076dbeb24c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/LoggingPacketHandler.java @@ -869,4 +869,11 @@ public PacketSignal handle(RequestAbilityPacket packet) { public PacketSignal handle(RequestNetworkSettingsPacket packet) { return defaultHandler(packet); } + + // todo: fix arrangement + + @Override + public PacketSignal handle(ToggleCrafterSlotRequestPacket packet) { + return defaultHandler(packet); + } } \ No newline at end of file diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/CrafterInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/CrafterInventoryTranslator.java new file mode 100644 index 00000000000..97398a2072e --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/CrafterInventoryTranslator.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.inventory; + +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequestSlotData; +import org.geysermc.geyser.inventory.BedrockContainerSlot; +import org.geysermc.geyser.inventory.CrafterContainer; +import org.geysermc.geyser.inventory.Inventory; +import org.geysermc.geyser.inventory.PlayerInventory; +import org.geysermc.geyser.inventory.SlotType; +import org.geysermc.geyser.inventory.updater.CrafterInventoryUpdater; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.BlockEntityUtils; + +/** + * Translates the Crafter. Most important thing to know about this class is that + * the result slot comes after the 3x3 grid AND the inventory. This means that the total size of the Crafter (10) + * cannot be used to calculate the inventory slot indices. The Translator and the Updater must then + * override any methods that use the size for such calculations + */ +public class CrafterInventoryTranslator extends AbstractBlockInventoryTranslator { + + public static final int JAVA_RESULT_SLOT = 45; + public static final int BEDROCK_RESULT_SLOT = 50; + public static final int GRID_SIZE = 9; + + // Properties + private static final int SLOT_ENABLED = 0; // enabled slot value + private static final int TRIGGERED_KEY = 9; // key of triggered state + private static final int TRIGGERED = 1; // triggered value + + public CrafterInventoryTranslator() { + super(10, "minecraft:crafter", org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType.CRAFTER, CrafterInventoryUpdater.INSTANCE); + } + + @Override + public void updateProperty(GeyserSession session, Inventory inventory, int key, int value) { + // the slot bits and triggered state are sent here rather than in a BlockEntityDataPacket. Yippee. + CrafterContainer container = (CrafterContainer) inventory; + + if (key == TRIGGERED_KEY) { + container.setTriggered(value == TRIGGERED); + } else { + // enabling and disabling slots of the 3x3 grid + container.setSlot(key, value == SLOT_ENABLED); + } + + // Unfortunately this will be called 10 times when a Crafter is opened + // Kind of unavoidable because it must be invoked anytime an individual property is updated + updateBlockEntity(session, container); + } + + @Override + public int bedrockSlotToJava(ItemStackRequestSlotData slotInfoData) { + int slot = slotInfoData.getSlot(); + switch (slotInfoData.getContainer()) { + case HOTBAR_AND_INVENTORY, HOTBAR, INVENTORY -> { + //hotbar + if (slot >= 9) { + return slot + GRID_SIZE - 9; + } else { + return slot + GRID_SIZE + 27; + } + } + } + return slot; + } + + @Override + public int javaSlotToBedrock(int slot) { + if (slot == JAVA_RESULT_SLOT) { + return BEDROCK_RESULT_SLOT; + } + + // grid slots 0-8 + if (slot < GRID_SIZE) { + return slot; + } + + // inventory and hotbar + final int tmp = slot - GRID_SIZE; + if (tmp < 27) { + return tmp + 9; + } else { + return tmp - 27; + } + } + + @Override + public BedrockContainerSlot javaSlotToBedrockContainer(int javaSlot) { + if (javaSlot == JAVA_RESULT_SLOT) { + return new BedrockContainerSlot(ContainerSlotType.CRAFTER_BLOCK_CONTAINER, BEDROCK_RESULT_SLOT); + } + + // grid slots 0-8 + if (javaSlot < GRID_SIZE) { + return new BedrockContainerSlot(ContainerSlotType.LEVEL_ENTITY, javaSlot); + } + + // inventory and hotbar + final int tmp = javaSlot - GRID_SIZE; + if (tmp < 27) { + return new BedrockContainerSlot(ContainerSlotType.INVENTORY, tmp + 9); + } else { + return new BedrockContainerSlot(ContainerSlotType.HOTBAR, tmp - 27); + } + } + + @Override + public SlotType getSlotType(int javaSlot) { + if (javaSlot == JAVA_RESULT_SLOT) { + return SlotType.OUTPUT; + } + return SlotType.NORMAL; + } + + @Override + public Inventory createInventory(String name, int windowId, ContainerType containerType, PlayerInventory playerInventory) { + // Java sends the triggered and slot bits incrementally through properties, which we store here + return new CrafterContainer(name, windowId, this.size, containerType, playerInventory); + } + + private static void updateBlockEntity(GeyserSession session, CrafterContainer container) { + /* + Here is an example of the tag sent by BDS 1.20.50.24 + It doesn't include the position or the block entity ID in the tag, for whatever reason. + + CLIENT BOUND BlockEntityDataPacket(blockPosition=(8, 110, 45), data={ + "crafting_ticks_remaining": 0i, + "disabled_slots": 511s + }) + */ + + NbtMapBuilder tag = NbtMap.builder(); + // just send some large amount since we don't know, and it'll be resent as 0 when java updates as not triggered + tag.putInt("crafting_ticks_remaining", container.isTriggered() ? 10_000 : 0); + tag.putShort("disabled_slots", container.getDisabledSlotsMask()); + + BlockEntityUtils.updateBlockEntity(session, tag.build(), container.getHolderPosition()); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java index 5262f048be7..b10fa85f0c1 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java @@ -86,6 +86,7 @@ public abstract class InventoryTranslator { put(ContainerType.BEACON, new BeaconInventoryTranslator()); put(ContainerType.BREWING_STAND, new BrewingInventoryTranslator()); put(ContainerType.CARTOGRAPHY, new CartographyInventoryTranslator()); + put(ContainerType.CRAFTER_3x3, new CrafterInventoryTranslator()); put(ContainerType.CRAFTING, new CraftingInventoryTranslator()); put(ContainerType.ENCHANTMENT, new EnchantingInventoryTranslator()); put(ContainerType.HOPPER, new HopperInventoryTranslator()); diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java index 9ff864101af..1774d9c76a0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java @@ -44,7 +44,6 @@ public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) if (tag == null) { return; } - // todo 1.20.3 maybe // exact same format if (tag.get("sherds") instanceof ListTag sherds) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java new file mode 100644 index 00000000000..93a4daba9b2 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.level.block.entity; + +import com.github.steveice10.mc.protocol.data.game.level.block.BlockEntityType; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import org.cloudburstmc.nbt.NbtMapBuilder; + +@BlockEntity(type = BlockEntityType.TRIAL_SPAWNER) +public class TrialSpawnerBlockEntityTranslator extends SpawnerBlockEntityTranslator { + + @Override + public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) { + if (tag != null) { + // todo 1.20.3 doesn't seem to work + super.translateTag(builder, tag, blockState); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockToggleCrafterSlotRequestTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockToggleCrafterSlotRequestTranslator.java new file mode 100644 index 00000000000..5c494cd88d6 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockToggleCrafterSlotRequestTranslator.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.bedrock; + +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerSlotStateChangedPacket; +import org.cloudburstmc.protocol.bedrock.packet.ToggleCrafterSlotRequestPacket; +import org.geysermc.geyser.inventory.CrafterContainer; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; + +@Translator(packet = ToggleCrafterSlotRequestPacket.class) +public class BedrockToggleCrafterSlotRequestTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ToggleCrafterSlotRequestPacket packet) { + if (!(session.getOpenInventory() instanceof CrafterContainer container)) { + return; + } + + // Note that the Bedrock packet uses disabled, whereas the java packet used enabled. + session.sendDownstreamGamePacket( + new ServerboundContainerSlotStateChangedPacket(packet.getSlot(), container.getJavaId(), !packet.isDisabled())); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaOpenScreenTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaOpenScreenTranslator.java index 8951f7171fe..1d0b4bf6356 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaOpenScreenTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaOpenScreenTranslator.java @@ -30,7 +30,9 @@ import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClosePacket; import net.kyori.adventure.text.Component; import org.geysermc.geyser.inventory.Inventory; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.inventory.OldSmithingTableTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; @@ -49,12 +51,18 @@ public void translate(GeyserSession session, ClientboundOpenScreenPacket packet) return; } - InventoryTranslator newTranslator = InventoryTranslator.inventoryTranslator(packet.getType()); + InventoryTranslator newTranslator; Inventory openInventory = session.getOpenInventory(); // Hack: ViaVersion translates the old (pre 1.20) smithing table to a furnace (does not work for Bedrock). We can detect this and translate it back to a smithing table. if (session.isOldSmithingTable() && packet.getType() == ContainerType.FURNACE && packet.getTitle().equals(SMITHING_TABLE_COMPONENT)) { newTranslator = OldSmithingTableTranslator.INSTANCE; + } else if (packet.getType() == ContainerType.CRAFTER_3x3 && GameProtocol.isPre1_20_50(session)) { + // Hack 2: Crafters are only supported by 1.20.50 and above. If 1.20.40 tries to open one, they'll get locked out of all inventories. + newTranslator = null; // close immediately below + session.sendMessage(ChatColor.RED + "Update your Bedrock Edition client to 1.20.50 or above to gain access to the Crafter."); + } else { + newTranslator = InventoryTranslator.inventoryTranslator(packet.getType()); } // No translator exists for this window type. Close all windows and return. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index faacaca2af3..e8cf9eaac5a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "c6ba2fa" +mcprotocollib = "11105ca" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" From 21a2c2332f56faf5564f1ff4fd01b06aec642b82 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:48:03 -0500 Subject: [PATCH 28/54] translate trial spawners, cleanup --- .../entity/SpawnerBlockEntityTranslator.java | 40 +++++++++++-------- .../TrialSpawnerBlockEntityTranslator.java | 13 ++++-- .../java/level/JavaBlockEventTranslator.java | 9 ----- .../java/level/JavaGameEventTranslator.java | 8 ++-- gradle/libs.versions.toml | 2 +- 5 files changed, 38 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java index 0aa8af27928..f2b0f5a783f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SpawnerBlockEntityTranslator.java @@ -29,6 +29,8 @@ import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; @@ -99,24 +101,28 @@ public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) builder.put("MinSpawnDelay", current.getValue()); } - CompoundTag spawnData = tag.get("SpawnData"); - if (spawnData != null) { - CompoundTag entityTag = spawnData.get("entity"); - if (entityTag.get("id") instanceof StringTag idTag) { - // As of 1.19.3, spawners can be empty - String entityId = idTag.getValue(); - builder.put("EntityIdentifier", entityId); - - EntityDefinition definition = Registries.JAVA_ENTITY_IDENTIFIERS.get(entityId); - if (definition != null) { - builder.put("DisplayEntityWidth", definition.width()); - builder.put("DisplayEntityHeight", definition.height()); - builder.put("DisplayEntityScale", 1.0f); - } - } - } + translateSpawnData(builder, tag.get("SpawnData")); - builder.put("id", "MobSpawner"); builder.put("isMovable", (byte) 1); } + + static void translateSpawnData(@NonNull NbtMapBuilder builder, @Nullable CompoundTag spawnData) { + if (spawnData == null) { + return; + } + + CompoundTag entityTag = spawnData.get("entity"); + if (entityTag.get("id") instanceof StringTag idTag) { + // As of 1.19.3, spawners can be empty + String entityId = idTag.getValue(); + builder.put("EntityIdentifier", entityId); + + EntityDefinition definition = Registries.JAVA_ENTITY_IDENTIFIERS.get(entityId); + if (definition != null) { + builder.put("DisplayEntityWidth", definition.width()); + builder.put("DisplayEntityHeight", definition.height()); + builder.put("DisplayEntityScale", 1.0f); + } + } + } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java index 93a4daba9b2..a6a99d86811 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/TrialSpawnerBlockEntityTranslator.java @@ -30,13 +30,18 @@ import org.cloudburstmc.nbt.NbtMapBuilder; @BlockEntity(type = BlockEntityType.TRIAL_SPAWNER) -public class TrialSpawnerBlockEntityTranslator extends SpawnerBlockEntityTranslator { +public class TrialSpawnerBlockEntityTranslator extends BlockEntityTranslator { @Override public void translateTag(NbtMapBuilder builder, CompoundTag tag, int blockState) { - if (tag != null) { - // todo 1.20.3 doesn't seem to work - super.translateTag(builder, tag, blockState); + if (tag == null) { + return; } + + // trial spawners have "spawn_data" instead of "SpawnData" + SpawnerBlockEntityTranslator.translateSpawnData(builder, tag.get("spawn_data")); + + // Because trial spawners don't exist on bedrock yet + builder.put("id", "MobSpawner"); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java index 49c54409b08..28fd2401b5f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaBlockEventTranslator.java @@ -33,7 +33,6 @@ import org.cloudburstmc.protocol.bedrock.packet.BlockEntityDataPacket; import org.cloudburstmc.protocol.bedrock.packet.BlockEventPacket; import it.unimi.dsi.fastutil.objects.Object2IntMaps; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.level.block.BlockStateValues; import org.geysermc.geyser.level.physics.Direction; @@ -128,14 +127,6 @@ public void translate(GeyserSession session, ClientboundBlockEventPacket packet) blockEntityPacket.setData(builder.build()); session.sendUpstreamPacket(blockEntityPacket); - } else if (value instanceof DecoratedPotValue) { - // todo 1.20.3 - } else if (value instanceof GenericBlockValue genericValue) { - if (genericValue.getValue() != 0) { - GeyserImpl.getInstance().getLogger().warning("Nonzero generic block value: " + packet); - } - } else { - GeyserImpl.getInstance().getLogger().warning("Unhandled non-generic block event: " + packet); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java index bbade18af51..f2d60fe343a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaGameEventTranslator.java @@ -142,7 +142,8 @@ public void translate(GeyserSession session, ClientboundGameEventPacket packet) } break; case AFFECTED_BY_ELDER_GUARDIAN: - // todo 1.20.3 does this play a sound? this game event has a value for audible or not + // note: There is a ElderGuardianEffectValue that determines if a sound should be made or not, + // but that doesn't seem to be controllable on Bedrock Edition EntityEventPacket eventPacket = new EntityEventPacket(); eventPacket.setType(EntityEventType.ELDER_GUARDIAN_CURSE); eventPacket.setData(0); @@ -168,9 +169,10 @@ public void translate(GeyserSession session, ClientboundGameEventPacket packet) arrowSoundPacket.setPosition(entity.getPosition()); session.sendUpstreamPacket(arrowSoundPacket); break; - case PUFFERFISH_STING_SOUND: - // todo 1.20.3 was this accidentally not implemented? default: + // DEMO_MESSAGE - for JE game demo + // LEVEL_CHUNKS_LOAD_START - ??? + // PUFFERFISH_STING_SOUND - doesn't exist on bedrock break; } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8cf9eaac5a..4db6a03a26e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "11105ca" +mcprotocollib = "7123bf9" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" From d3a4b1336433318721e4713acb83059be6e08d94 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:22:40 -0500 Subject: [PATCH 29/54] cleanup --- README.md | 2 +- .../main/java/org/geysermc/geyser/network/GameProtocol.java | 4 +++- .../geyser/registry/populator/Conversion630_622.java | 2 +- .../geyser/registry/populator/ItemRegistryPopulator.java | 2 +- .../protocol/java/level/JavaLevelEventTranslator.java | 2 +- .../protocol/java/scoreboard/JavaSetScoreTranslator.java | 5 +++-- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1663c493ad3..bdd8cbe9823 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! -### Currently supporting Minecraft Bedrock 1.20.40 - 1.20.50 and Minecraft Java 1.20.3 +### Currently supporting Minecraft Bedrock 1.20.40 - 1.20.51 and Minecraft Java 1.20.4 ## Setting Up Take a look [here](https://wiki.geysermc.org/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index c811afd2e10..42cce607b5b 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -63,7 +63,9 @@ public final class GameProtocol { SUPPORTED_BEDROCK_CODECS.add(Bedrock_v622.CODEC.toBuilder() .minecraftVersion("1.20.40/1.20.41") .build()); - SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); + SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder() + .minecraftVersion("1.20.50/1.20.51") + .build()); } /** diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java index 9404774b8a5..7c1453dc76d 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion630_622.java @@ -37,7 +37,7 @@ /** * Backwards-maps the blocks and items of 1.20.50 (630) to 1.20.40 (622) */ -public class Conversion630_622 { +class Conversion630_622 { private static final List NEW_STONES = List.of("minecraft:stone", "minecraft:granite", "minecraft:polished_granite", "minecraft:diorite", "minecraft:polished_diorite", "minecraft:andesite", "minecraft:polished_andesite"); private static final List NEW_WOODS = List.of("minecraft:oak_planks", "minecraft:spruce_planks", "minecraft:birch_planks", "minecraft:jungle_planks", "minecraft:acacia_planks", "minecraft:dark_oak_planks"); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 74c0432b577..bc2cf4a43ff 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -87,7 +87,7 @@ interface Remapper { public static void populate() { List paletteVersions = new ArrayList<>(3); - paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion630_622::remapItem)); // NO item changes between 1.20.30 and 1.20.40 + paletteVersions.add(new PaletteVersion("1_20_40", Bedrock_v622.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion630_622::remapItem)); paletteVersions.add(new PaletteVersion("1_20_50", Bedrock_v630.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java index 64d530a1f2d..843f3d514b7 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaLevelEventTranslator.java @@ -336,7 +336,7 @@ public void translate(GeyserSession session, ClientboundLevelEventPacket packet) return; } default -> { - GeyserImpl.getInstance().getLogger().warning("Unhandled level event: " + packet.getEvent()); + GeyserImpl.getInstance().getLogger().debug("Unhandled level event: " + packet.getEvent()); return; } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java index 362fb29e85e..594e2cbed97 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/scoreboard/JavaSetScoreTranslator.java @@ -27,6 +27,7 @@ import com.github.steveice10.mc.protocol.data.game.scoreboard.ScoreboardPosition; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.scoreboard.ClientboundSetScorePacket; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.packet.SetEntityDataPacket; import org.geysermc.geyser.GeyserImpl; @@ -86,7 +87,7 @@ public void translate(GeyserSession session, ClientboundSetScorePacket packet) { /** * @param objective the objective that currently resides on the below name display slot */ - protected static void setBelowName(GeyserSession session, Objective objective, String username, int count) { + static void setBelowName(GeyserSession session, Objective objective, String username, int count) { PlayerEntity entity = getOtherPlayerEntity(session, username); if (entity == null) { return; @@ -102,7 +103,7 @@ protected static void setBelowName(GeyserSession session, Objective objective, S session.sendUpstreamPacket(entityDataPacket); } - private static PlayerEntity getOtherPlayerEntity(GeyserSession session, String username) { + private static @Nullable PlayerEntity getOtherPlayerEntity(GeyserSession session, String username) { // We don't care about the session player, because... they're not going to be seeing their own score if (session.getPlayerEntity().getUsername().equals(username)) { return null; From 42949823103499cac5b1dd63f7f89904610d98ba Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:30:50 -0500 Subject: [PATCH 30/54] fabric: require 1.20.4 as ViaFabric doesn't support 1.20.2 --- bootstrap/fabric/build.gradle.kts | 2 +- gradle/libs.versions.toml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bootstrap/fabric/build.gradle.kts b/bootstrap/fabric/build.gradle.kts index 83d6a48d070..ea1fef2b734 100644 --- a/bootstrap/fabric/build.gradle.kts +++ b/bootstrap/fabric/build.gradle.kts @@ -119,7 +119,7 @@ modrinth { syncBodyFrom.set(rootProject.file("README.md").readText()) uploadFile.set(tasks.getByPath("remapModrinthJar")) - gameVersions.addAll("1.20.3") + gameVersions.addAll("1.20.4") loaders.add("fabric") failSilently.set(true) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4db6a03a26e..eb1008cd344 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "7123bf9" +mcprotocollib = "723fbb3" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" @@ -28,9 +28,9 @@ adapters = "1.10-SNAPSHOT" commodore = "2.2" bungeecord = "a7c6ede" velocity = "3.1.1" -fabric-minecraft = "1.20.2" -fabric-loader = "0.14.21" -fabric-api = "0.89.0+1.20.2" +fabric-minecraft = "1.20.4" +fabric-loader = "0.15.2" +fabric-api = "0.91.2+1.20.4" [libraries] base-api = { group = "org.geysermc.api", name = "base-api", version.ref = "base-api" } From a13492e0ed4434670d6be354b7fb25340a5b18d3 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:08:34 -0500 Subject: [PATCH 31/54] Final 1.20.4 cleanup --- .../geyser/platform/bungeecord/GeyserBungeePlugin.java | 2 +- bootstrap/fabric/src/main/resources/fabric.mod.json | 4 ++-- .../geyser/translator/inventory/InventoryTranslator.java | 2 +- core/src/main/resources/mappings | 2 +- gradle/libs.versions.toml | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java index c4eea66b8f5..c5d5cdaccb0 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java @@ -80,7 +80,7 @@ public void onLoad() { // Copied from ViaVersion. // https://github.com/ViaVersion/ViaVersion/blob/b8072aad86695cc8ec6f5e4103e43baf3abf6cc5/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java#L43 try { - ProtocolConstants.class.getField("MINECRAFT_1_20_2"); + ProtocolConstants.class.getField("MINECRAFT_1_20_3"); } catch (NoSuchFieldException e) { getLogger().warning(" / \\"); getLogger().warning(" / \\"); diff --git a/bootstrap/fabric/src/main/resources/fabric.mod.json b/bootstrap/fabric/src/main/resources/fabric.mod.json index f401e8f23d8..a192109e258 100644 --- a/bootstrap/fabric/src/main/resources/fabric.mod.json +++ b/bootstrap/fabric/src/main/resources/fabric.mod.json @@ -23,9 +23,9 @@ "geyser-fabric.mixins.json" ], "depends": { - "fabricloader": ">=0.14.21", + "fabricloader": ">=0.15.2", "fabric": "*", - "minecraft": ">=1.20.2", + "minecraft": ">=1.20.4", "fabric-permissions-api-v0": "*" } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java index b10fa85f0c1..95ec9941275 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java @@ -86,7 +86,7 @@ public abstract class InventoryTranslator { put(ContainerType.BEACON, new BeaconInventoryTranslator()); put(ContainerType.BREWING_STAND, new BrewingInventoryTranslator()); put(ContainerType.CARTOGRAPHY, new CartographyInventoryTranslator()); - put(ContainerType.CRAFTER_3x3, new CrafterInventoryTranslator()); + //put(ContainerType.CRAFTER_3x3, new CrafterInventoryTranslator()); todo Output slot is currently broken put(ContainerType.CRAFTING, new CraftingInventoryTranslator()); put(ContainerType.ENCHANTMENT, new EnchantingInventoryTranslator()); put(ContainerType.HOPPER, new HopperInventoryTranslator()); diff --git a/core/src/main/resources/mappings b/core/src/main/resources/mappings index 2393a655595..522967d6ee7 160000 --- a/core/src/main/resources/mappings +++ b/core/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit 2393a655595abd8e0b93e88553d9d8d7cdbde95b +Subproject commit 522967d6ee76972994ad05a992dc9d7bb4e889ba diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eb1008cd344..71d416f7221 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "723fbb3" +mcprotocollib = "1.20.4-1-20231214.212857-1" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" @@ -87,7 +87,7 @@ guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" } mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" } -mcprotocollib = { group = "com.github.GeyserMC", name = "MCProtocolLib", version.ref = "mcprotocollib" } +mcprotocollib = { group = "com.github.steveice10", name = "mcprotocollib", version.ref = "mcprotocollib" } raknet = { group = "org.cloudburstmc.netty", name = "netty-transport-raknet", version.ref = "raknet" } terminalconsoleappender = { group = "net.minecrell", name = "terminalconsoleappender", version.ref = "terminalconsoleappender" } velocity-api = { group = "com.velocitypowered", name = "velocity-api", version.ref = "velocity" } From aaf38f46fb32c4aaf984b535d5dcc593bdab7390 Mon Sep 17 00:00:00 2001 From: Kas-tle <26531652+Kas-tle@users.noreply.github.com> Date: Thu, 14 Dec 2023 17:47:00 -0800 Subject: [PATCH 32/54] Target Java 17 --- bootstrap/fabric/build.gradle.kts | 6 ------ .../src/main/kotlin/geyser.base-conventions.gradle.kts | 2 +- build.gradle.kts | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/bootstrap/fabric/build.gradle.kts b/bootstrap/fabric/build.gradle.kts index ea1fef2b734..66af130b3b0 100644 --- a/bootstrap/fabric/build.gradle.kts +++ b/bootstrap/fabric/build.gradle.kts @@ -5,12 +5,6 @@ plugins { id("com.modrinth.minotaur") version "2.+" } -indra { - javaVersions { - target(17) - } -} - dependencies { //to change the versions see the gradle.properties file minecraft(libs.fabric.minecraft) diff --git a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts index 95d4d5409fc..01c7697338f 100644 --- a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts @@ -16,7 +16,7 @@ indra { mitLicense() javaVersions { - target(16) + target(17) } } diff --git a/build.gradle.kts b/build.gradle.kts index d7360b7019d..a72b8a48460 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ allprojects { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(16)) + languageVersion.set(JavaLanguageVersion.of(17)) } } From 6e56666be2dec365125e5a1eca76aa26efec6ee0 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Fri, 15 Dec 2023 00:31:51 -0500 Subject: [PATCH 33/54] Update spigot adapters to include 1.20.4 (#4340) --- 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 71d416f7221..0974f7b81d3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ jline = "3.21.0" terminalconsoleappender = "1.2.0" folia = "1.19.4-R0.1-SNAPSHOT" viaversion = "4.0.0" -adapters = "1.10-SNAPSHOT" +adapters = "1.11-SNAPSHOT" commodore = "2.2" bungeecord = "a7c6ede" velocity = "3.1.1" From 58ff00db961641164411564fe1c6d9406750f991 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sat, 16 Dec 2023 23:42:59 +0100 Subject: [PATCH 34/54] Fixed an issue where there would be a null score in SetScorePacket --- .../java/org/geysermc/geyser/scoreboard/Scoreboard.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java b/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java index 1e0ea5eb18d..216370bdea0 100644 --- a/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java +++ b/core/src/main/java/org/geysermc/geyser/scoreboard/Scoreboard.java @@ -258,7 +258,12 @@ private void handleObjective(Objective objective, List addScores, Lis for (Score score : objective.getScores().values()) { if (score.getUpdateType() == REMOVE) { - removeScores.add(score.getCachedInfo()); + ScoreInfo cachedInfo = score.getCachedInfo(); + // cachedInfo can be null here when ScoreboardUpdater is being used and a score is added and + // removed before a single update cycle is performed + if (cachedInfo != null) { + removeScores.add(cachedInfo); + } // score is pending to be removed, so we can remove it from the objective objective.removeScore0(score.getName()); break; From af83e9269d7a4a166f3d682419259da549a7c194 Mon Sep 17 00:00:00 2001 From: Konicai <71294714+Konicai@users.noreply.github.com> Date: Tue, 19 Dec 2023 02:57:34 -0500 Subject: [PATCH 35/54] Fix (de)serialization of ClientboundExplodePacket (#4351) --- 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 0974f7b81d3..dd4c133ad95 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-connection = "3.0.0.Beta1-20231107.190703-112" raknet = "1.0.0.CR1-20230703.195238-9" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" -mcprotocollib = "1.20.4-1-20231214.212857-1" +mcprotocollib = "1.20.4-2-20231219.074138-2" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" From f3e56d282ebcb4fa298a8cb2c3696ee013d1a9d5 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 20 Dec 2023 16:35:48 +0100 Subject: [PATCH 36/54] Gracefully fail on older spigot builds due to outdated netty (#4355) * Test for outdated netty to avoid https://github.com/GeyserMC/Geyser/issues/3814 * capitalization * bad spigot, go paper --- .../geyser/platform/spigot/GeyserSpigotPlugin.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java index 02ea91cf2e6..62a1e3f028d 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java @@ -135,6 +135,17 @@ public void onLoad() { } } + try { + Class.forName("io.netty.util.internal.ObjectPool.ObjectCreator"); + } catch (ClassNotFoundException e) { + getLogger().severe("*********************************************"); + getLogger().severe(""); + getLogger().severe("This version of Spigot is using an outdated version of netty. Please use Paper instead!"); + getLogger().severe(""); + getLogger().severe("*********************************************"); + return; + } + // This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed try { if (!getDataFolder().exists()) { From 32a8573651c3d600ab05e21c1f92a4cea6899e4e Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 20 Dec 2023 17:59:51 +0100 Subject: [PATCH 37/54] Fix broken netty util class check (#4357) --- .../org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java index 62a1e3f028d..a2a08c3bfb9 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java @@ -136,7 +136,7 @@ public void onLoad() { } try { - Class.forName("io.netty.util.internal.ObjectPool.ObjectCreator"); + Class.forName("io.netty.util.internal.ObjectPool$ObjectCreator"); } catch (ClassNotFoundException e) { getLogger().severe("*********************************************"); getLogger().severe(""); From cdb8ab344cfda20a37994d5dd59cf692cdd786d4 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 20 Dec 2023 23:48:51 +0100 Subject: [PATCH 38/54] bump cloudburst/netty dependencies (#4354) * bump cloudburst's netty-transport-raknet * bump cloudburst protocol/codec/connection bump bump netty due CVE-2022-41881 Changes in cloudburst libs: - uses netty 4.1.101.Final - bumps netty-transport-raknet which fixes https://github.com/CloudburstMC/Network/pull/36, an issue where some connection attempts did not work --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd4c133ad95..c71aa715fd0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,13 +5,13 @@ erosion = "1.0-20230406.174837-8" events = "1.1-SNAPSHOT" jackson = { strictly = "2.14.0" } # Don't let other dependencies override fastutil = "8.5.2" -netty = "4.1.80.Final" +netty = "4.1.103.Final" guava = "29.0-jre" gson = "2.3.1" # Provided by Spigot 1.8.8 websocket = "1.5.1" -protocol = "3.0.0.Beta1-20231107.190703-113" -protocol-connection = "3.0.0.Beta1-20231107.190703-112" -raknet = "1.0.0.CR1-20230703.195238-9" +protocol = "3.0.0.Beta1-20231206.150507-114" +protocol-connection = "3.0.0.Beta1-20231206.150507-113" +raknet = "1.0.0.CR1-20231206.145325-12" blockstateupdater="1.20.50-20231106.161340-1" mcauthlib = "d9d773e" mcprotocollib = "1.20.4-2-20231219.074138-2" From 0b6f558e01f187a3839107dd0cbd9dce08401604 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Thu, 21 Dec 2023 11:04:12 +0100 Subject: [PATCH 39/54] init: neoforge 1.20.4 support --- .github/workflows/build.yml | 4 ++-- .github/workflows/pullrequest.yml | 2 +- bootstrap/mod/build.gradle.kts | 2 +- bootstrap/mod/forge/gradle.properties | 1 - .../mod/{forge => neoforge}/build.gradle.kts | 19 ++++++++++-------- bootstrap/mod/neoforge/gradle.properties | 1 + .../neoforge}/GeyserForgeBootstrap.java | 8 ++++---- .../neoforge}/GeyserForgeDumpInfo.java | 6 +++--- .../platform/neoforge}/GeyserForgeMain.java | 6 +++--- .../GeyserForgePermissionHandler.java | 2 +- .../neoforge/GeyserNeoforgePlatform.java} | 12 +++++------ .../platform/neoforge}/ModConstants.java | 4 ++-- .../src/main/resources/META-INF/mods.toml | 8 ++++---- .../assets/geyser_neoforge}/icon.png | Bin build-logic/build.gradle.kts | 4 ++-- .../geyser.modded-conventions.gradle.kts | 4 +++- build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 ++-- settings.gradle.kts | 14 ++++++++----- 19 files changed, 56 insertions(+), 47 deletions(-) delete mode 100644 bootstrap/mod/forge/gradle.properties rename bootstrap/mod/{forge => neoforge}/build.gradle.kts (66%) create mode 100644 bootstrap/mod/neoforge/gradle.properties rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge}/GeyserForgeBootstrap.java (93%) rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge}/GeyserForgeDumpInfo.java (94%) rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge}/GeyserForgeMain.java (91%) rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge}/GeyserForgePermissionHandler.java (99%) rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePlatform.java => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java} (88%) rename bootstrap/mod/{forge/src/main/java/org/geysermc/geyser/platform/forge => neoforge/src/main/java/org/geysermc/geyser/platform/neoforge}/ModConstants.java (92%) rename bootstrap/mod/{forge => neoforge}/src/main/resources/META-INF/mods.toml (72%) rename bootstrap/mod/{forge/src/main/resources/assets/geyser_forge => neoforge/src/main/resources/assets/geyser_neoforge}/icon.png (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a740062fcb1..bb7f720fa0f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,7 +54,7 @@ jobs: if: success() with: name: Geyser Forge - path: bootstrap/mod/forge/build/libs/Geyser-Forge.jar + path: bootstrap/mod/neoforge/build/libs/Geyser-Forge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 @@ -133,7 +133,7 @@ jobs: env: MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} with: - arguments: forge:modrinth + arguments: neoforge:modrinth gradle-home-cache-cleanup: true - name: Notify Discord diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 8ea35c733c1..d1ed73dc3d0 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -64,7 +64,7 @@ jobs: if: success() with: name: Geyser Forge - path: geyser/bootstrap/mod/forge/build/libs/Geyser-Forge.jar + path: geyser/bootstrap/mod/neoforge/build/libs/Geyser-Forge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index beb196ad936..0a8171f3a5d 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -1,5 +1,5 @@ architectury { - common("forge", "fabric") + common("neoforge", "fabric") } dependencies { diff --git a/bootstrap/mod/forge/gradle.properties b/bootstrap/mod/forge/gradle.properties deleted file mode 100644 index 32f842a63cf..00000000000 --- a/bootstrap/mod/forge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=forge \ No newline at end of file diff --git a/bootstrap/mod/forge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts similarity index 66% rename from bootstrap/mod/forge/build.gradle.kts rename to bootstrap/mod/neoforge/build.gradle.kts index a1edd55fc6f..324ca785873 100644 --- a/bootstrap/mod/forge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -4,24 +4,27 @@ plugins { architectury { platformSetupLoomIde() - forge() + neoForge() } loom { - forge { + /* + neoForge { mixinConfig("geyser.mixins.json") } + + */ } dependencies { - forge(libs.forge.minecraft) + neoForge(libs.neoforge.minecraft) api(projects.mod) shadow(project(path = ":mod", configuration = "transformProductionForge")) { isTransitive = false } shadow(projects.core) { - exclude(group = "com.google.guava", module = "guava") + //exclude(group = "com.google.guava", module = "guava") exclude(group = "com.google.code.gson", module = "gson") exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") @@ -30,7 +33,7 @@ dependencies { } application { - mainClass.set("org.geysermc.geyser.platform.forge.GeyserForgeMain") + mainClass.set("org.geysermc.geyser.platform.forge.GeyserNeoforgeMain") } tasks { @@ -39,14 +42,14 @@ tasks { } remapJar { - archiveBaseName.set("Geyser-Forge") + archiveBaseName.set("Geyser-Neoforge") } remapModrinthJar { - archiveBaseName.set("geyser-forge") + archiveBaseName.set("geyser-neoforge") } } modrinth { - loaders.add("forge") + loaders.add("neoforge") } \ No newline at end of file diff --git a/bootstrap/mod/neoforge/gradle.properties b/bootstrap/mod/neoforge/gradle.properties new file mode 100644 index 00000000000..2914393db46 --- /dev/null +++ b/bootstrap/mod/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeBootstrap.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java similarity index 93% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeBootstrap.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java index dcb80b07eea..146dbfc4b8a 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeBootstrap.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java @@ -42,11 +42,11 @@ import java.util.concurrent.ExecutorService; @Mod(ModConstants.MOD_ID) -public class GeyserForgeBootstrap extends GeyserModBootstrap { - private final GeyserForgePermissionHandler permissionHandler = new GeyserForgePermissionHandler(); +public class GeyserNeoforgeBootstrap extends GeyserModBootstrap { + private final GeyserNeoforgePermissionHandler permissionHandler = new GeyserNeoforgePermissionHandler(); - public GeyserForgeBootstrap() { - super(new GeyserForgePlatform()); + public GeyserNeoforgeBootstrap() { + super(new GeyserNeoforgePlatform()); this.onEnable(); diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeDumpInfo.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java similarity index 94% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeDumpInfo.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java index 4395d17956a..08d47e1a44a 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeDumpInfo.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java @@ -23,7 +23,7 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; import lombok.AllArgsConstructor; import lombok.Getter; @@ -40,7 +40,7 @@ import java.util.List; @Getter -public class GeyserForgeDumpInfo extends BootstrapDumpInfo { +public class GeyserNeoforgeDumpInfo extends BootstrapDumpInfo { private String platformVersion = null; private final Dist dist; @@ -50,7 +50,7 @@ public class GeyserForgeDumpInfo extends BootstrapDumpInfo { private final int serverPort; private final List mods; - public GeyserForgeDumpInfo(MinecraftServer server) { + public GeyseNeoforgeDumpInfo(MinecraftServer server) { this.platformVersion = FMLLoader.versionInfo().mcAndForgeVersion(); this.dist = FMLLoader.getDist(); this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp(); diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeMain.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java similarity index 91% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeMain.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java index b0be8172d9c..3e6910b549c 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgeMain.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java @@ -27,15 +27,15 @@ import org.geysermc.geyser.GeyserMain; -public class GeyserForgeMain extends GeyserMain { +public class GeyserNeoforgeMain extends GeyserMain { public static void main(String[] args) { - new GeyserForgeMain().displayMessage(); + new GeyserNeoforgeMain().displayMessage(); } @Override public String getPluginType() { - return "Forge"; + return "Neoforge"; } @Override diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePermissionHandler.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java similarity index 99% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePermissionHandler.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java index 5067aa9b75e..9fbbb5344c0 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePermissionHandler.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java @@ -44,7 +44,7 @@ import java.util.HashMap; import java.util.Map; -public class GeyserForgePermissionHandler { +public class GeyserNeoforgePermissionHandler { private static final Constructor PERMISSION_NODE_CONSTRUCTOR; static { diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePlatform.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java similarity index 88% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePlatform.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java index 3e4931c8b5b..817bdae502f 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/GeyserForgePlatform.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java @@ -23,7 +23,7 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; import net.minecraft.server.MinecraftServer; import net.minecraftforge.fml.loading.FMLPaths; @@ -38,16 +38,16 @@ import java.io.InputStream; import java.nio.file.Path; -public class GeyserForgePlatform implements GeyserModPlatform { +public class GeyserNeoforgePlatform implements GeyserModPlatform { @Override public @NotNull PlatformType platformType() { - return PlatformType.FORGE; + return PlatformType.NEOFORGE; } @Override public @NotNull String configPath() { - return "Geyser-Forge"; + return "Geyser-Neoforge"; } @Override @@ -57,12 +57,12 @@ public class GeyserForgePlatform implements GeyserModPlatform { @Override public @NotNull BootstrapDumpInfo dumpInfo(@NotNull MinecraftServer server) { - return new GeyserForgeDumpInfo(server); + return new GeyserNeoforgeDumpInfo(server); } @Override public boolean testFloodgatePluginPresent(@NotNull GeyserModBootstrap bootstrap) { - return false; // No Floodgate plugin for Forge + return false; // No Floodgate plugin for Forge yet } @Override diff --git a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/ModConstants.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/ModConstants.java similarity index 92% rename from bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/ModConstants.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/ModConstants.java index fba0a725af8..aa72bb2a028 100644 --- a/bootstrap/mod/forge/src/main/java/org/geysermc/geyser/platform/forge/ModConstants.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/ModConstants.java @@ -23,8 +23,8 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; public class ModConstants { - public static final String MOD_ID = "geyser_forge"; + public static final String MOD_ID = "geyser_neoforge"; } diff --git a/bootstrap/mod/forge/src/main/resources/META-INF/mods.toml b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml similarity index 72% rename from bootstrap/mod/forge/src/main/resources/META-INF/mods.toml rename to bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml index 7cc31685ddd..74b9083743a 100644 --- a/bootstrap/mod/forge/src/main/resources/META-INF/mods.toml +++ b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml @@ -2,19 +2,19 @@ modLoader="javafml" loaderVersion="[46,)" license="MIT" [[mods]] -modId="geyser_forge" +modId="geyser_neoforge" version="${version}" displayName="Geyser" -logoFile= "../assets/geyser_forge/icon.png" +logoFile= "../assets/geyser_neoforge/icon.png" authors="GeyserMC" description="${description}" -[[dependencies.geyser_forge]] +[[dependencies.geyser_neoforge]] modId="forge" mandatory=true versionRange="[46,)" ordering="NONE" side="BOTH" -[[dependencies.geyser_forge]] +[[dependencies.geyser_neoforge]] modId="minecraft" mandatory=true versionRange="[1.20,1.21)" diff --git a/bootstrap/mod/forge/src/main/resources/assets/geyser_forge/icon.png b/bootstrap/mod/neoforge/src/main/resources/assets/geyser_neoforge/icon.png similarity index 100% rename from bootstrap/mod/forge/src/main/resources/assets/geyser_forge/icon.png rename to bootstrap/mod/neoforge/src/main/resources/assets/geyser_neoforge/icon.png diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index de2c3a5b121..ec5140e7795 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -7,7 +7,7 @@ repositories { maven("https://repo.opencollab.dev/maven-snapshots/") maven("https://maven.fabricmc.net/") - maven("https://maven.minecraftforge.net/") + maven("https://maven.neoforged.net/releases") maven("https://maven.architectury.dev/") } @@ -15,7 +15,7 @@ dependencies { implementation("net.kyori", "indra-common", "3.1.1") implementation("com.github.johnrengelman", "shadow", "7.1.3-SNAPSHOT") implementation("architectury-plugin", "architectury-plugin.gradle.plugin", "3.4-SNAPSHOT") - implementation("dev.architectury.loom", "dev.architectury.loom.gradle.plugin", "1.1-SNAPSHOT") + implementation("dev.architectury.loom", "dev.architectury.loom.gradle.plugin", "1.4-SNAPSHOT") implementation("com.modrinth.minotaur:Minotaur:2.7.5") // Within the gradle plugin classpath, there is a version conflict between loom and some other diff --git a/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts b/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts index 7846c15de04..5b6c8d5db8b 100644 --- a/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts @@ -2,6 +2,7 @@ import net.fabricmc.loom.task.RemapJarTask import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.maven plugins { id("geyser.publish-conventions") @@ -16,7 +17,7 @@ architectury { loom { silentMojangMappingsLicense() - mixin.defaultRefmapName.set("geyser-mod-refmap.json") + //mixin.defaultRefmapName.set("geyser-mod-refmap.json") } tasks { @@ -84,6 +85,7 @@ repositories { maven("https://jitpack.io") maven("https://oss.sonatype.org/content/repositories/snapshots/") maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") + maven("https://maven.neoforged.net/releases") } modrinth { diff --git a/build.gradle.kts b/build.gradle.kts index 529fe27e9a2..882b65adba7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,7 +27,7 @@ val basePlatforms = setOf( val moddedPlatforms = setOf( projects.fabric, - projects.forge, + projects.neoforge, projects.mod ).map { it.dependencyProject } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 994d5a3a7cc..22a0425052c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,7 +31,7 @@ velocity = "3.1.1" fabric-minecraft = "1.20.4" fabric-loader = "0.15.2" fabric-api = "0.91.2+1.20.4" -forge-minecraft = "1.20.2-48.0.31" //TODO +neoforge-minecraft = "20.4.48-beta" mixin = "0.8.5" [libraries] @@ -83,7 +83,7 @@ fabric-minecraft = { group = "com.mojang", name = "minecraft", version.ref = "fa 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" } -forge-minecraft = { group = "net.minecraftforge", name = "forge", version.ref = "forge-minecraft" } +neoforge-minecraft = { group = "net.neoforged", name = "neoforge", version.ref = "neoforge-minecraft" } adapters-spigot = { group = "org.geysermc.geyser.adapters", name = "spigot-all", version.ref = "adapters" } bungeecord-proxy = { group = "com.github.SpigotMC.BungeeCord", name = "bungeecord-proxy", version.ref = "bungeecord" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2745996e051..459c5256332 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,8 +18,11 @@ dependencyResolutionManagement { mavenContent { snapshotsOnly() } } - // Forge - maven("https://maven.minecraftforge.net/") + // Neoforge + maven("https://maven.neoforged.net/releases") { + mavenContent { releasesOnly() } + } + maven("https://maven.neoforged.net/") // Minecraft maven("https://libraries.minecraft.net") { @@ -50,8 +53,9 @@ pluginManagement { maven("https://repo.opencollab.dev/maven-snapshots/") maven("https://maven.fabricmc.net/") - maven("https://maven.minecraftforge.net/") maven("https://maven.architectury.dev/") + maven("https://maven.neoforged.net/releases") + maven("https://maven.neoforged.net/") } plugins { @@ -68,7 +72,7 @@ include(":ap") include(":api") include(":bungeecord") include(":fabric") -include(":forge") +include(":neoforge") include(":mod") include(":spigot") include(":standalone") @@ -79,7 +83,7 @@ include(":core") // Specify project dirs project(":bungeecord").projectDir = file("bootstrap/bungeecord") project(":fabric").projectDir = file("bootstrap/mod/fabric") -project(":forge").projectDir = file("bootstrap/mod/forge") +project(":neoforge").projectDir = file("bootstrap/mod/neoforge") project(":mod").projectDir = file("bootstrap/mod") project(":spigot").projectDir = file("bootstrap/spigot") project(":standalone").projectDir = file("bootstrap/standalone") From f4f49cd10a1c2791568f4ff810a2d3a67d9ad35f Mon Sep 17 00:00:00 2001 From: Joshua Castle <26531652+Kas-tle@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:27:00 -0800 Subject: [PATCH 40/54] NeoForge builds Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com> --- .../geyser/api/util/PlatformType.java | 2 +- bootstrap/mod/build.gradle.kts | 6 ++++- bootstrap/mod/neoforge/build.gradle.kts | 10 +++++++- ...trap.java => GeyserNeoforgeBootstrap.java} | 24 +++++++++---------- ...pInfo.java => GeyserNeoforgeDumpInfo.java} | 12 +++++----- ...ForgeMain.java => GeyserNeoforgeMain.java} | 2 +- ...a => GeyserNeoforgePermissionHandler.java} | 14 +++++------ .../neoforge/GeyserNeoforgePlatform.java | 2 +- .../platform/mod/GeyserModBootstrap.java | 4 +--- .../mod/command/GeyserModCommandExecutor.java | 2 +- .../mod/world/GeyserModWorldManager.java | 1 + build.gradle.kts | 2 +- 12 files changed, 46 insertions(+), 35 deletions(-) rename bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/{GeyserForgeBootstrap.java => GeyserNeoforgeBootstrap.java} (81%) rename bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/{GeyserForgeDumpInfo.java => GeyserNeoforgeDumpInfo.java} (88%) rename bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/{GeyserForgeMain.java => GeyserNeoforgeMain.java} (97%) rename bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/{GeyserForgePermissionHandler.java => GeyserNeoforgePermissionHandler.java} (92%) diff --git a/api/src/main/java/org/geysermc/geyser/api/util/PlatformType.java b/api/src/main/java/org/geysermc/geyser/api/util/PlatformType.java index fc775bddd17..d59360e0431 100644 --- a/api/src/main/java/org/geysermc/geyser/api/util/PlatformType.java +++ b/api/src/main/java/org/geysermc/geyser/api/util/PlatformType.java @@ -34,7 +34,7 @@ public record PlatformType(String platformName) { public static final PlatformType ANDROID = new PlatformType("Android"); public static final PlatformType BUNGEECORD = new PlatformType("BungeeCord"); public static final PlatformType FABRIC = new PlatformType("Fabric"); - public static final PlatformType FORGE = new PlatformType("Forge"); + public static final PlatformType NEOFORGE = new PlatformType("NeoForge"); public static final PlatformType SPIGOT = new PlatformType("Spigot"); @Deprecated diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index 0a8171f3a5d..35be258785e 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -6,4 +6,8 @@ dependencies { api(projects.core) compileOnly(libs.mixin) -} \ No newline at end of file +} + +// Fails without due to shadow in neoforge somehow depending on this task +// Should see if there's a better way to workaround this +configurations.create("transformProductionForge") \ No newline at end of file diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 324ca785873..764e6f29b8e 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -1,5 +1,6 @@ plugins { application + eclipse } architectury { @@ -17,6 +18,13 @@ loom { } dependencies { + // See https://github.com/google/guava/issues/6618 + modules { + module("com.google.guava:listenablefuture") { + replacedBy("com.google.guava:guava", "listenablefuture is part of guava") + } + } + neoForge(libs.neoforge.minecraft) api(projects.mod) @@ -24,7 +32,7 @@ dependencies { isTransitive = false } shadow(projects.core) { - //exclude(group = "com.google.guava", module = "guava") + exclude(group = "com.google.guava", module = "guava") exclude(group = "com.google.code.gson", module = "gson") exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java similarity index 81% rename from bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java index 146dbfc4b8a..35eef6ae2ed 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeBootstrap.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java @@ -23,18 +23,18 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; import net.minecraft.Util; import net.minecraft.commands.CommandSourceStack; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppedEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.loading.FMLLoader; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStoppedEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.loading.FMLLoader; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; import org.geysermc.geyser.platform.mod.GeyserModUpdateListener; @@ -52,7 +52,7 @@ public GeyserNeoforgeBootstrap() { if (FMLLoader.getDist() == Dist.DEDICATED_SERVER) { // Set as an event so we can get the proper IP and port if needed - MinecraftForge.EVENT_BUS.addListener(this::onServerStarted); + NeoForge.EVENT_BUS.addListener(this::onServerStarted); } } @@ -60,10 +60,10 @@ public GeyserNeoforgeBootstrap() { public void onInitialStartup() { // Server has yet to start // Register onDisable so players are properly kicked - MinecraftForge.EVENT_BUS.addListener(this::onServerStopped); - MinecraftForge.EVENT_BUS.addListener(this::onPlayerJoin); + NeoForge.EVENT_BUS.addListener(this::onServerStopped); + NeoForge.EVENT_BUS.addListener(this::onPlayerJoin); - MinecraftForge.EVENT_BUS.addListener(this.permissionHandler::onPermissionGather); + NeoForge.EVENT_BUS.addListener(this.permissionHandler::onPermissionGather); } private void onServerStarted(ServerStartedEvent event) { diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java similarity index 88% rename from bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java index 08d47e1a44a..94a19c9dafd 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeDumpInfo.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java @@ -28,10 +28,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; import net.minecraft.server.MinecraftServer; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.forgespi.language.IModInfo; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforgespi.language.IModInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.text.AsteriskSerializer; @@ -50,8 +50,8 @@ public class GeyserNeoforgeDumpInfo extends BootstrapDumpInfo { private final int serverPort; private final List mods; - public GeyseNeoforgeDumpInfo(MinecraftServer server) { - this.platformVersion = FMLLoader.versionInfo().mcAndForgeVersion(); + public GeyserNeoforgeDumpInfo(MinecraftServer server) { + this.platformVersion = FMLLoader.versionInfo().mcAndNeoFormVersion(); this.dist = FMLLoader.getDist(); this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp(); this.serverPort = server.getPort(); diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeMain.java similarity index 97% rename from bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeMain.java index 3e6910b549c..61917992aef 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgeMain.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeMain.java @@ -23,7 +23,7 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; import org.geysermc.geyser.GeyserMain; diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java similarity index 92% rename from bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java rename to bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java index 9fbbb5344c0..4fb83055b05 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserForgePermissionHandler.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java @@ -23,17 +23,17 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.platform.forge; +package org.geysermc.geyser.platform.neoforge; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.server.permission.PermissionAPI; -import net.minecraftforge.server.permission.events.PermissionGatherEvent; -import net.minecraftforge.server.permission.nodes.PermissionDynamicContextKey; -import net.minecraftforge.server.permission.nodes.PermissionNode; -import net.minecraftforge.server.permission.nodes.PermissionType; -import net.minecraftforge.server.permission.nodes.PermissionTypes; +import net.neoforged.neoforge.server.permission.PermissionAPI; +import net.neoforged.neoforge.server.permission.events.PermissionGatherEvent; +import net.neoforged.neoforge.server.permission.nodes.PermissionDynamicContextKey; +import net.neoforged.neoforge.server.permission.nodes.PermissionNode; +import net.neoforged.neoforge.server.permission.nodes.PermissionType; +import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java index 817bdae502f..5e88d0007b4 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.platform.neoforge; import net.minecraft.server.MinecraftServer; -import net.minecraftforge.fml.loading.FMLPaths; +import net.neoforged.fml.loading.FMLPaths; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.dump.BootstrapDumpInfo; diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java index a260c5c0bd3..ea43ba6db22 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java @@ -52,8 +52,6 @@ import org.geysermc.geyser.platform.mod.world.GeyserModWorldManager; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -245,7 +243,7 @@ public String getMinecraftServerVersion() { return this.server.getServerVersion(); } - @NotNull + @NonNull @Override public String getServerBindAddress() { String ip = this.server.getLocalIp(); diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/command/GeyserModCommandExecutor.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/command/GeyserModCommandExecutor.java index bf707c1c893..60b72e2aa35 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/command/GeyserModCommandExecutor.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/command/GeyserModCommandExecutor.java @@ -57,7 +57,7 @@ public int run(CommandContext context) { public int runWithArgs(CommandContext context, String args) { CommandSourceStack source = context.getSource(); - FabricCommandSender sender = new FabricCommandSender(source); + ModCommandSender sender = new ModCommandSender(source); GeyserSession session = getGeyserSession(sender); if (!testPermission(source)) { sender.sendMessage(ChatColor.RED + GeyserLocale.getPlayerLocaleString("geyser.bootstrap.command.permission_fail", sender.locale())); diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java index f2fb18b540e..04c5386320e 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/world/GeyserModWorldManager.java @@ -57,6 +57,7 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtMap; diff --git a/build.gradle.kts b/build.gradle.kts index 882b65adba7..fba65e2fedd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { // Ensure AP works in eclipse (no effect on other IDEs) `eclipse` id("geyser.build-logic") - id("io.freefair.lombok") version "6.3.0" apply false + id("io.freefair.lombok") version "8.4" apply false } allprojects { From fbbfa9696c2999a3874a94ece7d188aac162918e Mon Sep 17 00:00:00 2001 From: Kas-tle <26531652+Kas-tle@users.noreply.github.com> Date: Thu, 21 Dec 2023 18:16:14 -0800 Subject: [PATCH 41/54] Archive neoforge artifacts --- .github/workflows/build.yml | 8 ++++---- .github/workflows/pullrequest.yml | 6 +++--- bootstrap/mod/neoforge/build.gradle.kts | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bb7f720fa0f..a63f27d4f8e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,12 +49,12 @@ jobs: name: Geyser Fabric path: bootstrap/mod/fabric/build/libs/Geyser-Fabric.jar if-no-files-found: error - - name: Archive artifacts (Geyser Forge) + - name: Archive artifacts (Geyser Neoforge) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 if: success() with: - name: Geyser Forge - path: bootstrap/mod/neoforge/build/libs/Geyser-Forge.jar + name: Geyser Neoforge + path: bootstrap/mod/neoforge/build/libs/Geyser-Neoforge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 @@ -127,7 +127,7 @@ jobs: arguments: fabric:modrinth gradle-home-cache-cleanup: true - - name: Publish to Modrinth (Forge) + - name: Publish to Modrinth (Neoforge) uses: gradle/gradle-build-action@3bfe3a46584a206fb8361cdedd0647b0c4204232 if: ${{ success() && github.repository == 'GeyserMC/Geyser' && github.ref_name == 'master' }} env: diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index d1ed73dc3d0..8d5101dd70a 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -59,12 +59,12 @@ jobs: name: Geyser Fabric path: geyser/bootstrap/mod/fabric/build/libs/Geyser-Fabric.jar if-no-files-found: error - - name: Archive artifacts (Geyser Forge) + - name: Archive artifacts (Geyser Neoforge) uses: actions/upload-artifact@v3 if: success() with: - name: Geyser Forge - path: geyser/bootstrap/mod/neoforge/build/libs/Geyser-Forge.jar + name: Geyser Neoforge + path: geyser/bootstrap/mod/neoforge/build/libs/Geyser-Neoforge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 764e6f29b8e..221c6fe520f 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -1,6 +1,5 @@ plugins { application - eclipse } architectury { From b0ccf45cd47f797eca2f62e5716170bc80074b86 Mon Sep 17 00:00:00 2001 From: Kas-tle <26531652+Kas-tle@users.noreply.github.com> Date: Sat, 23 Dec 2023 18:06:06 -0800 Subject: [PATCH 42/54] Closes GeyserMC/Geyser#4358 (#4360) Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com> --- .../geyser/level/block/BlockStateValues.java | 15 +++++++++++++++ .../java/org/geysermc/geyser/util/ChunkUtils.java | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java b/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java index 11702e78af1..e665a22ef77 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/BlockStateValues.java @@ -67,6 +67,7 @@ public final class BlockStateValues { private static final Int2IntMap SKULL_WALL_DIRECTIONS = new Int2IntOpenHashMap(); private static final Int2ByteMap SHULKERBOX_DIRECTIONS = new FixedInt2ByteMap(); private static final Int2IntMap WATER_LEVEL = new Int2IntOpenHashMap(); + private static final IntSet UPPER_DOORS = new IntOpenHashSet(); public static final int JAVA_AIR_ID = 0; @@ -219,6 +220,10 @@ public static void storeBlockStateValues(String javaId, int javaBlockState, Json if (javaId.contains("_cauldron") && !javaId.contains("water_")) { NON_WATER_CAULDRONS.add(javaBlockState); } + + if (javaId.contains("_door[") && javaId.contains("half=upper")) { + UPPER_DOORS.add(javaBlockState); + } } /** @@ -498,6 +503,16 @@ public static int getWaterLevel(int state) { return WATER_LEVEL.getOrDefault(state, -1); } + /** + * Check if a block is the upper half of a door. + * + * @param state BlockState of the block + * @return True if the block is the upper half of a door + */ + public static boolean isUpperDoor(int state) { + return UPPER_DOORS.contains(state); + } + /** * Get the height of water from the block state * This is used in FishingHookEntity to create splash sounds when the hook hits the water. In addition, diff --git a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java index 114a7b6ded4..cc21e2d0a22 100644 --- a/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/ChunkUtils.java @@ -215,6 +215,14 @@ public static void updateBlockClientSide(GeyserSession session, int blockState, break; //No block will be a part of two classes } } + + if (BlockStateValues.isUpperDoor(blockState)) { + // Update the lower door block as Bedrock client doesn't like door to be closed from the top + // See https://github.com/GeyserMC/Geyser/issues/4358 + Vector3i belowDoorPosition = position.sub(0, 1, 0); + int belowDoorBlockState = session.getGeyser().getWorldManager().getBlockAt(session, belowDoorPosition.getX(), belowDoorPosition.getY(), belowDoorPosition.getZ()); + updateBlock(session, belowDoorBlockState, belowDoorPosition); + } } public static void sendEmptyChunk(GeyserSession session, int chunkX, int chunkZ, boolean forceUpdate) { From 592a58a0c87bf0054610f5a7ec996e65f1c0c402 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 25 Dec 2023 20:43:13 +0100 Subject: [PATCH 43/54] Use uuid for bukkit api permission checks (#4363) * lookup players by uuid instead of name * Fix: look up Players by UUID for permissions, dont throw if a player can't be found (e.g. disconnected) * use api method --- .../spigot/world/manager/GeyserSpigotWorldManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java index 74f359e0264..42f0d17f469 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java @@ -197,7 +197,11 @@ public GameMode getDefaultGameMode(GeyserSession session) { @Override public boolean hasPermission(GeyserSession session, String permission) { - return Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().getUsername())).hasPermission(permission); + Player player = Bukkit.getPlayer(session.javaUuid()); + if (player != null) { + return player.hasPermission(permission); + } + return false; } @Override From 8ee9c45a5ff663fc2f67bc5ea1854a6ae13f1942 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Tue, 26 Dec 2023 01:12:48 +0100 Subject: [PATCH 44/54] transformForge -> transformNeoForge --- bootstrap/mod/build.gradle.kts | 6 +----- bootstrap/mod/neoforge/build.gradle.kts | 5 +---- .../geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java | 2 +- .../platform/neoforge/GeyserNeoforgePermissionHandler.java | 2 +- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index 35be258785e..0a8171f3a5d 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -6,8 +6,4 @@ dependencies { api(projects.core) compileOnly(libs.mixin) -} - -// Fails without due to shadow in neoforge somehow depending on this task -// Should see if there's a better way to workaround this -configurations.create("transformProductionForge") \ No newline at end of file +} \ No newline at end of file diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 221c6fe520f..37bd710cf7a 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -8,12 +8,9 @@ architectury { } loom { - /* neoForge { mixinConfig("geyser.mixins.json") } - - */ } dependencies { @@ -27,7 +24,7 @@ dependencies { neoForge(libs.neoforge.minecraft) api(projects.mod) - shadow(project(path = ":mod", configuration = "transformProductionForge")) { + shadow(project(path = ":mod", configuration = "transformProductionNeoForge")) { isTransitive = false } shadow(projects.core) { diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java index 94a19c9dafd..57b0963e22a 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java @@ -42,7 +42,7 @@ @Getter public class GeyserNeoforgeDumpInfo extends BootstrapDumpInfo { - private String platformVersion = null; + private String platformVersion; private final Dist dist; @AsteriskSerializer.Asterisk(isIp = true) diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java index 4fb83055b05..a926702d71e 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java @@ -128,7 +128,7 @@ private void registerNode(String node, PermissionGatherEvent.Nodes event) { private PermissionNode createNode(String node) { // The typical constructors in PermissionNode require a // mod id, which means our permission nodes end up becoming - // geyser_forge. instead of just . We work around + // geyser_neoforge. instead of just . We work around // this by using reflection to access the constructor that // doesn't require a mod id or ResourceLocation. try { From 46bde0c01955cddc5b0da547f76629583f568ca4 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 31 Dec 2023 02:24:44 +0100 Subject: [PATCH 45/54] Fix: protocol being null during online mode login (#4369) * fix: protocol being null during online mode login * gimme more space * add debug logging for too early downstream packet sending --- .../java/org/geysermc/geyser/session/GeyserSession.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 28ad5887c42..26e20645812 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1633,6 +1633,15 @@ public void sendDownstreamLoginPacket(Packet packet) { * @param intendedState the state the client should be in */ public void sendDownstreamPacket(Packet packet, ProtocolState intendedState) { + // protocol can be null when we're not yet logged in (online auth) + if (protocol == null) { + if (geyser.getConfig().isDebugMode()) { + geyser.getLogger().debug("Tried to send downstream packet with no downstream session!"); + Thread.dumpStack(); + } + return; + } + if (protocol.getState() != intendedState) { geyser.getLogger().debug("Tried to send " + packet.getClass().getSimpleName() + " packet while not in " + intendedState.name() + " state"); return; From 7613bdbafe402f86ec8f1bd7a446b2a1d6b86305 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Thu, 4 Jan 2024 13:49:01 -0500 Subject: [PATCH 46/54] Fix https://github.com/GeyserMC/Geyser/issues/4378 --- .../org/geysermc/geyser/network/UpstreamPacketHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index a0b104adb0c..7a22b8a429c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -28,6 +28,8 @@ import io.netty.buffer.Unpooled; import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.compat.BedrockCompat; +import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622; import org.cloudburstmc.protocol.bedrock.data.ExperimentData; import org.cloudburstmc.protocol.bedrock.data.PacketCompressionAlgorithm; import org.cloudburstmc.protocol.bedrock.data.ResourcePackType; @@ -108,6 +110,10 @@ private boolean setCorrectCodec(int protocolVersion) { session.disconnect(disconnectMessage); return false; } else if (protocolVersion < GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + if (protocolVersion < Bedrock_v622.CODEC.getProtocolVersion()) { + // https://github.com/GeyserMC/Geyser/issues/4378 + session.getUpstream().getSession().setCodec(BedrockCompat.CODEC_LEGACY); + } session.disconnect(GeyserLocale.getLocaleStringLog("geyser.network.outdated.client", supportedVersions)); return false; } else { From afacada0aceecfc2d726cadda0a329d02f1ff786 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Wed, 10 Jan 2024 15:17:36 +0100 Subject: [PATCH 47/54] Neoforge boots! * Fix mixins on neoforge * Update build/pr file names * Update mods.toml to new neoforge standard * Fix refmap naming --- .github/workflows/build.yml | 8 ++++---- .github/workflows/pullrequest.yml | 6 +++--- bootstrap/mod/build.gradle.kts | 4 ++++ bootstrap/mod/neoforge/build.gradle.kts | 8 +------- .../platform/neoforge/GeyserNeoforgePlatform.java | 2 +- .../neoforge/src/main/resources/META-INF/mods.toml | 13 ++++++++----- .../main/kotlin/geyser.base-conventions.gradle.kts | 2 +- 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a63f27d4f8e..763ba736ff0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,12 +49,12 @@ jobs: name: Geyser Fabric path: bootstrap/mod/fabric/build/libs/Geyser-Fabric.jar if-no-files-found: error - - name: Archive artifacts (Geyser Neoforge) + - name: Archive artifacts (Geyser NeoForge) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 if: success() with: - name: Geyser Neoforge - path: bootstrap/mod/neoforge/build/libs/Geyser-Neoforge.jar + name: Geyser NeoForge + path: bootstrap/mod/neoforge/build/libs/Geyser-NeoForge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 @@ -127,7 +127,7 @@ jobs: arguments: fabric:modrinth gradle-home-cache-cleanup: true - - name: Publish to Modrinth (Neoforge) + - name: Publish to Modrinth (NeoForge) uses: gradle/gradle-build-action@3bfe3a46584a206fb8361cdedd0647b0c4204232 if: ${{ success() && github.repository == 'GeyserMC/Geyser' && github.ref_name == 'master' }} env: diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index 8d5101dd70a..1c7d618e655 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -59,12 +59,12 @@ jobs: name: Geyser Fabric path: geyser/bootstrap/mod/fabric/build/libs/Geyser-Fabric.jar if-no-files-found: error - - name: Archive artifacts (Geyser Neoforge) + - name: Archive artifacts (Geyser NeoForge) uses: actions/upload-artifact@v3 if: success() with: - name: Geyser Neoforge - path: geyser/bootstrap/mod/neoforge/build/libs/Geyser-Neoforge.jar + name: Geyser NeoForge + path: geyser/bootstrap/mod/neoforge/build/libs/Geyser-NeoForge.jar if-no-files-found: error - name: Archive artifacts (Geyser Standalone) uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index 0a8171f3a5d..2dff63b6042 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -2,6 +2,10 @@ architectury { common("neoforge", "fabric") } +loom { + mixin.defaultRefmapName.set("geyser-refmap.json") +} + dependencies { api(projects.core) diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 37bd710cf7a..56514a8f385 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -7,12 +7,6 @@ architectury { neoForge() } -loom { - neoForge { - mixinConfig("geyser.mixins.json") - } -} - dependencies { // See https://github.com/google/guava/issues/6618 modules { @@ -46,7 +40,7 @@ tasks { } remapJar { - archiveBaseName.set("Geyser-Neoforge") + archiveBaseName.set("Geyser-NeoForge") } remapModrinthJar { diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java index 5e88d0007b4..44c2d7d6709 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java @@ -47,7 +47,7 @@ public class GeyserNeoforgePlatform implements GeyserModPlatform { @Override public @NotNull String configPath() { - return "Geyser-Neoforge"; + return "Geyser-NeoForge"; } @Override diff --git a/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml index 74b9083743a..350edf4a58c 100644 --- a/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml +++ b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml @@ -1,22 +1,25 @@ modLoader="javafml" -loaderVersion="[46,)" +loaderVersion="[1,)" license="MIT" [[mods]] modId="geyser_neoforge" version="${version}" displayName="Geyser" +displayURL="https://geysermc.org/" logoFile= "../assets/geyser_neoforge/icon.png" authors="GeyserMC" description="${description}" +[[mixins]] +config = "geyser.mixins.json" [[dependencies.geyser_neoforge]] - modId="forge" - mandatory=true - versionRange="[46,)" + modId="neoforge" + type="required" + versionRange="[20.4.72-beta,)" ordering="NONE" side="BOTH" [[dependencies.geyser_neoforge]] modId="minecraft" - mandatory=true + type="required" versionRange="[1.20,1.21)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts index 487b4bc12cc..810f1de872f 100644 --- a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts @@ -23,7 +23,7 @@ indra { tasks { processResources { // Spigot, BungeeCord, Velocity, Sponge, Fabric - filesMatching(listOf("plugin.yml", "bungee.yml", "velocity-plugin.json", "META-INF/sponge_plugins.json", "fabric.mod.json", "META-INF/mods.toml")) { + filesMatching(listOf("plugin.yml", "bungee.yml", "velocity-plugin.json", "fabric.mod.json", "META-INF/mods.toml")) { expand( "id" to "geyser", "name" to "Geyser", From b9ab9fe67ec1fae2d47d0165717c2f75aed9381c Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Fri, 12 Jan 2024 10:49:43 +0100 Subject: [PATCH 48/54] more fixes - no need to include gson - cleanup nullable/nonnull annotations - add more info to geyser dumps on neoforge --- .../platform/fabric/GeyserFabricPlatform.java | 16 +++++++-------- bootstrap/mod/neoforge/build.gradle.kts | 1 - .../neoforge/GeyserNeoforgeBootstrap.java | 10 +++++----- .../neoforge/GeyserNeoforgeDumpInfo.java | 8 +++++++- .../GeyserNeoforgePermissionHandler.java | 6 +++--- .../neoforge/GeyserNeoforgePlatform.java | 16 +++++++-------- .../src/main/resources/META-INF/mods.toml | 2 +- .../platform/mod/GeyserModBootstrap.java | 7 +++---- .../platform/mod/ModPingPassthrough.java | 2 +- .../mod/platform/GeyserModPlatform.java | 20 +++++++++---------- .../geyser.modded-conventions.gradle.kts | 1 - 11 files changed, 46 insertions(+), 43 deletions(-) diff --git a/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java b/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java index cc2b31dbb17..593b55d12f2 100644 --- a/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java +++ b/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java @@ -28,12 +28,12 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.server.MinecraftServer; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; import org.geysermc.geyser.platform.mod.platform.GeyserModPlatform; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.InputStream; @@ -48,27 +48,27 @@ public GeyserFabricPlatform() { } @Override - public @NotNull PlatformType platformType() { + public @NonNull PlatformType platformType() { return PlatformType.FABRIC; } @Override - public @NotNull String configPath() { + public @NonNull String configPath() { return "Geyser-Fabric"; } @Override - public @NotNull Path dataFolder(@NotNull String modId) { + public @NonNull Path dataFolder(@NonNull String modId) { return FabricLoader.getInstance().getConfigDir().resolve(modId); } @Override - public @NotNull BootstrapDumpInfo dumpInfo(@NotNull MinecraftServer server) { + public @NonNull BootstrapDumpInfo dumpInfo(@NonNull MinecraftServer server) { return new GeyserFabricDumpInfo(server); } @Override - public boolean testFloodgatePluginPresent(@NotNull GeyserModBootstrap bootstrap) { + public boolean testFloodgatePluginPresent(@NonNull GeyserModBootstrap bootstrap) { Optional floodgate = FabricLoader.getInstance().getModContainer("floodgate"); if (floodgate.isPresent()) { Path floodgateDataFolder = FabricLoader.getInstance().getConfigDir().resolve("floodgate"); @@ -80,7 +80,7 @@ public boolean testFloodgatePluginPresent(@NotNull GeyserModBootstrap bootstrap) } @Override - public @Nullable InputStream resolveResource(@NotNull String resource) { + public @Nullable InputStream resolveResource(@NonNull String resource) { // We need to handle this differently, because Fabric shares the classloader across multiple mods Path path = this.mod.findPath(resource).orElse(null); if (path == null) { diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 56514a8f385..68a4d6872b6 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -27,7 +27,6 @@ dependencies { exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") } - implementation(libs.gson) } application { diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java index 35eef6ae2ed..8919a2b407c 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java @@ -29,12 +29,12 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; -import net.neoforged.neoforge.event.server.ServerStoppedEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; import org.geysermc.geyser.platform.mod.GeyserModUpdateListener; @@ -60,7 +60,7 @@ public GeyserNeoforgeBootstrap() { public void onInitialStartup() { // Server has yet to start // Register onDisable so players are properly kicked - NeoForge.EVENT_BUS.addListener(this::onServerStopped); + NeoForge.EVENT_BUS.addListener(this::onServerStopping); NeoForge.EVENT_BUS.addListener(this::onPlayerJoin); NeoForge.EVENT_BUS.addListener(this.permissionHandler::onPermissionGather); @@ -70,7 +70,7 @@ private void onServerStarted(ServerStartedEvent event) { this.startGeyser(event.getServer()); } - private void onServerStopped(ServerStoppedEvent event) { + private void onServerStopping(ServerStoppingEvent event) { this.onDisable(); } diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java index 57b0963e22a..c8793db7e75 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java @@ -42,19 +42,25 @@ @Getter public class GeyserNeoforgeDumpInfo extends BootstrapDumpInfo { + private final String platformName; private String platformVersion; + private final String minecraftVersion; private final Dist dist; @AsteriskSerializer.Asterisk(isIp = true) private final String serverIP; private final int serverPort; + private final boolean onlineMode; private final List mods; public GeyserNeoforgeDumpInfo(MinecraftServer server) { - this.platformVersion = FMLLoader.versionInfo().mcAndNeoFormVersion(); + this.platformName = FMLLoader.getNaming(); + this.platformVersion = FMLLoader.versionInfo().neoForgeVersion(); + this.minecraftVersion = FMLLoader.versionInfo().mcVersion(); this.dist = FMLLoader.getDist(); this.serverIP = server.getLocalIp() == null ? "unknown" : server.getLocalIp(); this.serverPort = server.getPort(); + this.onlineMode = server.usesAuthentication(); this.mods = new ArrayList<>(); for (IModInfo mod : ModList.get().getMods()) { diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java index a926702d71e..1eea436e05d 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePermissionHandler.java @@ -34,11 +34,11 @@ import net.neoforged.neoforge.server.permission.nodes.PermissionNode; import net.neoforged.neoforge.server.permission.nodes.PermissionType; import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; +import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.command.GeyserCommandManager; -import org.jetbrains.annotations.NotNull; import java.lang.reflect.Constructor; import java.util.HashMap; @@ -94,7 +94,7 @@ public void onPermissionGather(PermissionGatherEvent.Nodes event) { } } - public boolean hasPermission(@NotNull Player source, @NotNull String permissionNode) { + public boolean hasPermission(@NonNull Player source, @NonNull String permissionNode) { PermissionNode node = this.permissionNodes.get(permissionNode); if (node == null) { GeyserImpl.getInstance().getLogger().warning("Unable to find permission node " + permissionNode); @@ -104,7 +104,7 @@ public boolean hasPermission(@NotNull Player source, @NotNull String permissionN return PermissionAPI.getPermission((ServerPlayer) source, node); } - public boolean hasPermission(@NotNull CommandSourceStack source, @NotNull String permissionNode, int permissionLevel) { + public boolean hasPermission(@NonNull CommandSourceStack source, @NonNull String permissionNode, int permissionLevel) { if (!source.isPlayer()) { return true; } diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java index 44c2d7d6709..d3d28cab709 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgePlatform.java @@ -27,13 +27,13 @@ import net.minecraft.server.MinecraftServer; import net.neoforged.fml.loading.FMLPaths; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; import org.geysermc.geyser.platform.mod.platform.GeyserModPlatform; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.InputStream; import java.nio.file.Path; @@ -41,32 +41,32 @@ public class GeyserNeoforgePlatform implements GeyserModPlatform { @Override - public @NotNull PlatformType platformType() { + public @NonNull PlatformType platformType() { return PlatformType.NEOFORGE; } @Override - public @NotNull String configPath() { + public @NonNull String configPath() { return "Geyser-NeoForge"; } @Override - public @NotNull Path dataFolder(@NotNull String modId) { + public @NonNull Path dataFolder(@NonNull String modId) { return FMLPaths.CONFIGDIR.get().resolve(modId); } @Override - public @NotNull BootstrapDumpInfo dumpInfo(@NotNull MinecraftServer server) { + public @NonNull BootstrapDumpInfo dumpInfo(@NonNull MinecraftServer server) { return new GeyserNeoforgeDumpInfo(server); } @Override - public boolean testFloodgatePluginPresent(@NotNull GeyserModBootstrap bootstrap) { + public boolean testFloodgatePluginPresent(@NonNull GeyserModBootstrap bootstrap) { return false; // No Floodgate plugin for Forge yet } @Override - public @Nullable InputStream resolveResource(@NotNull String resource) { + public @Nullable InputStream resolveResource(@NonNull String resource) { return GeyserBootstrap.class.getClassLoader().getResourceAsStream(resource); } } diff --git a/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml index 350edf4a58c..c69b43341a5 100644 --- a/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml +++ b/bootstrap/mod/neoforge/src/main/resources/META-INF/mods.toml @@ -14,7 +14,7 @@ config = "geyser.mixins.json" [[dependencies.geyser_neoforge]] modId="neoforge" type="required" - versionRange="[20.4.72-beta,)" + versionRange="[20.4.48-beta,)" ordering="NONE" side="BOTH" [[dependencies.geyser_neoforge]] diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java index ea43ba6db22..f1e15fd664b 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java @@ -28,6 +28,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import lombok.RequiredArgsConstructor; +import lombok.Setter; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.MinecraftServer; @@ -66,6 +67,7 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { private final GeyserModPlatform platform; + @Setter private boolean reloading; private GeyserImpl geyser; @@ -200,6 +202,7 @@ public void onDisable() { } if (!reloading) { this.server = null; + this.geyserInjector.shutdown(); } } @@ -266,10 +269,6 @@ public InputStream getResourceOrNull(String resource) { return this.platform.resolveResource(resource); } - public void setReloading(boolean reloading) { - this.reloading = reloading; - } - public abstract boolean hasPermission(@NonNull Player source, @NonNull String permissionNode); public abstract boolean hasPermission(@NonNull CommandSourceStack source, @NonNull String permissionNode, int permissionLevel); diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/ModPingPassthrough.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/ModPingPassthrough.java index 60e5c489b12..12d690d83fb 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/ModPingPassthrough.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/ModPingPassthrough.java @@ -40,10 +40,10 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerStatusPacketListenerImpl; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.IGeyserPingPassthrough; -import org.jetbrains.annotations.Nullable; import java.net.InetSocketAddress; import java.util.Objects; diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/platform/GeyserModPlatform.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/platform/GeyserModPlatform.java index 00d2808d0e3..2f615591b04 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/platform/GeyserModPlatform.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/platform/GeyserModPlatform.java @@ -26,11 +26,11 @@ package org.geysermc.geyser.platform.mod.platform; import net.minecraft.server.MinecraftServer; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.platform.mod.GeyserModBootstrap; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.InputStream; import java.nio.file.Path; @@ -46,7 +46,7 @@ public interface GeyserModPlatform { * * @return the platform type of the mod platform */ - @NotNull + @NonNull PlatformType platformType(); /** @@ -54,7 +54,7 @@ public interface GeyserModPlatform { * * @return the config path of the mod platform */ - @NotNull + @NonNull String configPath(); /** @@ -62,8 +62,8 @@ public interface GeyserModPlatform { * * @return the data folder of the mod platform */ - @NotNull - Path dataFolder(@NotNull String modId); + @NonNull + Path dataFolder(@NonNull String modId); /** * Gets the dump info of the mod platform. @@ -71,15 +71,15 @@ public interface GeyserModPlatform { * @param server the server to get the dump info from * @return the dump info of the mod platform */ - @NotNull - BootstrapDumpInfo dumpInfo(@NotNull MinecraftServer server); + @NonNull + BootstrapDumpInfo dumpInfo(@NonNull MinecraftServer server); /** * Tests if the Floodgate plugin is present on the mod platform. * * @return {@code true} if the Floodgate plugin is present on the mod platform, {@code false} otherwise */ - boolean testFloodgatePluginPresent(@NotNull GeyserModBootstrap bootstrap); + boolean testFloodgatePluginPresent(@NonNull GeyserModBootstrap bootstrap); /** * Resolves a resource from the mod jar. @@ -88,5 +88,5 @@ public interface GeyserModPlatform { * @return the input stream of the resource */ @Nullable - InputStream resolveResource(@NotNull String resource); + InputStream resolveResource(@NonNull String resource); } diff --git a/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts b/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts index 5b6c8d5db8b..0842eae8465 100644 --- a/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/geyser.modded-conventions.gradle.kts @@ -17,7 +17,6 @@ architectury { loom { silentMojangMappingsLicense() - //mixin.defaultRefmapName.set("geyser-mod-refmap.json") } tasks { From 1d3914f3eceb8f5f9ff8f7b7c8d1dc85c8da744e Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Wed, 17 Jan 2024 11:46:17 +0100 Subject: [PATCH 49/54] yeet platform executor --- .../neoforge/GeyserNeoforgeBootstrap.java | 9 --------- .../org/geysermc/geyser/GeyserBootstrap.java | 17 ----------------- .../java/org/geysermc/geyser/GeyserImpl.java | 9 ++------- .../command/defaults/ConnectionTestCommand.java | 2 +- .../geysermc/geyser/session/GeyserSession.java | 2 +- .../session/PendingMicrosoftAuthentication.java | 5 ++--- .../geysermc/geyser/skin/FakeHeadProvider.java | 2 +- .../org/geysermc/geyser/util/AssetUtils.java | 5 ++--- .../geysermc/geyser/util/VersionCheckUtils.java | 2 +- 9 files changed, 10 insertions(+), 43 deletions(-) diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java index 8919a2b407c..dd60a48e8fa 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeBootstrap.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.platform.neoforge; -import net.minecraft.Util; import net.minecraft.commands.CommandSourceStack; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; @@ -39,8 +38,6 @@ import org.geysermc.geyser.platform.mod.GeyserModBootstrap; import org.geysermc.geyser.platform.mod.GeyserModUpdateListener; -import java.util.concurrent.ExecutorService; - @Mod(ModConstants.MOD_ID) public class GeyserNeoforgeBootstrap extends GeyserModBootstrap { private final GeyserNeoforgePermissionHandler permissionHandler = new GeyserNeoforgePermissionHandler(); @@ -78,12 +75,6 @@ private void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { GeyserModUpdateListener.onPlayReady(event.getEntity()); } - @NonNull - @Override - public ExecutorService platformExecutor() { - return Util.backgroundExecutor(); - } - @Override public boolean hasPermission(@NonNull Player source, @NonNull String permissionNode) { return this.permissionHandler.hasPermission(source, permissionNode); diff --git a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java index 8bc9bddd613..4dbc1dca3d1 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java @@ -38,8 +38,6 @@ import java.net.SocketAddress; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ForkJoinPool; public interface GeyserBootstrap { @@ -177,19 +175,4 @@ default Path getLogsPath() { * Tests if Floodgate is installed, loads the Floodgate key if so, and returns the result of Floodgate installed. */ boolean testFloodgatePluginPresent(); - - /** - * The executor provided by the platform for - * running asynchronous tasks. - *

- * While most platforms will just use the ForkJoinPool - * common executor, some platforms (i.e. Forge) - * require a specific executor be used. - * - * @return the platform executor - */ - @NonNull - default ExecutorService platformExecutor() { - return ForkJoinPool.commonPool(); - } } diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index 8221dc3ea1b..b53ebf41aa4 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -96,7 +96,6 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Matcher; @@ -199,7 +198,7 @@ public void initialize() { MessageTranslator.init(); // Download the latest asset list and cache it - AssetUtils.generateAssetCache(this.bootstrap.platformExecutor()).whenComplete((aVoid, ex) -> { + AssetUtils.generateAssetCache().whenComplete((aVoid, ex) -> { if (ex != null) { return; } @@ -213,7 +212,7 @@ public void initialize() { ProvidedSkins.init(); - CompletableFuture.runAsync(AssetUtils::downloadAndRunClientJarTasks, GeyserImpl.getInstance().platformExecutor()); + CompletableFuture.runAsync(AssetUtils::downloadAndRunClientJarTasks); }); startInstance(); @@ -727,10 +726,6 @@ public WorldManager getWorldManager() { return bootstrap.getWorldManager(); } - public ExecutorService platformExecutor() { - return this.bootstrap.platformExecutor(); - } - @Nullable public String refreshTokenFor(@NonNull String bedrockName) { return savedRefreshTokens.get(bedrockName); diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java index a3ec20e1efc..ad51826c36f 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/ConnectionTestCommand.java @@ -215,7 +215,7 @@ public void execute(@Nullable GeyserSession session, GeyserCommandSource sender, sender.sendMessage("An error occurred while trying to check your connection! Check the console for more information."); geyser.getLogger().error("Error while trying to check your connection!", e); } - }, GeyserImpl.getInstance().platformExecutor()); + }); } private void sendLinks(GeyserCommandSource sender) { diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 37b70612170..26e20645812 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -748,7 +748,7 @@ public void authenticateWithRefreshToken(String refreshToken) { protocol = new MinecraftProtocol(profile, service.getAccessToken()); geyser.saveRefreshToken(bedrockUsername(), service.getRefreshToken()); return Boolean.TRUE; - }, this.geyser.platformExecutor()).whenComplete((successful, ex) -> { + }).whenComplete((successful, ex) -> { if (this.closed) { return; } diff --git a/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java b/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java index b52b03fd49d..0651039a09e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java +++ b/core/src/main/java/org/geysermc/geyser/session/PendingMicrosoftAuthentication.java @@ -78,7 +78,7 @@ public void setStoreServerInformation() { } public class AuthenticationTask { - private static final Executor DELAYED_BY_ONE_SECOND = CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS, GeyserImpl.getInstance().platformExecutor()); + private static final Executor DELAYED_BY_ONE_SECOND = CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS); @Getter private final MsaAuthenticationService msaAuthenticationService = new MsaAuthenticationService(GeyserImpl.OAUTH_CLIENT_ID); @@ -124,8 +124,7 @@ public void cleanup() { public CompletableFuture getCode(boolean offlineAccess) { // Request the code CompletableFuture code = CompletableFuture.supplyAsync( - () -> tryGetCode(offlineAccess), - GeyserImpl.getInstance().platformExecutor()); + () -> tryGetCode(offlineAccess)); // Once the code is received, continuously try to request the access token, profile, etc code.thenRun(() -> performLoginAttempt(System.currentTimeMillis())); return code; diff --git a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java index c49fd0eccb6..c7bd235b2fa 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java @@ -125,7 +125,7 @@ public static void setHead(GeyserSession session, PlayerEntity entity, Tag skull } catch (IOException e) { GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.skin.fail", entity.getUuid(), e.getMessage())); } - }, GeyserImpl.getInstance().platformExecutor()); + }); } } diff --git a/core/src/main/java/org/geysermc/geyser/util/AssetUtils.java b/core/src/main/java/org/geysermc/geyser/util/AssetUtils.java index 324872cb57a..6bdae6dfeda 100644 --- a/core/src/main/java/org/geysermc/geyser/util/AssetUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/AssetUtils.java @@ -38,7 +38,6 @@ import java.nio.file.Path; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.zip.ZipFile; /** @@ -80,7 +79,7 @@ public static void addTask(boolean required, ClientJarTask task) { /** * Fetch the latest versions asset cache from Mojang so we can grab the locale files later */ - public static CompletableFuture generateAssetCache(ExecutorService executor) { + public static CompletableFuture generateAssetCache() { return CompletableFuture.supplyAsync(() -> { try { // Get the version manifest from Mojang @@ -129,7 +128,7 @@ public static CompletableFuture generateAssetCache(ExecutorService executo GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.locale.fail.asset_cache", (!e.getMessage().isEmpty() ? e.getMessage() : e.getStackTrace()))); } return null; - }, executor); + }); } public static void downloadAndRunClientJarTasks() { diff --git a/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java b/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java index aed91411f0f..cf90a6bcdc0 100644 --- a/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/VersionCheckUtils.java @@ -123,7 +123,7 @@ public static void checkForGeyserUpdate(Supplier recipient) } catch (Exception e) { GeyserImpl.getInstance().getLogger().error("Error whilst checking for Geyser update!", e); } - }, GeyserImpl.getInstance().platformExecutor()); + }); } public static @NonNull OptionalInt getLatestBedrockRelease() { From 6ab0e7e77342220d2d14825815c4f91dba741e06 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Thu, 18 Jan 2024 23:49:40 +0100 Subject: [PATCH 50/54] yet another temp branch to figure out the runServer task --- bootstrap/mod/build.gradle.kts | 1 - bootstrap/mod/fabric/build.gradle.kts | 14 +++++++++++++- bootstrap/mod/neoforge/build.gradle.kts | 13 ++++++++++++- .../mod/src/main/resources/geyser.mixins.json | 1 - 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index 2dff63b6042..749fab8c1bf 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -8,6 +8,5 @@ loom { dependencies { api(projects.core) - compileOnly(libs.mixin) } \ No newline at end of file diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts index 464649f69cc..e5ea10b5c1e 100644 --- a/bootstrap/mod/fabric/build.gradle.kts +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -7,11 +7,20 @@ architectury { fabric() } +val common: Configuration by configurations.creating +val shadowCommon: Configuration by configurations.creating // Don't use shadow from the shadow plugin because we don't want IDEA to index this. +val developmentFabric: Configuration = configurations.getByName("developmentFabric") +configurations { + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + developmentFabric.extendsFrom(configurations["common"]) +} + dependencies { modImplementation(libs.fabric.loader) modApi(libs.fabric.api) - api(projects.mod) + //api(projects.mod) shadow(project(path = ":mod", configuration = "transformProductionFabric")) { isTransitive = false } @@ -25,6 +34,9 @@ dependencies { // This should be in the libs TOML, but something about modImplementation AND include just doesn't work include(modImplementation("me.lucko", "fabric-permissions-api", "0.2-SNAPSHOT")) + + common(project(":mod", configuration = "namedElements")) { isTransitive = true } + //shadowCommon(project(":mod", configuration = "transformProductionFabric")) { isTransitive = false } } application { diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 68a4d6872b6..d348d777738 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -7,6 +7,15 @@ architectury { neoForge() } +val common: Configuration by configurations.creating +val shadowCommon: Configuration by configurations.creating // Don't use shadow from the shadow plugin because we don't want IDEA to index this. +val developmentForge: Configuration = configurations.getByName("developmentNeoForge") +configurations { + compileClasspath.get().extendsFrom(configurations["common"]) + runtimeClasspath.get().extendsFrom(configurations["common"]) + developmentForge.extendsFrom(configurations["common"]) +} + dependencies { // See https://github.com/google/guava/issues/6618 modules { @@ -17,7 +26,7 @@ dependencies { neoForge(libs.neoforge.minecraft) - api(projects.mod) + //api(projects.mod) shadow(project(path = ":mod", configuration = "transformProductionNeoForge")) { isTransitive = false } @@ -27,6 +36,8 @@ dependencies { exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") } + common(project(":mod", configuration = "namedElements")) { isTransitive = true } + //shadowCommon(project(":mod", configuration = "transformProductionNeoForge")) { isTransitive = false } } application { diff --git a/bootstrap/mod/src/main/resources/geyser.mixins.json b/bootstrap/mod/src/main/resources/geyser.mixins.json index ec248b72c62..47b2f60f3fc 100644 --- a/bootstrap/mod/src/main/resources/geyser.mixins.json +++ b/bootstrap/mod/src/main/resources/geyser.mixins.json @@ -6,7 +6,6 @@ "mixins": [ "server.ServerConnectionListenerMixin" ], - "refmap": "geyser-mod-refmap.json", "server": [ "server.DedicatedServerMixin" ], From f640f97646a312b2d84e096db83e975cfe5d5eca Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 21 Jan 2024 01:20:01 +0100 Subject: [PATCH 51/54] yeet transitive dependency, that cant be right --- bootstrap/mod/fabric/build.gradle.kts | 6 ++---- bootstrap/mod/neoforge/build.gradle.kts | 8 +++----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts index e5ea10b5c1e..ffa8aaea9e8 100644 --- a/bootstrap/mod/fabric/build.gradle.kts +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -8,7 +8,6 @@ architectury { } val common: Configuration by configurations.creating -val shadowCommon: Configuration by configurations.creating // Don't use shadow from the shadow plugin because we don't want IDEA to index this. val developmentFabric: Configuration = configurations.getByName("developmentFabric") configurations { compileClasspath.get().extendsFrom(configurations["common"]) @@ -20,7 +19,7 @@ dependencies { modImplementation(libs.fabric.loader) modApi(libs.fabric.api) - //api(projects.mod) + api(projects.mod) shadow(project(path = ":mod", configuration = "transformProductionFabric")) { isTransitive = false } @@ -35,8 +34,7 @@ dependencies { // This should be in the libs TOML, but something about modImplementation AND include just doesn't work include(modImplementation("me.lucko", "fabric-permissions-api", "0.2-SNAPSHOT")) - common(project(":mod", configuration = "namedElements")) { isTransitive = true } - //shadowCommon(project(":mod", configuration = "transformProductionFabric")) { isTransitive = false } + common(project(":mod", configuration = "namedElements")) { isTransitive = false } } application { diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index d348d777738..504d57541df 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -8,12 +8,11 @@ architectury { } val common: Configuration by configurations.creating -val shadowCommon: Configuration by configurations.creating // Don't use shadow from the shadow plugin because we don't want IDEA to index this. -val developmentForge: Configuration = configurations.getByName("developmentNeoForge") +val developmentNeoForge: Configuration = configurations.getByName("developmentNeoForge") configurations { compileClasspath.get().extendsFrom(configurations["common"]) runtimeClasspath.get().extendsFrom(configurations["common"]) - developmentForge.extendsFrom(configurations["common"]) + developmentNeoForge.extendsFrom(configurations["common"]) } dependencies { @@ -36,8 +35,7 @@ dependencies { exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") } - common(project(":mod", configuration = "namedElements")) { isTransitive = true } - //shadowCommon(project(":mod", configuration = "transformProductionNeoForge")) { isTransitive = false } + common(project(":mod", configuration = "namedElements")) { isTransitive = false } } application { From 7d4a69f3f953595c6dd12b4c6aafb1c59deb3ad7 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 21 Jan 2024 15:25:34 +0100 Subject: [PATCH 52/54] Attempt at getting the runServer task to work, part two --- bootstrap/mod/fabric/build.gradle.kts | 4 +--- bootstrap/mod/neoforge/build.gradle.kts | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts index ffa8aaea9e8..208b5e12bf5 100644 --- a/bootstrap/mod/fabric/build.gradle.kts +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -8,18 +8,16 @@ architectury { } val common: Configuration by configurations.creating -val developmentFabric: Configuration = configurations.getByName("developmentFabric") configurations { compileClasspath.get().extendsFrom(configurations["common"]) runtimeClasspath.get().extendsFrom(configurations["common"]) - developmentFabric.extendsFrom(configurations["common"]) } dependencies { modImplementation(libs.fabric.loader) modApi(libs.fabric.api) - api(projects.mod) + api(project(":mod", configuration = "namedElements")) shadow(project(path = ":mod", configuration = "transformProductionFabric")) { isTransitive = false } diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 504d57541df..603be862503 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -8,6 +8,7 @@ architectury { } val common: Configuration by configurations.creating +// Without this, mixin config isn't read properly with the runServer neoforge task val developmentNeoForge: Configuration = configurations.getByName("developmentNeoForge") configurations { compileClasspath.get().extendsFrom(configurations["common"]) @@ -25,7 +26,7 @@ dependencies { neoForge(libs.neoforge.minecraft) - //api(projects.mod) + api(project(":mod", configuration = "namedElements")) shadow(project(path = ":mod", configuration = "transformProductionNeoForge")) { isTransitive = false } @@ -36,6 +37,8 @@ dependencies { exclude(group = "io.netty.incubator") } common(project(":mod", configuration = "namedElements")) { isTransitive = false } + + forgeRuntimeLibrary(projects.core) } application { From 96c47315c544215d5076c335721dad72ae7e138e Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 21 Jan 2024 19:25:33 +0100 Subject: [PATCH 53/54] Revert the changes for the runServer task, try and shut down the injector --- bootstrap/mod/fabric/build.gradle.kts | 8 -------- bootstrap/mod/neoforge/build.gradle.kts | 12 ------------ .../geyser/platform/mod/GeyserModInjector.java | 18 +++++++++++++++++- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts index 208b5e12bf5..9915928145d 100644 --- a/bootstrap/mod/fabric/build.gradle.kts +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -7,12 +7,6 @@ architectury { fabric() } -val common: Configuration by configurations.creating -configurations { - compileClasspath.get().extendsFrom(configurations["common"]) - runtimeClasspath.get().extendsFrom(configurations["common"]) -} - dependencies { modImplementation(libs.fabric.loader) modApi(libs.fabric.api) @@ -31,8 +25,6 @@ dependencies { // This should be in the libs TOML, but something about modImplementation AND include just doesn't work include(modImplementation("me.lucko", "fabric-permissions-api", "0.2-SNAPSHOT")) - - common(project(":mod", configuration = "namedElements")) { isTransitive = false } } application { diff --git a/bootstrap/mod/neoforge/build.gradle.kts b/bootstrap/mod/neoforge/build.gradle.kts index 603be862503..178564044ed 100644 --- a/bootstrap/mod/neoforge/build.gradle.kts +++ b/bootstrap/mod/neoforge/build.gradle.kts @@ -7,15 +7,6 @@ architectury { neoForge() } -val common: Configuration by configurations.creating -// Without this, mixin config isn't read properly with the runServer neoforge task -val developmentNeoForge: Configuration = configurations.getByName("developmentNeoForge") -configurations { - compileClasspath.get().extendsFrom(configurations["common"]) - runtimeClasspath.get().extendsFrom(configurations["common"]) - developmentNeoForge.extendsFrom(configurations["common"]) -} - dependencies { // See https://github.com/google/guava/issues/6618 modules { @@ -36,9 +27,6 @@ dependencies { exclude(group = "org.slf4j") exclude(group = "io.netty.incubator") } - common(project(":mod", configuration = "namedElements")) { isTransitive = false } - - forgeRuntimeLibrary(projects.core) } application { diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java index 4ccebdc0319..0f0770ba3fc 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java @@ -38,6 +38,7 @@ import net.minecraft.server.network.ServerConnectionListener; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.network.netty.LocalSession; @@ -51,6 +52,7 @@ public class GeyserModInjector extends GeyserInjector { private final MinecraftServer server; private final GeyserModPlatform platform; + private DefaultEventLoopGroup eventLoopGroup; /** * Used to uninject ourselves on shutdown. @@ -84,6 +86,7 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti Method initChannel = childHandler.getClass().getDeclaredMethod("initChannel", Channel.class); initChannel.setAccessible(true); + eventLoopGroup = new DefaultEventLoopGroup(0, new DefaultThreadFactory("Geyser " + this.platform.platformType().platformName() + " connection thread", Thread.MAX_PRIORITY)); ChannelFuture channelFuture = (new ServerBootstrap() .channel(LocalServerChannelWrapper.class) .childHandler(new ChannelInitializer<>() { @@ -97,7 +100,7 @@ protected void initChannel(@NonNull Channel ch) throws Exception { } }) // Set to MAX_PRIORITY as MultithreadEventLoopGroup#newDefaultThreadFactory which DefaultEventLoopGroup implements does by default - .group(new DefaultEventLoopGroup(0, new DefaultThreadFactory("Geyser " + this.platform.platformType().platformName() + " connection thread", Thread.MAX_PRIORITY))) + .group(eventLoopGroup) .localAddress(LocalAddress.ANY)) .bind() .syncUninterruptibly(); @@ -108,6 +111,8 @@ protected void initChannel(@NonNull Channel ch) throws Exception { this.serverSocketAddress = channelFuture.channel().localAddress(); workAroundWeirdBug(bootstrap); + + Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown)); } @SuppressWarnings("unchecked") @@ -153,6 +158,17 @@ public void shutdown() { this.allServerChannels.remove(this.localChannel); this.allServerChannels = null; } + + if (eventLoopGroup != null) { + try { + eventLoopGroup.shutdownGracefully().sync(); + eventLoopGroup = null; + } catch (Exception e) { + GeyserImpl.getInstance().getLogger().error("Unable to shut down injector! " + e.getMessage()); + e.printStackTrace(); + } + } + super.shutdown(); } } From e94ef30776dfbcb71dc8564fe1e4bfb919441d7a Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 21 Jan 2024 20:24:12 +0100 Subject: [PATCH 54/54] Remove spigot weird bug workaround, shut down properly Also add a compileOnly dependency for the mod module to get rid of spammy false warnings --- bootstrap/mod/build.gradle.kts | 3 +++ .../neoforge/GeyserNeoforgeDumpInfo.java | 2 +- .../platform/mod/GeyserModInjector.java | 21 +------------------ 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/bootstrap/mod/build.gradle.kts b/bootstrap/mod/build.gradle.kts index 749fab8c1bf..7651a2df2e1 100644 --- a/bootstrap/mod/build.gradle.kts +++ b/bootstrap/mod/build.gradle.kts @@ -9,4 +9,7 @@ loom { dependencies { api(projects.core) compileOnly(libs.mixin) + + // Only here to suppress "unknown enum constant EnvType.CLIENT" warnings. DO NOT USE! + compileOnly(libs.fabric.loader) } \ No newline at end of file diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java index c8793db7e75..d05fae10e9f 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoforgeDumpInfo.java @@ -54,7 +54,7 @@ public class GeyserNeoforgeDumpInfo extends BootstrapDumpInfo { private final List mods; public GeyserNeoforgeDumpInfo(MinecraftServer server) { - this.platformName = FMLLoader.getNaming(); + this.platformName = FMLLoader.launcherHandlerName(); this.platformVersion = FMLLoader.versionInfo().neoForgeVersion(); this.minecraftVersion = FMLLoader.versionInfo().mcVersion(); this.dist = FMLLoader.getDist(); diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java index 0f0770ba3fc..8beec9bd254 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.platform.mod; -import com.github.steveice10.mc.protocol.MinecraftProtocol; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; @@ -41,12 +40,10 @@ import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; -import org.geysermc.geyser.network.netty.LocalSession; import org.geysermc.geyser.platform.mod.platform.GeyserModPlatform; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.net.InetAddress; import java.util.List; public class GeyserModInjector extends GeyserInjector { @@ -86,6 +83,7 @@ protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Excepti Method initChannel = childHandler.getClass().getDeclaredMethod("initChannel", Channel.class); initChannel.setAccessible(true); + // Separate variable so we can shut it down later eventLoopGroup = new DefaultEventLoopGroup(0, new DefaultThreadFactory("Geyser " + this.platform.platformType().platformName() + " connection thread", Thread.MAX_PRIORITY)); ChannelFuture channelFuture = (new ServerBootstrap() .channel(LocalServerChannelWrapper.class) @@ -109,10 +107,6 @@ protected void initChannel(@NonNull Channel ch) throws Exception { allServerChannels.add(channelFuture); this.localChannel = channelFuture; this.serverSocketAddress = channelFuture.channel().localAddress(); - - workAroundWeirdBug(bootstrap); - - Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown)); } @SuppressWarnings("unchecked") @@ -139,19 +133,6 @@ private ChannelInitializer getChildHandler(GeyserBootstrap bootstrap, C return childHandler; } - /** - * Work around an odd bug where the first connection might not initialize all channel handlers on the main pipeline - - * send a dummy status request down that acts as the first connection, then. - * For the future, if someone wants to properly fix this - as of December 28, 2021, it happens on 1.16.5/1.17.1/1.18.1 EXCEPT Spigot 1.16.5 - */ - private void workAroundWeirdBug(GeyserBootstrap bootstrap) { - MinecraftProtocol protocol = new MinecraftProtocol(); - LocalSession session = new LocalSession(bootstrap.getGeyserConfig().getRemote().address(), - bootstrap.getGeyserConfig().getRemote().port(), this.serverSocketAddress, - InetAddress.getLoopbackAddress().getHostAddress(), protocol, protocol.createHelper()); - session.connect(); - } - @Override public void shutdown() { if (this.allServerChannels != null) {