From 0de5415f05b166cb0b3fe6cbdb62247f6093e3d2 Mon Sep 17 00:00:00 2001 From: AkmalFairuz Date: Tue, 31 Dec 2024 20:57:21 +0700 Subject: [PATCH] initial commit --- .gitignore | 1 + config.toml | 4 + go.mod | 31 + go.sum | 124 + internal/block_states.go | 53 + internal/chunk/chunk.go | 119 + internal/chunk/decode.go | 145 + internal/chunk/encode.go | 92 + internal/chunk/encoding.go | 193 + internal/chunk/palette.go | 131 + internal/chunk/paletted_storage.go | 200 + internal/chunk/sub_chunk.go | 66 + .../item/1.12.0_item_id_to_block_id_map.json | 481 ++ .../item/1.12.0_to_1.18.10_blockstate_map.bin | Bin 0 -> 329681 bytes internal/item/registry.go | 110 + internal/item/schema.go | 7 + .../item/schemas/0001_1.6_beta_to_1.6.0.json | 10 + .../item/schemas/0011_1.11.4_to_1.12.0.json | 20 + .../item/schemas/0021_1.16.0_to_1.16.100.json | 165 + .../schemas/0031_1.16.100_to_1.16.200.json | 7 + .../schemas/0041_1.16.200_to_1.17.30.json | 12 + .../item/schemas/0051_1.17.40_to_1.18.0.json | 5 + .../item/schemas/0061_1.18.0_to_1.18.10.json | 16 + .../item/schemas/0071_1.18.10_to_1.18.30.json | 23 + .../0081_1.18.30_to_1.19.30.34_beta.json | 25 + .../0091_1.19.60_to_1.19.70.26_beta.json | 37 + .../0101_1.19.70_to_1.19.80.24_beta.json | 36 + .../0111_1.19.80_to_1.20.0.23_beta.json | 37 + ...121_1.20.0.23_beta_to_1.20.10.24_beta.json | 40 + ...31_1.20.10.24_beta_to_1.20.20.23_beta.json | 40 + ...41_1.20.20.23_beta_to_1.20.30.22_beta.json | 40 + ...51_1.20.30.22_beta_to_1.20.50.23_beta.json | 20 + ...61_1.20.50.23_beta_to_1.20.60.26_beta.json | 47 + ...71_1.20.60.26_beta_to_1.20.70.24_beta.json | 42 + ...81_1.20.70.24_beta_to_1.20.80.24_beta.json | 39 + ...191_1.20.80.24_beta_to_1.21.0.25_beta.json | 44 + ...201_1.21.0.25_beta_to_1.21.20.24_beta.json | 138 + ...11_1.21.20.24_beta_to_1.21.30.24_beta.json | 52 + .../0221_1.21.30.24_beta_to_1.21.40.25.json | 13 + internal/item/upgrader.go | 109 + internal/iterator.go | 41 + legacyver/bitset.go | 22 + legacyver/block_states_748.nbt | Bin 0 -> 1918591 bytes legacyver/block_states_766.nbt | Bin 0 -> 2059051 bytes legacyver/block_translator.go | 340 + legacyver/item_runtime_ids_748.nbt | Bin 0 -> 50902 bytes legacyver/item_runtime_ids_766.nbt | Bin 0 -> 52097 bytes legacyver/item_translator.go | 767 ++ legacyver/legacypacket/item_stack_response.go | 27 + legacyver/legacypacket/packet.go | 1 + legacyver/legacypacket/player_auth_input.go | 210 + legacyver/legacypacket/resource_packs_info.go | 50 + legacyver/proto/id.go | 32 + legacyver/proto/io.go | 53 + legacyver/proto/item_stack.go | 652 ++ legacyver/proto/resource_pack.go | 79 + legacyver/proto/type.go | 5 + legacyver/protocol.go | 215 + legacyver/required_item_list_748.json | 6998 ++++++++++++++++ legacyver/required_item_list_766.json | 7158 +++++++++++++++++ legacyver/v748.go | 36 + legacyver/v766.go | 25 + main.go | 146 + mapping/block.go | 136 + mapping/custom_blocks.go | 84 + mapping/item.go | 109 + packbuilder/builder.go | 71 + packbuilder/components.go | 119 + packbuilder/items.go | 81 + packbuilder/lang.go | 17 + packbuilder/manifest.go | 52 + packbuilder/resource_pack.go | 40 + 72 files changed, 20340 insertions(+) create mode 100644 .gitignore create mode 100644 config.toml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/block_states.go create mode 100644 internal/chunk/chunk.go create mode 100644 internal/chunk/decode.go create mode 100644 internal/chunk/encode.go create mode 100644 internal/chunk/encoding.go create mode 100644 internal/chunk/palette.go create mode 100644 internal/chunk/paletted_storage.go create mode 100644 internal/chunk/sub_chunk.go create mode 100644 internal/item/1.12.0_item_id_to_block_id_map.json create mode 100644 internal/item/1.12.0_to_1.18.10_blockstate_map.bin create mode 100644 internal/item/registry.go create mode 100644 internal/item/schema.go create mode 100644 internal/item/schemas/0001_1.6_beta_to_1.6.0.json create mode 100644 internal/item/schemas/0011_1.11.4_to_1.12.0.json create mode 100644 internal/item/schemas/0021_1.16.0_to_1.16.100.json create mode 100644 internal/item/schemas/0031_1.16.100_to_1.16.200.json create mode 100644 internal/item/schemas/0041_1.16.200_to_1.17.30.json create mode 100644 internal/item/schemas/0051_1.17.40_to_1.18.0.json create mode 100644 internal/item/schemas/0061_1.18.0_to_1.18.10.json create mode 100644 internal/item/schemas/0071_1.18.10_to_1.18.30.json create mode 100644 internal/item/schemas/0081_1.18.30_to_1.19.30.34_beta.json create mode 100644 internal/item/schemas/0091_1.19.60_to_1.19.70.26_beta.json create mode 100644 internal/item/schemas/0101_1.19.70_to_1.19.80.24_beta.json create mode 100644 internal/item/schemas/0111_1.19.80_to_1.20.0.23_beta.json create mode 100644 internal/item/schemas/0121_1.20.0.23_beta_to_1.20.10.24_beta.json create mode 100644 internal/item/schemas/0131_1.20.10.24_beta_to_1.20.20.23_beta.json create mode 100644 internal/item/schemas/0141_1.20.20.23_beta_to_1.20.30.22_beta.json create mode 100644 internal/item/schemas/0151_1.20.30.22_beta_to_1.20.50.23_beta.json create mode 100644 internal/item/schemas/0161_1.20.50.23_beta_to_1.20.60.26_beta.json create mode 100644 internal/item/schemas/0171_1.20.60.26_beta_to_1.20.70.24_beta.json create mode 100644 internal/item/schemas/0181_1.20.70.24_beta_to_1.20.80.24_beta.json create mode 100644 internal/item/schemas/0191_1.20.80.24_beta_to_1.21.0.25_beta.json create mode 100644 internal/item/schemas/0201_1.21.0.25_beta_to_1.21.20.24_beta.json create mode 100644 internal/item/schemas/0211_1.21.20.24_beta_to_1.21.30.24_beta.json create mode 100644 internal/item/schemas/0221_1.21.30.24_beta_to_1.21.40.25.json create mode 100644 internal/item/upgrader.go create mode 100644 internal/iterator.go create mode 100644 legacyver/bitset.go create mode 100644 legacyver/block_states_748.nbt create mode 100644 legacyver/block_states_766.nbt create mode 100644 legacyver/block_translator.go create mode 100644 legacyver/item_runtime_ids_748.nbt create mode 100644 legacyver/item_runtime_ids_766.nbt create mode 100644 legacyver/item_translator.go create mode 100644 legacyver/legacypacket/item_stack_response.go create mode 100644 legacyver/legacypacket/packet.go create mode 100644 legacyver/legacypacket/player_auth_input.go create mode 100644 legacyver/legacypacket/resource_packs_info.go create mode 100644 legacyver/proto/id.go create mode 100644 legacyver/proto/io.go create mode 100644 legacyver/proto/item_stack.go create mode 100644 legacyver/proto/resource_pack.go create mode 100644 legacyver/proto/type.go create mode 100644 legacyver/protocol.go create mode 100644 legacyver/required_item_list_748.json create mode 100644 legacyver/required_item_list_766.json create mode 100644 legacyver/v748.go create mode 100644 legacyver/v766.go create mode 100644 main.go create mode 100644 mapping/block.go create mode 100644 mapping/custom_blocks.go create mode 100644 mapping/item.go create mode 100644 packbuilder/builder.go create mode 100644 packbuilder/components.go create mode 100644 packbuilder/items.go create mode 100644 packbuilder/lang.go create mode 100644 packbuilder/manifest.go create mode 100644 packbuilder/resource_pack.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..4c644df --- /dev/null +++ b/config.toml @@ -0,0 +1,4 @@ + +[Connection] + LocalAddress = "0.0.0.0:19132" + RemoteAddress = "play.venitymc.com:19132" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8db2e3e --- /dev/null +++ b/go.mod @@ -0,0 +1,31 @@ +module github.com/akmalfairuz/legacy-version + +go 1.23.3 + +require ( + github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/df-mc/dragonfly v0.9.20-0.20241229163702-cc7e4ee0e3ce // indirect + github.com/df-mc/goleveldb v1.1.9 // indirect + github.com/df-mc/worldupgrader v1.0.18 // indirect + github.com/go-gl/mathgl v1.2.0 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-jose/go-jose/v4 v4.0.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/muhammadmuzzammil1998/jsonc v1.0.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/samber/lo v1.47.0 // indirect + github.com/sandertv/go-raknet v1.14.2 // indirect + github.com/sandertv/gophertunnel v1.43.1 // indirect + github.com/segmentio/fasthash v1.0.3 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect + golang.org/x/image v0.21.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/text v0.21.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..91b058f --- /dev/null +++ b/go.sum @@ -0,0 +1,124 @@ +github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 h1:/G0ghZwrhou0Wq21qc1vXXMm/t/aKWkALWwITptKbE0= +github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9/go.mod h1:TOk10ahXejq9wkEaym3KPRNeuR/h5Jx+s8QRWIa2oTM= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/df-mc/dragonfly v0.9.20-0.20241229163702-cc7e4ee0e3ce h1:mhBn/ezojzACPHeg+Y9NnU2bbYCozx27RgpfWUPw4i0= +github.com/df-mc/dragonfly v0.9.20-0.20241229163702-cc7e4ee0e3ce/go.mod h1:hH1eU9lmucLNLehzxXzOUOmHJQLz3DLpQMUqIKcz8YI= +github.com/df-mc/goleveldb v1.1.9 h1:ihdosZyy5jkQKrxucTQmN90jq/2lUwQnJZjIYIC/9YU= +github.com/df-mc/goleveldb v1.1.9/go.mod h1:+NHCup03Sci5q84APIA21z3iPZCuk6m6ABtg4nANCSk= +github.com/df-mc/worldupgrader v1.0.18 h1:Q34X9ID/hGuDyj9oiq+dpyjOaJdNxhVmVUepf/EPYDA= +github.com/df-mc/worldupgrader v1.0.18/go.mod h1:tsSOLTRm9mpG7VHvYpAjjZrkRHWmSbKZAm9bOLNnlDk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-gl/mathgl v1.1.0 h1:0lzZ+rntPX3/oGrDzYGdowSLC2ky8Osirvf5uAwfIEA= +github.com/go-gl/mathgl v1.1.0/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= +github.com/go-gl/mathgl v1.2.0 h1:v2eOj/y1B2afDxF6URV1qCYmo1KW08lAMtTbOn3KXCY= +github.com/go-gl/mathgl v1.2.0/go.mod h1:pf9+b5J3LFP7iZ4XXaVzZrCle0Q/vNpB/vDe5+3ulRE= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= +github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/muhammadmuzzammil1998/jsonc v1.0.0 h1:8o5gBQn4ZA3NBA9DlTujCj2a4w0tqWrPVjDwhzkgTIs= +github.com/muhammadmuzzammil1998/jsonc v1.0.0/go.mod h1:saF2fIVw4banK0H4+/EuqfFLpRnoy5S+ECwTOCcRcSU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= +github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= +github.com/sandertv/go-raknet v1.14.2 h1:UZLyHn5yQU2Dq2GVq/LlxwAUikaq4q4AA1rl/Pf3AXQ= +github.com/sandertv/go-raknet v1.14.2/go.mod h1:/yysjwfCXm2+2OY8mBazLzcxJ3irnylKCyG3FLgUPVU= +github.com/sandertv/gophertunnel v1.43.0 h1:zoB0nngGXokBlj+ge4ISvbInEd/1xbrIlclC/POCTgc= +github.com/sandertv/gophertunnel v1.43.0/go.mod h1:krvLSeRUNQ2iEYJNEgzrKtWO8W5ybZxN5lFfSCkHoNk= +github.com/sandertv/gophertunnel v1.43.1-0.20241229203958-5af8736ae319 h1:yxDqIvO9BkUFtK2SpnngPDnPQ9hnhq3IGZ6qiO2rFHg= +github.com/sandertv/gophertunnel v1.43.1-0.20241229203958-5af8736ae319/go.mod h1:XuEJo+ARim+NKiD90Z56sQRcDtCOErz26e2bt3LEd9I= +github.com/sandertv/gophertunnel v1.43.1 h1:wY6Fy8dRMKtpZUQzCR35o9k05135vOJZhrz0GF6OXFI= +github.com/sandertv/gophertunnel v1.43.1/go.mod h1:XuEJo+ARim+NKiD90Z56sQRcDtCOErz26e2bt3LEd9I= +github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= +github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/block_states.go b/internal/block_states.go new file mode 100644 index 0000000..e35ba0d --- /dev/null +++ b/internal/block_states.go @@ -0,0 +1,53 @@ +package internal + +import ( + "fmt" + "github.com/df-mc/worldupgrader/blockupgrader" + "sort" + "strings" + "unsafe" +) + +// StateHash is a struct that may be used as a map key for block states. It contains the name of the block state +// and an encoded version of the properties. +type StateHash struct { + Name, Properties string +} + +// HashState produces a hash for the block properties held by the blockState. +func HashState(state blockupgrader.BlockState) StateHash { + if state.Properties == nil { + return StateHash{Name: state.Name} + } + keys := make([]string, 0, len(state.Properties)) + for k := range state.Properties { + keys = append(keys, k) + } + sort.Slice(keys, func(i, j int) bool { + return keys[i] < keys[j] + }) + + var b strings.Builder + for _, k := range keys { + switch v := state.Properties[k].(type) { + case bool: + if v { + b.WriteByte(1) + } else { + b.WriteByte(0) + } + case uint8: + b.WriteByte(v) + case int32: + a := *(*[4]byte)(unsafe.Pointer(&v)) + b.Write(a[:]) + case string: + b.WriteString(v) + default: + // If block encoding is broken, we want to find out as soon as possible. This saves a lot of time + // debugging in-game. + panic(fmt.Sprintf("invalid block property type %T for property %v", v, k)) + } + } + return StateHash{Name: state.Name, Properties: b.String()} +} diff --git a/internal/chunk/chunk.go b/internal/chunk/chunk.go new file mode 100644 index 0000000..1baf026 --- /dev/null +++ b/internal/chunk/chunk.go @@ -0,0 +1,119 @@ +package chunk + +import ( + "github.com/df-mc/dragonfly/server/block/cube" + "sync" +) + +// Chunk is a segment in the world with a size of 16x16x256 blocks. A chunk contains multiple sub chunks +// and stores other information such as biomes. +// It is not safe to call methods on Chunk simultaneously from multiple goroutines. +type Chunk struct { + sync.Mutex + // r holds the (vertical) range of the Chunk. It includes both the minimum and maximum coordinates. + r cube.Range + // air is the runtime ID of air. + air uint32 + // sub holds all sub chunks part of the chunk. The pointers held by the array are nil if no sub chunk is + // allocated at the indices. + sub []*SubChunk + // biomes is an array of biome IDs. There is one biome ID for every column in the chunk. + biomes []*PalettedStorage +} + +// New initialises a new chunk and returns it, so that it may be used. +func New(air uint32, r cube.Range) *Chunk { + n := (r.Height() >> 4) + 1 + sub, biomes := make([]*SubChunk, n), make([]*PalettedStorage, n) + for i := 0; i < n; i++ { + sub[i] = NewSubChunk(air) + biomes[i] = emptyStorage(0) + } + return &Chunk{r: r, air: air, sub: sub, biomes: biomes} +} + +// Range returns the cube.Range of the Chunk as passed to New. +func (chunk *Chunk) Range() cube.Range { + return chunk.r +} + +// Sub returns a list of all sub chunks present in the chunk. +func (chunk *Chunk) Sub() []*SubChunk { + return chunk.sub +} + +// Block returns the runtime ID of the block at a given x, y and z in a chunk at the given layer. If no +// sub chunk exists at the given y, the block is assumed to be air. +func (chunk *Chunk) Block(x uint8, y int16, z uint8, layer uint8) uint32 { + sub := chunk.subChunk(y) + if sub.Empty() || uint8(len(sub.storages)) <= layer { + return chunk.air + } + return sub.storages[layer].At(x, uint8(y), z) +} + +// SetBlock sets the runtime ID of a block at a given x, y and z in a chunk at the given layer. If no +// SubChunk exists at the given y, a new SubChunk is created and the block is set. +func (chunk *Chunk) SetBlock(x uint8, y int16, z uint8, layer uint8, block uint32) { + sub := chunk.sub[chunk.subIndex(y)] + if uint8(len(sub.storages)) <= layer && block == chunk.air { + // Air was set at n layer, but there were less than n layers, so there already was air there. + // Don't do anything with this, just return. + return + } + sub.Layer(layer).Set(x, uint8(y), z, block) +} + +// BiomeSub returns a list of all biome sub chunks present in the chunk. +func (chunk *Chunk) BiomeSub() []*PalettedStorage { + return chunk.biomes +} + +// Biome returns the biome ID at a specific column in the chunk. +func (chunk *Chunk) Biome(x uint8, y int16, z uint8) uint32 { + return chunk.biomes[chunk.subIndex(y)].At(x, uint8(y), z) +} + +// SetBiome sets the biome ID at a specific column in the chunk. +func (chunk *Chunk) SetBiome(x uint8, y int16, z uint8, biome uint32) { + chunk.biomes[chunk.subIndex(y)].Set(x, uint8(y), z, biome) +} + +// HighestBlock iterates from the highest non-empty sub chunk downwards to find the Y value of the highest +// non-air block at an x and z. If no blocks are present in the column, 0 is returned. +func (chunk *Chunk) HighestBlock(x, z uint8) int16 { + for index := int16(len(chunk.sub) - 1); index >= 0; index-- { + if sub := chunk.sub[index]; !sub.Empty() { + for y := 15; y >= 0; y-- { + if rid := sub.storages[0].At(x, uint8(y), z); rid != chunk.air { + return int16(y) | chunk.subY(index) + } + } + } + } + return int16(chunk.r[0]) +} + +// Compact compacts the chunk as much as possible, getting rid of any sub chunks that are empty, and compacts +// all storages in the sub chunks to occupy as little space as possible. +// Compact should be called right before the chunk is saved in order to optimise the storage space. +func (chunk *Chunk) Compact() { + for i := range chunk.sub { + chunk.sub[i].compact() + } +} + +// subChunk finds the correct SubChunk in the Chunk by a Y value. +func (chunk *Chunk) subChunk(y int16) *SubChunk { + return chunk.sub[chunk.subIndex(y)] +} + +// subIndex returns the sub chunk Y index matching the y value passed. +func (chunk *Chunk) subIndex(y int16) int16 { + return (y - int16(chunk.r[0])) >> 4 +} + +// subY returns the sub chunk Y value matching the index passed. +func (chunk *Chunk) subY(index int16) int16 { + return (index << 4) + int16(chunk.r[0]) +} diff --git a/internal/chunk/decode.go b/internal/chunk/decode.go new file mode 100644 index 0000000..29b73db --- /dev/null +++ b/internal/chunk/decode.go @@ -0,0 +1,145 @@ +package chunk + +import ( + "bytes" + "fmt" + "github.com/df-mc/dragonfly/server/block/cube" +) + +// NetworkDecode decodes the network serialised data passed into a Chunk if successful. If not, the chunk +// returned is nil and the error non-nil. +// The sub chunk count passed must be that found in the LevelChunk packet. +// noinspection GoUnusedExportedFunction +func NetworkDecode(air uint32, buf *bytes.Buffer, count int, oldFormat bool, r cube.Range, pse Encoding, pe PaletteEncoding) (*Chunk, error) { + var ( + c = New(air, r) + err error + ) + for i := 0; i < count; i++ { + index := uint8(i) + if oldFormat { + index += 4 + } + c.sub[index], err = DecodeSubChunk(air, r, buf, &index, NetworkEncoding, pse, pe) + if err != nil { + return nil, err + } + } + if oldFormat { + // Read the old biomes. + biomes := make([]byte, 256) + if _, err := buf.Read(biomes); err != nil { + return nil, fmt.Errorf("error reading biomes: %w", err) + } + + // Make our 2D biomes 3D. + for x := 0; x < 16; x++ { + for z := 0; z < 16; z++ { + id := biomes[(x&15)|(z&15)<<4] + for y := r.Min(); y <= r.Max(); y++ { + c.SetBiome(uint8(x), int16(y), uint8(z), uint32(id)) + } + } + } + } else { + var last *PalettedStorage + for i := 0; i < len(c.sub); i++ { + b, err := decodePalettedStorage(buf, NetworkEncoding, pse, BiomePaletteEncoding) + if err != nil { + return nil, err + } + if b == nil { + // b == nil means this paletted storage had the flag pointing to the previous one. It basically means we should + // inherit whatever palette we decoded last. + if i == 0 { + // This should never happen and there is no way to handle this. + return nil, fmt.Errorf("first biome storage pointed to previous one") + } + b = last + } else { + last = b + } + c.biomes[i] = b + } + } + return c, nil +} + +// DecodeSubChunk decodes a SubChunk from a bytes.Buffer. The Encoding passed defines how the block storages of the +// SubChunk are decoded. +func DecodeSubChunk(air uint32, r cube.Range, buf *bytes.Buffer, index *byte, e Encoding, pse Encoding, pe PaletteEncoding) (*SubChunk, error) { + ver, err := buf.ReadByte() + if err != nil { + return nil, fmt.Errorf("error reading version: %w", err) + } + sub := NewSubChunk(air) + switch ver { + default: + return nil, fmt.Errorf("unknown sub chunk version %v: can't decode", ver) + case 1: + // Version 1 only has one layer for each sub chunk, but uses the format with palettes. + storage, err := decodePalettedStorage(buf, e, pse, pe) + if err != nil { + return nil, err + } + sub.storages = append(sub.storages, storage) + case 8, 9: + // Version 8 allows up to 256 layers for one sub chunk. + storageCount, err := buf.ReadByte() + if err != nil { + return nil, fmt.Errorf("error reading storage count: %w", err) + } + if ver == 9 { + uIndex, err := buf.ReadByte() + if err != nil { + return nil, fmt.Errorf("error reading subchunk index: %w", err) + } + // The index as written here isn't the actual index of the subchunk within the chunk. Rather, it is the Y + // value of the subchunk. This means that we need to translate it to an index. + *index = uint8(int8(uIndex) - int8(r[0]>>4)) + } + sub.storages = make([]*PalettedStorage, storageCount) + + for i := byte(0); i < storageCount; i++ { + sub.storages[i], err = decodePalettedStorage(buf, e, pse, pe) + if err != nil { + return nil, err + } + } + } + return sub, nil +} + +// decodePalettedStorage decodes a PalettedStorage from a bytes.Buffer. The Encoding passed is used to read either a +// network or disk block storage. +func decodePalettedStorage(buf *bytes.Buffer, e Encoding, pse Encoding, pe PaletteEncoding) (*PalettedStorage, error) { + blockSize, err := buf.ReadByte() + if err != nil { + return nil, fmt.Errorf("error reading block size: %w", err) + } + if e == NetworkEncoding && blockSize&1 != 1 { + e = pse + } + + blockSize >>= 1 + if blockSize == 0x7f { + return nil, nil + } + + size := paletteSize(blockSize) + uint32Count := size.uint32s() + + uint32s := make([]uint32, uint32Count) + byteCount := uint32Count * 4 + + data := buf.Next(byteCount) + if len(data) != byteCount { + return nil, fmt.Errorf("cannot read paletted storage (size=%v) %T: not enough block data present: expected %v bytes, got %v", blockSize, pe, byteCount, len(data)) + } + for i := 0; i < uint32Count; i++ { + // Explicitly don't use the binary package to greatly improve performance of reading the uint32s. + uint32s[i] = uint32(data[i*4]) | uint32(data[i*4+1])<<8 | uint32(data[i*4+2])<<16 | uint32(data[i*4+3])<<24 + } + p, err := e.DecodePalette(buf, paletteSize(blockSize), pe) + return newPalettedStorage(uint32s, p), err +} diff --git a/internal/chunk/encode.go b/internal/chunk/encode.go new file mode 100644 index 0000000..c4e8392 --- /dev/null +++ b/internal/chunk/encode.go @@ -0,0 +1,92 @@ +package chunk + +import ( + "bytes" + "github.com/df-mc/dragonfly/server/block/cube" + "sync" +) + +// pool is used to pool byte buffers used for encoding chunks. +var pool = sync.Pool{ + New: func() any { + return bytes.NewBuffer(make([]byte, 0, 1024)) + }, +} + +func NetworkEncode(air uint32, c *Chunk, oldFormat bool, pe PaletteEncoding) ([]byte, error) { + buf := pool.Get().(*bytes.Buffer) + for i := 0; i < len(c.sub); i++ { + _, _ = buf.Write(EncodeSubChunk(c.sub[i], NetworkEncoding, pe, SubChunkVersion8, c.r, i)) + } + if oldFormat { + biomes := make([]byte, 256) + + // Make our 3D biomes 2D. + for x := uint8(0); x < 16; x++ { + for z := uint8(0); z < 16; z++ { + biomes[(x&15)|(z&15)<<4] = byte(c.Biome(x, c.HighestBlock(x, z), z)) + } + } + _, _ = buf.Write(biomes) + } else { + _, _ = buf.Write(EncodeBiomes(c, NetworkEncoding)) + } + + return buf.Bytes(), nil +} + +// EncodeSubChunk encodes a sub-chunk from a chunk into bytes. An Encoding may be passed to encode either for network or +// disk purposed, the most notable difference being that the network encoding generally uses varints and no NBT. +func EncodeSubChunk(s *SubChunk, e Encoding, pe PaletteEncoding, subChunkVer subChunkVersion, r cube.Range, ind int) []byte { + buf := pool.Get().(*bytes.Buffer) + defer func() { + buf.Reset() + pool.Put(buf) + }() + + subChunkVer.EncodeHeader(buf, s, r, ind) + for _, storage := range s.storages { + encodePalettedStorage(buf, storage, nil, e, pe) + } + sub := make([]byte, buf.Len()) + _, _ = buf.Read(sub) + return sub +} + +// EncodeBiomes encodes the biomes of a chunk into bytes. An Encoding may be passed to encode either for network or +// disk purposed, the most notable difference being that the network encoding generally uses varints and no NBT. +func EncodeBiomes(c *Chunk, e Encoding) []byte { + buf := pool.Get().(*bytes.Buffer) + defer func() { + buf.Reset() + pool.Put(buf) + }() + + var previous *PalettedStorage + for _, b := range c.biomes { + encodePalettedStorage(buf, b, previous, e, BiomePaletteEncoding) + previous = b + } + biomes := make([]byte, buf.Len()) + _, _ = buf.Read(biomes) + return biomes +} + +// encodePalettedStorage encodes a PalettedStorage into a bytes.Buffer. The Encoding passed is used to write the Palette +// of the PalettedStorage. +func encodePalettedStorage(buf *bytes.Buffer, storage, previous *PalettedStorage, e Encoding, pe PaletteEncoding) { + if storage.Equal(previous) { + _, _ = buf.Write([]byte{0x7f<<1 | e.Network()}) + return + } + b := make([]byte, len(storage.indices)*4+1) + b[0] = byte(storage.bitsPerIndex<<1) | e.Network() + + for i, v := range storage.indices { + // Explicitly don't use the binary package to greatly improve performance of writing the uint32s. + b[i*4+1], b[i*4+2], b[i*4+3], b[i*4+4] = byte(v), byte(v>>8), byte(v>>16), byte(v>>24) + } + _, _ = buf.Write(b) + + e.EncodePalette(buf, storage.palette, pe) +} diff --git a/internal/chunk/encoding.go b/internal/chunk/encoding.go new file mode 100644 index 0000000..5c5d7b6 --- /dev/null +++ b/internal/chunk/encoding.go @@ -0,0 +1,193 @@ +package chunk + +import ( + "bytes" + "encoding/binary" + "fmt" + "github.com/akmalfairuz/legacy-version/mapping" + "strings" + + "github.com/df-mc/dragonfly/server/block/cube" + "github.com/df-mc/worldupgrader/blockupgrader" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" +) + +const ( + // SubChunkVersion is the current version of the written sub chunks, specifying the format they are + // written on disk and over network. + SubChunkVersion = 9 +) + +type ( + // Encoding is an encoding type used for Chunk encoding. Implementations of this interface are DiskEncoding and + // NetworkEncoding, which can be used to encode a Chunk to an intermediate disk or network representation respectively. + Encoding interface { + EncodePalette(buf *bytes.Buffer, p *Palette, e PaletteEncoding) + DecodePalette(buf *bytes.Buffer, blockSize paletteSize, e PaletteEncoding) (*Palette, error) + Network() byte + } + // PaletteEncoding is an encoding type used for Chunk encoding. It is used to encode different types of palettes + // (for example, blocks or biomes) differently. + PaletteEncoding interface { + Encode(buf *bytes.Buffer, v uint32) + Decode(buf *bytes.Buffer) (uint32, error) + } + // Encoding is an encoding type used for Chunk encoding. Implementations of this interface are DiskEncoding and + // NetworkEncoding, which can be used to encode a Chunk to an intermediate disk or network representation respectively. + subChunkVersion interface { + EncodeHeader(buf *bytes.Buffer, s *SubChunk, r cube.Range, ind int) + } +) + +var ( + // SubChunkVersion9 subChunkVersion9 + SubChunkVersion9 subChunkVersion9 + // SubChunkVersion8 subChunkVersion8 + SubChunkVersion8 subChunkVersion8 + + // NetworkEncoding is the Encoding used for sending a Chunk over network. It does not use NBT and writes varints. + NetworkEncoding networkEncoding + // BiomePaletteEncoding is the paletteEncoding used for encoding a palette of biomes. + BiomePaletteEncoding biomePaletteEncoding +) + +// networkEncoding implements the Chunk encoding for sending over network. +type networkEncoding struct{} + +func (networkEncoding) Network() byte { return 1 } +func (networkEncoding) EncodePalette(buf *bytes.Buffer, p *Palette, _ PaletteEncoding) { + if p.size != 0 { + _ = protocol.WriteVarint32(buf, int32(p.Len())) + } + for _, val := range p.values { + _ = protocol.WriteVarint32(buf, int32(val)) + } +} +func (networkEncoding) DecodePalette(buf *bytes.Buffer, blockSize paletteSize, _ PaletteEncoding) (*Palette, error) { + var paletteCount int32 = 1 + if blockSize != 0 { + if err := protocol.Varint32(buf, &paletteCount); err != nil { + return nil, fmt.Errorf("error reading palette entry count: %w", err) + } + if paletteCount <= 0 { + return nil, fmt.Errorf("invalid palette entry count %v", paletteCount) + } + } + + blocks, temp := make([]uint32, paletteCount), int32(0) + for i := int32(0); i < paletteCount; i++ { + if err := protocol.Varint32(buf, &temp); err != nil { + return nil, fmt.Errorf("error decoding palette entry: %w", err) + } + blocks[i] = uint32(temp) + } + return &Palette{values: blocks, size: blockSize}, nil +} + +// biomePaletteEncoding implements the encoding of biome palettes to disk. +type biomePaletteEncoding struct{} + +func (biomePaletteEncoding) Encode(buf *bytes.Buffer, v uint32) { + _ = binary.Write(buf, binary.LittleEndian, v) +} +func (biomePaletteEncoding) Decode(buf *bytes.Buffer) (uint32, error) { + var v uint32 + return v, binary.Read(buf, binary.LittleEndian, &v) +} + +// BlockPaletteEncoding implements the encoding of block palettes to disk. +type BlockPaletteEncoding struct { + block mapping.Block + version int32 +} + +// NewBlockPaletteEncoding returns a new BlockPaletteEncoding using the block and version passed. +func NewBlockPaletteEncoding(block mapping.Block, version int32) BlockPaletteEncoding { + return BlockPaletteEncoding{block: block, version: version} +} + +func (b BlockPaletteEncoding) Encode(buf *bytes.Buffer, v uint32) { + // Get the block state registered with the runtime IDs we have in the palette of the block storage + // as we need the name and data value to store. + state, _ := b.block.RuntimeIDToState(v) + _ = nbt.NewEncoderWithEncoding(buf, nbt.LittleEndian).Encode(blockupgrader.BlockState{Name: state.Name, Properties: state.Properties, Version: b.version}) +} +func (b BlockPaletteEncoding) Decode(buf *bytes.Buffer) (uint32, error) { + var e blockupgrader.BlockState + if err := nbt.NewDecoderWithEncoding(buf, nbt.LittleEndian).Decode(&e); err != nil { + return 0, fmt.Errorf("error decoding block palette entry: %w", err) + } + v, ok := b.block.StateToRuntimeID(e) + if !ok { + return 0, fmt.Errorf("cannot get runtime ID of block state %v{%+v}", e.Name, e.Properties) + } + return v, nil +} + +// NewNetworkPersistentEncoding returns a new NetworkPersistentEncoding using the block and version passed. +func NewNetworkPersistentEncoding(block mapping.Block, version int32) NetworkPersistentEncoding { + return NetworkPersistentEncoding{block: block, version: version} +} + +// NetworkPersistentEncoding implements the Chunk encoding for sending over network with a persistent palette. +type NetworkPersistentEncoding struct { + block mapping.Block + version int32 +} + +func (n NetworkPersistentEncoding) Network() byte { return 1 } +func (n NetworkPersistentEncoding) EncodePalette(buf *bytes.Buffer, p *Palette, _ PaletteEncoding) { + if p.size != 0 { + _ = protocol.WriteVarint32(buf, int32(p.Len())) + } + + enc := nbt.NewEncoderWithEncoding(buf, nbt.NetworkLittleEndian) + for _, val := range p.values { + state, _ := n.block.RuntimeIDToState(val) + _ = enc.Encode(blockupgrader.BlockState{Name: strings.TrimPrefix("minecraft:", state.Name), Properties: state.Properties, Version: n.version}) + } +} +func (n NetworkPersistentEncoding) DecodePalette(buf *bytes.Buffer, blockSize paletteSize, _ PaletteEncoding) (*Palette, error) { + var paletteCount int32 = 1 + if blockSize != 0 { + err := protocol.Varint32(buf, &paletteCount) + if err != nil { + panic(err) + } + if paletteCount <= 0 { + return nil, fmt.Errorf("invalid palette entry count %v", paletteCount) + } + } + + blocks := make([]blockupgrader.BlockState, paletteCount) + dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian) + for i := int32(0); i < paletteCount; i++ { + if err := dec.Decode(&blocks[i]); err != nil { + return nil, fmt.Errorf("error decoding block state: %w", err) + } + } + + var ok bool + palette, temp := newPalette(blockSize, make([]uint32, paletteCount)), uint32(0) + for i, b := range blocks { + temp, ok = n.block.StateToRuntimeID(blockupgrader.BlockState{Name: "minecraft:" + b.Name, Properties: b.Properties, Version: n.version}) + if !ok { + return nil, fmt.Errorf("cannot get runtime ID of block state %v{%+v}", b.Name, b.Properties) + } + palette.values[i] = temp + } + return palette, nil +} + +type subChunkVersion8 struct{} + +func (subChunkVersion8) EncodeHeader(buf *bytes.Buffer, s *SubChunk, _ cube.Range, _ int) { + _, _ = buf.Write([]byte{8, byte(len(s.storages))}) +} + +type subChunkVersion9 struct{} + +func (subChunkVersion9) EncodeHeader(buf *bytes.Buffer, s *SubChunk, r cube.Range, ind int) { + _, _ = buf.Write([]byte{SubChunkVersion, byte(len(s.storages)), uint8(ind + (r[0] >> 4))}) +} diff --git a/internal/chunk/palette.go b/internal/chunk/palette.go new file mode 100644 index 0000000..3b3d32b --- /dev/null +++ b/internal/chunk/palette.go @@ -0,0 +1,131 @@ +package chunk + +import ( + "math" +) + +// paletteSize is the size of a palette. It indicates the amount of bits occupied per value stored. +type paletteSize byte + +// Palette is a palette of values that every PalettedStorage has. Storages hold 'pointers' to indices +// in this palette. +type Palette struct { + last uint32 + lastIndex int16 + size paletteSize + + // values is a map of values. A PalettedStorage points to the index to this value. + values []uint32 +} + +// newPalette returns a new Palette with size and a slice of added values. +func newPalette(size paletteSize, values []uint32) *Palette { + return &Palette{size: size, values: values, last: math.MaxUint32} +} + +// Len returns the amount of unique values in the Palette. +func (palette *Palette) Len() int { + return len(palette.values) +} + +// Add adds a values to the Palette. It does not first check if the value was already set in the Palette. +// The index at which the value was added is returned. Another bool is returned indicating if the Palette +// was resized as a result of adding the value. +func (palette *Palette) Add(v uint32) (index int16, resize bool) { + i := int16(len(palette.values)) + palette.values = append(palette.values, v) + + if palette.needsResize() { + palette.increaseSize() + return i, true + } + return i, false +} + +// Replace calls the function passed for each value present in the Palette. The value returned by the +// function replaces the value present at the index of the value passed. +func (palette *Palette) Replace(f func(v uint32) uint32) { + // Reset last runtime ID as it now has a different offset. + palette.last = math.MaxUint32 + for index, v := range palette.values { + palette.values[index] = f(v) + } +} + +// Index loops through the values of the Palette and looks for the index of the given value. If the value could +// not be found, -1 is returned. +func (palette *Palette) Index(runtimeID uint32) int16 { + if runtimeID == palette.last { + // Fast path out. + return palette.lastIndex + } + // Slow path in a separate function allows for inlining the fast path. + return palette.indexSlow(runtimeID) +} + +// indexSlow searches the index of a value in the Palette's values by iterating through the Palette's values. +func (palette *Palette) indexSlow(runtimeID uint32) int16 { + l := len(palette.values) + for i := 0; i < l; i++ { + if palette.values[i] == runtimeID { + palette.last = runtimeID + v := int16(i) + palette.lastIndex = v + return v + } + } + return -1 +} + +// Value returns the value in the Palette at a specific index. +func (palette *Palette) Value(i uint16) uint32 { + return palette.values[i] +} + +// needsResize checks if the Palette, and with it the holding PalettedStorage, needs to be resized to a bigger +// size. +func (palette *Palette) needsResize() bool { + return len(palette.values) > (1 << palette.size) +} + +var sizes = [...]paletteSize{0, 1, 2, 3, 4, 5, 6, 8, 16} +var offsets = [...]int{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 8: 7, 16: 8} + +// increaseSize increases the size of the Palette to the next palette size. +func (palette *Palette) increaseSize() { + palette.size = sizes[offsets[palette.size]+1] +} + +// padded returns true if the Palette size is 3, 5 or 6. +func (p paletteSize) padded() bool { + return p == 3 || p == 5 || p == 6 +} + +// paletteSizeFor finds a suitable paletteSize for the amount of values passed n. +func paletteSizeFor(n int) paletteSize { + for _, size := range sizes { + if n <= (1 << size) { + return size + } + } + // Should never happen. + return 0 +} + +// uint32s returns the amount of uint32s needed to represent a storage with this palette size. +func (p paletteSize) uint32s() (n int) { + uint32Count := 0 + if p != 0 { + // indicesPerUint32 is the amount of indices that may be stored in a single uint32. + indicesPerUint32 := 32 / int(p) + // uint32Count is the amount of uint32s required to store all indices: 4096 indices need to be stored in + // total. + uint32Count = 4096 / indicesPerUint32 + } + if p.padded() { + // We've got one of the padded sizes, so the storage has another uint32 to be able to store + // every index. + uint32Count++ + } + return uint32Count +} diff --git a/internal/chunk/paletted_storage.go b/internal/chunk/paletted_storage.go new file mode 100644 index 0000000..89a7e45 --- /dev/null +++ b/internal/chunk/paletted_storage.go @@ -0,0 +1,200 @@ +package chunk + +import ( + "bytes" + "reflect" + "unsafe" +) + +const ( + // uint32ByteSize is the amount of bytes in a uint32. + uint32ByteSize = 4 + // uint32BitSize is the amount of bits in a uint32. + uint32BitSize = uint32ByteSize * 8 +) + +// PalettedStorage is a storage of 4096 blocks encoded in a variable amount of uint32s, storages may have values +// with a bit size per block of 0, 1, 2, 3, 4, 5, 6, 8 or 16 bits. +// 3 of these formats have additional padding in every uint32 and an additional uint32 at the end, to cater +// for the blocks that don't fit. This padding is present when the storage has a block size of 3, 5 or 6 +// bytes. +// Methods on PalettedStorage must not be called simultaneously from multiple goroutines. +type PalettedStorage struct { + // bitsPerIndex is the amount of bits required to store one block. The number increases as the block + // storage holds more unique block states. + bitsPerIndex uint16 + // filledBitsPerIndex returns the amount of blocks that are actually filled per uint32. + filledBitsPerIndex uint16 + // indexMask is the equivalent of 1 << bitsPerIndex - 1. + indexMask uint32 + + // indicesStart holds an unsafe.Pointer to the first byte in the indices slice below. + indicesStart unsafe.Pointer + + // Palette holds all block runtime IDs that the indices in the indices slice point to. These runtime IDs + // point to block states. + palette *Palette + + // indices contains all indices in the PalettedStorage. This slice has a variable size, but may not be changed + // unless the whole PalettedStorage is resized, including the Palette. + indices []uint32 +} + +// newPalettedStorage creates a new block storage using the uint32 slice as the indices and the palette passed. +// The bits per block are calculated using the length of the uint32 slice. +func newPalettedStorage(indices []uint32, palette *Palette) *PalettedStorage { + var ( + bitsPerIndex = uint16(len(indices) / uint32BitSize / uint32ByteSize) + indexMask = (uint32(1) << bitsPerIndex) - 1 + indicesStart = (unsafe.Pointer)((*reflect.SliceHeader)(unsafe.Pointer(&indices)).Data) + filledBitsPerIndex uint16 + ) + if bitsPerIndex != 0 { + filledBitsPerIndex = uint32BitSize / bitsPerIndex * bitsPerIndex + } + return &PalettedStorage{filledBitsPerIndex: filledBitsPerIndex, indexMask: indexMask, indicesStart: indicesStart, bitsPerIndex: bitsPerIndex, indices: indices, palette: palette} +} + +// emptyStorage creates a PalettedStorage filled completely with a value v. +func emptyStorage(v uint32) *PalettedStorage { + return newPalettedStorage([]uint32{}, newPalette(0, []uint32{v})) +} + +// Palette returns the Palette of the PalettedStorage. +func (storage *PalettedStorage) Palette() *Palette { + return storage.palette +} + +// At returns the value of the PalettedStorage at a given x, y and z. +func (storage *PalettedStorage) At(x, y, z byte) uint32 { + return storage.palette.Value(storage.paletteIndex(x&15, y&15, z&15)) +} + +// Set sets a value at a specific x, y and z. The Palette and PalettedStorage are expanded +// automatically to make space for the value, should that be needed. +func (storage *PalettedStorage) Set(x, y, z byte, v uint32) { + index := storage.palette.Index(v) + if index == -1 { + // The runtime ID was not yet available in the palette. We add it, then check if the block storage + // needs to be resized for the palette pointers to fit. + index = storage.addNew(v) + } + storage.setPaletteIndex(x&15, y&15, z&15, uint16(index)) +} + +// Equal checks if two PalettedStorages are equal value wise. False is returned +// if either of the storages are nil. +func (storage *PalettedStorage) Equal(other *PalettedStorage) bool { + if storage == nil || other == nil { + return false + } + if len(storage.indices) == 0 || len(other.indices) == 0 || storage.palette.values[0] == 0 || other.palette.values[0] == 0 { + return false + } + indicesA := unsafe.Slice((*byte)(unsafe.Pointer(&storage.indices[0])), len(storage.indices)*4) + indicesB := unsafe.Slice((*byte)(unsafe.Pointer(&other.indices[0])), len(other.indices)*4) + if !bytes.Equal(indicesA, indicesB) { + return false + } + paletteA := unsafe.Slice((*byte)(unsafe.Pointer(&storage.palette.values[0])), len(storage.palette.values)*4) + paletteB := unsafe.Slice((*byte)(unsafe.Pointer(&other.palette.values[0])), len(other.palette.values)*4) + return bytes.Equal(paletteA, paletteB) +} + +// addNew adds a new value to the PalettedStorage's Palette and returns its index. If needed, the storage is resized. +func (storage *PalettedStorage) addNew(v uint32) int16 { + index, resize := storage.palette.Add(v) + if resize { + storage.resize(storage.palette.size) + } + return index +} + +// paletteIndex looks up the Palette index at a given x, y and z value in the PalettedStorage. This palette +// index is not the value at this offset, but merely an index in the Palette pointing to a value. +func (storage *PalettedStorage) paletteIndex(x, y, z byte) uint16 { + if storage.bitsPerIndex == 0 { + // Unfortunately our default logic cannot deal with 0 bits per index, meaning we'll have to special case + // this. This comes with a little performance hit, but it seems to be the only way to go. An alternative would + // be not to have 0 bits per block storages in memory, but that would cause a strongly increased memory usage + // by biomes. + return 0 + } + offset := ((uint16(x) << 8) | (uint16(z) << 4) | uint16(y)) * storage.bitsPerIndex + uint32Offset, bitOffset := offset/storage.filledBitsPerIndex, offset%storage.filledBitsPerIndex + + w := *(*uint32)(unsafe.Pointer(uintptr(storage.indicesStart) + uintptr(uint32Offset<<2))) + return uint16((w >> bitOffset) & storage.indexMask) +} + +// setPaletteIndex sets the palette index at a given x, y and z to paletteIndex. This index should point +// to a value in the PalettedStorage's Palette. +func (storage *PalettedStorage) setPaletteIndex(x, y, z byte, i uint16) { + if storage.bitsPerIndex == 0 { + return + } + offset := ((uint16(x) << 8) | (uint16(z) << 4) | uint16(y)) * storage.bitsPerIndex + uint32Offset, bitOffset := offset/storage.filledBitsPerIndex, offset%storage.filledBitsPerIndex + + ptr := (*uint32)(unsafe.Pointer(uintptr(storage.indicesStart) + uintptr(uint32Offset<<2))) + *ptr = (*ptr &^ (storage.indexMask << bitOffset)) | (uint32(i) << bitOffset) +} + +// resize changes the size of a PalettedStorage to newPaletteSize. A new PalettedStorage is constructed, +// and all values available in the current storage are set in their appropriate locations in the +// new storage. +func (storage *PalettedStorage) resize(newPaletteSize paletteSize) { + if newPaletteSize == paletteSize(storage.bitsPerIndex) { + return // Don't resize if the size is already equal. + } + // Construct a new storage and set all values in there manually. We can't easily do this in a better + // way, because all values will be at a different index with a different length. + newStorage := newPalettedStorage(make([]uint32, newPaletteSize.uint32s()), storage.palette) + for x := byte(0); x < 16; x++ { + for y := byte(0); y < 16; y++ { + for z := byte(0); z < 16; z++ { + newStorage.setPaletteIndex(x, y, z, storage.paletteIndex(x, y, z)) + } + } + } + // Set the new storage. + *storage = *newStorage +} + +// compact clears unused indexes in the palette by scanning for usages in the PalettedStorage. This is a +// relatively heavy task which should only happen right before the sub chunk holding this PalettedStorage is +// saved to disk. compact also shrinks the palette size if possible. +func (storage *PalettedStorage) compact() { + usedIndices := make([]bool, storage.palette.Len()) + for x := byte(0); x < 16; x++ { + for y := byte(0); y < 16; y++ { + for z := byte(0); z < 16; z++ { + usedIndices[storage.paletteIndex(x, y, z)] = true + } + } + } + newRuntimeIDs := make([]uint32, 0, len(usedIndices)) + conversion := make([]uint16, len(usedIndices)) + + for index, set := range usedIndices { + if set { + conversion[index] = uint16(len(newRuntimeIDs)) + newRuntimeIDs = append(newRuntimeIDs, storage.palette.values[index]) + } + } + // Construct a new storage and set all values in there manually. We can't easily do this in a better + // way, because all values will be at a different index with a different length. + size := paletteSizeFor(len(newRuntimeIDs)) + newStorage := newPalettedStorage(make([]uint32, size.uint32s()), newPalette(size, newRuntimeIDs)) + + for x := byte(0); x < 16; x++ { + for y := byte(0); y < 16; y++ { + for z := byte(0); z < 16; z++ { + // Replace all usages of the old palette indexes with the new indexes using the map we + // produced earlier. + newStorage.setPaletteIndex(x, y, z, conversion[storage.paletteIndex(x, y, z)]) + } + } + } + *storage = *newStorage +} diff --git a/internal/chunk/sub_chunk.go b/internal/chunk/sub_chunk.go new file mode 100644 index 0000000..082b5c4 --- /dev/null +++ b/internal/chunk/sub_chunk.go @@ -0,0 +1,66 @@ +package chunk + +// SubChunk is a cube of blocks located in a chunk. It has a size of 16x16x16 blocks and forms part of a stack +// that forms a Chunk. +type SubChunk struct { + air uint32 + storages []*PalettedStorage + blockLight []uint8 + skyLight []uint8 +} + +// NewSubChunk creates a new sub chunk. All sub chunks should be created through this function +func NewSubChunk(air uint32) *SubChunk { + return &SubChunk{air: air} +} + +// Empty checks if the SubChunk is considered empty. This is the case if the SubChunk has 0 block storages or if it has +// a single one that is completely filled with air. +func (sub *SubChunk) Empty() bool { + return len(sub.storages) == 0 || (len(sub.storages) == 1 && len(sub.storages[0].palette.values) == 1 && sub.storages[0].palette.values[0] == sub.air) +} + +// Layer returns a certain block storage/layer from a sub chunk. If no storage at the layer exists, the layer +// is created, as well as all layers between the current highest layer and the new highest layer. +func (sub *SubChunk) Layer(layer uint8) *PalettedStorage { + for uint8(len(sub.storages)) <= layer { + // Keep appending to storages until the requested layer is achieved. Makes working with new layers + // much easier. + sub.storages = append(sub.storages, emptyStorage(sub.air)) + } + return sub.storages[layer] +} + +// Layers returns all layers in the sub chunk. This method may also return an empty slice. +func (sub *SubChunk) Layers() []*PalettedStorage { + return sub.storages +} + +// Block returns the runtime ID of the block located at the given X, Y and Z. X, Y and Z must be in a +// range of 0-15. +func (sub *SubChunk) Block(x, y, z byte, layer uint8) uint32 { + if uint8(len(sub.storages)) <= layer { + return sub.air + } + return sub.storages[layer].At(x, y, z) +} + +// SetBlock sets the given block runtime ID at the given X, Y and Z. X, Y and Z must be in a range of 0-15. +func (sub *SubChunk) SetBlock(x, y, z byte, layer uint8, block uint32) { + sub.Layer(layer).Set(x, y, z, block) +} + +// Compact cleans the garbage from all block storages that sub chunk contains, so that they may be +// cleanly written to a database. +func (sub *SubChunk) compact() { + newStorages := make([]*PalettedStorage, 0, len(sub.storages)) + for _, storage := range sub.storages { + storage.compact() + if len(storage.palette.values) == 1 && storage.palette.values[0] == sub.air { + // If the palette has only air in it, it means the storage is empty, so we can ignore it. + continue + } + newStorages = append(newStorages, storage) + } + sub.storages = newStorages +} diff --git a/internal/item/1.12.0_item_id_to_block_id_map.json b/internal/item/1.12.0_item_id_to_block_id_map.json new file mode 100644 index 0000000..7a3ed6e --- /dev/null +++ b/internal/item/1.12.0_item_id_to_block_id_map.json @@ -0,0 +1,481 @@ +{ + "minecraft:acacia_button": "minecraft:acacia_button", + "minecraft:acacia_fence_gate": "minecraft:acacia_fence_gate", + "minecraft:acacia_pressure_plate": "minecraft:acacia_pressure_plate", + "minecraft:acacia_stairs": "minecraft:acacia_stairs", + "minecraft:acacia_standing_sign": "minecraft:acacia_standing_sign", + "minecraft:acacia_trapdoor": "minecraft:acacia_trapdoor", + "minecraft:acacia_wall_sign": "minecraft:acacia_wall_sign", + "minecraft:activator_rail": "minecraft:activator_rail", + "minecraft:andesite_stairs": "minecraft:andesite_stairs", + "minecraft:anvil": "minecraft:anvil", + "minecraft:bamboo": "minecraft:bamboo", + "minecraft:bamboo_sapling": "minecraft:bamboo_sapling", + "minecraft:barrel": "minecraft:barrel", + "minecraft:barrier": "minecraft:barrier", + "minecraft:beacon": "minecraft:beacon", + "minecraft:bedrock": "minecraft:bedrock", + "minecraft:bell": "minecraft:bell", + "minecraft:birch_button": "minecraft:birch_button", + "minecraft:birch_fence_gate": "minecraft:birch_fence_gate", + "minecraft:birch_pressure_plate": "minecraft:birch_pressure_plate", + "minecraft:birch_stairs": "minecraft:birch_stairs", + "minecraft:birch_standing_sign": "minecraft:birch_standing_sign", + "minecraft:birch_trapdoor": "minecraft:birch_trapdoor", + "minecraft:birch_wall_sign": "minecraft:birch_wall_sign", + "minecraft:black_glazed_terracotta": "minecraft:black_glazed_terracotta", + "minecraft:blast_furnace": "minecraft:blast_furnace", + "minecraft:blue_glazed_terracotta": "minecraft:blue_glazed_terracotta", + "minecraft:blue_ice": "minecraft:blue_ice", + "minecraft:bone_block": "minecraft:bone_block", + "minecraft:bookshelf": "minecraft:bookshelf", + "minecraft:brewingstandblock": "minecraft:brewing_stand", + "minecraft:brick_block": "minecraft:brick_block", + "minecraft:brick_stairs": "minecraft:brick_stairs", + "minecraft:brown_glazed_terracotta": "minecraft:brown_glazed_terracotta", + "minecraft:brown_mushroom": "minecraft:brown_mushroom", + "minecraft:brown_mushroom_block": "minecraft:brown_mushroom_block", + "minecraft:bubble_column": "minecraft:bubble_column", + "minecraft:cactus": "minecraft:cactus", + "minecraft:carpet": "minecraft:carpet", + "minecraft:carrots": "minecraft:carrots", + "minecraft:cartography_table": "minecraft:cartography_table", + "minecraft:carved_pumpkin": "minecraft:carved_pumpkin", + "minecraft:chain_command_block": "minecraft:chain_command_block", + "minecraft:chemical_heat": "minecraft:chemical_heat", + "minecraft:chemistry_table": "minecraft:chemistry_table", + "minecraft:chest": "minecraft:chest", + "minecraft:chorus_flower": "minecraft:chorus_flower", + "minecraft:chorus_plant": "minecraft:chorus_plant", + "minecraft:clay": "minecraft:clay", + "minecraft:coal_block": "minecraft:coal_block", + "minecraft:coal_ore": "minecraft:coal_ore", + "minecraft:cobblestone": "minecraft:cobblestone", + "minecraft:cobblestone_wall": "minecraft:cobblestone_wall", + "minecraft:cocoa": "minecraft:cocoa", + "minecraft:colored_torch_bp": "minecraft:colored_torch_bp", + "minecraft:colored_torch_rg": "minecraft:colored_torch_rg", + "minecraft:command_block": "minecraft:command_block", + "minecraft:composter": "minecraft:composter", + "minecraft:concrete": "minecraft:concrete", + "minecraft:concrete_powder": "minecraft:concretePowder", + "minecraft:conduit": "minecraft:conduit", + "minecraft:coral": "minecraft:coral", + "minecraft:coral_block": "minecraft:coral_block", + "minecraft:coral_fan": "minecraft:coral_fan", + "minecraft:coral_fan_dead": "minecraft:coral_fan_dead", + "minecraft:coral_fan_hang": "minecraft:coral_fan_hang", + "minecraft:coral_fan_hang2": "minecraft:coral_fan_hang2", + "minecraft:coral_fan_hang3": "minecraft:coral_fan_hang3", + "minecraft:crafting_table": "minecraft:crafting_table", + "minecraft:cyan_glazed_terracotta": "minecraft:cyan_glazed_terracotta", + "minecraft:dark_oak_button": "minecraft:dark_oak_button", + "minecraft:dark_oak_fence_gate": "minecraft:dark_oak_fence_gate", + "minecraft:dark_oak_pressure_plate": "minecraft:dark_oak_pressure_plate", + "minecraft:dark_oak_stairs": "minecraft:dark_oak_stairs", + "minecraft:dark_oak_trapdoor": "minecraft:dark_oak_trapdoor", + "minecraft:dark_prismarine_stairs": "minecraft:dark_prismarine_stairs", + "minecraft:darkoak_standing_sign": "minecraft:darkoak_standing_sign", + "minecraft:darkoak_wall_sign": "minecraft:darkoak_wall_sign", + "minecraft:daylight_detector": "minecraft:daylight_detector", + "minecraft:daylight_detector_inverted": "minecraft:daylight_detector_inverted", + "minecraft:deadbush": "minecraft:deadbush", + "minecraft:detector_rail": "minecraft:detector_rail", + "minecraft:diamond_block": "minecraft:diamond_block", + "minecraft:diamond_ore": "minecraft:diamond_ore", + "minecraft:diorite_stairs": "minecraft:diorite_stairs", + "minecraft:dirt": "minecraft:dirt", + "minecraft:dispenser": "minecraft:dispenser", + "minecraft:double_plant": "minecraft:double_plant", + "minecraft:double_stone_slab": "minecraft:stone_slab", + "minecraft:double_stone_slab2": "minecraft:stone_slab2", + "minecraft:double_stone_slab3": "minecraft:stone_slab3", + "minecraft:double_stone_slab4": "minecraft:stone_slab4", + "minecraft:double_wooden_slab": "minecraft:double_wooden_slab", + "minecraft:dragon_egg": "minecraft:dragon_egg", + "minecraft:dried_kelp_block": "minecraft:dried_kelp_block", + "minecraft:dropper": "minecraft:dropper", + "minecraft:element_0": "minecraft:element_0", + "minecraft:element_1": "minecraft:element_1", + "minecraft:element_10": "minecraft:element_10", + "minecraft:element_100": "minecraft:element_100", + "minecraft:element_101": "minecraft:element_101", + "minecraft:element_102": "minecraft:element_102", + "minecraft:element_103": "minecraft:element_103", + "minecraft:element_104": "minecraft:element_104", + "minecraft:element_105": "minecraft:element_105", + "minecraft:element_106": "minecraft:element_106", + "minecraft:element_107": "minecraft:element_107", + "minecraft:element_108": "minecraft:element_108", + "minecraft:element_109": "minecraft:element_109", + "minecraft:element_11": "minecraft:element_11", + "minecraft:element_110": "minecraft:element_110", + "minecraft:element_111": "minecraft:element_111", + "minecraft:element_112": "minecraft:element_112", + "minecraft:element_113": "minecraft:element_113", + "minecraft:element_114": "minecraft:element_114", + "minecraft:element_115": "minecraft:element_115", + "minecraft:element_116": "minecraft:element_116", + "minecraft:element_117": "minecraft:element_117", + "minecraft:element_118": "minecraft:element_118", + "minecraft:element_12": "minecraft:element_12", + "minecraft:element_13": "minecraft:element_13", + "minecraft:element_14": "minecraft:element_14", + "minecraft:element_15": "minecraft:element_15", + "minecraft:element_16": "minecraft:element_16", + "minecraft:element_17": "minecraft:element_17", + "minecraft:element_18": "minecraft:element_18", + "minecraft:element_19": "minecraft:element_19", + "minecraft:element_2": "minecraft:element_2", + "minecraft:element_20": "minecraft:element_20", + "minecraft:element_21": "minecraft:element_21", + "minecraft:element_22": "minecraft:element_22", + "minecraft:element_23": "minecraft:element_23", + "minecraft:element_24": "minecraft:element_24", + "minecraft:element_25": "minecraft:element_25", + "minecraft:element_26": "minecraft:element_26", + "minecraft:element_27": "minecraft:element_27", + "minecraft:element_28": "minecraft:element_28", + "minecraft:element_29": "minecraft:element_29", + "minecraft:element_3": "minecraft:element_3", + "minecraft:element_30": "minecraft:element_30", + "minecraft:element_31": "minecraft:element_31", + "minecraft:element_32": "minecraft:element_32", + "minecraft:element_33": "minecraft:element_33", + "minecraft:element_34": "minecraft:element_34", + "minecraft:element_35": "minecraft:element_35", + "minecraft:element_36": "minecraft:element_36", + "minecraft:element_37": "minecraft:element_37", + "minecraft:element_38": "minecraft:element_38", + "minecraft:element_39": "minecraft:element_39", + "minecraft:element_4": "minecraft:element_4", + "minecraft:element_40": "minecraft:element_40", + "minecraft:element_41": "minecraft:element_41", + "minecraft:element_42": "minecraft:element_42", + "minecraft:element_43": "minecraft:element_43", + "minecraft:element_44": "minecraft:element_44", + "minecraft:element_45": "minecraft:element_45", + "minecraft:element_46": "minecraft:element_46", + "minecraft:element_47": "minecraft:element_47", + "minecraft:element_48": "minecraft:element_48", + "minecraft:element_49": "minecraft:element_49", + "minecraft:element_5": "minecraft:element_5", + "minecraft:element_50": "minecraft:element_50", + "minecraft:element_51": "minecraft:element_51", + "minecraft:element_52": "minecraft:element_52", + "minecraft:element_53": "minecraft:element_53", + "minecraft:element_54": "minecraft:element_54", + "minecraft:element_55": "minecraft:element_55", + "minecraft:element_56": "minecraft:element_56", + "minecraft:element_57": "minecraft:element_57", + "minecraft:element_58": "minecraft:element_58", + "minecraft:element_59": "minecraft:element_59", + "minecraft:element_6": "minecraft:element_6", + "minecraft:element_60": "minecraft:element_60", + "minecraft:element_61": "minecraft:element_61", + "minecraft:element_62": "minecraft:element_62", + "minecraft:element_63": "minecraft:element_63", + "minecraft:element_64": "minecraft:element_64", + "minecraft:element_65": "minecraft:element_65", + "minecraft:element_66": "minecraft:element_66", + "minecraft:element_67": "minecraft:element_67", + "minecraft:element_68": "minecraft:element_68", + "minecraft:element_69": "minecraft:element_69", + "minecraft:element_7": "minecraft:element_7", + "minecraft:element_70": "minecraft:element_70", + "minecraft:element_71": "minecraft:element_71", + "minecraft:element_72": "minecraft:element_72", + "minecraft:element_73": "minecraft:element_73", + "minecraft:element_74": "minecraft:element_74", + "minecraft:element_75": "minecraft:element_75", + "minecraft:element_76": "minecraft:element_76", + "minecraft:element_77": "minecraft:element_77", + "minecraft:element_78": "minecraft:element_78", + "minecraft:element_79": "minecraft:element_79", + "minecraft:element_8": "minecraft:element_8", + "minecraft:element_80": "minecraft:element_80", + "minecraft:element_81": "minecraft:element_81", + "minecraft:element_82": "minecraft:element_82", + "minecraft:element_83": "minecraft:element_83", + "minecraft:element_84": "minecraft:element_84", + "minecraft:element_85": "minecraft:element_85", + "minecraft:element_86": "minecraft:element_86", + "minecraft:element_87": "minecraft:element_87", + "minecraft:element_88": "minecraft:element_88", + "minecraft:element_89": "minecraft:element_89", + "minecraft:element_9": "minecraft:element_9", + "minecraft:element_90": "minecraft:element_90", + "minecraft:element_91": "minecraft:element_91", + "minecraft:element_92": "minecraft:element_92", + "minecraft:element_93": "minecraft:element_93", + "minecraft:element_94": "minecraft:element_94", + "minecraft:element_95": "minecraft:element_95", + "minecraft:element_96": "minecraft:element_96", + "minecraft:element_97": "minecraft:element_97", + "minecraft:element_98": "minecraft:element_98", + "minecraft:element_99": "minecraft:element_99", + "minecraft:emerald_block": "minecraft:emerald_block", + "minecraft:emerald_ore": "minecraft:emerald_ore", + "minecraft:enchanting_table": "minecraft:enchanting_table", + "minecraft:end_brick_stairs": "minecraft:end_brick_stairs", + "minecraft:end_bricks": "minecraft:end_bricks", + "minecraft:end_gateway": "minecraft:end_gateway", + "minecraft:end_portal": "minecraft:end_portal", + "minecraft:end_portal_frame": "minecraft:end_portal_frame", + "minecraft:end_rod": "minecraft:end_rod", + "minecraft:end_stone": "minecraft:end_stone", + "minecraft:ender_chest": "minecraft:ender_chest", + "minecraft:farmland": "minecraft:farmland", + "minecraft:fence": "minecraft:fence", + "minecraft:fence_gate": "minecraft:fence_gate", + "minecraft:fire": "minecraft:fire", + "minecraft:fletching_table": "minecraft:fletching_table", + "minecraft:flowing_lava": "minecraft:flowing_lava", + "minecraft:flowing_water": "minecraft:flowing_water", + "minecraft:frosted_ice": "minecraft:frosted_ice", + "minecraft:furnace": "minecraft:furnace", + "minecraft:glass": "minecraft:glass", + "minecraft:glass_pane": "minecraft:glass_pane", + "minecraft:glazedterracotta.black": "minecraft:black_glazed_terracotta", + "minecraft:glazedterracotta.blue": "minecraft:blue_glazed_terracotta", + "minecraft:glazedterracotta.brown": "minecraft:brown_glazed_terracotta", + "minecraft:glazedterracotta.cyan": "minecraft:cyan_glazed_terracotta", + "minecraft:glazedterracotta.gray": "minecraft:gray_glazed_terracotta", + "minecraft:glazedterracotta.green": "minecraft:green_glazed_terracotta", + "minecraft:glazedterracotta.light_blue": "minecraft:light_blue_glazed_terracotta", + "minecraft:glazedterracotta.lime": "minecraft:lime_glazed_terracotta", + "minecraft:glazedterracotta.magenta": "minecraft:magenta_glazed_terracotta", + "minecraft:glazedterracotta.orange": "minecraft:orange_glazed_terracotta", + "minecraft:glazedterracotta.pink": "minecraft:pink_glazed_terracotta", + "minecraft:glazedterracotta.purple": "minecraft:purple_glazed_terracotta", + "minecraft:glazedterracotta.red": "minecraft:red_glazed_terracotta", + "minecraft:glazedterracotta.silver": "minecraft:silver_glazed_terracotta", + "minecraft:glazedterracotta.white": "minecraft:white_glazed_terracotta", + "minecraft:glazedterracotta.yellow": "minecraft:yellow_glazed_terracotta", + "minecraft:glowingobsidian": "minecraft:glowingobsidian", + "minecraft:glowstone": "minecraft:glowstone", + "minecraft:gold_block": "minecraft:gold_block", + "minecraft:gold_ore": "minecraft:gold_ore", + "minecraft:golden_rail": "minecraft:golden_rail", + "minecraft:granite_stairs": "minecraft:granite_stairs", + "minecraft:grass": "minecraft:grass", + "minecraft:grass_path": "minecraft:grass_path", + "minecraft:gravel": "minecraft:gravel", + "minecraft:gray_glazed_terracotta": "minecraft:gray_glazed_terracotta", + "minecraft:green_glazed_terracotta": "minecraft:green_glazed_terracotta", + "minecraft:grindstone": "minecraft:grindstone", + "minecraft:hard_glass": "minecraft:hard_glass", + "minecraft:hard_glass_pane": "minecraft:hard_glass_pane", + "minecraft:hard_stained_glass": "minecraft:hard_stained_glass", + "minecraft:hard_stained_glass_pane": "minecraft:hard_stained_glass_pane", + "minecraft:hardened_clay": "minecraft:hardened_clay", + "minecraft:hay_block": "minecraft:hay_block", + "minecraft:heavy_weighted_pressure_plate": "minecraft:heavy_weighted_pressure_plate", + "minecraft:ice": "minecraft:ice", + "minecraft:info_update": "minecraft:info_update", + "minecraft:info_update2": "minecraft:info_update2", + "minecraft:invisiblebedrock": "minecraft:invisibleBedrock", + "minecraft:iron_bars": "minecraft:iron_bars", + "minecraft:iron_block": "minecraft:iron_block", + "minecraft:iron_ore": "minecraft:iron_ore", + "minecraft:iron_trapdoor": "minecraft:iron_trapdoor", + "minecraft:item.acacia_door": "minecraft:acacia_door", + "minecraft:item.bed": "minecraft:bed", + "minecraft:item.beetroot": "minecraft:beetroot", + "minecraft:item.birch_door": "minecraft:birch_door", + "minecraft:item.cake": "minecraft:cake", + "minecraft:item.campfire": "minecraft:campfire", + "minecraft:item.cauldron": "minecraft:cauldron", + "minecraft:item.dark_oak_door": "minecraft:dark_oak_door", + "minecraft:item.flower_pot": "minecraft:flower_pot", + "minecraft:item.frame": "minecraft:frame", + "minecraft:item.hopper": "minecraft:hopper", + "minecraft:item.iron_door": "minecraft:iron_door", + "minecraft:item.jungle_door": "minecraft:jungle_door", + "minecraft:item.kelp": "minecraft:kelp", + "minecraft:item.nether_wart": "minecraft:nether_wart", + "minecraft:item.reeds": "minecraft:reeds", + "minecraft:item.skull": "minecraft:skull", + "minecraft:item.spruce_door": "minecraft:spruce_door", + "minecraft:item.wheat": "minecraft:wheat", + "minecraft:item.wooden_door": "minecraft:wooden_door", + "minecraft:jigsaw": "minecraft:jigsaw", + "minecraft:jukebox": "minecraft:jukebox", + "minecraft:jungle_button": "minecraft:jungle_button", + "minecraft:jungle_fence_gate": "minecraft:jungle_fence_gate", + "minecraft:jungle_pressure_plate": "minecraft:jungle_pressure_plate", + "minecraft:jungle_stairs": "minecraft:jungle_stairs", + "minecraft:jungle_standing_sign": "minecraft:jungle_standing_sign", + "minecraft:jungle_trapdoor": "minecraft:jungle_trapdoor", + "minecraft:jungle_wall_sign": "minecraft:jungle_wall_sign", + "minecraft:ladder": "minecraft:ladder", + "minecraft:lantern": "minecraft:lantern", + "minecraft:lapis_block": "minecraft:lapis_block", + "minecraft:lapis_ore": "minecraft:lapis_ore", + "minecraft:lava": "minecraft:lava", + "minecraft:lava_cauldron": "minecraft:lava_cauldron", + "minecraft:leaves": "minecraft:leaves", + "minecraft:leaves2": "minecraft:leaves2", + "minecraft:lectern": "minecraft:lectern", + "minecraft:lever": "minecraft:lever", + "minecraft:light_blue_glazed_terracotta": "minecraft:light_blue_glazed_terracotta", + "minecraft:light_weighted_pressure_plate": "minecraft:light_weighted_pressure_plate", + "minecraft:lime_glazed_terracotta": "minecraft:lime_glazed_terracotta", + "minecraft:lit_blast_furnace": "minecraft:lit_blast_furnace", + "minecraft:lit_furnace": "minecraft:lit_furnace", + "minecraft:lit_pumpkin": "minecraft:lit_pumpkin", + "minecraft:lit_redstone_lamp": "minecraft:lit_redstone_lamp", + "minecraft:lit_redstone_ore": "minecraft:lit_redstone_ore", + "minecraft:lit_smoker": "minecraft:lit_smoker", + "minecraft:log": "minecraft:log", + "minecraft:log2": "minecraft:log2", + "minecraft:loom": "minecraft:loom", + "minecraft:magenta_glazed_terracotta": "minecraft:magenta_glazed_terracotta", + "minecraft:magma": "minecraft:magma", + "minecraft:melon_block": "minecraft:melon_block", + "minecraft:melon_stem": "minecraft:melon_stem", + "minecraft:mob_spawner": "minecraft:mob_spawner", + "minecraft:monster_egg": "minecraft:monster_egg", + "minecraft:mossy_cobblestone": "minecraft:mossy_cobblestone", + "minecraft:mossy_cobblestone_stairs": "minecraft:mossy_cobblestone_stairs", + "minecraft:mossy_stone_brick_stairs": "minecraft:mossy_stone_brick_stairs", + "minecraft:movingblock": "minecraft:movingBlock", + "minecraft:mycelium": "minecraft:mycelium", + "minecraft:nether_brick": "minecraft:nether_brick", + "minecraft:nether_brick_fence": "minecraft:nether_brick_fence", + "minecraft:nether_brick_stairs": "minecraft:nether_brick_stairs", + "minecraft:nether_wart_block": "minecraft:nether_wart_block", + "minecraft:netherrack": "minecraft:netherrack", + "minecraft:netherreactor": "minecraft:netherreactor", + "minecraft:normal_stone_stairs": "minecraft:normal_stone_stairs", + "minecraft:noteblock": "minecraft:noteblock", + "minecraft:oak_stairs": "minecraft:oak_stairs", + "minecraft:observer": "minecraft:observer", + "minecraft:obsidian": "minecraft:obsidian", + "minecraft:orange_glazed_terracotta": "minecraft:orange_glazed_terracotta", + "minecraft:packed_ice": "minecraft:packed_ice", + "minecraft:pink_glazed_terracotta": "minecraft:pink_glazed_terracotta", + "minecraft:piston": "minecraft:piston", + "minecraft:pistonarmcollision": "minecraft:pistonArmCollision", + "minecraft:planks": "minecraft:planks", + "minecraft:podzol": "minecraft:podzol", + "minecraft:polished_andesite_stairs": "minecraft:polished_andesite_stairs", + "minecraft:polished_diorite_stairs": "minecraft:polished_diorite_stairs", + "minecraft:polished_granite_stairs": "minecraft:polished_granite_stairs", + "minecraft:portal": "minecraft:portal", + "minecraft:potatoes": "minecraft:potatoes", + "minecraft:powered_comparator": "minecraft:powered_comparator", + "minecraft:powered_repeater": "minecraft:powered_repeater", + "minecraft:prismarine": "minecraft:prismarine", + "minecraft:prismarine_bricks_stairs": "minecraft:prismarine_bricks_stairs", + "minecraft:prismarine_stairs": "minecraft:prismarine_stairs", + "minecraft:pumpkin": "minecraft:pumpkin", + "minecraft:pumpkin_stem": "minecraft:pumpkin_stem", + "minecraft:purple_glazed_terracotta": "minecraft:purple_glazed_terracotta", + "minecraft:purpur_block": "minecraft:purpur_block", + "minecraft:purpur_stairs": "minecraft:purpur_stairs", + "minecraft:quartz_block": "minecraft:quartz_block", + "minecraft:quartz_ore": "minecraft:quartz_ore", + "minecraft:quartz_stairs": "minecraft:quartz_stairs", + "minecraft:rail": "minecraft:rail", + "minecraft:real_double_stone_slab": "minecraft:double_stone_slab", + "minecraft:real_double_stone_slab2": "minecraft:double_stone_slab2", + "minecraft:real_double_stone_slab3": "minecraft:double_stone_slab3", + "minecraft:real_double_stone_slab4": "minecraft:double_stone_slab4", + "minecraft:red_flower": "minecraft:red_flower", + "minecraft:red_glazed_terracotta": "minecraft:red_glazed_terracotta", + "minecraft:red_mushroom": "minecraft:red_mushroom", + "minecraft:red_mushroom_block": "minecraft:red_mushroom_block", + "minecraft:red_nether_brick": "minecraft:red_nether_brick", + "minecraft:red_nether_brick_stairs": "minecraft:red_nether_brick_stairs", + "minecraft:red_sandstone": "minecraft:red_sandstone", + "minecraft:red_sandstone_stairs": "minecraft:red_sandstone_stairs", + "minecraft:redstone_block": "minecraft:redstone_block", + "minecraft:redstone_lamp": "minecraft:redstone_lamp", + "minecraft:redstone_ore": "minecraft:redstone_ore", + "minecraft:redstone_torch": "minecraft:redstone_torch", + "minecraft:redstone_wire": "minecraft:redstone_wire", + "minecraft:repeating_command_block": "minecraft:repeating_command_block", + "minecraft:reserved6": "minecraft:reserved6", + "minecraft:sand": "minecraft:sand", + "minecraft:sandstone": "minecraft:sandstone", + "minecraft:sandstone_stairs": "minecraft:sandstone_stairs", + "minecraft:sapling": "minecraft:sapling", + "minecraft:scaffolding": "minecraft:scaffolding", + "minecraft:sea_pickle": "minecraft:sea_pickle", + "minecraft:seagrass": "minecraft:seagrass", + "minecraft:sealantern": "minecraft:seaLantern", + "minecraft:shulker_box": "minecraft:shulker_box", + "minecraft:silver_glazed_terracotta": "minecraft:silver_glazed_terracotta", + "minecraft:slime": "minecraft:slime", + "minecraft:smithing_table": "minecraft:smithing_table", + "minecraft:smoker": "minecraft:smoker", + "minecraft:smooth_quartz_stairs": "minecraft:smooth_quartz_stairs", + "minecraft:smooth_red_sandstone_stairs": "minecraft:smooth_red_sandstone_stairs", + "minecraft:smooth_sandstone_stairs": "minecraft:smooth_sandstone_stairs", + "minecraft:smooth_stone": "minecraft:smooth_stone", + "minecraft:snow": "minecraft:snow", + "minecraft:snow_layer": "minecraft:snow_layer", + "minecraft:soul_sand": "minecraft:soul_sand", + "minecraft:sponge": "minecraft:sponge", + "minecraft:spruce_button": "minecraft:spruce_button", + "minecraft:spruce_fence_gate": "minecraft:spruce_fence_gate", + "minecraft:spruce_pressure_plate": "minecraft:spruce_pressure_plate", + "minecraft:spruce_stairs": "minecraft:spruce_stairs", + "minecraft:spruce_standing_sign": "minecraft:spruce_standing_sign", + "minecraft:spruce_trapdoor": "minecraft:spruce_trapdoor", + "minecraft:spruce_wall_sign": "minecraft:spruce_wall_sign", + "minecraft:stained_glass": "minecraft:stained_glass", + "minecraft:stained_glass_pane": "minecraft:stained_glass_pane", + "minecraft:stained_hardened_clay": "minecraft:stained_hardened_clay", + "minecraft:standing_banner": "minecraft:standing_banner", + "minecraft:standing_sign": "minecraft:standing_sign", + "minecraft:sticky_piston": "minecraft:sticky_piston", + "minecraft:stone": "minecraft:stone", + "minecraft:stone_brick_stairs": "minecraft:stone_brick_stairs", + "minecraft:stone_button": "minecraft:stone_button", + "minecraft:stone_pressure_plate": "minecraft:stone_pressure_plate", + "minecraft:stone_slab": "minecraft:stone_slab", + "minecraft:stone_slab2": "minecraft:stone_slab2", + "minecraft:stone_slab3": "minecraft:stone_slab3", + "minecraft:stone_slab4": "minecraft:stone_slab4", + "minecraft:stone_stairs": "minecraft:stone_stairs", + "minecraft:stonebrick": "minecraft:stonebrick", + "minecraft:stonecutter": "minecraft:stonecutter", + "minecraft:stonecutter_block": "minecraft:stonecutter_block", + "minecraft:stripped_acacia_log": "minecraft:stripped_acacia_log", + "minecraft:stripped_birch_log": "minecraft:stripped_birch_log", + "minecraft:stripped_dark_oak_log": "minecraft:stripped_dark_oak_log", + "minecraft:stripped_jungle_log": "minecraft:stripped_jungle_log", + "minecraft:stripped_oak_log": "minecraft:stripped_oak_log", + "minecraft:stripped_spruce_log": "minecraft:stripped_spruce_log", + "minecraft:structure_block": "minecraft:structure_block", + "minecraft:sweet_berry_bush": "minecraft:sweet_berry_bush", + "minecraft:tallgrass": "minecraft:tallgrass", + "minecraft:tnt": "minecraft:tnt", + "minecraft:torch": "minecraft:torch", + "minecraft:trapdoor": "minecraft:trapdoor", + "minecraft:trapped_chest": "minecraft:trapped_chest", + "minecraft:tripwire": "minecraft:tripWire", + "minecraft:tripwire_hook": "minecraft:tripwire_hook", + "minecraft:turtle_egg": "minecraft:turtle_egg", + "minecraft:underwater_torch": "minecraft:underwater_torch", + "minecraft:undyed_shulker_box": "minecraft:undyed_shulker_box", + "minecraft:unlit_redstone_torch": "minecraft:unlit_redstone_torch", + "minecraft:unpowered_comparator": "minecraft:unpowered_comparator", + "minecraft:unpowered_repeater": "minecraft:unpowered_repeater", + "minecraft:vine": "minecraft:vine", + "minecraft:wall_banner": "minecraft:wall_banner", + "minecraft:wall_sign": "minecraft:wall_sign", + "minecraft:water": "minecraft:water", + "minecraft:waterlily": "minecraft:waterlily", + "minecraft:web": "minecraft:web", + "minecraft:white_glazed_terracotta": "minecraft:white_glazed_terracotta", + "minecraft:wood": "minecraft:wood", + "minecraft:wooden_button": "minecraft:wooden_button", + "minecraft:wooden_pressure_plate": "minecraft:wooden_pressure_plate", + "minecraft:wooden_slab": "minecraft:wooden_slab", + "minecraft:wool": "minecraft:wool", + "minecraft:yellow_flower": "minecraft:yellow_flower", + "minecraft:yellow_glazed_terracotta": "minecraft:yellow_glazed_terracotta" +} diff --git a/internal/item/1.12.0_to_1.18.10_blockstate_map.bin b/internal/item/1.12.0_to_1.18.10_blockstate_map.bin new file mode 100644 index 0000000000000000000000000000000000000000..fcafbb9010e739aa973cf8b8904f4649f0a66b3f GIT binary patch literal 329681 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 Y&jucJ literal 0 HcmV?d00001 diff --git a/internal/item/registry.go b/internal/item/registry.go new file mode 100644 index 0000000..da70586 --- /dev/null +++ b/internal/item/registry.go @@ -0,0 +1,110 @@ +package item + +import ( + "bytes" + "embed" + "encoding/json" + "github.com/df-mc/worldupgrader/blockupgrader" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "regexp" + "sort" + "strconv" +) + +var ( + //go:embed schemas/*.json + schemasFS embed.FS + //go:embed 1.12.0_item_id_to_block_id_map.json + rawItemToBlockIdMap []byte + //go:embed 1.12.0_to_1.18.10_blockstate_map.bin + rawblockStateMap []byte + // schemaIDs is a list of ids from all registered schemas. + schemaIDs []int + // schemas is a map of all registered item upgrade schemas. + schemas map[uint16]schema + // itemToBlockIdMap is a list of all registered item upgrade schemas. + itemToBlockIdMap map[string]string + // blockStateMap is a list of all legacy block states mapped to an upgraded version of it. + blockStateMap map[stateHash]blockupgrader.BlockState + + filenameRegex = regexp.MustCompile(`(\d{4})_[\w.]+\.json`) +) + +// stateHash is a struct that may be used as a map key for block states. +type stateHash struct { + // Name is the name of the block. It looks like 'minecraft:stone'. + Name string + // Metadata is the metadata value of the block. A lot of blocks only have 0 as data value, but some blocks + // carry specific variants or properties encoded in the metadata. + Metadata uint32 +} + +// init ... +func init() { + schemas = make(map[uint16]schema) + files, err := schemasFS.ReadDir("schemas") + if err != nil { + panic(err) + } + for _, f := range files { + if f.IsDir() { + continue + } + subMatches := filenameRegex.FindStringSubmatch(f.Name()) + if subMatches == nil { + continue + } + id, err := strconv.Atoi(subMatches[1]) + if err != nil { + continue + } + + buf, err := schemasFS.ReadFile("schemas/" + f.Name()) + if err != nil { + panic(err) + } + var s schema + if err = json.Unmarshal(buf, &s); err != nil { + panic(err) + } + schemas[uint16(id)] = s + } + schemaIDs = make([]int, 0, len(schemas)) + for k := range schemas { + schemaIDs = append(schemaIDs, int(k)) + } + sort.Sort(sort.Reverse(sort.IntSlice(schemaIDs))) + + if err = json.Unmarshal(rawItemToBlockIdMap, &itemToBlockIdMap); err != nil { + panic(err) + } + + blockStateMap = make(map[stateHash]blockupgrader.BlockState) + buf := protocol.NewReader(bytes.NewBuffer(rawblockStateMap), 0, false) + var length uint32 + buf.Varuint32(&length) + for i := uint32(0); i < length; i++ { + var legacyStringId string + buf.String(&legacyStringId) + + var pairs uint32 + buf.Varuint32(&pairs) + for y := uint32(0); y < pairs; y++ { + var meta uint32 + buf.Varuint32(&meta) + + var blockStateRaw map[string]any + buf.NBT(&blockStateRaw, nbt.LittleEndian) + latestBlockState := blockupgrader.Upgrade(blockupgrader.BlockState{ + Name: blockStateRaw["name"].(string), + Properties: blockStateRaw["states"].(map[string]any), + Version: blockStateRaw["version"].(int32), + }) + blockStateMap[stateHash{ + Name: legacyStringId, + Metadata: meta, + }] = latestBlockState + } + } +} diff --git a/internal/item/schema.go b/internal/item/schema.go new file mode 100644 index 0000000..7491f2e --- /dev/null +++ b/internal/item/schema.go @@ -0,0 +1,7 @@ +package item + +// schema represents the schema for loading item upgrade data from a JSON file. +type schema struct { + RenamedIDs map[string]string `json:"renamedIds,omitempty"` + RemappedMetas map[string]map[uint32]string `json:"remappedMetas,omitempty"` +} diff --git a/internal/item/schemas/0001_1.6_beta_to_1.6.0.json b/internal/item/schemas/0001_1.6_beta_to_1.6.0.json new file mode 100644 index 0000000..8fdd19e --- /dev/null +++ b/internal/item/schemas/0001_1.6_beta_to_1.6.0.json @@ -0,0 +1,10 @@ +{ + "renamedIds": { + "minecraft:nametag": "minecraft:name_tag", + "minecraft:prismarineshard": "minecraft:prismarine_shard", + "minecraft:stone_slab": "minecraft:double_stone_slab", + "minecraft:stone_slab2": "minecraft:double_stone_slab2", + "minecraft:stone_slab3": "minecraft:double_stone_slab3", + "minecraft:stone_slab4": "minecraft:double_stone_slab4" + } +} diff --git a/internal/item/schemas/0011_1.11.4_to_1.12.0.json b/internal/item/schemas/0011_1.11.4_to_1.12.0.json new file mode 100644 index 0000000..824bddc --- /dev/null +++ b/internal/item/schemas/0011_1.11.4_to_1.12.0.json @@ -0,0 +1,20 @@ +{ + "renamedIds": { + "minecraft:glazedterracotta.black": "minecraft:black_glazed_terracotta", + "minecraft:glazedterracotta.blue": "minecraft:blue_glazed_terracotta", + "minecraft:glazedterracotta.brown": "minecraft:brown_glazed_terracotta", + "minecraft:glazedterracotta.cyan": "minecraft:cyan_glazed_terracotta", + "minecraft:glazedterracotta.gray": "minecraft:gray_glazed_terracotta", + "minecraft:glazedterracotta.green": "minecraft:green_glazed_terracotta", + "minecraft:glazedterracotta.light_blue": "minecraft:light_blue_glazed_terracotta", + "minecraft:glazedterracotta.lime": "minecraft:lime_glazed_terracotta", + "minecraft:glazedterracotta.magenta": "minecraft:magenta_glazed_terracotta", + "minecraft:glazedterracotta.orange": "minecraft:orange_glazed_terracotta", + "minecraft:glazedterracotta.pink": "minecraft:pink_glazed_terracotta", + "minecraft:glazedterracotta.purple": "minecraft:purple_glazed_terracotta", + "minecraft:glazedterracotta.red": "minecraft:red_glazed_terracotta", + "minecraft:glazedterracotta.silver": "minecraft:silver_glazed_terracotta", + "minecraft:glazedterracotta.white": "minecraft:white_glazed_terracotta", + "minecraft:glazedterracotta.yellow": "minecraft:yellow_glazed_terracotta" + } +} diff --git a/internal/item/schemas/0021_1.16.0_to_1.16.100.json b/internal/item/schemas/0021_1.16.0_to_1.16.100.json new file mode 100644 index 0000000..ce78553 --- /dev/null +++ b/internal/item/schemas/0021_1.16.0_to_1.16.100.json @@ -0,0 +1,165 @@ +{ + "remappedMetas": { + "minecraft:banner_pattern": { + "0": "minecraft:creeper_banner_pattern", + "1": "minecraft:skull_banner_pattern", + "2": "minecraft:flower_banner_pattern", + "3": "minecraft:mojang_banner_pattern", + "4": "minecraft:field_masoned_banner_pattern", + "5": "minecraft:bordure_indented_banner_pattern", + "6": "minecraft:piglin_banner_pattern" + }, + "minecraft:boat": { + "0": "minecraft:oak_boat", + "1": "minecraft:spruce_boat", + "2": "minecraft:birch_boat", + "3": "minecraft:jungle_boat", + "4": "minecraft:acacia_boat", + "5": "minecraft:dark_oak_boat" + }, + "minecraft:bucket": { + "1": "minecraft:milk_bucket", + "10": "minecraft:lava_bucket", + "2": "minecraft:cod_bucket", + "3": "minecraft:salmon_bucket", + "4": "minecraft:tropical_fish_bucket", + "5": "minecraft:pufferfish_bucket", + "8": "minecraft:water_bucket" + }, + "minecraft:coal": { + "1": "minecraft:charcoal" + }, + "minecraft:dye": { + "0": "minecraft:ink_sac", + "1": "minecraft:red_dye", + "10": "minecraft:lime_dye", + "11": "minecraft:yellow_dye", + "12": "minecraft:light_blue_dye", + "13": "minecraft:magenta_dye", + "14": "minecraft:orange_dye", + "15": "minecraft:bone_meal", + "16": "minecraft:black_dye", + "17": "minecraft:brown_dye", + "18": "minecraft:blue_dye", + "19": "minecraft:white_dye", + "2": "minecraft:green_dye", + "3": "minecraft:cocoa_beans", + "4": "minecraft:lapis_lazuli", + "5": "minecraft:purple_dye", + "6": "minecraft:cyan_dye", + "7": "minecraft:light_gray_dye", + "8": "minecraft:gray_dye", + "9": "minecraft:pink_dye" + }, + "minecraft:spawn_egg": { + "10": "minecraft:chicken_spawn_egg", + "104": "minecraft:evoker_spawn_egg", + "105": "minecraft:vex_spawn_egg", + "108": "minecraft:pufferfish_spawn_egg", + "109": "minecraft:salmon_spawn_egg", + "11": "minecraft:cow_spawn_egg", + "110": "minecraft:drowned_spawn_egg", + "111": "minecraft:tropical_fish_spawn_egg", + "112": "minecraft:cod_spawn_egg", + "113": "minecraft:panda_spawn_egg", + "114": "minecraft:pillager_spawn_egg", + "115": "minecraft:villager_spawn_egg", + "116": "minecraft:zombie_villager_spawn_egg", + "118": "minecraft:wandering_trader_spawn_egg", + "12": "minecraft:pig_spawn_egg", + "121": "minecraft:fox_spawn_egg", + "122": "minecraft:bee_spawn_egg", + "123": "minecraft:piglin_spawn_egg", + "124": "minecraft:hoglin_spawn_egg", + "125": "minecraft:strider_spawn_egg", + "126": "minecraft:zoglin_spawn_egg", + "127": "minecraft:piglin_brute_spawn_egg", + "13": "minecraft:sheep_spawn_egg", + "14": "minecraft:wolf_spawn_egg", + "15": "minecraft:villager_spawn_egg", + "16": "minecraft:mooshroom_spawn_egg", + "17": "minecraft:squid_spawn_egg", + "18": "minecraft:rabbit_spawn_egg", + "19": "minecraft:bat_spawn_egg", + "22": "minecraft:ocelot_spawn_egg", + "23": "minecraft:horse_spawn_egg", + "24": "minecraft:donkey_spawn_egg", + "25": "minecraft:mule_spawn_egg", + "26": "minecraft:skeleton_horse_spawn_egg", + "27": "minecraft:zombie_horse_spawn_egg", + "28": "minecraft:polar_bear_spawn_egg", + "29": "minecraft:llama_spawn_egg", + "30": "minecraft:parrot_spawn_egg", + "31": "minecraft:dolphin_spawn_egg", + "32": "minecraft:zombie_spawn_egg", + "33": "minecraft:creeper_spawn_egg", + "34": "minecraft:skeleton_spawn_egg", + "35": "minecraft:spider_spawn_egg", + "36": "minecraft:zombie_pigman_spawn_egg", + "37": "minecraft:slime_spawn_egg", + "38": "minecraft:enderman_spawn_egg", + "39": "minecraft:silverfish_spawn_egg", + "40": "minecraft:cave_spider_spawn_egg", + "41": "minecraft:ghast_spawn_egg", + "42": "minecraft:magma_cube_spawn_egg", + "43": "minecraft:blaze_spawn_egg", + "44": "minecraft:zombie_villager_spawn_egg", + "45": "minecraft:witch_spawn_egg", + "46": "minecraft:stray_spawn_egg", + "47": "minecraft:husk_spawn_egg", + "48": "minecraft:wither_skeleton_spawn_egg", + "49": "minecraft:guardian_spawn_egg", + "50": "minecraft:elder_guardian_spawn_egg", + "51": "minecraft:npc_spawn_egg", + "54": "minecraft:shulker_spawn_egg", + "55": "minecraft:endermite_spawn_egg", + "56": "minecraft:agent_spawn_egg", + "57": "minecraft:vindicator_spawn_egg", + "58": "minecraft:phantom_spawn_egg", + "59": "minecraft:ravager_spawn_egg", + "74": "minecraft:turtle_spawn_egg", + "75": "minecraft:cat_spawn_egg" + } + }, + "renamedIds": { + "minecraft:appleenchanted": "minecraft:enchanted_golden_apple", + "minecraft:carrotonastick": "minecraft:carrot_on_a_stick", + "minecraft:chorus_fruit_popped": "minecraft:popped_chorus_fruit", + "minecraft:clownfish": "minecraft:tropical_fish", + "minecraft:cooked_fish": "minecraft:cooked_cod", + "minecraft:darkoak_sign": "minecraft:dark_oak_sign", + "minecraft:emptymap": "minecraft:empty_map", + "minecraft:fireball": "minecraft:fire_charge", + "minecraft:fireworks": "minecraft:firework_rocket", + "minecraft:fireworkscharge": "minecraft:firework_star", + "minecraft:fish": "minecraft:cod", + "minecraft:horsearmordiamond": "minecraft:diamond_horse_armor", + "minecraft:horsearmorgold": "minecraft:golden_horse_armor", + "minecraft:horsearmoriron": "minecraft:iron_horse_armor", + "minecraft:horsearmorleather": "minecraft:leather_horse_armor", + "minecraft:lodestonecompass": "minecraft:lodestone_compass", + "minecraft:map": "minecraft:filled_map", + "minecraft:melon": "minecraft:melon_slice", + "minecraft:muttoncooked": "minecraft:cooked_mutton", + "minecraft:muttonraw": "minecraft:mutton", + "minecraft:netherstar": "minecraft:nether_star", + "minecraft:record_11": "minecraft:music_disc_11", + "minecraft:record_13": "minecraft:music_disc_13", + "minecraft:record_blocks": "minecraft:music_disc_blocks", + "minecraft:record_cat": "minecraft:music_disc_cat", + "minecraft:record_chirp": "minecraft:music_disc_chirp", + "minecraft:record_far": "minecraft:music_disc_far", + "minecraft:record_mall": "minecraft:music_disc_mall", + "minecraft:record_mellohi": "minecraft:music_disc_mellohi", + "minecraft:record_pigstep": "minecraft:music_disc_pigstep", + "minecraft:record_stal": "minecraft:music_disc_stal", + "minecraft:record_strad": "minecraft:music_disc_strad", + "minecraft:record_wait": "minecraft:music_disc_wait", + "minecraft:record_ward": "minecraft:music_disc_ward", + "minecraft:reeds": "minecraft:sugar_cane", + "minecraft:sign": "minecraft:oak_sign", + "minecraft:speckled_melon": "minecraft:glistering_melon_slice", + "minecraft:totem": "minecraft:totem_of_undying", + "minecraft:turtle_shell_piece": "minecraft:scute" + } +} diff --git a/internal/item/schemas/0031_1.16.100_to_1.16.200.json b/internal/item/schemas/0031_1.16.100_to_1.16.200.json new file mode 100644 index 0000000..1bdda6e --- /dev/null +++ b/internal/item/schemas/0031_1.16.100_to_1.16.200.json @@ -0,0 +1,7 @@ +{ + "remappedMetas": { + "minecraft:spawn_egg": { + "128": "minecraft:goat_spawn_egg" + } + } +} diff --git a/internal/item/schemas/0041_1.16.200_to_1.17.30.json b/internal/item/schemas/0041_1.16.200_to_1.17.30.json new file mode 100644 index 0000000..84e9a4e --- /dev/null +++ b/internal/item/schemas/0041_1.16.200_to_1.17.30.json @@ -0,0 +1,12 @@ +{ + "remappedMetas": { + "minecraft:bucket": { + "11": "minecraft:powder_snow_bucket", + "12": "minecraft:axolotl_bucket" + }, + "minecraft:spawn_egg": { + "129": "minecraft:glow_squid_spawn_egg", + "130": "minecraft:axolotl_spawn_egg" + } + } +} diff --git a/internal/item/schemas/0051_1.17.40_to_1.18.0.json b/internal/item/schemas/0051_1.17.40_to_1.18.0.json new file mode 100644 index 0000000..3b4ea9b --- /dev/null +++ b/internal/item/schemas/0051_1.17.40_to_1.18.0.json @@ -0,0 +1,5 @@ +{ + "renamedIds": { + "minecraft:record_otherside": "minecraft:music_disc_otherside" + } +} diff --git a/internal/item/schemas/0061_1.18.0_to_1.18.10.json b/internal/item/schemas/0061_1.18.0_to_1.18.10.json new file mode 100644 index 0000000..5221d9a --- /dev/null +++ b/internal/item/schemas/0061_1.18.0_to_1.18.10.json @@ -0,0 +1,16 @@ +{ + "remappedMetas": { + "minecraft:banner_pattern": { + "7": "minecraft:globe_banner_pattern" + }, + "minecraft:bucket": { + "13": "minecraft:tadpole_bucket" + }, + "minecraft:spawn_egg": { + "132": "minecraft:frog_spawn_egg", + "133": "minecraft:tadpole_spawn_egg", + "134": "minecraft:allay_spawn_egg", + "135": "minecraft:firefly_spawn_egg" + } + } +} diff --git a/internal/item/schemas/0071_1.18.10_to_1.18.30.json b/internal/item/schemas/0071_1.18.10_to_1.18.30.json new file mode 100644 index 0000000..3269f83 --- /dev/null +++ b/internal/item/schemas/0071_1.18.10_to_1.18.30.json @@ -0,0 +1,23 @@ +{ + "remappedMetas": { + "minecraft:chest_boat": { + "0": "minecraft:oak_chest_boat", + "1": "minecraft:spruce_chest_boat", + "2": "minecraft:birch_chest_boat", + "3": "minecraft:jungle_chest_boat", + "4": "minecraft:acacia_chest_boat", + "5": "minecraft:dark_oak_chest_boat" + }, + "minecraft:spawn_egg": { + "131": "minecraft:warden_spawn_egg" + } + }, + "renamedIds": { + "minecraft:concretepowder": "minecraft:concrete_powder", + "minecraft:invisiblebedrock": "minecraft:invisible_bedrock", + "minecraft:movingblock": "minecraft:moving_block", + "minecraft:pistonarmcollision": "minecraft:piston_arm_collision", + "minecraft:sealantern": "minecraft:sea_lantern", + "minecraft:stickypistonarmcollision": "minecraft:sticky_piston_arm_collision" + } +} diff --git a/internal/item/schemas/0081_1.18.30_to_1.19.30.34_beta.json b/internal/item/schemas/0081_1.18.30_to_1.19.30.34_beta.json new file mode 100644 index 0000000..4c3537a --- /dev/null +++ b/internal/item/schemas/0081_1.18.30_to_1.19.30.34_beta.json @@ -0,0 +1,25 @@ +{ + "remappedMetas": { + "minecraft:boat": { + "6": "minecraft:mangrove_boat" + }, + "minecraft:chest_boat": { + "6": "minecraft:mangrove_chest_boat" + } + }, + "renamedIds": { + "minecraft:double_stone_slab": "minecraft:stone_block_slab", + "minecraft:double_stone_slab2": "minecraft:stone_block_slab2", + "minecraft:double_stone_slab3": "minecraft:stone_block_slab3", + "minecraft:double_stone_slab4": "minecraft:stone_block_slab4", + "minecraft:real_double_stone_slab": "minecraft:double_stone_block_slab", + "minecraft:real_double_stone_slab2": "minecraft:double_stone_block_slab2", + "minecraft:real_double_stone_slab3": "minecraft:double_stone_block_slab3", + "minecraft:real_double_stone_slab4": "minecraft:double_stone_block_slab4", + "minecraft:record_5": "minecraft:music_disc_5", + "minecraft:stone_slab": "minecraft:stone_block_slab", + "minecraft:stone_slab2": "minecraft:stone_block_slab2", + "minecraft:stone_slab3": "minecraft:stone_block_slab3", + "minecraft:stone_slab4": "minecraft:stone_block_slab4" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0091_1.19.60_to_1.19.70.26_beta.json b/internal/item/schemas/0091_1.19.60_to_1.19.70.26_beta.json new file mode 100644 index 0000000..b674687 --- /dev/null +++ b/internal/item/schemas/0091_1.19.60_to_1.19.70.26_beta.json @@ -0,0 +1,37 @@ +{ + "remappedMetas": { + "minecraft:boat": { + "7": "minecraft:bamboo_raft" + }, + "minecraft:chest_boat": { + "7": "minecraft:bamboo_chest_raft" + }, + "minecraft:spawn_egg": { + "138": "minecraft:camel_spawn_egg", + "139": "minecraft:sniffer_spawn_egg", + "157": "minecraft:trader_llama_spawn_egg", + "20": "minecraft:iron_golem_spawn_egg", + "21": "minecraft:snow_golem_spawn_egg", + "52": "minecraft:wither_spawn_egg", + "53": "minecraft:ender_dragon_spawn_egg" + }, + "minecraft:wool": { + "0": "minecraft:white_wool", + "1": "minecraft:orange_wool", + "10": "minecraft:purple_wool", + "11": "minecraft:blue_wool", + "12": "minecraft:brown_wool", + "13": "minecraft:green_wool", + "14": "minecraft:red_wool", + "15": "minecraft:black_wool", + "2": "minecraft:magenta_wool", + "3": "minecraft:light_blue_wool", + "4": "minecraft:yellow_wool", + "5": "minecraft:lime_wool", + "6": "minecraft:pink_wool", + "7": "minecraft:gray_wool", + "8": "minecraft:light_gray_wool", + "9": "minecraft:cyan_wool" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0101_1.19.70_to_1.19.80.24_beta.json b/internal/item/schemas/0101_1.19.70_to_1.19.80.24_beta.json new file mode 100644 index 0000000..f79b82b --- /dev/null +++ b/internal/item/schemas/0101_1.19.70_to_1.19.80.24_beta.json @@ -0,0 +1,36 @@ +{ + "remappedMetas": { + "minecraft:boat": { + "8": "minecraft:cherry_boat" + }, + "minecraft:chest_boat": { + "8": "minecraft:cherry_chest_boat" + }, + "minecraft:fence": { + "0": "minecraft:oak_fence", + "1": "minecraft:spruce_fence", + "2": "minecraft:birch_fence", + "3": "minecraft:jungle_fence", + "4": "minecraft:acacia_fence", + "5": "minecraft:dark_oak_fence" + }, + "minecraft:log": { + "0": "minecraft:oak_log", + "1": "minecraft:spruce_log", + "10": "minecraft:birch_log", + "11": "minecraft:jungle_log", + "2": "minecraft:birch_log", + "3": "minecraft:jungle_log", + "5": "minecraft:spruce_log", + "6": "minecraft:birch_log", + "7": "minecraft:jungle_log", + "9": "minecraft:spruce_log" + }, + "minecraft:log2": { + "0": "minecraft:acacia_log", + "1": "minecraft:dark_oak_log", + "5": "minecraft:dark_oak_log", + "9": "minecraft:dark_oak_log" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0111_1.19.80_to_1.20.0.23_beta.json b/internal/item/schemas/0111_1.19.80_to_1.20.0.23_beta.json new file mode 100644 index 0000000..5668a17 --- /dev/null +++ b/internal/item/schemas/0111_1.19.80_to_1.20.0.23_beta.json @@ -0,0 +1,37 @@ +{ + "remappedMetas": { + "minecraft:carpet": { + "0": "minecraft:white_carpet", + "1": "minecraft:orange_carpet", + "10": "minecraft:purple_carpet", + "11": "minecraft:blue_carpet", + "12": "minecraft:brown_carpet", + "13": "minecraft:green_carpet", + "14": "minecraft:red_carpet", + "15": "minecraft:black_carpet", + "2": "minecraft:magenta_carpet", + "3": "minecraft:light_blue_carpet", + "4": "minecraft:yellow_carpet", + "5": "minecraft:lime_carpet", + "6": "minecraft:pink_carpet", + "7": "minecraft:gray_carpet", + "8": "minecraft:light_gray_carpet", + "9": "minecraft:cyan_carpet" + }, + "minecraft:coral": { + "0": "minecraft:tube_coral", + "1": "minecraft:brain_coral", + "10": "minecraft:dead_bubble_coral", + "11": "minecraft:dead_fire_coral", + "12": "minecraft:dead_horn_coral", + "2": "minecraft:bubble_coral", + "3": "minecraft:fire_coral", + "4": "minecraft:horn_coral", + "8": "minecraft:dead_tube_coral", + "9": "minecraft:dead_brain_coral" + } + }, + "renamedIds": { + "minecraft:record_relic": "minecraft:music_disc_relic" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0121_1.20.0.23_beta_to_1.20.10.24_beta.json b/internal/item/schemas/0121_1.20.0.23_beta_to_1.20.10.24_beta.json new file mode 100644 index 0000000..2d7a6db --- /dev/null +++ b/internal/item/schemas/0121_1.20.0.23_beta_to_1.20.10.24_beta.json @@ -0,0 +1,40 @@ +{ + "remappedMetas": { + "minecraft:concrete": { + "0": "minecraft:white_concrete", + "1": "minecraft:orange_concrete", + "10": "minecraft:purple_concrete", + "11": "minecraft:blue_concrete", + "12": "minecraft:brown_concrete", + "13": "minecraft:green_concrete", + "14": "minecraft:red_concrete", + "15": "minecraft:black_concrete", + "2": "minecraft:magenta_concrete", + "3": "minecraft:light_blue_concrete", + "4": "minecraft:yellow_concrete", + "5": "minecraft:lime_concrete", + "6": "minecraft:pink_concrete", + "7": "minecraft:gray_concrete", + "8": "minecraft:light_gray_concrete", + "9": "minecraft:cyan_concrete" + }, + "minecraft:shulker_box": { + "0": "minecraft:white_shulker_box", + "1": "minecraft:orange_shulker_box", + "10": "minecraft:purple_shulker_box", + "11": "minecraft:blue_shulker_box", + "12": "minecraft:brown_shulker_box", + "13": "minecraft:green_shulker_box", + "14": "minecraft:red_shulker_box", + "15": "minecraft:black_shulker_box", + "2": "minecraft:magenta_shulker_box", + "3": "minecraft:light_blue_shulker_box", + "4": "minecraft:yellow_shulker_box", + "5": "minecraft:lime_shulker_box", + "6": "minecraft:pink_shulker_box", + "7": "minecraft:gray_shulker_box", + "8": "minecraft:light_gray_shulker_box", + "9": "minecraft:cyan_shulker_box" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0131_1.20.10.24_beta_to_1.20.20.23_beta.json b/internal/item/schemas/0131_1.20.10.24_beta_to_1.20.20.23_beta.json new file mode 100644 index 0000000..eadfe8e --- /dev/null +++ b/internal/item/schemas/0131_1.20.10.24_beta_to_1.20.20.23_beta.json @@ -0,0 +1,40 @@ +{ + "remappedMetas": { + "minecraft:stained_glass": { + "0": "minecraft:white_stained_glass", + "1": "minecraft:orange_stained_glass", + "10": "minecraft:purple_stained_glass", + "11": "minecraft:blue_stained_glass", + "12": "minecraft:brown_stained_glass", + "13": "minecraft:green_stained_glass", + "14": "minecraft:red_stained_glass", + "15": "minecraft:black_stained_glass", + "2": "minecraft:magenta_stained_glass", + "3": "minecraft:light_blue_stained_glass", + "4": "minecraft:yellow_stained_glass", + "5": "minecraft:lime_stained_glass", + "6": "minecraft:pink_stained_glass", + "7": "minecraft:gray_stained_glass", + "8": "minecraft:light_gray_stained_glass", + "9": "minecraft:cyan_stained_glass" + }, + "minecraft:stained_glass_pane": { + "0": "minecraft:white_stained_glass_pane", + "1": "minecraft:orange_stained_glass_pane", + "10": "minecraft:purple_stained_glass_pane", + "11": "minecraft:blue_stained_glass_pane", + "12": "minecraft:brown_stained_glass_pane", + "13": "minecraft:green_stained_glass_pane", + "14": "minecraft:red_stained_glass_pane", + "15": "minecraft:black_stained_glass_pane", + "2": "minecraft:magenta_stained_glass_pane", + "3": "minecraft:light_blue_stained_glass_pane", + "4": "minecraft:yellow_stained_glass_pane", + "5": "minecraft:lime_stained_glass_pane", + "6": "minecraft:pink_stained_glass_pane", + "7": "minecraft:gray_stained_glass_pane", + "8": "minecraft:light_gray_stained_glass_pane", + "9": "minecraft:cyan_stained_glass_pane" + } + } +} diff --git a/internal/item/schemas/0141_1.20.20.23_beta_to_1.20.30.22_beta.json b/internal/item/schemas/0141_1.20.20.23_beta_to_1.20.30.22_beta.json new file mode 100644 index 0000000..2c3a27d --- /dev/null +++ b/internal/item/schemas/0141_1.20.20.23_beta_to_1.20.30.22_beta.json @@ -0,0 +1,40 @@ +{ + "remappedMetas": { + "minecraft:concrete_powder": { + "0": "minecraft:white_concrete_powder", + "1": "minecraft:orange_concrete_powder", + "10": "minecraft:purple_concrete_powder", + "11": "minecraft:blue_concrete_powder", + "12": "minecraft:brown_concrete_powder", + "13": "minecraft:green_concrete_powder", + "14": "minecraft:red_concrete_powder", + "15": "minecraft:black_concrete_powder", + "2": "minecraft:magenta_concrete_powder", + "3": "minecraft:light_blue_concrete_powder", + "4": "minecraft:yellow_concrete_powder", + "5": "minecraft:lime_concrete_powder", + "6": "minecraft:pink_concrete_powder", + "7": "minecraft:gray_concrete_powder", + "8": "minecraft:light_gray_concrete_powder", + "9": "minecraft:cyan_concrete_powder" + }, + "minecraft:stained_hardened_clay": { + "0": "minecraft:white_terracotta", + "1": "minecraft:orange_terracotta", + "10": "minecraft:purple_terracotta", + "11": "minecraft:blue_terracotta", + "12": "minecraft:brown_terracotta", + "13": "minecraft:green_terracotta", + "14": "minecraft:red_terracotta", + "15": "minecraft:black_terracotta", + "2": "minecraft:magenta_terracotta", + "3": "minecraft:light_blue_terracotta", + "4": "minecraft:yellow_terracotta", + "5": "minecraft:lime_terracotta", + "6": "minecraft:pink_terracotta", + "7": "minecraft:gray_terracotta", + "8": "minecraft:light_gray_terracotta", + "9": "minecraft:cyan_terracotta" + } + } +} diff --git a/internal/item/schemas/0151_1.20.30.22_beta_to_1.20.50.23_beta.json b/internal/item/schemas/0151_1.20.30.22_beta_to_1.20.50.23_beta.json new file mode 100644 index 0000000..30e368f --- /dev/null +++ b/internal/item/schemas/0151_1.20.30.22_beta_to_1.20.50.23_beta.json @@ -0,0 +1,20 @@ +{ + "remappedMetas": { + "minecraft:planks": { + "0": "minecraft:oak_planks", + "1": "minecraft:spruce_planks", + "2": "minecraft:birch_planks", + "3": "minecraft:jungle_planks", + "4": "minecraft:acacia_planks", + "5": "minecraft:dark_oak_planks" + }, + "minecraft:stone": { + "1": "minecraft:granite", + "2": "minecraft:polished_granite", + "3": "minecraft:diorite", + "4": "minecraft:polished_diorite", + "5": "minecraft:andesite", + "6": "minecraft:polished_andesite" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0161_1.20.50.23_beta_to_1.20.60.26_beta.json b/internal/item/schemas/0161_1.20.50.23_beta_to_1.20.60.26_beta.json new file mode 100644 index 0000000..31f762c --- /dev/null +++ b/internal/item/schemas/0161_1.20.50.23_beta_to_1.20.60.26_beta.json @@ -0,0 +1,47 @@ +{ + "remappedMetas": { + "minecraft:hard_stained_glass": { + "0": "minecraft:hard_white_stained_glass", + "1": "minecraft:hard_orange_stained_glass", + "10": "minecraft:hard_purple_stained_glass", + "11": "minecraft:hard_blue_stained_glass", + "12": "minecraft:hard_brown_stained_glass", + "13": "minecraft:hard_green_stained_glass", + "14": "minecraft:hard_red_stained_glass", + "15": "minecraft:hard_black_stained_glass", + "2": "minecraft:hard_magenta_stained_glass", + "3": "minecraft:hard_light_blue_stained_glass", + "4": "minecraft:hard_yellow_stained_glass", + "5": "minecraft:hard_lime_stained_glass", + "6": "minecraft:hard_pink_stained_glass", + "7": "minecraft:hard_gray_stained_glass", + "8": "minecraft:hard_light_gray_stained_glass", + "9": "minecraft:hard_cyan_stained_glass" + }, + "minecraft:hard_stained_glass_pane": { + "0": "minecraft:hard_white_stained_glass_pane", + "1": "minecraft:hard_orange_stained_glass_pane", + "10": "minecraft:hard_purple_stained_glass_pane", + "11": "minecraft:hard_blue_stained_glass_pane", + "12": "minecraft:hard_brown_stained_glass_pane", + "13": "minecraft:hard_green_stained_glass_pane", + "14": "minecraft:hard_red_stained_glass_pane", + "15": "minecraft:hard_black_stained_glass_pane", + "2": "minecraft:hard_magenta_stained_glass_pane", + "3": "minecraft:hard_light_blue_stained_glass_pane", + "4": "minecraft:hard_yellow_stained_glass_pane", + "5": "minecraft:hard_lime_stained_glass_pane", + "6": "minecraft:hard_pink_stained_glass_pane", + "7": "minecraft:hard_gray_stained_glass_pane", + "8": "minecraft:hard_light_gray_stained_glass_pane", + "9": "minecraft:hard_cyan_stained_glass_pane" + }, + "minecraft:spawn_egg": { + "140": "minecraft:breeze_spawn_egg", + "142": "minecraft:armadillo_spawn_egg" + } + }, + "renamedIds": { + "minecraft:scute": "minecraft:turtle_scute" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0171_1.20.60.26_beta_to_1.20.70.24_beta.json b/internal/item/schemas/0171_1.20.60.26_beta_to_1.20.70.24_beta.json new file mode 100644 index 0000000..453199e --- /dev/null +++ b/internal/item/schemas/0171_1.20.60.26_beta_to_1.20.70.24_beta.json @@ -0,0 +1,42 @@ +{ + "remappedMetas": { + "minecraft:leaves": { + "0": "minecraft:oak_leaves", + "1": "minecraft:spruce_leaves", + "2": "minecraft:birch_leaves", + "3": "minecraft:jungle_leaves" + }, + "minecraft:leaves2": { + "0": "minecraft:acacia_leaves", + "1": "minecraft:dark_oak_leaves" + }, + "minecraft:spawn_egg": { + "144": "minecraft:bogged_spawn_egg" + }, + "minecraft:wood": { + "0": "minecraft:oak_wood", + "1": "minecraft:spruce_wood", + "10": "minecraft:stripped_birch_wood", + "11": "minecraft:stripped_jungle_wood", + "12": "minecraft:stripped_acacia_wood", + "13": "minecraft:stripped_dark_oak_wood", + "2": "minecraft:birch_wood", + "3": "minecraft:jungle_wood", + "4": "minecraft:acacia_wood", + "5": "minecraft:dark_oak_wood", + "8": "minecraft:stripped_oak_wood", + "9": "minecraft:stripped_spruce_wood" + }, + "minecraft:wooden_slab": { + "0": "minecraft:oak_slab", + "1": "minecraft:spruce_slab", + "2": "minecraft:birch_slab", + "3": "minecraft:jungle_slab", + "4": "minecraft:acacia_slab", + "5": "minecraft:dark_oak_slab" + } + }, + "renamedIds": { + "minecraft:grass": "minecraft:grass_block" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0181_1.20.70.24_beta_to_1.20.80.24_beta.json b/internal/item/schemas/0181_1.20.70.24_beta_to_1.20.80.24_beta.json new file mode 100644 index 0000000..fb05350 --- /dev/null +++ b/internal/item/schemas/0181_1.20.70.24_beta_to_1.20.80.24_beta.json @@ -0,0 +1,39 @@ +{ + "remappedMetas": { + "minecraft:coral_fan": { + "0": "minecraft:tube_coral_fan", + "1": "minecraft:brain_coral_fan", + "2": "minecraft:bubble_coral_fan", + "3": "minecraft:fire_coral_fan", + "4": "minecraft:horn_coral_fan" + }, + "minecraft:coral_fan_dead": { + "0": "minecraft:dead_tube_coral_fan", + "1": "minecraft:dead_brain_coral_fan", + "2": "minecraft:dead_bubble_coral_fan", + "3": "minecraft:dead_fire_coral_fan", + "4": "minecraft:dead_horn_coral_fan" + }, + "minecraft:red_flower": { + "0": "minecraft:poppy", + "1": "minecraft:blue_orchid", + "10": "minecraft:lily_of_the_valley", + "2": "minecraft:allium", + "3": "minecraft:azure_bluet", + "4": "minecraft:red_tulip", + "5": "minecraft:orange_tulip", + "6": "minecraft:white_tulip", + "7": "minecraft:pink_tulip", + "8": "minecraft:oxeye_daisy", + "9": "minecraft:cornflower" + }, + "minecraft:sapling": { + "0": "minecraft:oak_sapling", + "1": "minecraft:spruce_sapling", + "2": "minecraft:birch_sapling", + "3": "minecraft:jungle_sapling", + "4": "minecraft:acacia_sapling", + "5": "minecraft:dark_oak_sapling" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0191_1.20.80.24_beta_to_1.21.0.25_beta.json b/internal/item/schemas/0191_1.20.80.24_beta_to_1.21.0.25_beta.json new file mode 100644 index 0000000..9372668 --- /dev/null +++ b/internal/item/schemas/0191_1.20.80.24_beta_to_1.21.0.25_beta.json @@ -0,0 +1,44 @@ +{ + "remappedMetas": { + "minecraft:coral_block": { + "0": "minecraft:tube_coral_block", + "1": "minecraft:brain_coral_block", + "10": "minecraft:dead_bubble_coral_block", + "11": "minecraft:dead_fire_coral_block", + "12": "minecraft:dead_horn_coral_block", + "2": "minecraft:bubble_coral_block", + "3": "minecraft:fire_coral_block", + "4": "minecraft:horn_coral_block", + "8": "minecraft:dead_tube_coral_block", + "9": "minecraft:dead_brain_coral_block" + }, + "minecraft:double_plant": { + "0": "minecraft:sunflower", + "1": "minecraft:lilac", + "2": "minecraft:tall_grass", + "3": "minecraft:large_fern", + "4": "minecraft:rose_bush", + "5": "minecraft:peony" + }, + "minecraft:stone_block_slab": { + "0": "minecraft:smooth_stone_slab", + "1": "minecraft:sandstone_slab", + "2": "minecraft:petrified_oak_slab", + "3": "minecraft:cobblestone_slab", + "4": "minecraft:brick_slab", + "5": "minecraft:stone_brick_slab", + "6": "minecraft:quartz_slab", + "7": "minecraft:nether_brick_slab" + }, + "minecraft:tallgrass": { + "0": "minecraft:short_grass", + "2": "minecraft:fern", + "3": "minecraft:fern" + } + }, + "renamedIds": { + "minecraft:record_creator": "minecraft:music_disc_creator", + "minecraft:record_creator_music_box": "minecraft:music_disc_creator_music_box", + "minecraft:record_precipice": "minecraft:music_disc_precipice" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0201_1.21.0.25_beta_to_1.21.20.24_beta.json b/internal/item/schemas/0201_1.21.0.25_beta_to_1.21.20.24_beta.json new file mode 100644 index 0000000..d160bb5 --- /dev/null +++ b/internal/item/schemas/0201_1.21.0.25_beta_to_1.21.20.24_beta.json @@ -0,0 +1,138 @@ +{ + "remappedMetas": { + "minecraft:anvil": { + "10": "minecraft:damaged_anvil", + "11": "minecraft:damaged_anvil", + "4": "minecraft:chipped_anvil", + "5": "minecraft:chipped_anvil", + "6": "minecraft:chipped_anvil", + "7": "minecraft:chipped_anvil", + "8": "minecraft:damaged_anvil", + "9": "minecraft:damaged_anvil" + }, + "minecraft:dirt": { + "1": "minecraft:coarse_dirt" + }, + "minecraft:double_stone_block_slab": { + "0": "minecraft:smooth_stone_double_slab", + "1": "minecraft:sandstone_double_slab", + "2": "minecraft:petrified_oak_double_slab", + "3": "minecraft:cobblestone_double_slab", + "4": "minecraft:brick_double_slab", + "5": "minecraft:stone_brick_double_slab", + "6": "minecraft:quartz_double_slab", + "7": "minecraft:nether_brick_double_slab" + }, + "minecraft:double_stone_block_slab2": { + "0": "minecraft:red_sandstone_double_slab", + "1": "minecraft:purpur_double_slab", + "2": "minecraft:prismarine_double_slab", + "3": "minecraft:dark_prismarine_double_slab", + "4": "minecraft:prismarine_brick_double_slab", + "5": "minecraft:mossy_cobblestone_double_slab", + "6": "minecraft:smooth_sandstone_double_slab", + "7": "minecraft:red_nether_brick_double_slab" + }, + "minecraft:double_stone_block_slab3": { + "0": "minecraft:end_stone_brick_double_slab", + "1": "minecraft:smooth_red_sandstone_double_slab", + "2": "minecraft:polished_andesite_double_slab", + "3": "minecraft:andesite_double_slab", + "4": "minecraft:diorite_double_slab", + "5": "minecraft:polished_diorite_double_slab", + "6": "minecraft:granite_double_slab", + "7": "minecraft:polished_granite_double_slab" + }, + "minecraft:double_stone_block_slab4": { + "0": "minecraft:mossy_stone_brick_double_slab", + "1": "minecraft:smooth_quartz_double_slab", + "2": "minecraft:normal_stone_double_slab", + "3": "minecraft:cut_sandstone_double_slab", + "4": "minecraft:cut_red_sandstone_double_slab" + }, + "minecraft:light_block": { + "0": "minecraft:light_block_0", + "1": "minecraft:light_block_1", + "10": "minecraft:light_block_10", + "11": "minecraft:light_block_11", + "12": "minecraft:light_block_12", + "13": "minecraft:light_block_13", + "14": "minecraft:light_block_14", + "15": "minecraft:light_block_15", + "2": "minecraft:light_block_2", + "3": "minecraft:light_block_3", + "4": "minecraft:light_block_4", + "5": "minecraft:light_block_5", + "6": "minecraft:light_block_6", + "7": "minecraft:light_block_7", + "8": "minecraft:light_block_8", + "9": "minecraft:light_block_9" + }, + "minecraft:monster_egg": { + "0": "minecraft:infested_stone", + "1": "minecraft:infested_cobblestone", + "2": "minecraft:infested_stone_bricks", + "3": "minecraft:infested_mossy_stone_bricks", + "4": "minecraft:infested_cracked_stone_bricks", + "5": "minecraft:infested_chiseled_stone_bricks" + }, + "minecraft:prismarine": { + "1": "minecraft:dark_prismarine", + "2": "minecraft:prismarine_bricks" + }, + "minecraft:quartz_block": { + "1": "minecraft:chiseled_quartz_block", + "2": "minecraft:quartz_pillar", + "3": "minecraft:smooth_quartz" + }, + "minecraft:red_sandstone": { + "1": "minecraft:chiseled_red_sandstone", + "2": "minecraft:cut_red_sandstone", + "3": "minecraft:smooth_red_sandstone" + }, + "minecraft:sand": { + "1": "minecraft:red_sand" + }, + "minecraft:sandstone": { + "1": "minecraft:chiseled_sandstone", + "2": "minecraft:cut_sandstone", + "3": "minecraft:smooth_sandstone" + }, + "minecraft:stone_block_slab2": { + "0": "minecraft:red_sandstone_slab", + "1": "minecraft:purpur_slab", + "2": "minecraft:prismarine_slab", + "3": "minecraft:dark_prismarine_slab", + "4": "minecraft:prismarine_brick_slab", + "5": "minecraft:mossy_cobblestone_slab", + "6": "minecraft:smooth_sandstone_slab", + "7": "minecraft:red_nether_brick_slab" + }, + "minecraft:stone_block_slab3": { + "0": "minecraft:end_stone_brick_slab", + "1": "minecraft:smooth_red_sandstone_slab", + "2": "minecraft:polished_andesite_slab", + "3": "minecraft:andesite_slab", + "4": "minecraft:diorite_slab", + "5": "minecraft:polished_diorite_slab", + "6": "minecraft:granite_slab", + "7": "minecraft:polished_granite_slab" + }, + "minecraft:stone_block_slab4": { + "0": "minecraft:mossy_stone_brick_slab", + "1": "minecraft:smooth_quartz_slab", + "2": "minecraft:normal_stone_slab", + "3": "minecraft:cut_sandstone_slab", + "4": "minecraft:cut_red_sandstone_slab" + }, + "minecraft:stonebrick": { + "0": "minecraft:stone_bricks", + "1": "minecraft:mossy_stone_bricks", + "2": "minecraft:cracked_stone_bricks", + "3": "minecraft:chiseled_stone_bricks" + } + }, + "renamedIds": { + "minecraft:yellow_flower": "minecraft:dandelion" + } +} \ No newline at end of file diff --git a/internal/item/schemas/0211_1.21.20.24_beta_to_1.21.30.24_beta.json b/internal/item/schemas/0211_1.21.20.24_beta_to_1.21.30.24_beta.json new file mode 100644 index 0000000..450a016 --- /dev/null +++ b/internal/item/schemas/0211_1.21.20.24_beta_to_1.21.30.24_beta.json @@ -0,0 +1,52 @@ +{ + "remappedMetas": { + "minecraft:chemistry_table": { + "0": "minecraft:compound_creator" + }, + "minecraft:cobblestone_wall": { + "1": "minecraft:mossy_cobblestone_wall", + "10": "minecraft:end_stone_brick_wall", + "11": "minecraft:prismarine_wall", + "12": "minecraft:red_sandstone_wall", + "13": "minecraft:red_nether_brick_wall", + "2": "minecraft:granite_wall", + "3": "minecraft:diorite_wall", + "4": "minecraft:andesite_wall", + "5": "minecraft:sandstone_wall", + "6": "minecraft:brick_wall", + "7": "minecraft:stone_brick_wall", + "8": "minecraft:mossy_stone_brick_wall", + "9": "minecraft:nether_brick_wall" + }, + "minecraft:colored_torch_bp": { + "0": "minecraft:colored_torch_blue", + "10": "minecraft:colored_torch_purple", + "11": "minecraft:colored_torch_purple", + "12": "minecraft:colored_torch_purple", + "13": "minecraft:colored_torch_purple", + "14": "minecraft:colored_torch_purple", + "15": "minecraft:colored_torch_purple", + "8": "minecraft:colored_torch_purple", + "9": "minecraft:colored_torch_purple" + }, + "minecraft:colored_torch_rg": { + "0": "minecraft:colored_torch_red", + "10": "minecraft:colored_torch_green", + "11": "minecraft:colored_torch_green", + "12": "minecraft:colored_torch_green", + "13": "minecraft:colored_torch_green", + "14": "minecraft:colored_torch_green", + "15": "minecraft:colored_torch_green", + "8": "minecraft:colored_torch_green", + "9": "minecraft:colored_torch_green" + }, + "minecraft:purpur_block": { + "1": "minecraft:deprecated_purpur_block_1", + "2": "minecraft:purpur_pillar", + "3": "minecraft:deprecated_purpur_block_2" + }, + "minecraft:sponge": { + "1": "minecraft:wet_sponge" + } + } +} \ No newline at end of file diff --git a/internal/item/schemas/0221_1.21.30.24_beta_to_1.21.40.25.json b/internal/item/schemas/0221_1.21.30.24_beta_to_1.21.40.25.json new file mode 100644 index 0000000..4e1c059 --- /dev/null +++ b/internal/item/schemas/0221_1.21.30.24_beta_to_1.21.40.25.json @@ -0,0 +1,13 @@ +{ + "remappedMetas": { + "minecraft:skull": { + "0": "minecraft:skeleton_skull", + "1": "minecraft:wither_skeleton_skull", + "2": "minecraft:zombie_head", + "3": "minecraft:player_head", + "4": "minecraft:creeper_head", + "5": "minecraft:dragon_head", + "6": "minecraft:piglin_head" + } + } +} \ No newline at end of file diff --git a/internal/item/upgrader.go b/internal/item/upgrader.go new file mode 100644 index 0000000..c3ece41 --- /dev/null +++ b/internal/item/upgrader.go @@ -0,0 +1,109 @@ +package item + +import ( + "github.com/df-mc/worldupgrader/blockupgrader" +) + +// Item ... +type Item struct { + Name string + Metadata uint32 + Version uint16 +} + +// Upgrade upgrades the given item using the registered item upgrade schemas. +func Upgrade(item Item, ver uint16) Item { + version := item.Version + for id, s := range schemas { + if version > id || id > ver { + continue + } + + name := item.Name + metadata := item.Metadata + nameRenamed := false + metadataRemapped := false + + if metadataCombinations, ok := s.RemappedMetas[name]; ok { + name, metadataRemapped = metadataCombinations[item.Metadata] + metadata = 0 + } else if name, nameRenamed = s.RenamedIDs[item.Name]; !nameRenamed { + name = item.Name + } + + if nameRenamed || metadataRemapped { + item = Item{ + Name: name, + Metadata: metadata, + Version: id, + } + } + } + return item +} + +// Downgrade downgrades the given item using the registered item upgrade schemas. +func Downgrade(item Item, ver uint16) Item { + for i, id := range schemaIDs { + s := schemas[uint16(id)] + if uint16(id) > item.Version { + continue + } + + name := item.Name + metadata := item.Metadata + nameRenamed := false + metadataRemapped := false + + for oldName, newName := range s.RenamedIDs { + if newName == name { + name = oldName + nameRenamed = true + } + } + + if !nameRenamed { + for oldName, m := range s.RemappedMetas { + for meta, newName := range m { + if newName == name { + name = oldName + metadata = meta + nameRenamed = true + metadataRemapped = true + } + } + if metadataRemapped { + break + } + } + } + + if ver > item.Version || i == len(schemaIDs)-1 { + break + } + + return Downgrade(Item{ + Name: name, + Metadata: metadata, + Version: uint16(schemaIDs[i+1]), + }, ver) + } + return item +} + +func BlockStateFromItemName(itemName string, metadata uint32) (blockupgrader.BlockState, bool) { + blockId, ok := itemToBlockIdMap[itemName] + if !ok { + return blockupgrader.BlockState{}, false + } + + blockState, ok := blockStateMap[stateHash{ + Name: blockId, + Metadata: metadata, + }] + return blockState, ok +} + +func BlockStateFromItem(item Item) (blockupgrader.BlockState, bool) { + return BlockStateFromItemName(item.Name, item.Metadata) +} diff --git a/internal/iterator.go b/internal/iterator.go new file mode 100644 index 0000000..5645635 --- /dev/null +++ b/internal/iterator.go @@ -0,0 +1,41 @@ +package internal + +type Iterator[T any] struct { + index int + values []T +} + +func NewIterator[T any](values []T) *Iterator[T] { + return &Iterator[T]{values: values} +} + +func (i *Iterator[T]) HasNext() bool { + if i.index < len(i.values) { + return true + } + return false +} + +func (i *Iterator[T]) HasPrevious() bool { + if i.index > 0 { + return true + } + return false +} + +func (i *Iterator[T]) Next() T { + if i.HasNext() { + value := i.values[i.index] + i.index++ + return value + } + panic("no more elements") +} + +func (i *Iterator[T]) Previous() T { + if i.HasPrevious() { + i.index-- + return i.values[i.index] + } + panic("no more elements") +} diff --git a/legacyver/bitset.go b/legacyver/bitset.go new file mode 100644 index 0000000..2ce8bbd --- /dev/null +++ b/legacyver/bitset.go @@ -0,0 +1,22 @@ +package legacyver + +import "github.com/sandertv/gophertunnel/minecraft/protocol" + +func fitBitset(b protocol.Bitset, size int) protocol.Bitset { + if b.Len() != size { + ret := protocol.NewBitset(size) + + copySize := b.Len() + if copySize > size { + copySize = size + } + + for i := 0; i < copySize; i++ { + if b.Load(i) { + ret.Set(i) + } + } + return ret + } + return b +} diff --git a/legacyver/block_states_748.nbt b/legacyver/block_states_748.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ff4d75701640921818a7fda13f0449f5e3595a19 GIT binary patch literal 1918591 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

g^bcV3{F(gA+9T|`ztbTN7$ZU2VHN=A--5KJ+ zkqiXj}_4=)?hgS8IC%*`) zhfRF72&)jZp4OOU2tV6pjhW`*!m*#%>PgrvE*zsiPqH^*nmBiMciOS2fV0~1xj0kD z9SgNR;qauJBY3n?;Rqh>S2%)4+ZHzP9Y?#+=9nXRmt)`Iz00xhfJbAmowMF-i;a4^ zz4vz#U$?t?Rah+J!$%8&#I#+8`#fLlK4ZSE)b8KDzRo^w{vFg0B0ruv?!O7>2p-Yw z2p-Yw2p-Yw2p(+^I)d-BPuMqelm7NgR<*C3pT2?=&29q>p1h`$+u+HII=Ky=yk=E1c=~2g2SZA6$YPM< zki{UyA&WtZ!&6zHW&Z$KP#m%tq&Q?TNO8zwkmB$(X_z@=F-UR9VvypH#o!5t+B>9A zlZK;~avMD1klWx1huj7!4o{PYnL`$X6o)JZDGpf-QXHP@kfWB8S?a(b#UV?C6o)JZ zDGpDQ#=(%D^fVfWECwkKSqxGf_BW`VY}#%6>d$1mdq=+`BgA2w-?UqC^$ETDPS?@# zy!|E{*aFdxRB3PNZ(a+)x?Z+0e3IMRBJWhaXi~EKs>tcEF$Sq-0X zthIcn$;DZ#r3{~NEM@qFV=2QF$EV39#4)R3iepy86vwQFDUMHd%vr0+tafOa;+QpJ ziepy86vwB@<#4D^dM=G)R>Ks>tcEF$tqgDCut?)FinA)XE%IgkiH801y59?;v}Sn# z8hS;P9U6K`ly>9n@hdl6r*y`^_c&`Y2ENBxi!ty$&RUFt?{U^*41ABX7QNv+j&h)` z#U?R3;9X`;2fWM7>40~cIUVpWGp7R{WzHw<_GJ~O>F#?s<>67t-6ugeanYQ`rk=_i zhJq$l?b*)e<2&^k@ZgVM?@K(`K}FYnV|m>lEU){c<#pd$UiV%9>mEOWt6r<99^X9h z3&vC1(vBX&=B=ZdIuu%etGCa?=GwHl*uA55rOv81?`SvF#Uiwy?S~_w znSMADn&p4rDz3g^P=8_S=!QX`A=Vzeczk}_!E4YhL5aH~9f;a%8T++tLog71Log6= zTA9%j`ZheAqQ3lT{duxL{YZP!BuH{QG&F^3>A5Uob-ug*OR2TmtzNIHp1!}0i$h2@ zGe8d%Gy`ar=kO}n{kxA>51UnZczUc~>e%9;G_u7*DW!b~J<6jz+!yrAOZ6Iri_7=h z*Oh`S>J5Mrr#ArVu6hHY{)q&5Hg*hj0IM<30j$PA2e2B0tFdFC16YlL4q!C~IzW#x zNMkkc@3nCAs{UtNQC}{0U%HILvQnS5FRR&2zS%v{l2mBaW26=7>_@8iCZ+f~94P-2zv+mj_x-NLFb3LTc6``G~WLE8Ja zT|YnU02)oY4xrI=>;M`~)I*`wZq$986pOr_!qH6a0NT}9cX;h;tUI95SZm+2P%r7r zcb@}NZ}5s%YM)L?WG{-F&zc`Ted_Z0HoMDIvjjvl4!nM23J>ybo@YUB`W+tVy5V7g zCMxGYwUzVa@Tht{+XfyWZCk$G62D9qvHB35YO9Gh+S1mucG9kI>~h+=60~(KXiGc$ zc{+w@^5@{ou`QA>$F@km9NW_Ps&902=Demac3T=>?6x$%*lm$~InE7|FUPh>z8u>k z`RZY-^W&%vmMdBrv^POa!P@@$Ixov!ceu2dMnAs#CCam?h}G9@)%#i(?dBKgC-m!+ z>~42wZuc#*)Az^pe-p_UFf>~9%MnA zWKJ7KwE7-oL7Q5bENBx7lLc+sKed3StU;qh^5Db*$%7LMBo9t3Xgu_9^=x@yvY_$6 zWI^MB$pXoP6Q(sioW|h90?C6D3nUN7g1*IE$=besxBoq#(Fj&rFa2FJP7 zVZm`Oby#qmOC1(aE@?-*cQ+SGRg&sAG3+Z6SXpQ%Ja?Bp9xr{o^_GV7{pB|rzB<#P zzC5Jr+A2(MujjdX0qL3xo>)a_XSjB+B`%fw(JCq9boU?iYZvy;1Lw4}c8{Mazl}5X zvGQeD9ge5zM|Nf(sB(Y5J6yfnT-SDu-QYiC#=m05zh=f)A13b}e>7DOLYt!|`{-?{WTX{yV~l7C*JCpokj99ThJq+2VflXPnZb(15ksD7{S2^+Uo7!ga>1Cj3-(rjTz4#E2F<|v!(hx!zK;0yF+yZ z-Me=0r~N{vDuK=W?bHb_!|LMbdiCtwyl8fd)E737_lkgh?Iy|LE$H?7#9&uj(dBQG zMY6k}_;`azJ)zdFY=BwqckA zX@~)BzxMPF32NYn7|^zBc?@W~wLAv&75z!agnGy!Lqu}m!T`yE3j-tvE(~ZKoZeP& zk)|34JO(rlcnoM9@E9ODa6vN3feQm92QCbd93TVQ$&YG#d)x18)!NO`Ll=<7>eF_I z_GR``z1g8u-+wiVGA%i@KUUj62JW;!p2r8GkM4K8T3meALdcCRsUA28T^#45m>!IjR#o0AdLrDy#S2|SiQuK1V*K6^cY(Mo5t80*fhr0 zz$aron=$3FE8vqcb_IMg#;$-(V{A>{Nv(L|u{E%1jIDu9V~l|Hm1G*KFX!%0lJ~FU zRd)D(=9MozAeJ6`-9xQ(+@U~{(00EaSYhC$BNhf;I;=;dZMmunL8e}r zwZGm_bF~Yj;vvbFK|WWH1}5zj44?`fEfdztURZ35AANpWX9hgwfHG|aBuXpofY>75 z71m1Cu1$WJk@S@X7@YwS4!l5_JHQK+mfG;DdoJ0odb|4+(nxS(yWr?6@6k%VuW^^! zRj9T`41&;J{BfvU^IaFy+%4N3n%g7X{JcIwr<9h((e8kBP(5to`jtReS)Ro=Uv&Py zzIQ|YLH*c%^9S7)c5lY1e?R+4Z9yFwY&Oh5HcmMv)G`Uh^j`gF8(?y(MDYaWnW?MY z%YxrAqF7?$<%!I#sg^!ZLHTBi4Es!rAL(^LsG4b+5=2pMf@BE1J6qIkK$grC|^|PC$ zNS`NL{mfCZlnUN?%2QChs-k$9YWedMlV_gD>^#%rXC#UzD9=n$QBRd9mYA4%8o%bP z5%Bu3$=-MDxN~Pvo|)=VCMHM~Q&gV0GFOTTQpFP#FH>ZC^=$plk1AhL`R0m@yXh*X zNETCAzS-ib7w5nHwMjuKZsnvY4Xc<%-O( zer@16lI1Nd-)xbApRKk?uj?!%|6)X3zWHJ*8ocusNk+eh@DXBQ@5IX%#l>_>p|7Ys zb4BLph=ReZEF)Q5VR>eYihH_bF-679m1$8zom#EAYQi2^+L?9bCn(QMnTy2~sbY%C zGgro1F-59)g5qV0Os{@z;2BcoD=Obyk#V2vY(+ZVb2)64gTC3~sTaJhg_$g#sCc=e ze4cC(^c0k5rpN?6*Ai%?iYY43Tv1_9mMWg0n3)>CV5|}FD!3k%CwIJgXDVvp-m|7# z#N?T$9(BSZD9=Rk1m&42bD5YPQ7kd>@NDbnY@i(iYV zd~?N8D!i*|?7_gUE{T^ZiifF|KR+>f=7}sMXIlJ>MDYaWnJFsjsS?E!6EjcstjT&J zx*nB@EqWg%H*6*EnJIIbu!@SeoiOfCFh%8=D`TaYB2_#=@iIlGSHITp45{)Jm2a-d zxa+QBl4LQ3<(n;@dciwikyJGG!nFLgN^sbY%CGgnmD zlckC$C}yTcuY#MXhpiWRXDZ{$iu!|Q2gdaN(B1E!EbKk=WUdnvB#I{}&rBK1!~}_A ziHVmdGPnA*e&~gxO}dDTqb$;x4-}6 zql*_8H&j$K>3tnv*o^{dvw`F381k{8O!d$rCCZo_OJ$>po4{`n#);;2#%BlfKU zpSkw%$~E9M0Q{^SLp4U(G7hS3nr!w%2d?@>d)2(i@3Wv>ZPPoIK=b^q;nLUbrQwfZ z8i$6z|D^r<^>z`=izK=$4cGjS z^;MZHVurkaitB2WpW?b2;-|Q-#`k8uO{-*+a*S~owySaO!ge**UD(dX+f=L3JYrc- zkH*_E_R)Ad#y%SF5!fB2saG4-W4Jq@U5$1Jw5!4HfOa+3PivH`fqshXYLuVix*FoA zxUR;xt1h`3<1TDhQyt{a$@5 zVfMi$zmIplJh9ZaHF0$xmldmp_v%}atR}AFkUNM|CeTFTjtSQmI+$>6;*<$wLA$L{ zRz;%j^elp?NY-VpHtwr~t^q%G4fu&` zz|UL*e(oCZ3)g^Ox(56T0BXCGX|h~Z!93l@18&x8M*#l1&33mSc6*$~;r{FF)poPn z$x%lM)J@=B&vg0vK2C~7ZZ54Zuu+wDfsG2T3v5(-2V>6|$GZdD*?4zgI~(r~Y&725 zl3=Yie~bK09Bhhw6E3&u;SSzxzqY=(e0BKcP6*2wwGCr&(KwIAMPob`muq}cOEJvf z853`(xNdkm#dX8mDXtsdPH_=$+FeX_0-)L+CX&lbLQV8lXw2!W(1_Akq4A=xvKtN5 z{nEBji%VaH`dIoZ)U481p^lWk3bmc|Rj9Y5uR;wZeHH2w>8nsHNMD8eJ^j4ScCov6 z9H=9i)#{<%(de$Z$6dwmXSv!yP(LVLpgn)Y zc7gT5I(*x>7B2wa@7ry_O`ay@N=3Cu@*=5rZESra*1<7YS5}DQuiDYg=9Htm-rNB+ zD$5R_QSEjBjSBow=#Cx~^@48Y=ahRsqGNhB=nog6hR!EiBC&*Ho<#@?BDQk}U}<0l$l z+?Z>?<6jJ$I(?DD6pk-;jAdX_Qig$YC@I=GK&FGa|6Yext zI@G=1X1l}mPU?;|wJ&DOMPN$Q@I>Q_8)FTa5;ZKrFfl`>QNK3rjHvMxjW=${c&!Vx zxAhHAINsP{sRQ1~VTp!`8_L(o6*WJ>_+o~q1~93{NDWUkzPO>nJ-6A0^0nV)T7xib zp~l6`_*G|(fP-lgbt-p1O$Ti{qw&Q}j~Xx~a+t#L#ST>`nwmBxa(JR);)cwmo^9G0 zk>e{IZ|sl(pPhC{Z|iI$|H3{VZ~X8S1EyA*9Q>XQn@urbVuu?0>6JE5(fHzq%tiY` zz@!`_IZWaBVuy-%dgSm#!^KTqVOdY%Hpx1bh3KQS2Cl1pv12X-cJXi(HdD57#p8<~ zV=b5#Jxt*+u|p&{?e1aSrAjUlFrz%>7m!{2X7YL{?K{7|Dm z!2;(i9AE5^>3DwS%}5VdJihp$0-hi}OyO{`V_GYWKFZpp>r@t|4SVm*y3{HhrnZ2} zq~c7m17 z98V*T?)~fu(!&!DlX@s;r&roMMdOPbQd(!H93weQ;rL>Qig$YC@I=GK&G>a_jeu8f z^>9pP8EO%XFJ^ia0gGsuT4@)HP>X1MabvCl7Qy(Uh9wv#W=K)=Y}3w%8c)%9(=k4o^7V*kP#yOht_x`lb#TH`Xjtjfop-5R88Q*it)v;L;fclJ#u)W;o@fWIw;<~KDDlRWy--c0=ErUf;#8H*x87ldsK%ZS)K7SJzrNaN)-~aK^#fyuZ zt1Mi{qd>1XK(9GKZ#Y0-0MK8x>@SNr&Vnez8SU4*Y|N!EON8t zT;U`2xxz<6bcK&JX@x&y9{&z}r{mv&?{xe-@X`2xtmpqW4w5L|r#(>27wr|%Lzo5S zYMb80MKI6b8m|0L?Uk#rSOkTd&UQ-6)c>p5tt^90n3>G$(@mZxgaT|(*#%d^z ztMNho^-zCMOZ}>ye9B18SbL_xEcY+%pVxEM<05SEboEJ#lf~7lUc8xXYrXNK*+|WB z>0xHPeBS)KyqI04xQFiz^UMv*l^d9AH!#iEpw-F1u^A21jLm46W^545S8cBCmt2)f zoZZ$ynJnA#{^_#Fx0&j_)DO)om~p76T#Z9T#cLcYDrMtPQDGa0iptzL)DJ;59EbXn z1@$!x>c=dopRk~Q#)A4e3+fjvs9&<6eg#l}-qzQ3n5iQACJyFXwOw^6t+S7te+Qc) zE=#pC-EFb;-=B46099RQ22cTZW&qV&peZEq`s*V=z4fVJbwa?o2i<+X4|dniQ*|4Ly5(YR{+VC%SANZ3`!#<-n4j%# z9Qos3z&yphfO(300rM317bo01FFV6@@7z4ay+HI7_X6fA?oU(C`QTIB3z(<47cft8 zFJS(J`uJ#on5VcGFi&wWV4mV$V9GhE`5N~E z<|*z4%v0P8n5VcuO+EhkUgKWCJjK0$d5Zh~=6~JpeOR45(vGUByRK?MAC^^cs}53z z?U|{YFIyvOLq^?uQ|BuV8wKyxXP&|C@_6{G`?yrw&7G%o$D_YjKL^1Ee-*3Y1n9qM z2X&KVcf${jXRk6C*xmf!?sty9-kZMpV3VY2SOnqQq?|oCM||rX@ke{aKRS;ZAdZL{ zAfl+X6Cv}Yh*rG2ihZq}G#6HTn0>9C%qOhYPNol5YbTw8X61m zd7WgncETI0wG-Z0tx>$4W(g;6?yXV0xwl5~=H42`+o|51*GV!b$6BL!a~~VUn|o^% zZ>L!@b|g>wNsTx6)+pZGTcddEZ%x}0h*oOD<*-7v-}~>@hkI?kn=NN*4*7!p((5n7ubkrk_hpgzeThs4q@Yly{9M*ANG!e zJsa)Z*&}D}p1E{^jgFMLz(&UvU0|b=ii5G$8N$BLrn|s)Hr^e6I~(r~Y&71w8p6Bw zk*g2YSw3~fQav}Ljw7O`w%5gI#ClzfhNRcUqhdxUU3*zZr&xPk+~c8?s7Tgjt{%Z` z4u>8+?lk)_R4+?W#R{IrzXT6N%}j?)wZ~#cdGO4;2Up%bxc2VBjdu@Tc=zA}c<{`- z7UVoYT9ESqX+h2dqy;$-kQU@TKw7x+t_3*{kQU@TKw6OV0BJ$a1Ed8x50DnFy=y_v z1Ed8x50Dn*JV08I^8jf<&I6={8}C|>^8jf<&I6@jJ(t?}^NDFcvAT7vwfVA+^yB6d;Kw6OV z0BJ$a1Ed8x50Dn*JV07_?Oh9U9w05qd4RMa=K<1!oCin?avmTpeC%BdavmTp$a#RY zAm;(nf}96P3vwPHEqvl#3vwPHEy#I*v>@jJ(t?}^NDFcvAT506T?=v^AT7vwfV3dz z0n&n;2S^KY9w04z?p+IV9w05qd4RMa=K<1!oCin?avmTpeBoUSavmTp$a#RYAm;(n zf}96P3vwPHEqv)+3vwPHEy#I*v>@jJ(t?}^NDFcvAT505T?=v^AT7vwfV3dz0n&n; z2S^KY9w04T9JGKQ3YB|)f!hP51-UUmT9ESqX+h2dqy;$-kQUlgAA0BJ$a z1Ed8x50Dn*JV08I^8jg~JvHu23vwPHEy#I*v>@jJ(t?}^NDFcvAT6|~#(il)&I6Y=K<1!oCin?avmTp$a#RYAm;(nLVIf5mlota zKw6OV0BJ$a1Ed8x50Dn*JV07#PmTN1f}96P3vwPHEy#I*v>@jJ(t?}^NDJ+$abH@H z^8jf<&I6xGycpd4RMa=K<1!oCin?avmTp$a#RY(4HFi zr3E<;kQU@TKw6OV0BJ$a1Ed8x50DnxQ{%q0Am;(nf}96P3vwPHEy#I*v>@jJ(n5P` z+?N*QJV08I^8jf<&I6@jJ(t?}^NDFcvAT7vwfV9w_8uz6IIS-H)@jJ(t?}^NDFcvAT6|~#(il)&I6@jJ(t?}^NDFcvAT7vwfV9w_8uz6IIS-H)@jJ(t?}^NDFcvAT6|~#(il)&I6Y=K<1!oCin?avmTp$a#RYAm;(nLVIf5mlota zKw6OV0BJ$a1Ed8x50Dnj9(=M+vN$Tj+v+c6v`z1VH*u1^xGt-(ip$HNueWKH1nOf8 zar>!-V4hSZdNRir@7cxW^EYu(CVBR^zyIT-ix(F+S6R4@ZSk%g<6S$(yK#*7!ZF^5 zj`3bP#(V7;?_k?qy#LNI-hb~H?>{@n z`yU+R{g00E{wK$H|FdJf|HU!h|LPd;e{+oYzdOeJKOE!zpN{eVFUNTQw`08j$1&dA zG2X&4-mPQ2m1DfWI>t*K<7JNVHjeQM$9R=vyf=>V-a5wn(J|it>lp9<19)Gw`+ti# zTmP+xQG`)w5`F0>Qc2`nJsqTgDsO~yL(`+{myZyXxDQbD%$%Thl+MU$DyKq&~d0}H*_2- z+7tcfwz6;XG$~iA!m9cjmx-$Ii+npz<3N@B`Mylw{H(n|-NUJpNKFE(FulE==T()j z!35&W%w?6McIe+)&(uw>=uSm)2x*?GACy&|#cI||)PL^d0sd-(JrCFOJa;|qSfKWp zb}UePOgk2+J*FKC)E?801!|9J#{#v-v}1wVW7@Gm?J@0Gp!S${EKqw)I~J%trX35^ z9@CBmYL98h0=37qV}XjMozL1@eVgX@yLLVe--P?BeEDIT{Kqy~1dDi6txy*~2n1En zK_IAD4gx{7aS#Y9g@Zs)J?w8>zEc+jy)o(LH3BKAlW0L>ZGke4*h+#y}jK}9-yVy99f6UIIF^4Pp?kIErMklmZlYf zwt`uO#Ui+0?N&%f2*D=IOuJ#4^I@b?F%0HgwQf3WWX(Qq{vB+JxGa@#>HywF|EzTc zk5bqXJj!QB@F=+*!J|xf1m7d=duL9^tDjN5v+=$I-eu-=z`M+x4tSTD(*f@?b2{Kr z=KQ{$9P82*J%nmn)N5a#%JpfBk|tGfyDc(xRCr%>Z?szkk*beLruKynlk9tCzEypE z_p#qGz*qNisp@0rapEz!?`3(x<8T~8hkxCUaI{KF)xRu)EUvqmUYk~$gzuZX8eDVB z82BC)Vhntb3NZ%0M}-&z-=ji|fkzd>CUZIpP>;E#xAz_JE;FYC-eu-=z`M+x4tSTD z(*ch%=a+5Gs_*OOSyaTTG2Z0&3**h*-?bN~$#PW%%OZSG_l1XGXbvpm{jKRV+$3d> zd(*#Y9cb=|Z|A!k9(`_!f8Jgisr6>@5R~C2RZGkLj5vF)RvC5s4(6x+2xAgnMX}CHPMk;uH%wF48P=?;g@_p{F3j6U-IqnOa3(clJAFK^5@}~{9w35 z+X~6w#t*883X}4|aM9~FWg_)-c5%2n3$*a6{rmfsI_bHGzr0pwGw<X@!W zrNnd{st=~?&tMu0uCoP1m7&t=jS6`|z#Wd+L2iSF4L^f zsvjHUdyo390`1Vyg3t~PtqrvRy?NM)SV0+YC8`vK8)&{mm zy|sbuQEzQvd(>MS*dF!P2DV4NwSnzXZ*5?E)LR?a9`)7+7S-E-)mGbw$0{Em*l8DT zE}q?SX^B`6hfT~Y+Wyf|$cFtRZ93W{ z*Z&v*aY-5^x&;N3lV5>yYHIM^Kry~@;c$v0ng{=PnkO8r57 zvbOnyZVS5;vi0w0KdCKj^0K0~rY9SaPlnzrSL(np;Bb-@@kHd4qpL~@@Li&aB_KwI z$dsC7q4N}xSB}V-&#}~z4%cZ%{)Kf&URh$P4XDj^&@zw|G_`@Fd^2)HF)+zu=O-Ya z43SA`T^ATtWTc2EBA*;lAy1MbmVh`J8ohdbOv-m?`DzuBPmauW!73!qQfEp#rjUHH zWGoGnBZ(&>Mvlm=>etqt8%e%G^2!n!blo>hk0z#=yz<0TAQS*y%rWQpQn znkCOuL_Rqp^YSbUo{=P`kbJU4#XL=tcp~ED$h5F9-;J$zD&L{yY{TKOfP6A!E(|si zF*XfUO4TzgPeeXBGS-EuQN$7uBSU0L^=s?Sj3Q4FdF6jQ3a%~c+;baDI`Xg$i(W`;+-8$-eU5~ z6B+e+>WOr@PCoK4Mg--RDW)pHI6sjz^lSDWAqKWaj66{+OtkR%3dtu+WNMD65R7Uv z(!>>$PoAitCrT4jNSrL0))~~{(3+(t=7Ck5Q%im#^2w38I!ulvrjUHHWGoJoBZ(&> zMvlm=>eu3(8%e%G^2!n!^jXeIq{lrMwpOXQY2pcqktNFEX_h=s5&7hZ z%*(SZct(<#Lh{KH74tMn;)#fpqw%Z18Ue3o>mhk^3z~68qSoI%%eO^9J{js!7%U?4 zNfA#(J~=Yig^5wb5)dOpWJ>YX1x6KlipVQRWXw&+a9%nh9qzk~wFt>8ODwg)uad?d z#OrE;7&)RCm}If@6Od1a$jWh!rOrqZPeeXBqC%b|MJxevGE`5EtmlpEA(_(h^-*TS z7UVuTGS>yGkQf^V;~oQ3NIqFImWIiZ#1j!CM`Tv@YwOO9BwrzUWr+;B?i;2@6H`oH zdEzM$jPnvnLQ^123t6koV`PcqV45Y*Q$#*FBJ=Vr3!afArjUHHM8!N!l6WHGegg8z5KmoTRFRP) zo``&MM1^c!x_wf_5)fkO%XN~)Q4!u&f7xt{O&SN~YMb80MKI6bzPK){u!_rz%ja+6 zqD=DaZ-4*CM;9+HZmzO$9e>_l8->N2coA&2>&;z~?XSDh(A8fok}OPvMN-63rLf+s z+2O&yx{u3>2l~CbcJp9g#UXV2qjt0xMZVd@#eSGCU*CpNk}cbzy_o%^Dw5?gE)*&A zq(bRD1oIgK<`o0xH3Q}i1Lg|`%%{8~)sNxb1?E%UU0^=t-38`T-d$im6Cxdgj*33lTW>;(Y(N@G)%W>vlyiqB&Ae`OV~ z_oe*igH4jAVG)FHlXCXp66~!@upa@~>o&|N%ob_95A5=J^Y8LvcA4S{$$b5@k=I|1 zy#9LR^-cUp^nK&EzrKmz{`w|YV2MB91qzEUV%?FH|v8y-1i8<$la&ueO^qS;WC2zt8G*QJ2;L7l6;k(mT19Y)-9(qY6sCmlxma1s`G!KO&cby%nk zGbWvkHqwWa(MI}kGTMlHPCAH3t(q>zVUctganDJI5%-*Q7(tw9Yujj*lyRzN!)kkb z+srA4*#t}!ziemiG+C~yV4iN{Aj-3-h^s^24KDs^d+}}#uC{5i+0S0!5^cthR`I%7 zc*LQpQP3>y*6+c++Q!~nntd2nRjAOK&DPn6i=+&T_5Pn9Z1VfVPVDR_<+j|!YE4A$ z%sMhRlQpOIACIC#of=bgy5)Gd?QrvI|C1n1 z{$rag-n&;T$l~(Ft=hW|()dlBqA?qXidw00sHk@uhl-k|aj58C#W+-S(_$RzhoAu) zf_jyPZ$j6Jbpq-luTDT+q}2(ii>x{Ub&*sjpe}Oi1k^=J?Ye@6I^R-e`MvARLf9@6 z3}L&-GlcCT-4M2mtV7r?k`G~{9Q?gLVZMojH)@}#3|4WdZuBPADwwOiKWnY{(z8 zA%DV#{23ea=WNJdupxiRhWr&9@~_#Df6IpaJ2vFsvmyTr8}h%hA^#g2^1rho|A7tp zYk;gBL#(#*-7bHjj{VHjJi6QOrGqQATQY}x3`cj}4cGs+?amgvmP|8WAFI3#58E4; zuNt=w2h~wuHU<-QWMeQ9 zCdr!fZ<)F?zf8lj3^rkV@Yg&;s9q*hbDp{rQiPE@#2oJDLU5^eT=DVn-T3p-c9_Ij z!C$p~(|!0>jZFSFStLKI|A>yBK{Lm=o1b@EU3Z5qFmR35B$oR}C3Y95`Jub$_n5?B zAoPgDU?B8(gw{`#>pWMxg3eBij)EoG?%?9l2ePI#T z8>H$`YPQ(hnteXkf2%qJ9wL z(fzA>Jka!EpQqhHoASfGAKgLMessGiKOPo-Xb+{&!}UDR2d_-~BOp%nNmHFHR8JKg z=F4EdO%D%2HII@VpHl*5aS-H_<1;QGFOIx)68N!~2vXOXYRanMc3Wg&bU1rC;vECy zps803j6){hFfb09dclB(92LpB%(I|SJ&LJa(`NZFQtu%MT|EC{3EHoZse3NL3|dfY zD_C_%UJZ7k-t=i0Z0!MrN3wR$u^r4BuGVtsuiI>?UV*d7xAWbbaK^94$6*ussqJ1I zmSsz|0kKOpcka8gLIk4a+Ws{cd45>!^;_r*iRkG+F}g8wixTLEjaz!B6q&F$kDGYwD7fs=DxPj_IDPXerJ(8-&u^ocNSy)oy{0n zjP-XGIr^Q27QVB{(eEs@@T~=>-&*9(w-#gltp%swTI9~R7CHK@%~)G-`mIIod~1=T zf3ooHPZneFCmY`^#^6sDx$`HB9Q~6;?)=FjNB?A@xj$KG`+E!DzPA{I?=8mqdkap# zx5%CEEpqgG3oU$ap}FsEIJL-~Kigbm;oF}r#`@0|oc`Hjtp9Am>7OmM@MjCn{naO?*Sn_uG2wdtuxc07}G~6U*VBXmKtlb=Jju7>FDVlaGt3K4+>qV&A zJ=7<6>7Bh2)S(IV_>@Bv=xHj4CeXuGwkA5>*@vE8b7;af7adW!=Ay#{;^OB|Bv`-I zzW*_fo|mJ$1KOFa@W(LSouZDzH|<*_W-rxuV9G>&LO|{L*EfV;Y&VPgeZKf5`=dZz zc{-ahczOhiJk^To?vqE`r-#6LeS%>S2s(2x2m~EE&>l`uZ=fuS2S?ut=?{hqfR$%R z>Q-P#)K*~VwINnu=uIKo+#NlH+2gUXeGk_2D;hmP=uc_%1fjpD(G!IJs76l^`pX(U zL7Fi^rK2YZ{f&*DAoPbew9?T$m(}ZWEbVk&5pUGd^xgZ1qI|tpv)b`d*qM3=K3gQa z@3ifn&{va5|Bns1wSuaPTPvvSxV3`nky|UMP`R~&D%c1ssx3SDk{vj{;MNL5j&;Ps zkYgQI7;>z`3PX-{SV1|atzM!$RqJT=LXUj+7K-K@miy`Q=CkIfPm}8THoH@A|I0vb zjYOxmEXG0;--jFtP40+{#iqXWITE|y(ch{Uw-H(UJcVC}rS_>D);hmc!*w-H8+ds~9tB&_?%Y6a> z^=l*fxCH9;)Vg-k|8OAxaG1|vQd>dP-%W6LfPV}!F}9j!A2$nkCHU|KBty8`2tO{s z-F(gWB*gjJKMJ`+nwWu-_fn&c?d~+u3+`V59NY?jN+T88c`? zdrUxIm5z}u`|?tT-j)B>(~&6ai&e)swwwJq2z=%{xb3^e*|=E3Nd52M#Uj9w5% z>(}#0bIN9v;*`xO#VMOniqne|ouX|gR-HOBN^!~-Da9$9QHs;kL~=B|RPALmN^#0& zl;V`l=n1FVlSikCgl?*i)v1Kh6HXkpwtpGfHvFW|ZQT%_zm`sZP0S zFPXiLj8dGkMM`nXW|ZReG?5$)@5y|samr?t;*`xO#c6+|uiK5n<5zO1H#F3*=m^5M zNom+v?*}qN$0d4Rjt)v_w@jN?R?pQdfZDH`%|34atv>S`m!;ay8g|pu4LaHiaf6OF zL)@UF?GQKU=!TOUbabQ10$ptsJ-y$AdJ8w`4s)i%cZWICf$lJ8I?x^FOb0s3nO9n= zjPvYazw>vp+(&8A8vxCP+NP}Y!yPWLQO3H!M)~Rj8)d5tY?P}muu-NC#_mu7N@5q- z&hn(gZ)bVZf$c0$IuQQP4~MR=>;BYWuaZt5SX zyRsKIALQzLpIN02+2+~%3w7Kq*qz>*{X~7!V7aVc3B6lkf>S8NO}wa0WNIpvvUX0;o)5 zEX??OrehO4JyVyBE=7##{f=$G%H+-js7&q*pvvUd0xu7sGPw%@R3?W8x+{}A1E?}N zv;ZoTI}0p5)3Ks)WpYAiBLZms|xCrT4f zOn!N~QXh;<-z}P0LSki!Ost6(Jx?)t=825@Jj)*Ga-DqSUswm_nJJbkfp*QD%()~D zO_ks%=BzwXEKIcU`3cD{OJr(VR|r-$8EN8)$uCb-&=aMJB_v*!Mz3%mQ}dl#;#$Sz zmnUaOiQ3pj&s_18 z3f6gwB%^#%rXC#U#D8EcmQBRd9o|t%fGA%pIcXjK% z&39_a+weFnB)=?~ON32Ktc?VfSoNIC6O&(_j1^*fG_i!l$`YAa{o1{=qsdcDo_Qjp zZuZU3ZFVAEo@(7Q2gOn)Sm!5CF|jI&Vqv0%&re8xSt3*OJj<43b#hU%fTjf->rkooiX|4sYivF9#Kp|`DMynB&J6cPfV;lk-62g-8(y?d>zQWy)M8?4sf=ey056ipnonR4J*e-xR50 z3W}8}GQIk>erHIPx2QaGMaF%ux+0yfQ;__N5n*{|i>Y3)&Q~NA{hGi>h=C0gD_0Z~ zlP!Y2g7V80nV=(T1*@uzRB=V+mn$ml$x_7>6faYzRS0ziwPvb`dSFfG)s&x@{PJY3 z6B8tgDJZ{88Oy{3iQ2uG;uT=ti=8C6Our?HC zs(6B8Wr}ins^!m9On!MHv-3=gpOGl0p!_mLMLkubcw*w^Y5e-IM!;*{dQhI+%x0aT zs8xE;Vr~(VUzU252#c8f(!>*!U!KerVsbRGgv81cnOJ-kf>lkPV)D!r8FkY|oSU9V zm-{YtErRmQ6ib!xt*EgF{kmEsR-PypCR+IXgyfecvWA>z*)!6_6O&(_sGuiG6H7?E zEY*`G>)GadP^PuSeU#gpVpg(Uc0)V%IAFSec@Dm}>d+6q8?`$m~4R;%6j^ zDJZ{8QBhBoD4v*jc^bXuZGs-QJY=1rj4LVX51P#u)2lsqzkjld_sf#GL`;t+o|ydd zWULU=qlqOXR+h-b>eud_9ZjBM^2`$%wRI_Hot;RR>*OQtjjzLZsRP92VAyF$~aZ#s_pHq;j*ti@Fqy ztTQv!eJ)_;{c2Uj67k&J=G($iK+hk^VkL(#;*J_@#3?b@j7wTRSch*L*~AN0Y7BwM-ClzWHhM_)VLA_!@y=FnZVL^Stg8DQEP;WIZ2i%}O%>g&4PjkQx>eC!> zgZeZF5USQd&Wrp$3#zzKeUNHvO%>!fZ3T()xoVlqYS$OJYo8q$AUfw?weBzCc%#~V z)kZFoaGht1ATLY}tk&c$)#71M2fwemH!ngpe$i?jXVr~rC$ojBrkC%x6!<;>E?ym#v{l?QtZT+O|0q;rHr|G6_pp_iApGF!Wx%)h=P_Dh?fmG!tXV zV96az215>6GFYNm`bDdar(2+=JwL5=QleeNS+FVMvfLJGA8yx1?d5p+N-YED+iG+g_GJB>~zC4BEhZQo|<^ai=Xod8&&M@*XtYh)R z3ybhMCVO(w8{wNC)@wSS?#^hpVN(D8N#DZ33N_}_Dq(&i@xlq2f7YVsP>PWho>087 zLd7~QQdlBk;iR6Yd0#EFGx4Mlvna(+C|+1Gi~jL1hRu&&Xkm)Q3ol09PlpzsP&im2 z6R2Mcb~d#5ip38vWVH2+KOth6g7L!)kNP?07joG9EhVjzjDr_y)F)QRJcZ(g6*2|S ztBe_GVT#2IFI2D-qlG6F7FI?t!^3oAy^ zPlgnhNH{nlv!`DRb}poN3dIjAWU$t?*w1=}Cl)`vun6A|Ei9pMutGUHtrF%Z5-*(a zh@L|!MpAe}@xlrf>siezl%xGN!5V~Nt1cE!#;+f11RP0|pOd&FX*%T68HyKHdWe29 zv@pfug%_$YG!<+zwD5$&!3vo`JzKDIp~Y7$et03HJukhGuGUFL{)K%oewg7=KSzU1 z4tvjL%trkjyilV)u|no46fdlhDQK^J4z(C*VT#2IFI2D-qlG6F7FOzF%6i7N$@lS{trdT+5A#0`+Uh ztTK#4Exuy$!wVU0v#)$EdLdn%S{*Y7(+Hw_?|Ev(@WjHQ7|PR$6*5nucwvQ<(|M`I zNDEUeUU;E`ofs`Vp|G$rennX$;AL1n7SmWzT14W7lOC$K2!*3TcCnna2*nF4X3<+j z;)N8JNH{nlh0wDFI}=hoh2n=5GT3IWpA0QLvH0PIMfe;gj2!ev_{I$}iwxsng&Ol| zl`ub%c;ST1zq2Y}MpAe}@xlrf>$FH=iG+odx{7x1Joc+zkNNj5EFi5y@xqE(^j5KO zO!W?ykXEsH;l-$Xt5Ceq!V?MyE2J1ER>XY8;)fS9+Iq%68@-UO)=5VGg?%u7nBh@B zM@R3olf#6QhME6c$!SuPB>X z--QLGO(b48F{|Dt6qW*JN-v&Jys%;v{bWdCiG+g_GJE>9VCO=Lr%?Q`LIzvU_0yq+ zCl)`vun3=HULgm)-!jrB!#G%>#(Y{O%ugg;E!rSUE^Q4GY!EKyH@r&!S3ahxhxP1O5F3Kd&{`U8Oe01^R;^ry~*YOwaMQO5* zgDA`v>F)pT4p+`D)1*Sxzwh

HpN)zYpKWiy(iSERrA9e?<9a6Bog!6NfAet8jtttoC4!B4*F{MwPP0K_v$%?1^Oxu zq0_%;2eQerMZTS@d@0j#ei&_S%v8!%Nu)-56{fe>^Sr9^HE?4*=-LNPVK5J`i7==+1_Ub)8X|GbVd|3vYuv+bFE6BNDx7S4ZTunWT zU=ha~HUFr}ejldooZr2by_?&NhhwNeXc|z{G1%Sjdp^E1-H1?6ClXPQ_0H5t;t9zs zOXda8)JS59h?65St9tHCof%1{{54Fh?6CXgK3sLKM{H5h|Ejt;=rjSBS}0Vd1Z-;d731#M8wKb z-JbD2PP8-eq=2(3$xldLSuz)g$G;dh&w8baDJHKx8SBIJXyOTplO-~-`n7mxN0YCZ z{PILbU3U-@B#J30zfAE|3C{V6q@mx^)++fpd7@aDXyNk|l2?|<)I86!XQYWKCa*kE zK~Iz>o{(5s8oeBBVxG{-$$Ssm@Y-ncJy#P)=ISsxl6XS$t0d!IzeV10_IQ*~`n7mA zX~)SCnN|H-Je!a>N%9nuUzW(Ao4xTf(-P@%oq6P6SjXg-r$#K@`{&jnc~%og73XA$ z;$WI3&rd{NIpQe}oJum1#1oQNmZ+G|vfNP)PqV`__pHQXs^O^q1H7JX@^(^pY@0zD z7!s?J2om}>LzAPaN5Qj+$tzD(0hy|rj1Atou|y_T&lb-nCeHT3S4^C0GRH*z#d+$9 zbeXf3`(;#SDvV#CrT4fNUSW?ty=e< zYQLKIn3@CEgPh&o_*J`IOkR01R|vbHyb{F~lvk#VMPhoybr_59_1;xn}X^pRbs_@Jdsg1`{stz$_;|xnIqEWo=aV;?DNYMPnF=DpUgz@#Kg%Hun38>eV{n# z+vZt>NrK2Dw}7A9KwJcZM%KyctY~ZlCd~UjwF_dI5{G-s$YwD zZX|gM$uCP}(AG7ab5XG1@*>QZaS-KMRK!&rZ1Vd>T)en0tFVg8i_7P4;-XCQ>~DYn z$43`0E^e-}a2;E!rSUE`|HDOkt&$*F5X`|yG)Y`jcI=b6vG#-5BG6ct>PkH zs4zAgqxagU+ShqmJ_Kc@zNs6`izK=W?!z?QM{v`<){eu+@2KC5xnJEZj=L?OFSVo5 zoNh#jU6F`-6h_mj(cSN#Y*2V5i6Yl2Ho^c zlcR|zCciwf6bR0Fi6o&Z5T={dHvJGMOB4swEO~w+^2!mJmuFekT_W)6RTf~ zcXl-SipeieWYl#BF+rl3g7V80PnF=DpGX?|Ep4rmkCP{gg^3nEPa%0_iA>G&EPF

lorrHLmbPL@cq^lb6YjV50)`Q?d>+P;)? z>WOrDs&&sC6i=1#OB7E`oQk46o@n9o6p~k#NV%P7*)!6_6q8q;sGuiG6HiF2ESc6B z)V;NurN`8Kr zc?-%fQ)Jj@I!lp0PqzA*qhcx*oaN73P@Jlwc$jMW^A(dwILsKOtSNSLwCR+GBg~X{QV@PCb zo@d$f6_Zz8 zOXlKW5s_DtSR&%&h!jfC7VpeR@)VL^mdK#3YdEKtNRR8xBmcrWCciwf6bQdGv4q6Q z66NqTOP-&IymG`-95|I^B#9>^uPjk9TUT(eB(X%q%2C~(b>BkjSM47265q0|$7E6q zTC0$}vScm}Rxz<^$&`6aF?r?5SRbZG6HiE-ERl&d(W2)oCciw9QP&;B+3AUNx#z;x zDk#59@l*-U`N>QaPfVOVQ65jU@OcW!D@$Z*o@d!J(!>;#SDvV#CrT4fNUSWG))~~j zwPqK>^rpbw?mIcp95>H58 zS)yW|CP^$2A&$OUCs`a7;cfMoZI&igP{fO}QeO)Rs=SC+FRsfftm5+Kv-+RGZ5Sol zGFT)<992o4J>O<`S$>~gTt0sj7p3~i-~RrOk1k$Z++1bhIv$CBbsv`%6LcJMLBCg5 zcpkUkt5cc>`?AV60Qu)_mZZsA ze@FPo<3D50fA{#uLYt!|`{-?{WTX{yV~lRXf>qlDo!oKjT|=lVhN% zR&o?B(MOKKC7Z}mz*Gl02AF6cf7(`oG+(HmUac?oxd77WXYD2Pa6QlSV4as?5*aT0 zeS6s|EEd5$-Nu1h!l*^gVpn|1GT4Mh`5K*0teFljW)k>H-yo z#U`!{mwwus+-!?Y8VC1zo*FLtq`j!OkFVQn(r~eei@lBh6?gyys<;CnP=y@;fhy_% z2vk7_K%k1L%|20)tV@+_n<6gDZ4n2XR9`5)IxNo1WSNC&k128>BI3*5M?{}JB4X1X z5s_<;=$`8jL7}ww@uhRb*Uk|?c8>UobHvY_BYy52@eAjOUphzp3LyTfow3TQNH!Za zm9N8WS>$ixAkCNi3GC*BO_HWz5rl7(a`xa9?X6R^9|4*+nW)a;O>CO~wSGf28C9+> z+N>UeDx9aL{z}`K&EF=AWVb4day7O^u*mbaDbV-kUhaMqtkec@{B(P6_G(*STX#v+ zhTU+x&t`t?UU{;6?aA&1VRz<P6u+Ey zDSl7$%H23q^_kNy#V@B_ieFB1s0fQInBDx|)m(($xe7`O5UkDlTuLBEE_4ieh!>l*^B|X_m!h6u(WY z`8!aQ)1tif66FUF<=2MMA}yDjy>0SUny;fOUFQd0XJ4+%VwbPlzl>ICnJnwZgvbe_ zfJAz{IFo2y}XW>`_;y}rkolFEhDGKK`Y0panNFMY8TCciU~#B#W$A-n4&XZx1@%Gud?Kvgs~l z)6Ix<^SP*Y4CyHC7}8PNF{Gokn?2DEon!{v{50Qd<6AswaN(^eT>OiDY3 zbd+`s=_u_O(ml~`F1z0GrhB3tZ@MSi@us7+d)g}Kv4;E1?6G4=M`_29j?#`H9i<(^ zh<-9Nd)hIiqqJj4M`_29j?(UFtN35gI^H|G=Zj zmt|5X(YCl-B@f3vaAvkK>c=%IykK=ky&IUstB;T#Y>&u|Wi9&G%{sC*Z{ZJuisZ_`!! zL-T)@o3u)@{r@TU4=oOQgXaID7bmHsYFjkVKP>O*kxBNSqBK3$JTfWM=Gn+yoMnf1 zUw*Uy)835D=b-x!SfcvfHi?qBs?YQ0Etjv4{(D}O^@e&uRqPHgIG*7yxz8~FMVnz; zRLx+(A9aSx2dyvyd_Jl+jZ8qn5C!5Pq^Qt&-I(tK5{QKlpFU(ig*f7r2x%%rQl8+D zBk{I9N4~)MAbjUF{i^vQ6I7+oks$ngRBDa5K>f# zVjQACEPNRC8GTm0@5m45ur@C$A|66~3Xv@}Y%4c0 ziL@ALYD98wcMHLZ#6(F`C7#*9w;qua3_G?uwH=>ElmbBxJ0(Jj3Xx4Y#ZhOKh>4M+ zMik{BCE_8(sF3X>VgIDHeIWVa99}yGPvfJgk9{V%5aQb^Q2o>{tUQDi6|#13~Ps6ry(-KIDkfuT;4M+M)s)?m_$5; z_!J^rYT#CGS`uk7($t9L-0c=Z6N!nErb;}sVcN%5m$u{6h*BWPVW&h$Q6Z+ez~>^X zL`;knHKHg_aW$gwc4J}e4?=VrKRWC&D%6hMF+bCK-;^KF@zsryqDJ<);6{mY)Y;mO zi;|*B)a+Q`pbCOjgE=r0jQJljRiHQ-TMz(_mb2{^Q}bGVSC`*cHpC^&w!cWKuA#_9zu!=*+)WH0F`n1ha4Ic9CB8HcnB#fL@^Fg zAQnE1`m`$|>&@Y|A^{y%?=5!P>041D`$%wN#J5ebK2Km`q^OZ~DugBx4X z4ROrr@KMxz(0@pb+Ex{UL*POdJhI%Isj&;!@t!MMgVw>dc{{_f~27bmB_?#>71y^8LW7ICA zYdkhEtnt{uu*PEpzhC1yS08%}{CP(Ufdl9GMKgBm^ZEB@+KmonAasGMt=V)6dRn;sI`yqbz@;Y9o z`8qOFo;$%a?gZ!D2`;!3TyiJ4@|s}I-9<+d`0b)23H)}^kpzCb=tu&;U34S?>Z0#@ zvnWZnRo3h$qh+z(HlwU4AGVgD2Y+MUz1*Z#k~O2MYUWrHEy{FxQyu0Rc>Ax-+w-K} zG%4G+wcFzI;mz|;ciSpmCDE$5>-Ml`FYl7HTov|7=r03mVt*M>7yHYA+SoBe(`L*% z9LeBWha(w0>u@9k(&1aFuL)@c}q^@8^b2*^HmN zqR1@o=oR44yL{c$$LsFPQ+U+qp2DLp_Y@wrxTo-Fz4R0wt(Gp~8~+d8w|ffjvvZE1 z_t`l|!u#x;BjJ5^&XMo~I;Yx}yXMK={@I_OO-`?EoMR8@8Ryso8pb*HfNmKUyU}v! zX6EF2ABpX)-bZ44tM`%EsNR1xtMDc+nnnqM~3$wgmGke|EXgy1A5eUa+RPC-ZDTPyk&qoc+2p< z4!wu8=tI1bI&froUk8p1@9V&k0qWpQ>G%E6N3`#vWt^{? zWnvlMJUrW)pJmO{b#S^I`hJwZce33USz2wHBWk_7zV>k>9~YZAj=%R+4PXWU zJkxf87y#q~F#yN~VgQf}!~h@{hyg$@IM;T87y#q~F#yN~VgQf}!~h@{hyg$@xX^Zi z7y#q~F#yN~VgQf}!~h@{hyg$@xYTxm7y#q~F#yN~VgQf}!~h@{hyg$@xYBlk7y#q~ zF#yN~VgQf}!~h@{hyg$@_(an%K`5Fatm?5UT)kffxYf0xyOmrZ1^~H03;=S07y#q~F#yN~ zVgQf}%++os7l;8sE)WBNTp$Jjxj+m6a)B5C zp!x2%Ctq6$esjCI+U@iE3yuIlH>kTp$Jjxj+m6a)B5CyOmrZ1^~H03;=S07y#q~F#yN~VgQf}%++os7l;8sE)WBN zTp$Jjxj+m6a)B5CyOmrZ z1^~H03;=S07y#q~F#yN~VgQf}%++os7l;8sE)WBNTp$Jjxj+m6a)B5CkTp$Jj zxj+m6a)B5CCAH;EFAdm5 z5-*E~t^>$ko7a~OqdciMNf|B5ba`XR^o4n6`|`HY5AV7BrfvHsf8(LLaYFOYSqwf6->x7F8WB(i;6JTUad6g2~3>qiWMg z0@Mme3?3TdYMj^2S`xe%EG&F$L3T_yV@ipJyc#6Y$qXtIW!qKcE1Y@A>%n4j--|d| z?9SvI6W6yIRIS4qRXQxhwIF-W+2FpNVHJaihPWCO&v3+GVc}hi(dWMVo(uip=R`wX z4ZFdecz7RFwyt90A+Cqj<6+3bL&LWkWYY}WQcXe*EgtfEkWAZ^JP<*ch{!9#<8@~sC|?SKZB5)E-R$hMo#xU$N@#6w&UifBM`@X+wChHcMo{{*moEEoDg zuv6SW^C%5*H3k?w2sxN|i0fhZco1^%(D1DW*)#*UR8x>ci-)`(B-3ss4?_?p zBJzsxIDLvoK$phytp`=@fCiQl4RJM?T<+T)Rymk>i0eTSozCh(q3ldP_QHCn=c6N( zcQx99Ip${o@7pf;qo5lPaXsuVcO&9`T-h3ni-@=))Ff!e@$jt&**C+sSJMzg zjflJ=B-IIdgv8nQ7Ws-1Oyo6Tvb*nfge>^5jn;jL6L%=S6`|@K(%91CA+876c_Xau z+aXp#xQK`=LNN_V5GEep^{{Q>sk?ry9v#sW2d{U3=+F>X!*261u^Su4hwND$PqA^L1h(#hlaQs6wh$PU}521i+0^&y&c-tVe$vRd+VHbeic{4 zZg3|azL#+8Ih=`yxE@xIham?K4c}^zO*3puH3>Pic*yHPGHqA#Km=hTBCiOK(|xZW zWVt)1+m3)vjpbVps@ee!EF~J^YLIO=opEKAgNcW@9u(1le)Z@Owd9^6h`V$QM$UIC|~ybWtTMVQf`y_(A=OsdTY}zz6`alYQ~x69^P+`|)Vu#NuKFy23Ddw6gc-8FY~4mkk zKm$Lav;ExX{@)+n7DC6=FxjAC#?EHIM_nO_!$U_+9s6frA&JAnhD#f=lfoNoN_6zp zAqjV%eox3dB-){OryTg`>BBM%xHbiLd06OhsY8JcZ?x&KQPYO(#mNmet2jJ#)YPH) zh9?dS8#Zm)^^fuJZq=c{4tvPfML6x`#-@$!tYbg9wGl9z zu2&y@q{!wR9Xe|23>XAK$-~4)O&@AlbdxP8d3fk>sY5o?z%AR99tLsdV(0jESqO&ziw-KPPUd#v&>@ln%Y#fomNi1sHZnb?Z4Ug{b<6IOeqYsOdv?u498as&@K)I44ynK3p3Fs+rpL)IQ#v_~^N3?2X=u zxrc=gmpWuK4copsbsLv^wD{=hLo)83V^3-IA>oEN-|U1sgB*X>9il)ye7GD$p$%}r zDbZ0=hqTx9++&r8iI18-6yX5n;i1E(&iIpQ8v!5X+Ioa@Fm+&~rpOegF@k98I}(NU9!hYpuIq&Wf{Zd!cw^dT9yJA+C2hlJZU9Qg`& zLV61EOa!h0N0z^v2(}}sQ^RrTLsdV(0jESqO&ziw-KPPUd#v&>@ln%W@|MbI%?`z2SHHcu(09MhU}zaTec~QqeMqf9g=Xn zCkRU(9zJ^dunYsPb%!keu;Zvpw{fXM)jqt@ro%=}8?qNCH`uJ=@X%3HhvFNaI4o?C zHov<~^JH1Z*Y)??GOcdoviWngDAVOl6;*Ydmetio^WQqD=AZ7iRk})|RdJU`i?p7d zy}V1(a#cjDv`m(DTI6Ug@SNt^?CklQq^z2ZKmPRdXS1u><#`_8CZ5xr%cQwrNHdqw z=13Y2ZH}bj(B?=Qq|NV*Z|>r^$to(|rmOUa=Km~rb+jzD+oU`g2gv)G39*c`Wm+ee zH@q@$SfxeTydkQxcyV~wph}=j%q6W^m>W z>2(%YRkV$Bo3y=(t&(^ZEq04VmNb1-HX2^X`JrNGzkK*B`_LT~6xsL-!}!m;eBFRN zShs zU&PI-{U({suaj?Ox z$=d0i#mh#rQzyxnCQJ){8JF9nw!r_^yeUhwcTsU2)te-G6K7fS&hp;h_TPJ(>}TG7 z8LX4CjF-*A6Cd7x_VPMjruo`FxJHCTZW<91?KDP&M7xR+AuquY7!mRcg#6qnUYGH9 zRTK|fowL6%M}hfeu}!*z!qcO}sL;>&LZ9=6zTgWzqe7!GH%vyd*5g8xwH_Cmto69i zy;{%t`r3EsUaftH?$z3NXtLJhWbF0zQ`F-^leHcfnyfVn{hgWD-Ql8aPA4PJ7Gq+f zHM+NTN%QL>+HF_ObEm`h!MUZ1Z`6{`NcUkk?>gdCx z-aNELx>^;x{rL5%Dde=B>e|T@-Z+UC)q_IkpZSyq8^!w$YhaSdbvr;Xjv8yx?) z@s03lz>x@F_(u3NAVS!CsM$U28}Q%>uZx?sO0xYrJmj;8-Xc)%uCINp*iIpd)w%aH z`)>bCYZYzFq^fph5^ekI=GmtYi+7c-^EgARg>yi(6><)Uo-jEFM9-I;1EQx(&H>T0 zCFg*jfIWe8z!$y)zVsdNbKe2K@E!1#?|@(X4*1%4z;AsA{0;={oxmSHWQ~{26ZUxj zfyL@@@)&lEa0-S_6i&g=;i7jaTcvUH`Bd}a=>8mV;0LPnSLRUGe)8PA+;V?*_wdoV zrzFIp*V_{8KRe%l8sz6f&gj5s5gZ*DErz25qebzwz(?+gpbf_8zB2c`_UNdeVTvdgZv>^M0(wn?1x}`MbA>T zUz@TYp3GF6<|e@YVM_7V^5$N`ZSzrdv*Avcwx_XA-*dZrSc<@?e(w{?^`>s-`>uJ$ z8Rx704Vd`mA?N%o!_R(Bi-L||y+_ddXL-Y(WA&D(`;*Cab2Dc5@EjWO?s;NcWNEc& zD*W&i(8mePLjq!H>Xm8{-!6*g7AX24_{IKTqD}MJe{;38k?_%{m4lw`4NmuLE}HIK zHr<76x*3tK{n$)SJBD23$D8hncD(5*?Vh#@I{3NoReJ0g(oxzmq@%QB zNJnYMFruH#%${}(=_u_O(oxzmq@%QZ+A99nyPkFo=_u_O(oxzCPuIKE(fnjxy?Iyd zPv-U~uYWMl9G?Ct%UyG${Jo!N`Lz3a7ISMD9G1sLMGw-(MMY21#zjSs(0Y$n)teZ9lBX+V;bG ztZhH6$J&0*Q`>%6kG1WG^;p|}SdX>+f~U6qupVpM59_hE{jeTu`--Qw{jeTu+Yjrp zw*9akYx^}%ZTn$8*0vwkV{Q9kJ=XR$Pi^~QJ=V4#)?;n^VLjINTb|nX!+NZ3Kdi^v z_QQIt?RPx2?T7VP+kRM&we5%XSli$7)V3eiV{Q9kJ=V4#)?;md$5Y#WSdX>shxJ(7 zeprvS{R2;J`(ZuSwjb7GZTn$8*7mP?YTFO%v9|rN9&6hV>#??f;;C&vtjF5+!+NZ3 zKdi^v{$rln_QQItZ9lBX+V;bGtnEMHsck>3$J+M8daP|ftjF5^Q=Z!P!+NZ3Kdi^v z_QQIt?cea!wjb7GZTn$8*0vwkV{QMIr?&mD9&6hV>#?@|upVpscRaQ2hxJ(7eprvS z?T7VP+rQ_jZ9lBX+V;bGtZhH6$J+h_Pi^~QJ=V4#)?;n^VLjINd!E|%!+NZ3Kdi^v z_QQIt?LX(KZ9lBX+V;bGtZhH6$J+i2p4#@qdaP|ftjF5+!+NakzvQWHKdi^v_QQIt zZ9lBX+Wsq^+V;bGtZhH6$J+M8daUig=BaHztjF5+!+NZ3Kdi^v{u`d!_QQItZ9lBX z+V;bGtnI($sck>3$J+M8daP|ftjF5^JD%G1!+NZ3Kdi^v_QQIt?Z4-#Z9lBX+V;bG ztZhH6$J+h}p4#@qdaP|ftjF5+!+Nakf8?ocKdi^v_QQItZ9lBX+Wse=+V;bGtZhH6 z$J+M8daUh#=BaHztjF5+!+NZ3Kdi^v{uiFw_QQItZ9lBX+V;bGtnGj0sck>3$J+M8 zdaP|ftjF5^H=f$|!+NZ3Kdi^v_QQIt?SJQ~Z9lBX+V;bGtZhH6$J+i6p4#@qdaP|f ztjF5+!+Nak|KzD{Kdi^v_QQItZ9lBX+Aer%+Yjrpw*9akYugX&v9>Fo+V;bGtZhH6 z$J+M8daUg=Pi^~QJ=V4#)?;n^VLjG%!&BRSSdX>shxJ(7eprvS{WDK(`(ZuSwjb7G zZTn$8);8m*Z9lBX+V;bGtZhH6$J*vRwe5%XSlfPBkG1WG^;p|2Pi^~QJ=V4#)?;n^ zVLjHi#?@|upVpM59_hE|C^__{jeTu+Yjrpw*9ak zYx{qAYTFO%v9|rN9&6hVi)#CO^V^V*eaVlv?{o8=2UXv99wdkFJS_Sg`2sZbl>npo z9Ld9?&yhSV`W(rF^m%Rklcl#wH2mw!dKJG*;=1{E`Tdt6AASe*pl?O){etD{cK@5p z%`ZYX-)eT*`yJWcH`HIp%jA4j+~xLPUVUoVXS=QcpdaN$S#KEPR>h7Z?)hC()&Ak0 zCov4$|7G~gI(-v2zo|Sb<1{<`3iJ6d_J4|2aUHk6PyOsg_vf@sn%5UOnhT=?qd_n_ zFmnFrz{u*O1EVjg9vv8cS@o%b=UiR!B(SfpcoNuGS3C*qt1F%a_SF?n0;8_zeH~<4 z7I{>c@fLnH;$^W-^6pC!KizGsbd@w;qj=Z-4H$7J#DDhao2PuoKWC1A!5shbH&MP< zAM}+LzUuEGK3RVc@yYsoh~KM!`^7Zx)gLXHZuMu0->W}M{9gT8;*<6Fpl@&fJjL%J zK3RVc@yYt5_@A32OY?0z%}z0S_$J`9i*;GtHG5((+6TN9t?UEdiq`G{Z$+!~fVZOc zcfecG3OnGfpSV}}1$gUsM%U&`tyk}&+cD~i?O0ny3J!th`NmWAQL(6aDLv-;&loecRV z$QR}<_3rxN+x|cuUzt}wEUa0vKCONy1wnN?DF~`p?@J(yx9KYVVgK}bS4Z80=jN*p z7Gm#-(DFPk(UDIv&<4nRA|8#7FyhhZ zNFt?UzWsg%wcT)Vw;pzTGdJ3e6wv@&xU*<>d3I@ z%y@d(IS<yj8JVH2-P-X7Mn%d(Ug$BxRj0<1E_5+4aSu zsO#bu=;tTLSzVwH%zBMg#rfeJGak5mTmtNGO*h{bRrPNFRk_WvYf+}l8z0pkAD;l< zt4JB&MT5V+_@yD;eE6E~ZVxR5TIN^g^>>@JY02Rq7WbC?`vrPk_D;GW;d`I_#*Grq zhVS7MLGYfQ8;Y`dfRIGXru(voad!5+`*Ss$pJmNZ8XM-BpD^cs!d&SL=Ci70_qU+$dI?-%v>)HAqv$R@sKaP49jK!?r85{C^n}h} zL~%-IFv2*YGZ;}E?~M6;3Nu3-#qrJ%hjFws#8I5m8H^2jbY>hc1|y17I)f3$37vsZ z^mfAcPces_wtJT?_Yb+ufy&>3&`S#9l+wFtdKZ`br?_|fE1&yMwhr5?vzN`)&NN?} zEfw0HI|V}zb)15s2RBZ^(8C$0VCa)Ar(ozatzH{f+j6%|q9JYEgRqLroA$HMD&A&| z=7%1bKaZO;+x~G8*dd=11DWtkbCSJHvgQuikjL%6F>hLA`_t&M$d_f(oP(R4`YL%i zBmmsKw{zHcba=wLz0dLP;WaTHlvZJI&R zJmt%qCxwUM4n|}Dp~vAfh!L9u$8e}K9mAm(bPR`j%`qI>Bshjc+l1by+RekUEV^!f zUgOXVXJ^eykA{x*jYuu)8<8&7HzEbBZ$!1WzR|g==-QAqBf1=9eIvR8WPKyL=wp2& zy3S*LBf7L>eIvS>V|^pKfMb0lx@Kd2Bf3n}`>5!)abMp2G?mlGBg5m+pN|ZWLw`Ur zJP!Q{$?!PzMMkkIiy{8-1ZF8M?6aBAU zT-HB${6yVL3WCD#%=t4**PD93x!QkF9jEzzrgG`z`5V^K$u3yFqOp0p#5ephoq( zZ4&K&#PvLHt`1zjKKk$NPXbdfXg@;iUT{3a{%3RBf1m%N&9E&h@&mEA;hSV?IdCU zq_uq@`QaR1I|WbUqo|L4Cb$sd+bU4~)Gn+%gcKFBj)cGjV&TK557|${wsO-FNQsc9 zLL}wx8TX`CArfzpQ_jwaWi0TmLrR4BTtwAB#4)GCM^PWLBPTfItOD^6QdEdy9HKxh zd>Hi^e^zZH;Im!Vu^-U2;G={T6&f%S0+Wb|k)lTSsSub%JcRfZB3o+UR&H7nX))5& zh~(Vu7D5w=iIS#DJhNfi$5xlN@h0Tj@>ao(|X^OAJFmDjgg{8_PO9jiE-4~+K!8oqDs{4XlGq;A~7-I z(}?V1heB$_K^pOrBMTP8xAvB4Y z7%6IGoeQB!#6yTrA+n{0ZR;i`krpFOjY!T@T#ZP;1COyzeW$4s&urk^GT24pVZ^5q zg*V7yr$k6mA+jl_IO?ntF)>oqh@u>%L_CBT6&iooYa`&(Yg>^=pDy#QMATt>;M{iL zqo~h-nczT3Q6L^diVE3BLRbQ^@Zr;k>?gjFz~>+(LYfMZl)HVxq&!689eQYWV5F%L z%UDo#(b$W1$96t^3Q_eBam?xPQPhVV8WS9HR)Kg3DJn!U4pAT$K8*UbDEiiIJj46y+c#;vvMS z(CE`^$N03f9^Xo2JsD9i=$@9?epluG-ya>u74@;tgun#iA*85~btD8P5DOnZeaL{<|!;+oX)vWn3p$7ggQ- zr<$ETf0L9|TI4_e^z&!4tJ&pw9^WSa$iyh#rmOUa=IyIux5$!cxvLM6sw`d{0$qM( z-qJ*@(`B4Rn>f3^SQK?#-0~+ntBWnj^0mSCelZT{!TbJX-nT8XwA$>;kR;oNc%2*y z;-L!u@(@LMWyn-@ktfk&*9emzN-+Pt`*XA{lWN~Ci?p7dy}XW>X}*qDX_+kRrcIEG z{6v2SgzyvnoHhCdYxGOj=vV%t&slrsNOX@qb0oUQo;ecTW6vCk?y+Z%L`OaI*JjR? z%^1m(def{ri!xo_cpRC&vJeCFSB6Npklrt#i(U4x?9I=zW=zgM-WGSsp6z~U0xt~? zH}@OveROEo;D`=|dueJ{ZHs(u+i>(&z{3j7vfuERhiIJMYPE=O7ex_WC;8G=f?u1G zHOI)?X8Y7F)6GULEvtuR`qSOEN>}^c$6bEEM&BiAxhm{yw7(2!=K9Nk=B~dCX!bg0 zXeK1H4o5P0*5OD7&pI5*FhGY@T9m2R9d}P;m*9l?zcV&Y^3}bEyVcLbNnvbs0(kEL zw~5PDk~hoQGK=3GCJ$KFzBPOoX}R1qhrWEhKQdJ5+8i!EiR(IE?$1x)SaJ5{x-544 zf;DgJjk5Xk`*>(s^^^aZa{hDW{1?jkFO~CODd(So{Lhs8Un)Q9f2sVa|E2Py{+G&+ z`d=zP>i=`){+G&+`d=zP>VK*HsQ;z%qyCr5kNW>Yx&Ni|qyCr5kNRIKKk9#}{HXt> z@}vI0RPKMN{HXt>@}vHj%8&YADnIIfsr;z_uax^=DnIIfsr;z_rShZxm&%X&Un)Q9 z|4)?rUn)Q9f2sVa|E2Py{+G&+`d=zP>i-wY{V$at^}kep)c;cXQU6QjNBu9AANBuB z<^Gq-kNRIKKk9#}{HXt>@}vHj%8&a0bLIY*%8&YADnIIfsr;z_rShZxm&%X&{|n{* zm&%X&Un)Q9f2sVa|E2Py{+G&+`u~-3|4ZdZ{V$at^}kep)c;cXQU6QjNB#e`a{o)^ zNBu9AAN9Xfe$@X``BDE%VK*HsQ;z%qyC>g^gsGZGpYOk zy!lc8OYukjFO?tlzf^wI|5Eu;|C{^Qy#0rM{zWQ3>VK*HsQ;z%qyCr5kNRIKKk9#T z|5~U2rShZxm&%X&Un)Q9f2sVa|E2Py{x|opb^2c_Kk9#}{HXt>@}vHj%8&YADnIIf zbN^bW|E2Py{+G&+`d=zP>VK*HsQ;z%qy9JduXXxgDnIIfsr;z_rShZxm&%X&Un)Q9 ze{=s@r~jq$qyCr5kNRIKKk9#}{HXt>@}vGY_pf#OUn)Q9f2sVa|E2Py{+G&+`d=zP z>VI?pTBrY|@}vHj%8&YADnIIfsr;z_rShZxH}|h~`d=zP>VK*HsQ;z%qyCr5kNRIK zKk9#T|5~U2rShZxm&%X&Un)Q9f2sVa|E2Py{x|opb^2c_Kk9#}{HXt>@}vHj%8&YA zDnIIfbN^bW|E2Py{+G&+`d=zP>VK*HsQ;z%qy9JduXXxgDnIIfsr;z_rShZxm&%X& zUn)Q9e{=s@r~jq$qyCr5kNRIKKk9#}{HXt>@}vGY_pf#OUn)Q9f2sVa|E2Py{+G&+ z`ky6#^Cb{ZzE%wU{&REx+T-v4KawBaf0oLR`d=zP>VK*HsQ;z%qyCr5kLJI*f34I1 zQu$H;OXWxXFO?tlzf^wI|5Eu;|C{^QI{hz|AN9Xfe$@X``BDE%3^yGsQ;z%qyCr5 zkNRIKKk9#}{HXuU{cD~6m&%X&Un)Q9f2sVa|E2Py{+G&+`rq8Y*6Dw#{HXt>@}vHj z%8&YADnIIfsr;z_&HZbg{+G&+`d=zP>VK*HsQ;z%qyCr5kNV%-zt-u0sr;z_rShZx zm&%X&Un)Q9f2sVa|IPhto&J}~kNRIKKk9#}{HXt>@}vHj%8&Zr+`rc8f2sVa|E2Py z{+G&+`d=zP>VK*HsQ=CVYn}d=%8&YADnIIfsr;z_rShZxm&%X&-`u~}>3^yGsQ;z% zqyCr5kNRIKKk9#}{HXuU{cD~6m&%X&Un)Q9f2sVa|E2Py{+G&+`rq8Y*6Dw#{HXt> z@}vHj%8&YADnIIfsr;z_&HZbg{+G&+`d=zP>VK*HsQ;z%qyCr5kNV%-zt-u0sr;z_ zrShZxm&%X&Un)Q9f2sVa|IPhto&J}~kNRIKKk9#}{HXt>@}vH@=l}I>nkUOLzOKKo z>N4GKlU4NRUB1qeC@a=i7gZhCNp<=0HqElQjN-RxHGeldd;TUVtF*{}{ORY>Sz z^E|#yTw=ZT80!ZR>np=COV^t^T4crYCi?#l>`r^zKe)Z^|8;xY-@Co-|8aZU-?_c* z|8{%Z-@3i+|8jfV-wc1-Hg4L#h;O1*QIv*tn!}(lTLzaY;hAasw4OtRW8qS_* zh_+z8<-xBHJtU+wWMN2Y$dZuK@M+U{C@D2dSrSqjvLvK5WJ&l$!@2Z&$er+shTI9C zXvm$A((q~1aO`P%3|SIV8nPs$G-OFgX~;6XpUl#phAasw4OtRW8nPs$G<@1L9P43E zLzaY;hAasw4TmTE(mX}j9}TN`n>EM3!|8DTJib2)g45o>wTc1TS*t8w91vah_O;E^nmS#^S+t3>>x)HE*TpTs=`qn+U2H*?-xxaG zBbjv>zl-XmEaPQ^E}yS%eY*nc|-c)-2PEj?COo*nCEv% zRr?M3QC^hZVJ0zz*?VrcD2uy1Y99JEPX$-eI*Y5yBE{#X;Bmf6sDw2gCHbM)R=@2;<-MVU5_YVYFgp+hde+5f5On!I^%y?+`P)$g`R zwD0fpyqSfUuaEwF>nZ95?QG~?a6H4_=x7FF{o89(0(kP2FTc&U6;ZJL1x zbPG%t9xgh%oY#%fJ`7n{sIaI)Hc((gOo@wN$3!tiim(S_`xVcW6k2%|+tNg0xEyY`194HFwBZFoii z%Q{0Ae%RsCsn1xHq3RymI8)-HqYK%E6B}k$VVKD1C_}LgO&A_7Ji6Gn|MpKU+h>9w z#1XU8?KCPns@SdX!i8nwry8hTD|xu+=wfw#II^%%VNr!_pkdpw$;hI_MM)QuZTDPx zDys_#HMBWqC&S`?mi0x63yWi@ss}d6bg1a4Lbl+v#+X$W9xgh%P-Fv>g@p=_D&tR- zZ3KJ_>ss`~xCncci;gY>oF9%bOk{MFv70{}VR*Q(=tB0;!0p&%gwZ0Sqzp;7Tl)i& zhKY@mHasI>vWH8TK4Vdas(WbTOo@w*E==}kag0?MCNet8P;4i*%1}@{_m92Y-zod( zT*jkIJ5$H}tmSjyBYYXs207(lC)>QHE@zVOz5a zNu$O_NgI;y)OM+d#mi2}#{jg2ieTWk`HZ0mul@D&HX_3)UhHS(U zGl0c4R%y7{=x9UH4Ne*+GCa!IP6O0c$5xq+?TNFQ$1^%ybab)%KOkY4$ml3zwSPdu z@Ni+#h3uhWTeIm1qeVtZ8ItbARv8lOz{93fqbX^_GXhvP0Cs73$gn6wK@Dx3DRI%! zh3vwK4Ku4SOk{MFq1c8d3=bC`UB;iw+6efJ*%sr`hqNp!40ReFIFucz=%_Nl`VL%l zWZ~hWql?}7!N|fwg+&#zf%u%y;ua+?O1hA2yH$TGej%X_Jz6@DQBsD*{aTJ0d(rIJ z7KTL^s_KCaG94;9s*tl`T4T&A3lA3^T`01F$-+W~N0oMwW4$Ze79)%!<-MIwJ09!k zVt2k18J0!gde&zmqoa(~`~eBW!-Yi`vWJFk$EG8U78xaFNV@IXACfdoY?QR&838Qo z3|aVY1lSIjPJPCr3|05g#+ecq9bL#SoY*k43d2N3M;VH3Xu|Mt;n8LE8M7mM+Odpf zg|VJws26k(F>JrGaR2X*PRlx~*sULqEIeFvbg?==99dYXu&6>d(6H^;WMom|qNEGS z)_EketS%(fw#mp>IFnIQhQ<9#!mw~*(S<@9*dWuPqN56r^I6}qy-p2xR|W6-m@*xDm5$~euVWl_f20Va6UcLsb_m+5w!tfFdL z?v_b(R}`zmyDvZ9rdbx3QT#To=I?w4d+RgU4Dia>|9!OF#N|3cL&`PYGtg$P@yYE@Pu~ zbr~C_s|$+KTdMBjx6Le0-foMk`R}r5maT^o0J`n>rrXN>8rSq%H^%)9a4#u{>Gy@9 zut>}0#$km%Ap}~NPY8ileU- z7R~l=ezn`Kni1dr0hFh=G@Td`?Kw`0IQNe6y@&{7ufLna&;Hz>?QXY+PCEPMc9+#@ zbR9QG`c>MjlXdebVqe7yZK<6DqGOSBKy)s04u}p$&H>TM$T{E@=xyhKpZE^=!gs)z zz5{;lJKz_-1HSSd@N3@zU;7UDt?z)}`40G7-vNK;JK!ID2mEW_0srJX;6L^q@Spe& z_)mQY{2Si^|JHZFzw;gN?|ldS2j2m|_Z{$``wsXod6Y8sNB0Z)I2cEAD$upvb{>Q|10wd5j{P042PZ_zBcHV@0$GGrGVx?HxD-j$WPOU zz8^hZ{nq4vxCB)1uCJrJ=7(Pn1-d-`^FB#j)znYf47|f?`{hpie}D92I7pl@*{EqV z;Pz)o;_%Q>Q^$S@G$e6Y*l=k>c2am_O^J@4IwaxlF8GAJL!uq}!$uB#^z>mF23(s0 zyF4s(xYVJ*hBw-D*r;hk_TuCQn^hbhI%?`re8Urmg$T|;6_0Fpxb&f_AK-vfqNAn`*^bj2Z&rDj_^9ba5e`ru z9y)C5j6Rumd`~;cajiVolMnTR?iq;f*Dgw~J2q|XlOQN@c9A4LhG!6PImapv z4;?jiD87?hbttgI98rF!52- zhZ+{$WD80j9y(m=kj*r3%Qhu>wD{=hLo%M8e@M7(!;!CWC#0tk&qUzb9+2f9xOsD# z2weJ5)emsMDbZ0=hipgpX~5+kt2|76)bybU2Ph8@9X55^LCbn~x9itnj;8naI`OEj zrjLCZxDjF-Z?=ZxBBZ8}bsz*L5ECCReaLMV#LKNc=1!CgErjPCDVE+`=a{smK z*kF#ToqiwAN!5uD*9L)VrglBGk2fbidhQu}qjzHNVWGpN4%tk@wr@_|#^oL@K6?6) zjJxO9Q(ApUxFOCrJE6`X$DehFC=d@HE(cL)0~~Nlbkx)#?KM63Smj~jqoxlj-EOs;cib5lsr6q^z>mF23(_!EPgi(tPk8Ax{XU6s`lZHHXSx<+K|0Cxxr=? zhlh@uIuzgV#9?8>rcFCxk3ZoYHr4KX@k2R?I?+*6$36(0_;76rJRC)x_^9b)odr&G z)a2oz!=(;sjsS<779Tx*NXG5XU{d}e;kFG&zQUc5oa9sLO z)emsMDbZ0=hipgpX~5+kt2|76)bybU2Ph8@9X54FpG-TxAIibhg^ijv_DSGEhi$Og zT8)Q}nmX1&5R^D9Y`C-`J89UKZA#)O(a}?fB;4)^!jgxFkDfj(!+>kuA&WokIO@`E zT7?8V6qHmf*1bkx+L_=YDA3mc@(SGQ@NEX(-1{(cePE{YNqW{ ztBdBpbyCeg-EFIMl|-xJE{_&zJv)1Om!##Yh*oKtEbFw$(E{Kj_Osd9^EXLZHEDkQ z>F3X8SF_9WJibkQ#6D+?ec>zioUz_VVtcFik=WkqeIz!j_g|U*PV?*Lt74N?bX!!_ zyQa^ZufUBKWxBk1=yo95rzS{Ul*`S*9G9=!KStN_GR@b<5YKn{P2Tv$Q@Hc}SKRuF zmBij+ebjDSJOTTt9n_wJoz=w_g!p@IA<0f^RUwhK z9Y(&wnTw7tEXGG?sWD3=S@h2MwtF4j#^(6WXumsc|NYUvg+mpp=3$L69VRN8kp1Uu zdJd;pMd6{Mq6)<|EKyjPuxQe5pLlDsF!B}7Ty%8l z%y9hqvNIJWw{T2j4ppd{hc&`JKEp{&CE2iZa5-R6R)=?&$L1q_*hYN=;6w<&3nGzKhRmc{c))=$O!o)>I7m93P zvhYx0QKj8V9e)NnY=+&p;ECrjj@{V!)3F;D6O&{Wvu28NEjwA9J-J_ z6xt|LBcr1XNw;15r{ftC>%gO>8yg*Mm_`7{I%AiHi42D_6x7hhnHConUC1t+*f6sS z!$n3#8H#Oa!Z2}R(Pi`*vm^UK95J1!sHkGMz7rRYh2MJeXX2uwi`Dtz$ihQ~Llv@t zhHb|tBa0Rn9bHJa-E(Ej?bj}Xz?~Qp>cFF=Q4;KzyD5QZ6G9@Z1 zs*o)>tubbmg^7!bE)?0oWZ|L0qRRLarR54)TML0D-+FSPUeNWI0}~ZZ2DsjV3deF! z)qLnS%z=uEDt6O5Fi{bOg$aiyq!9*g!6qV#5)~a)NV3ken8Pb1(!eH|oePWcb!1_o z!r>MQXjmgmhlz?Nq?IN$z^tP1P*G8Z;u@AHEKFE5X}3?Tw_e*?1aW}8w-Wwz^%xZu zRqUpB;=-}idpJTmaZ%C5>U$?DDzflU;ZTJ%!>}#bWMt9eqN5ARwq5Z95{8M4jxs#% z=NM#U**o{!ej?nd$vAYOsvg)NQ=+1x3fY3w8e>*jn7F9uLXizj79J`rs*FBSc3e+8 zg>kGb){_hMg6?^R$(+4983lk1a$nF`o1)GW}N>p@I zA;~(=VvbdXMA~*3`3h$)I=ZkJUq==eDjcd%K*JhgI!shF;W0gjQ>>!!P*G8Z;_5t! zRYYN7f;9Q^HqDb|8DH1mZ1XUVtI3QQPpvsRI{_^Z<4Y~i~Pr*e*SEBHM=~| z%;rzA180OS+Po@MOqIi;(#cKz&D1#s!X?4-LM!$;)QwR zo2CW_=x4v&|0!CfWwNXr;(G=aqHs!#XP}s;#5ng5*AIr_E}wQLEzrBTyB!Gd>7Sayj>MVc|d&j7Z0OvHoq*kNjm{&^G|o% zDs2Y(s<`X^#z%%{>>1A4GhDD|Aaxk9F4~nQb?}mb)WJ&zQU@;?dOFP6{lJu=rvp=l zo(@bINFBT=-Sfj!4qh^lI(W%I>M$U~B8!(d-d42U!gFe1VmbTVtgh=KTSZ0ru#X4J z)9=hX-X&R9+(qjw{-IgFn-feKFPlXs}^WmWdkiWOj@226ROqVxN^ME8R zA9~>FcHr#gU6Pio!ahB`B|tskEdlBfZwXNUxFwi#Yj7liUk#2V@T z=mjkYCK{Ts*xmoaZkL3Gh<`;Wm?4cV9UcmLkexT7p=A|>hlqkA6w{CdVd24`N4t{o z{(^{oiU1CW_ZB*Sj=oFo&(V*FC@5mLx)T%s%ewWs0}~SkO{{JYMG_t&{uLoxXV_M2 zB9dq^(a?nC+OF=wh{8lgLlqv+`(IDUl6RgT|EnO5Y*zehLRCDd;iW`GK@qa~rZl>& zk}xq*(1fBIlq5Vv7!(&SB9;a?B3Z-#BPT!{D|SxQ7S6d|cPPhSm5c$jEt!eVy~Nmz*ZSA>EY(%91B zp`Ztk)%`ofDhLk|1w|;P6Iw+mn8O}wbrDWGQ!(gaJB!%QRBZ&zqwCB^AHXpNm+;6@`n6f+`f(utZ^E!k~$5 zgKz(|(Q<>c>(2m=kDX>8!s*e8iT_2OYMpjvw2v+)CK@godmD8!E@2_!UlFo(hHbl? zddt5{w3ujULUQe%4^Lw?A%TW9yX;gtBOHH*9F{0NO#C~A!Wq=?QX-qs0pa{h@BtcksFzC_F&EroIhfS>e&I|u==tM+85xdo$nD}4TJsc06 zm?&ssb-NQ01xa{__*aB9K~RHBi;0FNB-eIzpNLOLply4RuW+ZLp$d=Z{SPm)0QOKqs0pa{h@BtcksAU%F_o94-~jIZnOS4q5z zuG2D!mPHw7(IP9BH&+)`9oI=UJA3{nDXX-|fBfm^&t_M%%kw`*^YtKUC;*E);$8q`Ty#>=9v<3otEm)G$!&DYVYQFvK5LLvpmMSaGC^_(T@ z1xwURmZ(=C>bIr`{?{%p>mQ<3v0G$GRAupl|1Q5WuWD>ur_09Qn>f3^STsFS+_JWspd0Mo3WxK5294ND0*_O~M|LI?N`a8QHIs9*|bic&JT6HHv%K zqOmX&(X5@?W6sz2{rVvuu$`z)LN)skapESi6%qM4gMHUOdVDYm-K=vYT-kW2NvKAe zY1kHWva)G$n}%*A`*ueXuy9P|rlB0qG?7@}NLhv*wVj$$LN`j4zz3xgwMnQ(w(PXW zq*XR1Zj;cBA|JSHJk&%~8-3#LxPOQTZWm^g(9AwXT&PKGM?4(2U8qe$wGR04hhN?E zNXu_RZj1NmIl?4FV__zt8EK?pTS%97ln_mc+B8%n$xqsAB=WW+$yYdYn}%*IgJdFZ zv;BGjmq8+-8l_3tBT|RiBsAk0A`(usipE225~@+$ohSb!L}OtlqS^TKbsGVnue*Mp zbwZNHY!GLQYjSEpF4$ zjb!h>1W5RegdX~ww3FkRCesj(hns}sDCB_;N+oKOP>rY~0Th;Dc_JcffyK$R@ZuUvyMowZ=LiOCh&7>Q-NhoI>CT`p&AsiDo3EfCT z4cksmS2#6t(@>72Kk-$L#2);#w6kLxDH7vSjhuw*C|yDyms;E=p&Qw?6CajV;kd|6 zLOF_k=)y5^6VYw-8N4I^K_0=Ks7*pO`zUeZCb2Q`Z~%AWHVNH2*_- zlSipZs79J;*mlyXBPHCX#cdk8k?h-DNx;G}k(-8c;SNetmTsB^J1Hqu0w0u0)Fj+y zrAD^ww8x|tw@K(mkq=xp9%>@0jX!Z)u28nMndA|Gpx*VP1G7nJHefbwZ$c77iNNRDLhHfPLc1JQ^JiQ6P}qsRv?8xJ)R)okY* z>NCdfDT(d(CGY<|$OCt$>S>P>CZU;qinvgd*p5)$HgFs1LTwVNS%-)Vvq^}?!c0Ol z(n!O$kW&>+iP|(&Bgs#CRU?rHJ|XSgSO$s2h*Y8`;WkQ>ut%g0vq@-1_Uohvq*XK? zYLifn;vTkWEX z>x)HE*TwDZ?0NIoRa)df{`B)_v#Z(Vc^=;;y?31!_N*?pAm;B3)S_&#Ceb>Je@IqQ zos?y~Y~aKP)MqcR<7Jw!qg7fa%ep~_7QRtIpK%~P=LmYi5%iKH=oJY1N2C5GE?3c_ zEbj8CY0{>DSNl$=s%RVM$)N>6m|kO6w?$EJqD5TAS#5dSFHQEl#ujCkX74O-`K@_N zRhQ{@+rZq$SrQfTO>|cjtHb**Ki;NU7MD@{Hm&CG0C2}}Z~cb*0fc+3PL{4Wb+pKK z%{1vtbl?oa^wddilQPa4owH(jV|m**y;AS0ZMsa0T@_Vv{!rtymy2>&ZT1qB#kx$Y zYBqnqX@*EMB+zIW7ZnX$m#EKJu$rhov7WPFHBo(Hy7PQZMK>NVcCp*#G;$huPsWQq^d{{ya31cqpl=WZ#g7 zCK3xHPL0T}8u;X8Vj?L~(p8BhJ;_yxL_G8%v_tFZ>clc2&_>(G=D{u#3nfmKD8ONk zJRL@=8j*cD$$@7TiHDM^N)+cXMPgyZs!_W}^8Pr~K1EOm+Iy=Ve+qEdJTPbv`Hv{6 zs$?GyPMkQm4%CB^fg3z0PO3Ut=Yta^Rhf7wajHa`W!M&Pax!Ug($$G%-R>X)6pD$I zu2MWxf^+bZGIUeI_KP^3nvYW_N`*iNpAscimB`kd=Ge2!#KcKeCyI2SGVxGiRcZ7I zx8r=;X^?YevYwo%7j(~6Y(G$SO`{cb`aqS#Y9S1DV{08xs4!Y=%$426Wi{|`H5R2PMs(f0v&uxlvGtB zTXULY&ngoWCsmy&(t*mvLy1+Tb_c+EC%Nn0ppLlrcAL`LWYft$A>2rDZX&49&f5i- zi7k-ar+yXQuV(@|=qbd@4$w|j{YrQ%|xs}<9zP<9p1Oy^XJ z(jnCGr^QKCC$2HU=_spET%=T$qF7IKm7*YbQzF30XFE$#=aTNpL`(X_;~}e`bSSa9 z$wtXOBD&@cNhT&vsyb04Bvd!qhMrUBajHZ%*0AlK6DQ80r^QKECzACv{X{};n~!{j zJ1JeI!W(>~48yj2PE&$YCrX7t2cHrpRh7urbe|BM>yuR`CQhn4QKSQviH8!aO186; z{e;^_z(=RHCP96sYrAfAjFGBF1Exc0BJogCRmnaaLKBIF5vN9ER}I|aO-v*uO1dhM zq`SRCa5C|5($$G&KyYrvNf8DfYaKd|Qzc4+Fh`yaBUO#azMSO1vx>w+NmV6^bC@Er zFk;oHoxZHMl-rsFb)dbs+G%HWRh8_+!HE;+)`5CZ(yp^ioK$tP&WG@1;-SQ;64_Y8 zws@11NsE)NP9*Dg2N9r9Or&&`;+Ybh>k}!%u%oS0^Kt4#sSxPkQ=+7*64{#59D7!o zm^i8GM3D|uCLT(xDvdtjcAQT;4RWqb){_(Ug6_GB<(75J_|cJFRU`X!2u>s(N~$VZ zheL28u`uG)i0rCiTfC`>q(n(qC6cuB4Ch>xNW^XDk*{#(q^lFlfY6nRg%YPq6yPvN zo(>~bjd+Fwr<1HA@laA#iQ?=$!Bs_KVT3gL<87KJ%QC*MzuzSBn|IM&lCC#(vWm84 zQdPS$iMCl>Cs!9$-TbFI`?O3}Ro#5^Y*eM|JkC(5MhAX2JA3{nDXX-|fBfm^&t_M% z%kwLa|QmEEAV$9 z@ONe&Z+GQ3YsPFHHzRr#t+TkQ4r3U+`z!PAY(K{HG+#$$u{yl%?B#X5-2dGwEt6&4 zj8-(hPmhG=_34q&fIdAEn#iX|LL>O}NNDEvBE`!_r8vr(1vz<;eEwp)Uk$4|$?Is5 z*0cH5Zo6vMSyKL5LjxaaO-2|cGFr-zbh~FH0ZGHdMoSx(5x}znAPe7(0PC+x za_BQ2WvIG`HqLaoDCt6W;lzfSRTv&JO3F}dLlcID3zIJGOdWH^yzj!}$Jo2(#M>T1 z136?mkx^2{Zht2>Jj*|Ig|A&Pnb;_4W1RpYNy9^iM;Wq>hHcFzB#jmuEp14??JgiF zahT|6slzh|c-9-T^uvyuPOZkH4ORKzhME!?C1uD)oZ3jUO2foPNgIl8aMJLQVNz!F zsk3AIVH`SLxG3pj_rD7no-KffBc}@)C1pCO#~Be(bDL>|*vKM8Q)!lMgm zh+$hZmnP$Jj1n0wWk|Xc^9+f#?KAQf&TO=_322;=g&%g*bQu9W%20I=ZJgoD)jqt@ro~1{8?qNCH`uJ=aM4jxhvFNaI81Dqv>AO4?dX0W$51CSO3K)W zfD;>@&47nPs1q9{Z91$YZrOI?PUOzO*lV^&$?zycnqt^C&8g3LT%*NCOB<4JyAudX z940zi>V!1Z$kKOnAfTy6RX(_(rbLFvHC8fYBTj9kX|Yk#hN2ssG(2ROlo@~Ov|LeZ zt1*%7GeNfNG6yb7x(t|R4rF*X&pwWv4rG*+vD@E)i;^%bTzGUL4KZ+QHW^`*$Y?1; z(siE9Jf0!3wtYsv!kLYhHY_7ROBxn3Jjzf|LmOv0T$FU-u|JPvtite+QBsCt>pYj0 zgkj;rq)WT4I{p#Nut|2`h4`b*wi+5uWg7rXym$nb0ds2&=) zJ#!(Wq>R=6E?ks^Vd27~3u%a9TeIm1qeMna8ItbARv8j&aMR4rhGhisj58%NJg%YY z9@;q5;i9Aq*@Y7uW>#T%$S5g8u?9kjOwCXZmuq>y7^Oe`KtY6 zbR93#d>yUQGFjGXkw4$%H+gZF&(5B|Ny@7En;(Dr`Lo&8?D9O1Zbkh)O+wK4*5InP+4FI{|nYIhW03a8L0YEMg1Ats01^~H03;=S$xwZ?$03a8L z0YEMg1Ats01^~H03;=S$g|-XC03a8L0YEMg1Ats01^~H03;=S$rM3&i03a8L0YEMg z1Ats01^~H03;=S$m9`7S03a8L0YEMg1Ats01^~H03;=S$C)zF$1Ats01^~H03;=S0 z7y#q~F#yN~FSK1C1^~H03;=S07y#q~F#yN~VgQf}UTV8Q3;=S07y#q~F#yN~VgQf} z!~h@{e6H;RF#yN~VgQf}!~h@{hyg$@5Cec*@P)Pu!~h@{hyg$@5Cec*AO--rKnwtK z!7FVShyg$@5Cec*AO--rKnwtKffxYfg0Hn*AO--rKnwtKffxYf0xo zn-Kk!jTivr0xkTp$Jjxj+m6a)B5CyOmrZ1^~H03;=S07y#q~F#yN~VgQf}%++os z7l;8sE)WBNTp$Jjxj+m6asdy3x%T%L907oCR-3!!KEFWW2ms^)F#yN~VgQf}!~h@{ zhyg%rfw|hv+=R#lVgQf}!~h@{hyg$@5Cec*AO--rz+CNCa)B5CyOmrZ1^~H03;=S07y#q~F#yN~VgQf}%++os7l;8sE)WBNTp$Jjxj+m6 za)B5CkTp$Jjxj+m6a)B5CyOmrZ1^~H03;=S07y#q~ zF#yN~VgQf}%++os7l;8sE)WBNTp$Jjxj+m6a)B5C>*y}dvIj=r?Ee%ki@c#;H%y}X-8PAmxT??dB2O+~AN}{dDC-UNf~wdZUT{3a zU2>mc{);xlwy5f8k=E!Zkb)wC#vB)kkE%^02+%4RDR@{&YjIvTh6-H@780J7AloIF z0j0!3Tnm!tR7MmDvTZ5y70xuo)nM_r=cSu0b?0x6QR`U?s?xy>DIF5hN{|ib>}}7k zuu8$hLRt%oW-wB)knpX<=u_T(!v%iKb7CQ_h27guG<=UJTT3y~kXFNL?;ynBVc}T| zvSWsAqoyE+77cMVNTTif9fllCJjC_jF}de;gDm#21D{h@c~*m}bvUC+iG{QlWY0}z zP+7%bq9LsY#WNf+cv$$>!nR4bf4bK`eGB~9*J*Vc327zl=5}G>dGV&&rCs%SSV(JO z^>zqSu#oVq1lcabwowz1LWzaA79`K^d9D6xL4pitM%ihw_}lY(p~S+oGpI@jGo*A# zNGm}$+*C%CRSF&!(ppe7gOP%Tgl{FrpYqxW_<+JAM zhad(I3(s1R9W!tnH32cSXo#yp67AOSAmm`;A+86H$tQT=bLlG2YEZQfXH+S%kk*39 z;GUgf6@!U}v>Fu8$*dX_$j;wmFP(R4J~}b^)}o!1V}5q;zUM+e__@)LR>N*^Hy*wR zm949|cu4C(4S{x2g&_wM4bN(jO*3puH3>P?c!=vkGM$b;NSJM7k*^p*L|hRjr+Z#M z$Z`+cT-}E_aa-b9531S$4J<7h(rS=xH^Swf-C>o3i-)ux6w!d>V4~q$4cnfby13V> z(eXTS;`;W64hv~5><$k?3?>@VYFG^(gcv+5JZnLA%&;xh6vWV?A+82VbTX?3iE`ip z(5bD&_24nN=SAEu2M-O;YEU4<8C6Owq_rS>ZZd<)Dh3k`X*DRG;fTS*!nYRVPfTqD zeC}(@@aSVq&npIXHXS%>9Y{zkF~HmoETpC2VIi%B-P-|3!9v2b5@fsZdE2uqlvs#s zLGtWYZhc>nAcr3J9B7EE!QyXuXNZB9F^N^4>Fwi6A{3%B*m%|t_54XeF_5QB$>XD!H% z8Mcj@f*4vf#MK~)w(EBoaxn1_*MrC8p4Sbs*qzC32R^5+@~j3`>u^Su5({Z9$ex?b zpt6d=L_=B)if1@t@UZZ$#prWiNAt7;ljjw~deWd?&^<=5{ZhI8zdt&=N-JSEcL-AO zu#ncm>g^DuU?JgI39?;=ZKEb2g%S&KEl8fugVytEL4s^sihPAL4RJMC{4Fj93k%O$ zP#A+5QaU80mEiHVXIEII;9()H1x3?&%t}kaLINrAx%me6Vo@b!^R4j@U%>v_{M&WB zO!IZLO3UuM*w0tRT|WPKTihjOvZB5n-7&$l-Ig=_N9_=0&CvE6XNL3r7uB;SNMhy$ zPrAr+n?CL$&*6`Bk?#yoyU25fr(NVb!ILgR3BES-rWq<#UF1nr7v*yEFp*xhe~cba zqvyN)CT|AP?Cg0nzpAvzfBfm^&t_M%%kwA6jh4|mi+^Yqm^vxTcv;kSeCUO26!4t0da58||j!?B!jOmaD?-Oi&ki368qKOK{W`UV@|U zI6e5Bv*t&F`>Xkp;QnfUBsi-1S7yp>)BGk{7WuMF>g3Soz#hLbZ(GIXO;p4;(I(E< z`;B>(uJgm&=byyQoLp}1_vJ?h<=L0(ve@OT_H8}u%%9)KLniVD;h8>!bA1RG`VcPl zAzbN0m;ngS^c^7x0Xaet0&;{P1mp-o2*?qF5RfCz^&KGy0Xaet0&;{P1mp-o2*?qF z5RfA-^c^7x0Xaet0&;{P1mp-o2*?qF5RfA-^&KGy0Xaet0&;{P1mp-o2*?qF5RfCT z^c^7x0Xaet0&;{P1mp-o2*?qF5RfB2(RYL(1mp-o2*?qF5RfATAs|NxLO_mqq3;Mm z2*?qF5RfATAs|NxLO_lXgn%6JQr{7R5RfATAs|NxLO_lXgn%3&2mv|bbA3k$LO_lX zgn%3&2mv`l5CU?9AOz%yFZ3ND2mv`l5CU?9AOz$HK?ukZf)J1+UgkAV&y7K#mZEfE*zR0Xf24NLO=&AOz$HK?ukZ zf)J1+1R)?t2tq)PFc;F*93cn+IYJNua)clRS963Q1mp-o2*?qF z5RfATAs|NxLO_l%7t+-nAqW9ELJ$ISgdhau2tf$Q5rPnqBg}<#HAe_SK#mZEfE*zR z0Xaet0&;{P1mp;FAzjT8f)J1+1R)?t2tq)P5QKmnAqW9E!dysKbA%uSkAV&y7K#njM($yRx2mv`l5CU?9AOz$HK?ukZf)J1+%!PC{M+ibdju3=^93cn+ zIYJNua)clR*GX2tq)P5QKmnAqW9ELJ$ISgdhau2y-D_ z%@KkSkRt>kAV&y7K#mZEfE*zR0Xf24NLO=&AOz$HK?ukZf)J1+1R)?t2tq)PFc;F* z93cn+IYJNua)clRS963Q1mp-o2*?qF5RfATAs|NxLO_l%7t+-n zAqW9ELJ$ISgdhau2tf$Q5rPnqBg}<#HAe_SK#mZEfE*zR0Xaet0&;{P1mp;FAzjT8 zf)J1+1R)?t2tq)P5QKmnAqW9E!dysKbA%uSkAV&y7K#njM($yRx z2mv`l5CU?9AOz$HK?ukZf)J1+%!PEnKQZL=^AYS2kRt@EfE*zR0Xaet0&;{P1mp;F zA)UP)(N7EsLO_lXgn%3&2mv`l5CU?9AOz$Hb0J;L5rPnqBLpEJM+ibdju3=^93cn+ zIl^2>S963Q1mp-o2*?qF5RfATAs|NxLO_l%7t+-nAqW9ELJ$ISgdhau2tf$Q5rPnq zBg}<#HAe_SK#mZEfE*zR0Xaet0&;{P1mp;FAzjT8f)J1+1R)?t2tq)P5QKmnAqW9E z!dysKbA%uSkAV&y7K#njM($yRx2mv`l5CU?9AOz$HK?ukZf)J1+ z%!PC{M+ibdju3=^93cn+IYJNua)clR*GX2tq)P5QKmnAqW9ELJ$ISgdhau2y-D_%@KkSkRt>kAV&y7K#mZEfE*zR0Xf24 zNLO=&AOz$HK?ukZf)J1+1R)?t*dcs#o94-~jIZnO*I99w=IdfnrK>c~uP&-Ou9IqZ z_WVs!R%wy{_|wmy&8}vb=Xrdad~M#iD2u!QpS$<(apbzv#+u!&R%DYH6Dmc_#~ zD_chY#*Ut5=`^{?%gmT4(|Pic&gaRE#eMN|^Y5qTPbRg2kKS17WAhx$P9K|>0yeLJ z&40A>xnc2kp8k|glR7KQbW+rHx+UbmFNO%%MDy7PCz{VbHYMisT3|k(0h_F4N_-D0VWu_{_>@bX_d7MKaFov(d}d(o~5onXZ+;{x|XboRj=qlKfne z{G9pxbl8n_%>yq#5&d}iiRj16PeeZsKO>TUMEyAYi28B(5%uHcCt@Br`q_^sq8~3m z5&d}iL4KUIx6G>CtRZDSxiibjYCO-9YMzd_`;P0M+oj6vL+gBE_Ik5)eseW8+mqrR zEIbh$T-3!9Sa){K#XGZGUT>K;E9e$B82F_P=5fU>%B*FK<7}FicS(`nCChobxT{(Q zI$P~=UQTAo(#&zZz9|KI1xqxV2)Vba-?olJubqN8cBL3B0^Hi!ti4Wc7zut9W2b?#iuQ~1f9sfnAbxaLB1x9%@b;~(+Op39&x^1v;odc)N9q6nm*Bt=n@qNn}=MMCJHaCq5X4Ix{ zpk<(ouxU3)%VoBk9)QsCw!UnQcPrh)u;(_~x$Ca(i=v(-mB98rt{1fW#`S`hv&W|yN*XSv+Hv&YW zoFmnEzRC`CE(78J%vQbKacNsOz!2x2chfE1wIs+XamsOFxnaPHjK6m zy$z$igmb&UT1?-s@8W0XR^7Z8GcMk3*H^GN_@%Ao%VM5aGc$TTH#hoSuEby4!T0Yc z**sshy+-%Sj@UdX-ohJwnwm$a>sNBFUp+oTo@eQeY3=)%Bal|7QB$ z%wvOkX1cEzraAc1{I3OwP{`#cjq{j3pI7(mcLB+fcJe9^tZ4@@gtLR~;VYbCi*HphzBNm+bFAqD55>@9#0aKi&GiA)vF7@K zX*AdWV)eawHTEG(>shw$TAR%BDx0tWNAuS7cIyR{R%0M&r<2LN zzWLr9N@wN^DBIf8{nqzbJ81rowS(sRSUYH5kF|sD^^UcJuJN3wp3cg#`OJn{2kiT| zfbW-f{aKn(@3%~YKX>+T_3Gv(Ua9Y4*i+@5Me)9{I1K3^?ym$g=lke^udQj z*58F`-a_zw=%ur}^AXkECD+{**WH=NUGs4X9(MxneB24R^KmEO&c|Kzfu$$hp$Ec3 zy6f%E$DKfQKJEnE`MBFpmEM!-tC<4seB24R^KmEOZjZYWcfFH!x5u5VyFKn?-TAoN zPZe}34X>F_bOP>t+zGhzaVOx;$DKfl-m94ocLMHw+zGhzaVOx;$K8Ia#9!|m?gZTV zxD#;abL85ASv>`;Vb5}hn?w5sWp-9Z9ebf5z z=S0Ch#&K5A<Yh$b%BVDvdew|v0}(RE+2 zLDa1mY!G$n1sg=&dBFxzS6;9|)QuNx5Ov`N8${iA!3I&+U9dsaZ5M11b=f%=%8P9M zL^WSOnRGvM0+t4+V}F@1?vf7IzRtsz-A69FxN<80=F^!s*}@d=Tj$!|eYa@zx%q@? z^8xzi>)7@~*&veR%%97ezmzq9C2Rf+neVVo=|C-<`#9#|+{ZBw=RS`4r*rRY($QYC zPu@p2|8(x7n}0g@(apoTk3;R#ym!#YF%RcHj(Iru$h>n1+N~20=7&SJ4_!NdBl&1U zXit8$A+#4i+7Q}8tLr*G{K6Fr~je_7?zWSTAO8QOVt8jNajr@^THb{dRoZl}Sh z&UPA%YHO##sGfEjjB047!KiL_8jNaXr@^Q`b{dRoVyD5V4t5%hYG0?psNQuNjB1?o z#@yp)m}cqXcHIu?zRo^+o|<1FGxyu(bvpA>+krmEi?43W=CXM`%=rxQ=+j4gs3t@L zaIOsi{S4z7YX;DdFwy{^pJ1c`KtI4p1Au;z^qiFgNCh+iNCh+iNCh+iNCh+iNCh+i zNClVLDxd*CDxd*CDxd*CDxd*CDxd*CD!9^C0Sy3B0Sy3B0Sy3B0Sy3B0Sy3B!L_yu zXaJB3XaJB3XaJB3XaJB3XaJB3o@uLq1^}sm1^}sm1^}sm1^}sm1^}txxwZ;u0FVl3 z0FVl30FVl30FVl30FVk^Xsdt*0I7fm0I7fm0I7fm0I7fm0IA@WwhCwfkP2u3kP2u3 zkP2u3kP2u3kP2RFtAGXoselFmselFmselFmselFmso+a(70>`670>`670>`670>`6 z70>`66}-__0Sy3B0Sy3B0Sy3B0Sy3B0Sy3B!PnX8AupaDQCpaDQCpaDQCu&v#~ zN!b2=fiM810@@5970>`670>`670>`671-8p;Uq*VpaDQCpaDQCpaDQCpaDQCpaDQC zu&v!nDxd*CDxd*CDxd*CDxd*CDxd*CDzL5HN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U z-AXE;0YECC0YECC0YECC0YECC0YECSt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!n zDxd*CDxd*CDxd*CDxd*CDxd*CDzL5HN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U-AXE; z0YECC0YECC0YECC0YECC0YECSt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*C zDxd*CDxd*CDxd*CDxd*CDzL5HN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U-AXE;0YECC z0YECC0YECC0YECC0YECSt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*CDxd*C zDxd*CDxd*CDv$v%(*FH|0{~D@sqHO~`2z|E03a3603a3603a3603a360HC$Nwss3A zAyNSi08#-B08#-B08#-B08#-B08)W%?N(9&4FFOB4FFOB4FFOB4FFOB4FFPsZS7W4 z0Sy3B0Sy3B0Sy3B0Sy3B0Sy3Bfo<(pQUMJBQUMJBQUMJBQUMJBQUMJBQh{ylR#E{C z08#-B08#-B08#-B08#-B08)W%?N(9&4FFOB4FFOB4FFOB4FFOB4FFPsZS7W40Sy3B z0Sy3B0Sy3B0Sy3B0Sy3Bfo<(pQUMJBQUMJBQUMJBQUMJBQUMJBQh{ylR#E{C08#-B z08#-B08#-B08#-B08)W%?N(9&4FFOB4FFOB4FFOB4FFOB4FFPsZS7W40Sy3B0Sy3B z0Sy3B0Sy3B0Sy3Bfo<(pQUMJBQUMJBQUMJBQUMJBQUMJBQh{ylR#E{C08#-B08#-B z08#-B08#-B08)W%?N(9&4FFOB4FFOB4FFOB4FFOB4FFPsZS7W40Sy3B0Sy3B0Sy3B z0Sy3B0Sy3Bfo<)M`IgOr_I}h^O#^^bKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlO zR6qlOR6qlOR6qlORA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO z1AtUO1AtUO1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlO zR6qlOR6qlORA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO z1AtUO1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlOR6qlO zR6qlORA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO1AtUO z1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlOR6qlOR6qlO zRA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO1AtV}4&clC ze34Dc^rrrCoR^bXQq9xxv#Y93>#Vx|x&5ziv$D=7={%XG^P8)2QP;)&*~O>kUsrjt z`0L;P{>9m|v+K)6dY^^ayr_#MF!;j4m>0$U7T(2Y)4a?kwegSM;b|Xv9_;fnc;por z`70aeG)t#Ry&7l9q$tg-kLShYZW}ll{xdr~TTGLxE*4qKkbkm6mc=};X4%^7%}p{b zR^xdVBO9W)@Fd3@8^WZ_@2g^Az!&8@wcBZXiMCq zeme0<`1A26;m^mPgg+mD67_noemeX~`1A26;m^mPgg+mD`}rcU{yF?f`1A26;m^lk zcYptA&wuyn;n+(Zl35I4<`v`7FN4=kZOxh;Q;$e3P%^oBT4q$v5#$ejVTBxA9GW7vJRfz~oo9 zUjBKtxQ%nk7iiRTt@qCs<~+Zh)#hSuW$q*E)ZAB3liPV(Rmn1Kz2J22L~rNCLzg?z z@2%&}V$pLo3AKlol2ChS9SOCE7LibUXaxzihn9~}duZ(lwTBjtP1OXr&0Xhn9&@duWXawTBjnf3fxNA$@0xZT4H%jn&&MEvL!DEU!P<>1>4twsc=x3-_yOGA{GUU5rP!;dVV6yVn-%O@M!G)IBQ?udtUK2L7a#V(OvZn`E~SD#)+QBL(TiZZO1QIv1Luv%O% z?&f+dsf-@GoRXZ*8bic6a<934hF4o7E?Z*0Pj=jr5bb3k9qf17~U-!#QwQY=hg+qyL@soyWNBulIMa$y>x zuD?C_-xoz$&wPJS6|3zZ9QN>#J$e}ZL*v2hna!nzX)*$f_5edck2GXM`J|c|asY1w zqeUhb9bPVLBfF1-7LiaySn(#%z>1hsEK0n1qdl!M=7riMnfEV(gHd8eMExSmzIWO; z>X#_WBE0x!ePD%5Clno4yeSy0d=a&@(jpU!4lll72S$rXC^D?{K2biV;74(!42ngE zmv-d`1tU|&+LBBt7#(I>#XlfoWMUEF#hXLjwqvJ5j8-s8%y`3X*8U+;BNUAiH!>wa zWS#L&e7D18P@ah}k@ZC>77@kxW_@6VOeYi_R=g>AT4k)27MWOdc<}{0Fj_=H zkzu9(iL$YPk71h>{Wuz755}UyO9$l-hZvz?beL%u|8R(riA97LZw__bj-3oKTEQqW z;|+JS_78{}p=gx2ktqQud$T+7L80XYs)jKXmq&om58RA4T&0| zU__Ylrct-8*$Gjj7L5`&-gr+tCC2-N|R^~O8(-8N~DCXU?Lh;ZYZ z`N0)6tzdMR@g`!A8X%&YR%)c8(c#7y?%=2q3Py&Rw$p&G)v;k_6YY_;Sw=HDvFPy9 zuKxiMBNU7dGp+I;5HT{bi16agp>A8V(;-GH7$s)B;hxwky!2%w{q^ct|U< z!uU?Z9gA{6C_1ckkbXccI<&~dqQgtO@&`kUNGKw#coRrY`66mjibaVRZ?v0L|5Wti zh1&IK84!#TGa~BOQcT}QvqM`L5ng<=KCnWj6N(Ni-r8_lWvrDJnOJmq@dZ0DT0}yT zVWnB*M0;hM$r#3w@=;F59glT*X;*$wFd~b7>senY7#(I>#XlfoWMUEF#hXLjwqvJ5 zj8-s8%y`3X*8U+;BNUAiH!>waWS#L&{H6r79WI0NOoSQVybrCMDaE40i#H2TteCYD zBNU7dGrnktMvP1>GQ9LYV{U>y?pP+W!nB@be1EXH#Ay3u;rhRSa9Y-3rCs{Np+zPZ z9bQ_MKO9;_LJ?ubn?T*RV<$t4QY=cmc%uz2$s((Z7iyDa-oFSAMu`~_^(zr05{n2g zKBNOHWICbfup*;;5w*0^A`^=aFTP-d3$hL^BB3Bw-rVPlY*MB-^^a9uEV5)==99bX z*;Q4ibyl5SeEK#ktGrnJ^>2Uw;_TVk_2nYH&wgV^-4|8$KA9Bb@jTmDFeCGFXJPbm zwXE`KmQ0I>MKaFovx`>`Szbg%vo8Ma9%+hk2+^4tMqE3^wWER;pxt*ugPC0oSolZlc3I5xYPK$C zWxB}gtT7g6M-bNwO3}DpP{PLbg3`B#mjeqM+Ns6$BEZXmSOj=E;05vGY`n+0k!Ui{ z(zn@e@gKcduJ_$lZT1JvGCq2?TADT8Y|zaX8mPFB%?<~IE;vU5IG@-=IKOe~PrkTI z>Z~l&Nm18nOX2$74xFatT~efX=B%r{nGDYiD0zjzo1nN$1Hdo!?xIjg#UY zP}0}>MO`f0P3ManbNDh9*Exr6frHWC+OU`F`I@AQsR?_f%#O_tcVS{L4J8lexm|LTF1DjDUT*$<>tQq09x7I$ z_E1?0wTB9jlh60*;~;#*pD*+IJS~&-U0#jegETtM%DX65egam0WmCG` z9HxFU|8Kt#T)etTC;8&G{Q@G~BFc(zizqL`Euzc_w}|$-;TF*@_m`IIUDdwH7LzQw zH3eiR{?DxJN1vM-(Nu@^3Oc$jmS&slSxk@ia4zoQQryFpxQ8?30WB2qc!=f!@(|4f z8Ewci6NQ?$U`&_kO$=9*LHn4@PwlOzP`VG z&(8jzEckJHKQ4;I#E|Bbi06_hE<7PP#{=g~65~YG$Fc|T*LKb)Wqw~3i)8VBp0Dn= zdkL`VbjDS6xti3gGE3eTtv7D&d39AT*GI2nF)7WBev3ngxrg+f+2CgHmPKX$|D;%& zJA-7rn(q#+n-kpV^JVdnt+&LU?at9=M>1wjJ#^3_dG|z%%>Ldc!R``sJU6FP=hsHf$Ypn^L*@mHlG&{$6rRfqFfqLnyZ|2IX6eX zt+qy=nkR2QIdr#xa><#a$1wI!qM)X{u*_A9;$aKA!(W?AoR+_KU`(; zN8Ap*cxj5oW3uG8i*$}I9D|IZqj8WibSe%qh7QC*#?VuVQPxxRK$!Ru=m)xN%VQ5o!O7gfZ*c2RNcYZukYzIIW`>}wZQ&%Sn1A?<4y z)zrRrQF-la7ggH6c2UvoYqvxFHRs>l96{G@ZNblz9GJ(LLl2e$&7mhuU)YVgIjv7u zdA(g-!0PnU4yfk&ecRdoOZ(^JrWto$OzyTWE}l)ZrRkV8&o`!L-JZ^Mws#)c-eqKa zSCQ>~Fn=h0Lg%lyy$|NEx4jSMueZGq<`3y5bpCqV`(XZh+xuYtkUdB4H>K&5-${4> ziSy{S>5RKinm;oIbJ<)*jJ|aK<#JZkh3}4{ySHlVY(Q%tlYfz>@O?Ru%0Z*yzw3*A9@(}Op){8 zz=0cY-RN)M1K!zfO-$h}-(0mBeyWIaC*aP< zoq#(ZcLMHw-0kZwe$Dh|W^Z>s?gXOqaVOx;$K8Ia^q$PU_0Hi=z@3jf0e3#`y1R3( z)+WW=T!5M*{Q5Ib<{-Y>U6EhE+5Ec?zjg5GYH?>?Dp|B&9UgD{^1 z9F8ZX_?{3;@jW4$;(HR}=|DyxG4+h;fF~iI4tNsc>3}E1lk>dDJkKzn9h;i>AIxX` zZk|36xpuc}=BvNCd7;+6f412s?A`ex#w2~By?Yd&&DM|`=3$qjQEs-A+%SPp(Ks*H z`*CiVhh3s59nCe*a*z4K_V1i^viZV>vs!Mxv0*-J+xndj=fUk`*VK4rJ`}loA9eJ4 z^UsNSr>9zfzhnJzj_#kPi)0?v>qzENk&a{@Rpv%)UST0$b3 zkC{0K(8tW21Lk99&H?i=Gv|PLlsQh{R5~%=xJ-}lD>}jiI`$u70v-9?k32nojj1lv zC2V7`Uvpe9N>6`p1YE%!=i>Z>#s~oym+~&I>47g8>~T*RT<%S9X)UM}Le@N$7%ys}&NaayJG-Fx}nUXtiI z94&Yqhoi;L`4oEd)w9X_^n)MZXlcuIe!b(#m)_#FE5`8Pd2Hd#fYV_f@pG3E9C+Y6 z-P4;7sx?2n()n|5PFJn@;QsnmkIf{^)BCojcPFkUbsERVoOPWKDK-X{n{QDbW5Q{N znda%e`7TC>H+7shIZO-j`lBIbQPgeU{CD;V+n>(r_|;6OOSt)7xNYif(UyB!GC%ro z_dYSNFFD8fuya>8OI?mw-7IxEO?9)><>1uKQkOGQH%sU^HSifUrx}ht(G&pxe z6L2pJ&JKMH`<{{avFm-3-N$fq@dhTsc^TtAo0_lXCg!Ub_3XWQw`;uGeTwqhIT1GR z3YZ`0m}HmhUxXB}d%i-yn9>KWcY1pn_Vo$$G3-mUUUogb7*2uST)WOz^Skw{U&XtY zI_rq>aY2Z;d+BG}v+z6N{&}^yHScmYKQQs+vxA-Q<${c%B_hZeS|x&vp@kyI7+NcW zjG^Vi*^^WglebBgEh^`|nb+>WO-xr!m7zP<08@y`08@xZXBFu8vG5Ltx_utJgQ0F8 z1n*$zDI#=|bb6Mic~Qpw`NAm1QKCdKj#4Lzaa0nHH*W64yZ(rD6yx#c`~dQJbAG@$ znsfJD^Z03r{y#w2%P3Ohu|}W#Tp%jYy^JEH&Nla^EX?PJm+8aqc`w-MI)&@;kqvyv z5&7jwzq`FYZ07=Vzsnp=bLZ&x`mkl)?e$^Hy4&lacic4>&d0uI8_u18J0Euf?tI({ zxbtzhF9cK?It$@A-Su|o<4zztA9n)oeBAA)O7F?^aVOx;$DM#XA9n)o_PBFi1lmuP z-V4wkce3vGxRZ6a$DOP@A9wqyBFdeBJ0Euf?tI({xbtzhue&S-TAl^h|b5I zfIA;|`>E19kFYpq_aKFB%SSXCh5$_*?xiuau(g0kF)5`e4Ish z=Ho1SA>LchyxG{Z5c@cb9+{7`=+1nc?I%djY4mXx-IHXs)eK>EViurI}Nfqz}2Kx^HRbLHhDk`FH* zk$iahh~&fJqgga1a@XNQ%!k8=m=A{!F&|z&B605JBa#mW>THenpdI;6eDth$P&+2o~7T?e63lXcYM6A9RvHGQm)i)wmzZS9jt%%j{M67-f ztUmd$NLgm{T`k>ztJL|lQ-5pDN{FiT5!jqHFM>5^b&Fu_I_kVVi)zi?^F-wo?E%6# zjbP2;G=epU(+JiaPLVaI{o=97Z?lEk%C*~9h>o*@+S-n@f*RVK_f^bqFPBxe{$la& z(-|Nc9oLgtQLd`wW?nqlU(UR^NN?dQ)13yR&0VL#Xb;zEFxskh8jN;iod% z)3&qz0moy$+T(oD>0!2g%XwiMJ8$P{RVB-GvHQ&k!1kg3$#K5^8Ip&h*zNkerGAJl zB!CcGNCwWAohD^Exij-Zr09p}A|mV?*<{`L6qi?oj=bVNT53Vdli#9b`_-+hOL=;vvJFn76~s ziMcz-oS3)6%%PQAhB+~BhnW*|caS;c&3O*td;oEhE~fL{F5=?T%|BOXqYLwyL$rn+ zW$HYhsmpk#uHu>6%oRFz1k6e}_D=$}ZT{&EJe=OgdD`{5_SJJK=uB2Ug zxr&<>j;{8jitEbDRa{qIu8=EdsWl7TqPYg0r{nDg=GwWRUH3BN6Z3ZDES=w6jSKTr zUiV-r4z=oe`QEvX-`v*Lt9jn`ad-!PvvKbDsdVR5F`k<{&t!9MGym^yw+ZQb!topE zK+F151NWAbyhv+`{={r8rY)mhg?R>fHMQKrSRk8&-ReUxoM_77w;(s?ZVQRn{v z{;2bRz&@IP=T>;NxLcSXO=%H~qcKwqk~$qbPhmbYeLSW=J1-W9kB-C9baxz%X0zjP zG+EA>=kXh3QNP0#$vm37NaoSpMlvrv_nn%hva)<{eqt!#2enZP= z_lex-^L(-SxuW$C&$st2AMN2>+{2}~hbwUp=I3n=^AL?`$U`&_kcVg8X|aTkwXLzEqZ9W_`v}tiX8eoXi-Cd2Q6ag@1R8s{T;MO zp}&I`CG>aDA_SiU=bSxG@5e=9Ibwy=6lKfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO z1AtUO1AtUO1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlO zR6qlOR6qlORA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO z1AtUO1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlOR6qlO zR6qlORA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO1AtUO z1AtUuTf3E1Km&kOKm&kOKm&kOKm&kOKm&kOU|YMDR6qlOR6qlOR6qlOR6qlOR6qlO zRA5`Xl~h0jfK)&OfK)&OfK)&OfK)&OfK*^xyOmTx1AtUO1AtUO1AtUO1AtUO1AtUu zTf3E1Km&kOKm&kOKm&kOKm&kOAOqmQkB=f1*w*ftzh7_w0P3u!0YECC0YECC0YECC z0YECC0YECSt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*CDxd*CDxd*CDxd*C zDxd*CDzL5HN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U-AXE;0YECC0YECC0YECC0YECC z0YECSt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*CDxd*CDxd*CDxd*CDxd*C zDzL5HN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U-AXE;0YECC0YECC0YECC0YECC0YECS zt=&p0paDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*CDxd*CDxd*CDxd*CDxd*CDzL5H zN-CfMKq{aCKq{aCKq{aCKq{aCKq|1U-AXE;0YECC0YECC0YECC0YECC0YECSt=&p0 zpaDQCpaDQCpaDQCpaDQCpaDQCu&v!nDxd*CDxd*CDxd*CDxd*CDxd*CDzL5HN-CfM zKq{aCKq{aCKq{aCKq{aCKq|1U-7(*?33|Uk7ywcMZ3d7EXaJB3XaJB3XaJB3Y-_i0 z5~85> ze|GWd+pMheV)56%{r!uxXJ^-!i}XGVF!e5;sh@zUFKvKTv6?4!QBG#Nz}__fnB1h3 zd~ush^D>*%CazCci@Qbfu!w2%^1;k*RD)R>*Wf3MqO4~zA%0?}Jg&uyx>y2)uPoEc zV)|1t-?9w;{*C?nNwHjJWip-@le?Bt-`Y|0yiUq&TGhoOONw$Q7vS$#cH~ZBNuAHL z#HcJUtF7bF%hj^Vr&%&J8JLW7lQgd$vb>xYHbK!lYcYMC6XLie__&Jg!@S-k&c^{C z(fK&wBRU@kd>}rY^7pjHGoS;NU3-0uG*XAm9LU5R2re zwaAGemIKH^EC-MSbv{Yw$t<1UT#bvmF79dmJlosfT8PVHo>wyy)p(vx?l$|+ zahaR{xeW*ab`C@9NtvXJ>3p|sz4&zV&(+!J!fb8P7PFg;^9VLBBiOi#U}G~MC{2%< zkA5~b^U=@7WzusOoVjT z+ntX)f#`hP3Apodx1TD#C(~Cm1>E_#6L9C_PQcwBcg{Y4KUL5MEnIi9?)JEob+^Zz ztUDif`>7(zoq#(ZcLMHw+zGhzaksC#_%+j;nZ4clxD$xZ$DM#XA9wqy(t9%Z);otg z0e3#`1l;+!3vzc;7R@8&d}6N|F4EhqL;XWT(PI#2*+WCo(~S;8(L)R8;%G9<&4F~9 zq>H!t?%CtDd*Pjy(|loWmUfRYyw6Abnf5(y?q}Kin7E(mOV1;1XCh52g1HYcEeG}N zeN`vp)pUD#aP8d2G*5HakM^_6^^;U^JJ7@I`3gOX?qSqByM65X9>w>t>&vq~W<8nk zOM8Emy;~O5`X+Pp0AKVT>1elmYsH!KY-aBmjY{ItZuiy=Dc0Z*k+zPt&aVzN7$E~1SAGiCum8;3#OpfN( z$E{$rK5hlw`ncUssc4hDx0iCb6?E(4R?w}F+wN|EVb8bKs#@lgyjWGqZJEB!cK1pb zug0Zmh%!gtWm(*oS!KF*KAokDThl6mif&)KC@I41+V7pm#cS=x#cRJz9T%^)8yBzr zhHzZG)-J;Pjm_VOv|L|_)@8bccQdwcdwnPJ^vwrwX?K)|^AB!a;(NFh_i!cd!MQeR zR-q@e6oqLo4^cdLd5Ge{%R>|o4iC+W@q`DYOQU_8?dTjda%Dg;_V&!=hD=(s0c@@RV>nK*fjAG?Y6f0jxvGQ#cE8j)2@;$KPJkD?4 zisP$j_e~xjNXFjy_VVZ~IQv^XRAzg5bQU0zM`uAI zd2}`k`ySB}*lSk3Jc@Yq@+jib%cF=#hsXWxn20(Y9!VY@9!VY@9!Va(Jc?wFmq!tg zULHj}dU-@1oo(@7R%u!P6!A+JF>H4@6a?e$a8wAk-QfVy&Gvz>GoVU$^n4$%9c{i3 z*p4>e2W+GHcJ_=Db2*>9HQ!R&?HMn=xGgt_+vPl6)QP9-^;kP-9*?zy=ImHIvE~OI zX^+K&4z1kF|pixyRZ;$J}G> zpo8wQc76>G%*WdKO(Z+Njb!I{k?j0FlAS+9vh&ACcK$Vzoj*mg^KZb8^NEXlvs^Cf zwAnB&%oD`sIwo1Bi`{!9z{bz)olNsNf^llUtOkZSpLBbe<#m>ryXZ2Vm@j{%+xH5< zNcYKiU2b0gDAK#+p(yMt37tNkc)TU_?Zo3Pp-(3|mgf2G%)DqZUzty+tRLytEfeER z>3TjM8xxW$zg=ucj-IDxf+x*qOqy@pefSYZ^kvodMu!;Q&o90*`?u9%+JLsN>~OrJ zZ>n;_n&3TS@l=B?#DCareQOM>+qsYR+@Kqnzh>M>)^& zj&h#k9pya7JIeWQRdb%>9pya7JIZ;Eca-xS?M>)^&j&h#k9pya7JIZ<6$*hs{9PcRSIo?subG)OR z=Xggs&+(3O-gYu; zM>)^&j&k01GHc{K$2-b-j(3#v9PcRSIo?subG)ORx1G!yInVKqa-QQIpFiLo<-G0Uj`n@p z1Kv^2bG)OR=Xggs&+(4xyzOL`M>)^&j&h#k9pya7JIZ<6$*hs{9PcRS zIo?subG)OR=Xggs&+(3O-gYu;;mD znByJgJjXlAd5(9K^BnIe=Q-X{&f89AjhyFrM>)^&j&h#k9pya7JIZ;Eca-zClUXC@ zIo?subG)OR=Xggs&+(3Op5qM>%ghnKg2r z;~nKZ$2-b-j(3#v9PcRSIo?su+fHVUoacB)InVKqa-QQIM>)^&j&h#k9p$|3WY)-ej(3#v9PcRSIo?subG)OR=XggsZ#$Vaa-QQI zqyWfsE^riZ%+p>75XXqu8PQXD?Fz?d(O$zn#5E`M0wdDgQ1b=ikm=r2O02iQXD?Fz z?d(O$zn#5E`M0wdDgUk_=ikm=r2O02iQXD?Fz?d(O$zn#5E`M0wdDgUk` z=ikm=r2O02iQXD?Fz?d(O$zn#5E`M0wdDgT~D&cB_#Ncp$37b*XC_9Erq z&R(Sa+u4hhe>;1T@^5Dk<=@x#{5vW0`^ubvm-BRSS8dP0;N0?SJFcqBe7Ve~$uuqR zk|MoJ9*SbR9e@4#GM~@WGD+X%)#!a(bMNAs`w5u)tqt}eeP<$l$kKY2mF9mmgY1KB{&fr;5E{w-AohJ|Je4gB-i|tfjyxjczX=WK_UY=>8Dhi5*A=tjR!(s((PaOmYw!l9Q#35O1cBeo7X4jm3T4jm3T4!s;o zB#ooP{Rkx-dO4JE=;aVO{F%ERnr&2--`aiD{tpy`MeaB&X#aGa6|`+S&I;Ns9cKld zqK>nI&Q4!gj{dy5%f`jKmQBw0cEIjXGBNw~@_oROB*+-r0tOjF+rd{h%s=P1Rr;`< zmP5}gugk(b|MVONj<9xq5!2dbRBKmJtzAd8_AIKkGiwc1lrT;sSaUdyV9nt)f;ETJ z2-X}u(SK z_eD|GGv6On#cKNphdn%Gj~+(<(0EuDRo&dffDP#YLqR)q*-$>I%tdMqcpDfkGO_6J za#@>8?T>>Nkx)cf@g~r~ikMO?O1yZZJ*_h4h1w*U_b-BjQDR0!{pf*SueH)U?Hlz= z6lD=!e6v2VLZ%an4lCXi3|78~T3Tt5iA9GOU$6tCMI;m%R(hW(A5-w7I8p}1qQgtO z@`HkrDPwI(CKQYgGp*tu5HT{bi16agp>Er;(;-GH7$s)B;Wlgkkf;%gMu{7l5+Jh9 zcqhKw;W8-CM40i-`_RgnQY<>Wc(d@tidic$Lc!=T||(BibaVRZ?v0x z7FtdsF$l5HU8J$>kcxl)F zfQS(aMu(YJ`45N~nOH=4@#avst=Z`iqZN!2Gv07dY?bk1?ReM>N;D;IWJ-X@2B4i9 znP5bi@j)G0Ia7*7hZk=ao>(z!B}OP19cFyd4viR@SY&wVe=ch*;4@}386P~P60vEsO{+zF8kwA=3#(hZS#aIIS|)N{dV^I=uLT9T+Vlp~$e( zEOMf~vdv@+<4E}^r{j*tI=r+iKPVWHMZfi|FBFUpGp*tu5HT{bi16agp>Er;(;-GH z7$s)B;Wlgkkf;%gMu{7l5+Jh9cqe{S0@@CjL3t*^jBnnDR?d`S(c#6Lg(p_bT8R+~ zMu!<+v_m6CCKef9dY>^j!5()k6Io$ePcptg*j!??eX?-<-#<7l>#));{o&9e6N?Tn zt;!z`Eh3?au;NXiZribwp+zYcC0@MI2A5=!)x`_7Niy$W1P7zUjEMS`h!KfJgcl#u zffX{HP;^+4QND;;T4|AqMTZw(u)zgchZd1g5G!x)^F=l()0_IoaZygQG8xZ{$=$Q7 zs!r>yx;}i^%hIa$9kDtVu(r;g^?(2142CEfS{w>|bddWn2$2ayfsuBl4}%bqIO6l+ z&6^>WETup+81aU>S=diPBVL?c&x`?)XmBDT_xKBYJ0&84#An0@b4X=NCk_QZyqR}G zMXQw%nLrd6@kKf$LPX*a;GvkC=?A=WHcXtJ@HQYM)Uo< zRS#@d;&bAg@j(?Yr9c!I@h0CXm9ADwgd$Pk#24zID3J+7fRWy(#Z9Egow4GtB&{bC z-ydvlA=A2N84N9~k(cr`z>nZ8P3$#fu?_Y$6qQQ!c=HoB%-YM_6=?c+&d`^5bKB(fQ6o>*N z-sB6{dwi9&QX&+I0w=yu2StfYAOegu3PphxU#!C-MJN&hPTDs3?N1w9Iyg7^Ie_EihO>|1 z^cWOL{6*fEI?c-1Ub=!J(NIa>Zq$=eiAW&v8S$o0w{2HYZpBxLRwNpncw^n%51+k4i#1IaP0dXks(Lw70fyCbg$2ckm1fsx5yVL{XP#{Dkj`)0d1<-M;brOUq z1){--H`L9#J`hS|BGKSPMDFp+mUqH8a&Nuh3dpVajQHkzNM%bW4h25EnRh}(tCbL$ zKol79MLHxxMB)(Oqp6#RZxOpytjEk7{^2kv5Culsr5+SX{AE4D@h~V71x{Mk9u$ZI zB{G4;XT&RlK@~2oNHjR{#@ejzC!!NC&?ddSe-R#v1}id}k6*mJQ@+uB+c7aHz2bA? zoAE&vFQq^f81W`wxZdNdq?Hn(NEA5ng*qroWC9Ujr1xoY6Y1~|iy?6+@X@aIkU#{A zR$F4p1fsx5tJDWVh)5jq`S9jVx2@J`5TX=_1|!~3n{|CCl*mM)!HJ06eYr^QvtQUj(po;rx$p|LOe4xBqnhQmwk^L`i{ht)& z;$~hvWaYN-gPQ(3XUr_GvUxU5mc=};X6Ap4=jr6Gs?9IwwpjVbTA8NhT~efXiCL=h zvf2(Dy<9D;e3~WG;$gGMT)cY7@^V@vc0mFd<5)izwSFmT{VJaIk?6c1upV*V4_J>l z?+2`-dHA80tJ z4$6nq;c(X02)+LA9beTNYCL-Uw4c=mMUO~0V(fUu(ecvkl;}~4N0A?I#G5;tVG$$~ zkRn4O6+vu!;GO=Cj{^b{PK+Pl><_TO>4c-ljyD}oue`O=BNLAvKfZtmNRLQ3a_lsP zw$I7*F&#geqiIk)di=CkgP?%KHV2f~lh#T7!D(BMq1J*hFoI;_5#z@zkZ#+z(;`SK zAVr3}Avb%3p;06hks?PjWkGBm@)FSPkQ$V8Vhs7_e~4vHDIPt3ycv0dMXr?~p@8%l z@6f@IRUiOV%zK(2i1Uh z^!RD71_9yd(IXO$7&~5Zblkq35BkGVNjUFc1P7$ZkVr*PBuFG4 zF@Ah#2Uy^A!qH<#rW%N;r}^M~vi}MPq*6kn2z`{YBM3j zIhqE=qsLEsH3$kwPCso4Clrt#L#+j2Us7FdGU5U zq6S5z$dOE05L<`ZDUu0Dj3FP~A(lC%c=Y)3X5bQjqiARs0)@l$EjvhTC;fS&0 z6-T%2+ey)*6ptc5-iS|c_3^?TVts25NTec&6*#4M#1!P4{Q(v@opAKn@uuVHmA6)U zWa81|#~1Jb=@AJBvGe79zQ`tJdQ<;+J5Q@BS*DBZ*;Q4ibyl5SeEK#ktGrnJ^>2Uw z;_TVk_2nYH&%U!`CbPWC=GiovX4$fun?WsOzj4N{>SR(Zmsy#Zk>l;a>z~^{G2ZKZ zlFpM^I={IZ7j<3S15iB-U)04CSp9{?Qkp2uw3z9dCe2iB0fV7V7|V2?B}ICdJQT%r zJM8-NWj>#$Ws<(jtI_)?R^COi@)NM~D?1ta;wG!=W=71fj3(nUpWId3$l8aelXQ}& z$+FC*(#@QUmu9M~dTqDLZx`tt?K2!a#~D12jqozI!K>H?uVWj07Te(S*alz3 zHux&G!Pl`3ei_@~o7e`wj&1PU*ap9gZSZ?w&{?s@>HWAUlDbTn)1oN1h4kXHXk+>d&JUBcEd2o0T^5Eqm3e%1r_G5_R!OKGw4_+RShu_%kcJVHs=0BP3 z_U^p3IXG<>3Q+%@gW7$%xGjsfS@K{W^ELbG?bwS~H)b=wxJ~R@6W1KtZ3m)5d+k7T zXr~=$4(+o8&7ocPw>CG*^kI999?y%(-IiBC;=!zndJ>P}!E+>cLZ21o!o*&h3xY18 zzqXS$&a%2Jih4U)7gt6d5A_TkH9HJNY2INdO6d+mQTlcmic+=1P?VM(hN5F$hoR^| z_iM}RJindQ$!(dwPbTSNYOY-->D}&5YIHF-+h-t*nC11_{~E?F&pzG! zb9Ls$($&g&6f2ietXxI0vYD5@v%8s>zE(E#($~snUXT^%XkZd0tJW#AzGW(i7Q`yFOIhn1m zeiyA*$6wj1dRxq=<{qR>^ZB-@j{af&Psuc`)8>BU;>G5lcXubC;`g(P*y(2#vC_{f zVxyl`w1Mbn740pKvN{sUfjz5Ha$wJDlpNTz8YKtztVYR!J*y}OerD^y*2sUJrEfF4*M4ET5vtrg*%0FtE6a3Z zdZ5y+uDV~{_b`d(x`#?Y>%q3cqdZ0w>l5=HldhsTAhV5NLUAN|{U)oxFW6r&g zx8lvio||;BOPH6N+w#^&J%Q#>t^}Gxc@k(2<%qM#c-$4-WQ$3b+&b-yPg*fP&&|GT7Sm%zke?F46e<^JLO4$AxvX6EsvF1OLeK`M-?8EtwWdG^>kDQhpiTsam z|LOe4xBqnh<$v&L_NcQ3UBm2(AG<&x!Dzo}N_NAKxO>0NHbMx|$ zzB_L0AML6=Gq*O$=JDltzS=wl+O?W@>B@JWXgscBg6)Lu9-OwFpoYbE4^G>TkO!x2 zN63TIKDF-wDLQmwk$vYNH8Bmzm3dw3gZC+bVs=L*E*Ot)zjy}K?x^E3Ih3;AdOrd+$08{7=KEM>Zdv|+E zihFbXH_usi_vK$sw*M-*F>h;|$Hi|m_&)OSmJol(TSD|5Zwaw?yd^~5@s{FohuY7N z$Ar4kkGF*0EB>9WEt{LA$Cjmab&U7ngjilYMe>CW#MH>;PF>gQe@fEZ3~gCj2O


%dZ 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 tkN-TOFaY3gNB4c}MWuGpjX`9J0TzsUdq literal 0 HcmV?d00001 diff --git a/legacyver/block_translator.go b/legacyver/block_translator.go new file mode 100644 index 0000000..78624b2 --- /dev/null +++ b/legacyver/block_translator.go @@ -0,0 +1,340 @@ +package legacyver + +import ( + "bytes" + _ "embed" + "github.com/akmalfairuz/legacy-version/internal/chunk" + "github.com/akmalfairuz/legacy-version/mapping" + "github.com/df-mc/dragonfly/server/block/cube" + "github.com/df-mc/dragonfly/server/world" + "github.com/sandertv/gophertunnel/minecraft" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +const ( + BlockVersionLatest int32 = (1 << 24) | (21 << 16) | (50 << 8) | 29 +) + +var ( + //go:embed block_states_766.nbt + latestBlockStateData []byte + + // latestBlockMapping is the BlockMapping used for translating blocks between versions. + latestBlockMapping = mapping.NewBlockMapping(latestBlockStateData) + // LatestNetworkPersistentEncoding is the Encoding used for sending a Chunk over network. It uses NBT, unlike NetworkEncoding. + LatestNetworkPersistentEncoding = chunk.NewNetworkPersistentEncoding(latestBlockMapping, BlockVersionLatest) + // LatestBlockPaletteEncoding is the paletteEncoding used for encoding a palette of block states encoded as NBT. + LatestBlockPaletteEncoding = chunk.NewBlockPaletteEncoding(latestBlockMapping, BlockVersionLatest) +) + +type BlockTranslator interface { + // DowngradeBlockPackets downgrades the input block packets to legacy block packets. + DowngradeBlockPackets([]packet.Packet, *minecraft.Conn) (result []packet.Packet) + // UpgradeBlockPackets upgrades the input block packets to the latest block packets. + UpgradeBlockPackets([]packet.Packet, *minecraft.Conn) (result []packet.Packet) +} + +type DefaultBlockTranslator struct { + mapping mapping.Block + latest mapping.Block + pse chunk.Encoding + pe chunk.PaletteEncoding + oldFormat bool +} + +func NewBlockTranslator(mapping mapping.Block, latestMapping mapping.Block, pse chunk.Encoding, pe chunk.PaletteEncoding, oldFormat bool) *DefaultBlockTranslator { + return &DefaultBlockTranslator{mapping: mapping, latest: latestMapping, pse: pse, pe: pe, oldFormat: oldFormat} +} + +func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn *minecraft.Conn) (result []packet.Packet) { + for _, pk := range pks { + switch pk := pk.(type) { + case *packet.LevelChunk: + count := int(pk.SubChunkCount) + if count == protocol.SubChunkRequestModeLimitless || count == protocol.SubChunkRequestModeLimited { + break + } + + buf := bytes.NewBuffer(pk.RawPayload) + writeBuf := bytes.NewBuffer(nil) + if !pk.CacheEnabled { + c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, world.Overworld.Range(), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding) + if err != nil { + //fmt.Println(err) + break + } + c = t.DowngradeChunk(c) + + payload, err := chunk.NetworkEncode(t.mapping.Air(), c, t.oldFormat, t.pe) + if err != nil { + //fmt.Println(err) + break + } + writeBuf.Write(payload) + pk.SubChunkCount = uint32(len(c.Sub())) + } + safeBytes := buf.Bytes() + + countBorder, err := buf.ReadByte() + if err != nil { + pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) + break + } + borderBytes := make([]byte, countBorder) + if _, err = buf.Read(borderBytes); err != nil { + pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) + break + } + writeBuf.WriteByte(countBorder) + writeBuf.Write(borderBytes) + + enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian) + dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian) + for { + var decNbt map[string]any + if err = dec.Decode(&decNbt); err != nil { + break + } + t.mapping.DowngradeBlockActorData(decNbt) + + if err = enc.Encode(decNbt); err != nil { + break + } + } + pk.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...) + case *packet.SubChunk: + r := world.Overworld.Range() + if t.oldFormat { + r = cube.Range{0, 255} + } + + for i, entry := range pk.SubChunkEntries { + if entry.Result == protocol.SubChunkResultSuccess { + buf := bytes.NewBuffer(entry.RawPayload) + writeBuf := bytes.NewBuffer(nil) + if !pk.CacheEnabled && !conn.ClientCacheEnabled() { + ind := byte(i) + subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding) + if err != nil { + //fmt.Println(err) + continue + } + t.DowngradeSubChunk(subChunk) + writeBuf.Write(chunk.EncodeSubChunk(subChunk, chunk.NetworkEncoding, t.pe, chunk.SubChunkVersion9, r, int(ind))) + } + + enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian) + dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian) + for { + var decNbt map[string]any + if err := dec.Decode(&decNbt); err != nil { + break + } + t.mapping.DowngradeBlockActorData(decNbt) + + if err := enc.Encode(decNbt); err != nil { + break + } + } + + entry.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...) + pk.SubChunkEntries[i] = entry + } + } + case *packet.ClientCacheMissResponse: + r := world.Overworld.Range() + if t.oldFormat { + r = cube.Range{0, 255} + } + + for i, blob := range pk.Blobs { + buf := bytes.NewBuffer(blob.Payload) + ind := byte(0) + subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding) + if err != nil { + // Has a possibility to be a biome, ignore then + continue + } + t.DowngradeSubChunk(subChunk) + + blob.Payload = append(chunk.EncodeSubChunk(subChunk, chunk.NetworkEncoding, t.pe, chunk.SubChunkVersion9, r, int(ind)), buf.Bytes()...) + pk.Blobs[i] = blob + } + case *packet.UpdateSubChunkBlocks: + for i, block := range pk.Blocks { + block.BlockRuntimeID = t.DowngradeBlockRuntimeID(block.BlockRuntimeID) + pk.Blocks[i] = block + } + for i, block := range pk.Extra { + block.BlockRuntimeID = t.DowngradeBlockRuntimeID(block.BlockRuntimeID) + pk.Extra[i] = block + } + case *packet.UpdateBlock: + pk.NewBlockRuntimeID = t.DowngradeBlockRuntimeID(pk.NewBlockRuntimeID) + case *packet.UpdateBlockSynced: + pk.NewBlockRuntimeID = t.DowngradeBlockRuntimeID(pk.NewBlockRuntimeID) + case *packet.InventoryTransaction: + if transactionData, ok := pk.TransactionData.(*protocol.UseItemTransactionData); ok { + transactionData.BlockRuntimeID = t.DowngradeBlockRuntimeID(transactionData.BlockRuntimeID) + pk.TransactionData = transactionData + } + case *packet.LevelEvent: + switch pk.EventType { + case packet.LevelEventParticleLegacyEvent | 20: // terrain + fallthrough + case packet.LevelEventParticlesDestroyBlock: + fallthrough + case packet.LevelEventParticlesDestroyBlockNoSound: + pk.EventData = int32(t.DowngradeBlockRuntimeID(uint32(pk.EventData))) + case packet.LevelEventParticlesCrackBlock: + face := pk.EventData >> 24 + rid := t.DowngradeBlockRuntimeID(uint32(pk.EventData & 0xffff)) + pk.EventData = int32(rid) | (face << 24) + } + case *packet.LevelSoundEvent: + switch pk.SoundType { + case packet.SoundEventBreak: + fallthrough + case packet.SoundEventPlace: + fallthrough + case packet.SoundEventHit: + fallthrough + case packet.SoundEventLand: + fallthrough + case packet.SoundEventItemUseOn: + pk.ExtraData = int32(t.DowngradeBlockRuntimeID(uint32(pk.ExtraData))) + } + case *packet.AddActor: + if pk.EntityType == "minecraft:falling_block" { + pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) + } + case *packet.SetActorData: + pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) + case *packet.StartGame: + t.latest.Adjust(pk.Blocks) + t.mapping.Adjust(pk.Blocks) + case *packet.ResourcePackStack: + var packs []protocol.StackResourcePack + for _, pack := range pk.TexturePacks { + if pack.UUID == "0fba4063-dba1-4281-9b89-ff9390653530" { + continue + } + packs = append(packs, pack) + } + pk.TexturePacks = packs + } + result = append(result, pk) + } + return result +} + +func (t *DefaultBlockTranslator) UpgradeBlockPackets(pks []packet.Packet, conn *minecraft.Conn) (result []packet.Packet) { + for _, pk := range pks { + switch pk := pk.(type) { + case *packet.InventoryTransaction: + if transactionData, ok := pk.TransactionData.(*protocol.UseItemTransactionData); ok { + transactionData.BlockRuntimeID = t.UpgradeBlockRuntimeID(transactionData.BlockRuntimeID) + pk.TransactionData = transactionData + } + case *packet.SetActorData: + pk.EntityMetadata = t.upgradeEntityMetadata(pk.EntityMetadata) + } + result = append(result, pk) + } + return result +} + +func (t *DefaultBlockTranslator) DowngradeBlockRuntimeID(input uint32) uint32 { + if t.latest == t.mapping { + return input + } + state, ok := t.latest.RuntimeIDToState(input) + if !ok { + return t.mapping.Air() + } + runtimeID, ok := t.mapping.StateToRuntimeID(state) + if !ok { + return t.mapping.Air() + } + return runtimeID +} + +func (t *DefaultBlockTranslator) DowngradeChunk(input *chunk.Chunk) *chunk.Chunk { + if t.latest == t.mapping { + return input + } + + start := 0 + r := world.Overworld.Range() + if t.oldFormat { + start = 4 + r = cube.Range{0, 255} + } + downgraded := chunk.New(t.mapping.Air(), r) + + i := 0 + // First downgrade the blocks. + for _, sub := range input.Sub()[start : len(input.Sub())-start] { + t.DowngradeSubChunk(sub) + downgraded.Sub()[i] = sub + i += 1 + } + i = 0 + // Then downgrade the biome ids. + for _, sub := range input.BiomeSub()[start : len(input.BiomeSub())-start] { + // todo + sub.Palette().Replace(func(v uint32) uint32 { + return 0 // at least the client doesn't crash now + }) + downgraded.BiomeSub()[i] = sub + i += 1 + } + + return downgraded +} + +func (t *DefaultBlockTranslator) DowngradeSubChunk(input *chunk.SubChunk) { + if t.latest == t.mapping { + return + } + for _, storage := range input.Layers() { + storage.Palette().Replace(t.DowngradeBlockRuntimeID) + } +} + +func (t *DefaultBlockTranslator) downgradeEntityMetadata(metadata map[uint32]any) map[uint32]any { + if t.latest == t.mapping { + return metadata + } + if latestRID, ok := metadata[protocol.EntityDataKeyVariant]; ok { + metadata[protocol.EntityDataKeyVariant] = int32(t.DowngradeBlockRuntimeID(uint32(latestRID.(int32)))) + } + return metadata +} + +func (t *DefaultBlockTranslator) UpgradeBlockRuntimeID(input uint32) uint32 { + if t.latest == t.mapping { + return input + } + state, ok := t.mapping.RuntimeIDToState(input) + if !ok { + return t.latest.Air() + } + runtimeID, ok := t.latest.StateToRuntimeID(state) + if !ok { + return t.latest.Air() + } + return runtimeID +} + +func (t *DefaultBlockTranslator) upgradeEntityMetadata(metadata map[uint32]any) map[uint32]any { + if t.latest == t.mapping { + return metadata + } + if latestRID, ok := metadata[protocol.EntityDataKeyVariant]; ok { + metadata[protocol.EntityDataKeyVariant] = int32(t.UpgradeBlockRuntimeID(uint32(latestRID.(int32)))) + } + return metadata +} diff --git a/legacyver/item_runtime_ids_748.nbt b/legacyver/item_runtime_ids_748.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e1eb29e8491d10cabdb133424de52201b12f7115 GIT binary patch literal 50902 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 b{BbfpWF8z`0g> 16, MetadataValue: uint32(value & 0xf)}) + pk.EventData = (itemType.NetworkID << 16) | int32(itemType.MetadataValue) + } + case *packet.AddItemActor: + pk.Item = t.DowngradeItemInstance(pk.Item) + case *packet.AddPlayer: + pk.HeldItem = t.DowngradeItemInstance(pk.HeldItem) + case *packet.InventorySlot: + pk.NewItem = t.DowngradeItemInstance(pk.NewItem) + case *packet.InventoryContent: + pk.Content = lo.Map(pk.Content, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + return t.DowngradeItemInstance(item) + }) + case *packet.ItemStackRequest: + for i, request := range pk.Requests { + for i2, action := range request.Actions { + if act, ok := action.(*protocol.CraftResultsDeprecatedStackRequestAction); ok { + act.ResultItems = lo.Map(act.ResultItems, func(item protocol.ItemStack, _ int) protocol.ItemStack { + return t.DowngradeItemStack(item) + }) + pk.Requests[i].Actions[i2] = act + } + } + } + case *packet.CraftingData: + for i, recipe := range pk.Recipes { + switch recipe := recipe.(type) { + case *protocol.ShapelessRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.DowngradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.DowngradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapedRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.DowngradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.DowngradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.FurnaceRecipe: + recipe.InputType = t.DowngradeItemType(recipe.InputType) + recipe.Output = t.DowngradeItemStack(recipe.Output) + pk.Recipes[i] = recipe + case *protocol.FurnaceDataRecipe: + recipe.InputType = t.DowngradeItemType(recipe.InputType) + recipe.Output = t.DowngradeItemStack(recipe.Output) + pk.Recipes[i] = recipe + case *protocol.ShulkerBoxRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.DowngradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.DowngradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapelessChemistryRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.DowngradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.DowngradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapedChemistryRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.DowngradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.DowngradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.SmithingTransformRecipe: + recipe.Template = t.DowngradeItemDescriptorCount(recipe.Template) + recipe.Base = t.DowngradeItemDescriptorCount(recipe.Base) + recipe.Addition = t.DowngradeItemDescriptorCount(recipe.Addition) + recipe.Result = t.DowngradeItemStack(recipe.Result) + pk.Recipes[i] = recipe + case *protocol.SmithingTrimRecipe: + recipe.Template = t.DowngradeItemDescriptorCount(recipe.Template) + recipe.Base = t.DowngradeItemDescriptorCount(recipe.Base) + recipe.Addition = t.DowngradeItemDescriptorCount(recipe.Addition) + } + } + for i, recipe := range pk.PotionRecipes { + itemType := t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.InputPotionID, MetadataValue: uint32(recipe.InputPotionMetadata)}) + recipe.InputPotionID, recipe.InputPotionMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + itemType = t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.ReagentItemID, MetadataValue: uint32(recipe.ReagentItemMetadata)}) + recipe.ReagentItemID, recipe.ReagentItemMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + itemType = t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.OutputPotionID, MetadataValue: uint32(recipe.OutputPotionMetadata)}) + recipe.OutputPotionID, recipe.OutputPotionMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + pk.PotionRecipes[i] = recipe + } + for i, recipe := range pk.PotionContainerChangeRecipes { + itemType := t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.InputItemID}) + recipe.InputItemID = itemType.NetworkID + itemType = t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.ReagentItemID}) + recipe.ReagentItemID = itemType.NetworkID + itemType = t.DowngradeItemType(protocol.ItemType{NetworkID: recipe.OutputItemID}) + recipe.OutputItemID = itemType.NetworkID + pk.PotionContainerChangeRecipes[i] = recipe + } + for i, recipe := range pk.MaterialReducers { + recipe.InputItem = t.DowngradeItemType(recipe.InputItem) + for i2, output := range recipe.Outputs { + itemType := t.DowngradeItemType(protocol.ItemType{NetworkID: output.NetworkID}) + output.NetworkID = itemType.NetworkID + recipe.Outputs[i2] = output + } + pk.MaterialReducers[i] = recipe + } + //case *packet.CraftingEvent: + // pk.Input = lo.Map(pk.Input, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + // return t.DowngradeItemInstance(item) + // }) + // pk.Output = lo.Map(pk.Output, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + // return t.DowngradeItemInstance(item) + // }) + case *packet.PlayerAuthInput: + for i, action := range pk.ItemStackRequest.Actions { + if act, ok := action.(*protocol.CraftResultsDeprecatedStackRequestAction); ok { + act.ResultItems = lo.Map(act.ResultItems, func(item protocol.ItemStack, _ int) protocol.ItemStack { + return t.DowngradeItemStack(item) + }) + pk.ItemStackRequest.Actions[i] = act + } + } + for i, action := range pk.ItemInteractionData.Actions { + action.OldItem = t.DowngradeItemInstance(action.OldItem) + action.NewItem = t.DowngradeItemInstance(action.NewItem) + pk.ItemInteractionData.Actions[i] = action + } + pk.ItemInteractionData.HeldItem = t.DowngradeItemInstance(pk.ItemInteractionData.HeldItem) + case *packet.CreativeContent: + for i, creativeItem := range pk.Items { + creativeItem.Item = t.DowngradeItemStack(creativeItem.Item) + + pk.Items[i] = creativeItem + } + case *packet.InventoryTransaction: + for i, action := range pk.Actions { + action.OldItem = t.DowngradeItemInstance(action.OldItem) + action.NewItem = t.DowngradeItemInstance(action.NewItem) + pk.Actions[i] = action + } + switch transactionData := pk.TransactionData.(type) { + case *protocol.UseItemTransactionData: + transactionData.HeldItem = t.DowngradeItemInstance(transactionData.HeldItem) + for i, action := range transactionData.Actions { + action.OldItem = t.DowngradeItemInstance(action.OldItem) + action.NewItem = t.DowngradeItemInstance(action.NewItem) + transactionData.Actions[i] = action + } + case *protocol.UseItemOnEntityTransactionData: + transactionData.HeldItem = t.DowngradeItemInstance(transactionData.HeldItem) + case *protocol.ReleaseItemTransactionData: + transactionData.HeldItem = t.DowngradeItemInstance(transactionData.HeldItem) + } + case *packet.LevelEvent: + if pk.EventType == packet.LevelEventParticleLegacyEvent|14 { // egg crack + itemType := t.DowngradeItemType(protocol.ItemType{ + NetworkID: pk.EventData >> 16, + MetadataValue: uint32(pk.EventData & 0xf), + }) + pk.EventData = (itemType.NetworkID << 16) | int32(itemType.MetadataValue) + } + case *packet.StartGame: + for i, entry := range pk.Items { + if !entry.ComponentBased { + itemType := t.DowngradeItemType(protocol.ItemType{ + NetworkID: int32(entry.RuntimeID), + MetadataValue: 0, + }) + if itemType.NetworkID == t.mapping.Air() { + removeIndex(pk.Items, i) + continue + } + entry.RuntimeID = int16(itemType.NetworkID) + + var ok bool + if entry.Name, ok = t.mapping.ItemRuntimeIDToName(itemType.NetworkID); !ok { + panic(itemType) + } + } else { + t.latest.RegisterEntry(entry.Name) + entry.RuntimeID = int16(t.mapping.RegisterEntry(entry.Name)) + } + pk.Items[i] = entry + } + for rid, i := range t.CustomItems() { + name, _ := i.EncodeItem() + pk.Items = append(pk.Items, protocol.ItemEntry{ + Name: name, + RuntimeID: int16(rid), + ComponentBased: true, + }) + } + case *packet.ItemComponent: + for _, i := range t.CustomItems() { + name, _ := i.EncodeItem() + pk.Items = append(pk.Items, protocol.ItemComponentEntry{ + Name: name, + Data: packbuilder.Components(i), + }) + } + } + result = append(result, pk) + } + return result +} + +func (t *DefaultItemTranslator) UpgradeItemPackets(pks []packet.Packet, _ *minecraft.Conn) (result []packet.Packet) { + for _, pk := range pks { + switch pk := pk.(type) { + case *packet.MobEquipment: + pk.NewItem = t.UpgradeItemInstance(pk.NewItem) + case *packet.MobArmourEquipment: + pk.Helmet = t.UpgradeItemInstance(pk.Helmet) + pk.Chestplate = t.UpgradeItemInstance(pk.Chestplate) + pk.Leggings = t.UpgradeItemInstance(pk.Leggings) + pk.Boots = t.UpgradeItemInstance(pk.Boots) + pk.Body = t.UpgradeItemInstance(pk.Body) + case *packet.AddItemActor: + pk.Item = t.UpgradeItemInstance(pk.Item) + case *packet.AddPlayer: + pk.HeldItem = t.UpgradeItemInstance(pk.HeldItem) + case *packet.InventorySlot: + pk.NewItem = t.UpgradeItemInstance(pk.NewItem) + case *packet.InventoryContent: + pk.Content = lo.Map(pk.Content, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + return t.UpgradeItemInstance(item) + }) + case *packet.ItemStackRequest: + for i, request := range pk.Requests { + for i2, action := range request.Actions { + if act, ok := action.(*protocol.CraftResultsDeprecatedStackRequestAction); ok { + act.ResultItems = lo.Map(act.ResultItems, func(item protocol.ItemStack, _ int) protocol.ItemStack { + return t.UpgradeItemStack(item) + }) + pk.Requests[i].Actions[i2] = act + } + } + } + case *packet.CraftingData: + for i, recipe := range pk.Recipes { + switch recipe := recipe.(type) { + case *protocol.ShapelessRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.UpgradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.UpgradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapedRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.UpgradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.UpgradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.FurnaceRecipe: + recipe.InputType = t.UpgradeItemType(recipe.InputType) + recipe.Output = t.UpgradeItemStack(recipe.Output) + pk.Recipes[i] = recipe + case *protocol.FurnaceDataRecipe: + recipe.InputType = t.UpgradeItemType(recipe.InputType) + recipe.Output = t.UpgradeItemStack(recipe.Output) + pk.Recipes[i] = recipe + case *protocol.ShulkerBoxRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.UpgradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.UpgradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapelessChemistryRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.UpgradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.UpgradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.ShapedChemistryRecipe: + for i2, input := range recipe.Input { + recipe.Input[i2] = t.UpgradeItemDescriptorCount(input) + } + for i2, stack := range recipe.Output { + recipe.Output[i2] = t.UpgradeItemStack(stack) + } + pk.Recipes[i] = recipe + case *protocol.SmithingTransformRecipe: + recipe.Template = t.UpgradeItemDescriptorCount(recipe.Template) + recipe.Base = t.UpgradeItemDescriptorCount(recipe.Base) + recipe.Addition = t.UpgradeItemDescriptorCount(recipe.Addition) + recipe.Result = t.UpgradeItemStack(recipe.Result) + pk.Recipes[i] = recipe + case *protocol.SmithingTrimRecipe: + recipe.Template = t.UpgradeItemDescriptorCount(recipe.Template) + recipe.Base = t.UpgradeItemDescriptorCount(recipe.Base) + recipe.Addition = t.UpgradeItemDescriptorCount(recipe.Addition) + } + } + for i, recipe := range pk.PotionRecipes { + itemType := t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.InputPotionID, MetadataValue: uint32(recipe.InputPotionMetadata)}) + recipe.InputPotionID, recipe.InputPotionMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + itemType = t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.ReagentItemID, MetadataValue: uint32(recipe.ReagentItemMetadata)}) + recipe.ReagentItemID, recipe.ReagentItemMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + itemType = t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.OutputPotionID, MetadataValue: uint32(recipe.OutputPotionMetadata)}) + recipe.OutputPotionID, recipe.OutputPotionMetadata = itemType.NetworkID, int32(itemType.MetadataValue) + pk.PotionRecipes[i] = recipe + } + for i, recipe := range pk.PotionContainerChangeRecipes { + itemType := t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.InputItemID}) + recipe.InputItemID = itemType.NetworkID + itemType = t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.ReagentItemID}) + recipe.ReagentItemID = itemType.NetworkID + itemType = t.UpgradeItemType(protocol.ItemType{NetworkID: recipe.OutputItemID}) + recipe.OutputItemID = itemType.NetworkID + pk.PotionContainerChangeRecipes[i] = recipe + } + for i, recipe := range pk.MaterialReducers { + recipe.InputItem = t.UpgradeItemType(recipe.InputItem) + for i2, output := range recipe.Outputs { + itemType := t.UpgradeItemType(protocol.ItemType{NetworkID: output.NetworkID}) + output.NetworkID = itemType.NetworkID + recipe.Outputs[i2] = output + } + pk.MaterialReducers[i] = recipe + } + //case *packet.CraftingEvent: + // pk.Input = lo.Map(pk.Input, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + // return t.UpgradeItemInstance(item) + // }) + // pk.Output = lo.Map(pk.Output, func(item protocol.ItemInstance, _ int) protocol.ItemInstance { + // return t.UpgradeItemInstance(item) + // }) + case *packet.PlayerAuthInput: + for i, action := range pk.ItemStackRequest.Actions { + if act, ok := action.(*protocol.CraftResultsDeprecatedStackRequestAction); ok { + act.ResultItems = lo.Map(act.ResultItems, func(item protocol.ItemStack, _ int) protocol.ItemStack { + return t.UpgradeItemStack(item) + }) + pk.ItemStackRequest.Actions[i] = act + } + } + for i, action := range pk.ItemInteractionData.Actions { + action.OldItem = t.UpgradeItemInstance(action.OldItem) + action.NewItem = t.UpgradeItemInstance(action.NewItem) + pk.ItemInteractionData.Actions[i] = action + } + pk.ItemInteractionData.HeldItem = t.UpgradeItemInstance(pk.ItemInteractionData.HeldItem) + case *packet.CreativeContent: + for i, creativeItem := range pk.Items { + creativeItem.Item = t.UpgradeItemStack(creativeItem.Item) + pk.Items[i] = creativeItem + } + case *packet.InventoryTransaction: + for i, action := range pk.Actions { + action.OldItem = t.UpgradeItemInstance(action.OldItem) + action.NewItem = t.UpgradeItemInstance(action.NewItem) + pk.Actions[i] = action + } + switch transactionData := pk.TransactionData.(type) { + case *protocol.UseItemTransactionData: + transactionData.HeldItem = t.UpgradeItemInstance(transactionData.HeldItem) + for i, action := range transactionData.Actions { + action.OldItem = t.UpgradeItemInstance(action.OldItem) + action.NewItem = t.UpgradeItemInstance(action.NewItem) + transactionData.Actions[i] = action + } + case *protocol.UseItemOnEntityTransactionData: + transactionData.HeldItem = t.UpgradeItemInstance(transactionData.HeldItem) + case *protocol.ReleaseItemTransactionData: + transactionData.HeldItem = t.UpgradeItemInstance(transactionData.HeldItem) + } + case *packet.LevelEvent: + if pk.EventType == packet.LevelEventParticleLegacyEvent|14 { // egg crack + itemType := t.UpgradeItemType(protocol.ItemType{ + NetworkID: pk.EventData >> 16, + MetadataValue: uint32(pk.EventData & 0xf), + }) + pk.EventData = (itemType.NetworkID << 16) | int32(itemType.MetadataValue) + } + case *packet.StartGame: + for i, entry := range pk.Items { + if !entry.ComponentBased { + itemType := t.UpgradeItemType(protocol.ItemType{ + NetworkID: int32(entry.RuntimeID), + MetadataValue: 0, + }) + entry.RuntimeID = int16(itemType.NetworkID) + + var ok bool + if entry.Name, ok = t.latest.ItemRuntimeIDToName(itemType.NetworkID); !ok { + panic(itemType) + } + } else { + t.latest.RegisterEntry(entry.Name) + entry.RuntimeID = int16(t.mapping.RegisterEntry(entry.Name)) + } + pk.Items[i] = entry + } + for rid, i := range t.CustomItems() { + name, _ := i.EncodeItem() + pk.Items = append(pk.Items, protocol.ItemEntry{ + Name: name, + RuntimeID: int16(rid), + ComponentBased: true, + }) + } + case *packet.ItemComponent: + for _, i := range t.CustomItems() { + name, _ := i.EncodeItem() + pk.Items = append(pk.Items, protocol.ItemComponentEntry{ + Name: name, + Data: packbuilder.Components(i), + }) + } + } + result = append(result, pk) + } + return result +} + +func (t *DefaultItemTranslator) Register(item world.CustomItem, replacement string) { + name, _ := item.EncodeItem() + originalRid, ok := t.latest.ItemNameToRuntimeID(replacement) + if !ok { + panic(fmt.Errorf("%v not found in latest items", replacement)) + } + if _, ok := t.originalToCustom[originalRid]; ok { + panic(fmt.Errorf("%v is already mapped", replacement)) + } + + nextRID := t.mapping.RegisterEntry(name) + t.ridToCustomItem[nextRID] = item + t.originalToCustom[originalRid] = nextRID + t.customToOriginal[nextRID] = originalRid +} + +func (t *DefaultItemTranslator) CustomItems() map[int32]world.CustomItem { + return t.ridToCustomItem +} + +func removeIndex[T any](s []T, index int) []T { + ret := make([]T, 0) + ret = append(ret, s[:index]...) + return append(ret, s[index+1:]...) +} diff --git a/legacyver/legacypacket/item_stack_response.go b/legacyver/legacypacket/item_stack_response.go new file mode 100644 index 0000000..254798b --- /dev/null +++ b/legacyver/legacypacket/item_stack_response.go @@ -0,0 +1,27 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// ItemStackResponse is sent by the server in response to an ItemStackRequest packet from the client. This +// packet is used to either approve or reject ItemStackRequests from the client. If a request is approved, the +// client will simply continue as normal. If rejected, the client will undo the actions so that the inventory +// should be in sync with the server again. +type ItemStackResponse struct { + // Responses is a list of responses to ItemStackRequests sent by the client before. Responses either + // approve or reject a request from the client. + // Vanilla limits the size of this slice to 4096. + Responses []proto.ItemStackResponse +} + +// ID ... +func (*ItemStackResponse) ID() uint32 { + return packet.IDItemStackResponse +} + +func (pk *ItemStackResponse) Marshal(io protocol.IO) { + protocol.Slice(io, &pk.Responses) +} diff --git a/legacyver/legacypacket/packet.go b/legacyver/legacypacket/packet.go new file mode 100644 index 0000000..612a433 --- /dev/null +++ b/legacyver/legacypacket/packet.go @@ -0,0 +1 @@ +package legacypacket diff --git a/legacyver/legacypacket/player_auth_input.go b/legacyver/legacypacket/player_auth_input.go new file mode 100644 index 0000000..75ac970 --- /dev/null +++ b/legacyver/legacypacket/player_auth_input.go @@ -0,0 +1,210 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/go-gl/mathgl/mgl32" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +const PlayerAuthInputBitsetSize = 65 + +const ( + InputFlagAscend = iota + InputFlagDescend + InputFlagNorthJump + InputFlagJumpDown + InputFlagSprintDown + InputFlagChangeHeight + InputFlagJumping + InputFlagAutoJumpingInWater + InputFlagSneaking + InputFlagSneakDown + InputFlagUp + InputFlagDown + InputFlagLeft + InputFlagRight + InputFlagUpLeft + InputFlagUpRight + InputFlagWantUp + InputFlagWantDown + InputFlagWantDownSlow + InputFlagWantUpSlow + InputFlagSprinting + InputFlagAscendBlock + InputFlagDescendBlock + InputFlagSneakToggleDown + InputFlagPersistSneak + InputFlagStartSprinting + InputFlagStopSprinting + InputFlagStartSneaking + InputFlagStopSneaking + InputFlagStartSwimming + InputFlagStopSwimming + InputFlagStartJumping + InputFlagStartGliding + InputFlagStopGliding + InputFlagPerformItemInteraction + InputFlagPerformBlockActions + InputFlagPerformItemStackRequest + InputFlagHandledTeleport + InputFlagEmoting + InputFlagMissedSwing + InputFlagStartCrawling + InputFlagStopCrawling + InputFlagStartFlying + InputFlagStopFlying + InputFlagClientAckServerData + InputFlagClientPredictedVehicle + InputFlagPaddlingLeft + InputFlagPaddlingRight + InputFlagBlockBreakingDelayEnabled + InputFlagHorizontalCollision + InputFlagVerticalCollision + InputFlagDownLeft + InputFlagDownRight + InputFlagStartUsingItem + InputFlagCameraRelativeMovementEnabled + InputFlagRotControlledByMoveDirection + InputFlagStartSpinAttack + InputFlagStopSpinAttack + InputFlagIsHotbarTouchOnly + InputFlagJumpReleasedRaw + InputFlagJumpPressedRaw + InputFlagJumpCurrentRaw + InputFlagSneakReleasedRaw + InputFlagSneakPressedRaw + InputFlagSneakCurrentRaw +) + +const ( + InputModeMouse = iota + 1 + InputModeTouch + InputModeGamePad + InputModeMotionController +) + +const ( + PlayModeNormal = iota + PlayModeTeaser + PlayModeScreen + PlayModeViewer + PlayModeReality + PlayModePlacement + PlayModeLivingRoom + PlayModeExitLevel + PlayModeExitLevelLivingRoom + PlayModeNumModes +) + +const ( + InteractionModelTouch = iota + InteractionModelCrosshair + InteractionModelClassic +) + +// PlayerAuthInput is sent by the client to allow for server authoritative movement. It is used to synchronise +// the player input with the position server-side. +// The client sends this packet when the ServerAuthoritativeMovementMode field in the StartGame packet is set +// to true, instead of the MovePlayer packet. The client will send this packet once every tick. +type PlayerAuthInput struct { + // Pitch and Yaw hold the rotation that the player reports it has. + Pitch, Yaw float32 + // Position holds the position that the player reports it has. + Position mgl32.Vec3 + // MoveVector is a Vec2 that specifies the direction in which the player moved, as a combination of X/Z + // values which are created using the WASD/controller stick state. + MoveVector mgl32.Vec2 + // HeadYaw is the horizontal rotation of the head that the player reports it has. + HeadYaw float32 + // InputData is a combination of bit flags that together specify the way the player moved last tick. It + // is a combination of the flags above. + InputData protocol.Bitset + // InputMode specifies the way that the client inputs data to the screen. It is one of the constants that + // may be found above. + InputMode uint32 + // PlayMode specifies the way that the player is playing. The values it holds, which are rather random, + // may be found above. + PlayMode uint32 + // InteractionModel is a constant representing the interaction model the player is using. It is one of the + // constants that may be found above. + InteractionModel uint32 + // InteractPitch and interactYaw is the rotation the player is looking that they intend to use for + // interactions. This is only different to Pitch and Yaw in cases such as VR or when custom cameras + // being used. + InteractPitch, InteractYaw float32 + // Tick is the server tick at which the packet was sent. It is used in relation to + // CorrectPlayerMovePrediction. + Tick uint64 + // Delta was the delta between the old and the new position. There isn't any practical use for this field + // as it can be calculated by the server itself. + Delta mgl32.Vec3 + // ItemInteractionData is the transaction data if the InputData includes an item interaction. + ItemInteractionData protocol.UseItemTransactionData + // ItemStackRequest is sent by the client to change an item in their inventory. + ItemStackRequest protocol.ItemStackRequest + // BlockActions is a slice of block actions that the client has interacted with. + BlockActions []protocol.PlayerBlockAction + // VehicleRotation is the rotation of the vehicle that the player is in, if any. + VehicleRotation mgl32.Vec2 + // ClientPredictedVehicle is the unique ID of the vehicle that the client predicts the player to be in. + ClientPredictedVehicle int64 + // AnalogueMoveVector is a Vec2 that specifies the direction in which the player moved, as a combination + // of X/Z values which are created using an analogue input. + AnalogueMoveVector mgl32.Vec2 + // CameraOrientation is the vector that represents the camera's forward direction which can be used to + // transform movement to be camera relative. + CameraOrientation mgl32.Vec3 + // RawMoveVector is the value of MoveVector before it is affected by input permissions, sneaking/fly + // speeds and isn't normalised for analogue inputs. + RawMoveVector mgl32.Vec2 +} + +// ID ... +func (pk *PlayerAuthInput) ID() uint32 { + return packet.IDPlayerAuthInput +} + +func (pk *PlayerAuthInput) Marshal(io protocol.IO) { + io.Float32(&pk.Pitch) + io.Float32(&pk.Yaw) + io.Vec3(&pk.Position) + io.Vec2(&pk.MoveVector) + io.Float32(&pk.HeadYaw) + if proto.IsProtoGTE(io, proto.ID766) { + io.Bitset(&pk.InputData, PlayerAuthInputBitsetSize) + } else { + io.Bitset(&pk.InputData, 64) + } + io.Varuint32(&pk.InputMode) + io.Varuint32(&pk.PlayMode) + io.Varuint32(&pk.InteractionModel) + io.Float32(&pk.InteractPitch) + io.Float32(&pk.InteractYaw) + io.Varuint64(&pk.Tick) + io.Vec3(&pk.Delta) + + if pk.InputData.Load(InputFlagPerformItemInteraction) { + io.PlayerInventoryAction(&pk.ItemInteractionData) + } + + if pk.InputData.Load(InputFlagPerformItemStackRequest) { + protocol.Single(io, &pk.ItemStackRequest) + } + + if pk.InputData.Load(InputFlagPerformBlockActions) { + protocol.SliceVarint32Length(io, &pk.BlockActions) + } + + if pk.InputData.Load(InputFlagClientPredictedVehicle) { + io.Vec2(&pk.VehicleRotation) + io.Varint64(&pk.ClientPredictedVehicle) + } + + io.Vec2(&pk.AnalogueMoveVector) + io.Vec3(&pk.CameraOrientation) + + if proto.IsProtoGTE(io, proto.ID766) { + io.Vec2(&pk.RawMoveVector) + } +} diff --git a/legacyver/legacypacket/resource_packs_info.go b/legacyver/legacypacket/resource_packs_info.go new file mode 100644 index 0000000..d68aa4d --- /dev/null +++ b/legacyver/legacypacket/resource_packs_info.go @@ -0,0 +1,50 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// ResourcePacksInfo is sent by the server to inform the client on what resource packs the server has. It +// sends a list of the resource packs it has and basic information on them like the version and description. +type ResourcePacksInfo struct { + // TexturePackRequired specifies if the client must accept the texture packs the server has in order to + // join the server. If set to true, the client gets the option to either download the resource packs and + // join, or quit entirely. Behaviour packs never have to be downloaded. + TexturePackRequired bool + // HasAddons specifies if any of the resource packs contain addons in them. If set to true, only clients + // that support addons will be able to download them. + HasAddons bool + // HasScripts specifies if any of the resource packs contain scripts in them. If set to true, only clients + // that support scripts will be able to download them. + HasScripts bool + // WorldTemplateUUID is the UUID of the template that has been used to generate the world. Templates can + // be downloaded from the marketplace or installed via '.mctemplate' files. If the world was not generated + // from a template, this field is empty. + WorldTemplateUUID uuid.UUID + // WorldTemplateVersion is the version of the world template that has been used to generate the world. If + // the world was not generated from a template, this field is empty. + WorldTemplateVersion string + // TexturePacks is a list of texture packs that the client needs to download before joining the server. + // The order of these texture packs is not relevant in this packet. It is however important in the + // ResourcePackStack packet. + TexturePacks []proto.TexturePackInfo +} + +// ID ... +func (*ResourcePacksInfo) ID() uint32 { + return packet.IDResourcePacksInfo +} + +func (pk *ResourcePacksInfo) Marshal(io protocol.IO) { + io.Bool(&pk.TexturePackRequired) + io.Bool(&pk.HasAddons) + io.Bool(&pk.HasScripts) + if proto.IsProtoGTE(io, proto.ID766) { + io.UUID(&pk.WorldTemplateUUID) + io.String(&pk.WorldTemplateVersion) + } + protocol.SliceUint16Length(io, &pk.TexturePacks) +} diff --git a/legacyver/proto/id.go b/legacyver/proto/id.go new file mode 100644 index 0000000..ebdb140 --- /dev/null +++ b/legacyver/proto/id.go @@ -0,0 +1,32 @@ +package proto + +import "github.com/sandertv/gophertunnel/minecraft/protocol" + +const ( + ID766 = 766 + ID748 = 748 + ID729 = 729 + ID712 = 712 + ID686 = 686 + ID685 = 685 +) + +func IsProtoGTE(io protocol.IO, proto int32) bool { + return io.(IO).ProtocolID() >= proto +} + +func IsProtoLTE(io protocol.IO, proto int32) bool { + return io.(IO).ProtocolID() <= proto +} + +func IsProtoLT(io protocol.IO, proto int32) bool { + return io.(IO).ProtocolID() < proto +} + +func IsProtoGT(io protocol.IO, proto int32) bool { + return io.(IO).ProtocolID() > proto +} + +func FetchProtoID(io protocol.IO) int32 { + return io.(IO).ProtocolID() +} diff --git a/legacyver/proto/io.go b/legacyver/proto/io.go new file mode 100644 index 0000000..3304494 --- /dev/null +++ b/legacyver/proto/io.go @@ -0,0 +1,53 @@ +package proto + +import ( + "github.com/sandertv/gophertunnel/minecraft/protocol" +) + +type IO interface { + protocol.IO + + SetProtocolID(protocolID int32) + ProtocolID() int32 +} + +type Reader struct { + *protocol.Reader + + protocolID int32 +} + +func NewReader(r *protocol.Reader, protocolID int32) *Reader { + return &Reader{ + Reader: r, + protocolID: protocolID, + } +} + +func (r *Reader) SetProtocolID(protocolID int32) { r.protocolID = protocolID } +func (r *Reader) ProtocolID() int32 { return r.protocolID } +func (r *Reader) Reads() bool { return true } + +type Writer struct { + *protocol.Writer + + protocolID int32 +} + +func NewWriter(w *protocol.Writer, protocolID int32) *Writer { + return &Writer{w, protocolID} +} + +func (w *Writer) SetProtocolID(protocolID int32) { w.protocolID = protocolID } +func (w *Writer) ProtocolID() int32 { return w.protocolID } +func (w *Writer) Reads() bool { return false } + +func IsReader(r protocol.IO) bool { + _, ok := r.(*Reader) + return ok +} + +func IsWriter(w protocol.IO) bool { + _, ok := w.(*Writer) + return ok +} diff --git a/legacyver/proto/item_stack.go b/legacyver/proto/item_stack.go new file mode 100644 index 0000000..0f1b294 --- /dev/null +++ b/legacyver/proto/item_stack.go @@ -0,0 +1,652 @@ +package proto + +import ( + "github.com/sandertv/gophertunnel/minecraft/protocol" +) + +const ( + FilterCauseServerChatPublic = iota + FilterCauseServerChatWhisper + FilterCauseSignText + FilterCauseAnvilText + FilterCauseBookAndQuillText + FilterCauseCommandBlockText + FilterCauseBlockActorDataText + FilterCauseJoinEventText + FilterCauseLeaveEventText + FilterCauseSlashCommandChat + FilterCauseCartographyText + FilterCauseKickCommand + FilterCauseTitleCommand + FilterCauseSummonCommand +) + +// ItemStackRequest represents a single request present in an ItemStackRequest packet sent by the client to +// change an item in an inventory. +// Item stack requests are either approved or rejected by the server using the ItemStackResponse packet. +type ItemStackRequest struct { + // RequestID is a unique ID for the request. This ID is used by the server to send a response for this + // specific request in the ItemStackResponse packet. + RequestID int32 + // Actions is a list of actions performed by the client. The actual type of the actions depends on which + // ID was present, and is one of the concrete types below. + Actions []protocol.StackRequestAction + // FilterStrings is a list of filter strings involved in the request. This is typically filled with one string + // when an anvil or cartography is used. + FilterStrings []string + // FilterCause represents the cause of any potential filtering. This is one of the constants above. + FilterCause int32 +} + +// Marshal encodes/decodes an ItemStackRequest. +func (x *ItemStackRequest) Marshal(r protocol.IO) { + r.Varint32(&x.RequestID) + protocol.FuncSlice(r, &x.Actions, r.StackRequestAction) + protocol.FuncSlice(r, &x.FilterStrings, r.String) + r.Int32(&x.FilterCause) +} + +// lookupStackRequestActionType looks up the ID of a StackRequestAction. +func lookupStackRequestActionType(x StackRequestAction, id *uint8) bool { + switch x.(type) { + case *TakeStackRequestAction: + *id = StackRequestActionTake + case *PlaceStackRequestAction: + *id = StackRequestActionPlace + case *SwapStackRequestAction: + *id = StackRequestActionSwap + case *DropStackRequestAction: + *id = StackRequestActionDrop + case *DestroyStackRequestAction: + *id = StackRequestActionDestroy + case *ConsumeStackRequestAction: + *id = StackRequestActionConsume + case *CreateStackRequestAction: + *id = StackRequestActionCreate + case *LabTableCombineStackRequestAction: + *id = StackRequestActionLabTableCombine + case *BeaconPaymentStackRequestAction: + *id = StackRequestActionBeaconPayment + case *MineBlockStackRequestAction: + *id = StackRequestActionMineBlock + case *CraftRecipeStackRequestAction: + *id = StackRequestActionCraftRecipe + case *AutoCraftRecipeStackRequestAction: + *id = StackRequestActionCraftRecipeAuto + case *CraftCreativeStackRequestAction: + *id = StackRequestActionCraftCreative + case *CraftRecipeOptionalStackRequestAction: + *id = StackRequestActionCraftRecipeOptional + case *CraftGrindstoneRecipeStackRequestAction: + *id = StackRequestActionCraftGrindstone + case *CraftLoomRecipeStackRequestAction: + *id = StackRequestActionCraftLoom + case *CraftNonImplementedStackRequestAction: + *id = StackRequestActionCraftNonImplementedDeprecated + case *CraftResultsDeprecatedStackRequestAction: + *id = StackRequestActionCraftResultsDeprecated + default: + return false + } + return true +} + +// lookupStackRequestAction looks up the StackRequestAction matching an ID. +func lookupStackRequestAction(id uint8, x *StackRequestAction) bool { + switch id { + case StackRequestActionTake: + *x = &TakeStackRequestAction{} + case StackRequestActionPlace: + *x = &PlaceStackRequestAction{} + case StackRequestActionSwap: + *x = &SwapStackRequestAction{} + case StackRequestActionDrop: + *x = &DropStackRequestAction{} + case StackRequestActionDestroy: + *x = &DestroyStackRequestAction{} + case StackRequestActionConsume: + *x = &ConsumeStackRequestAction{} + case StackRequestActionCreate: + *x = &CreateStackRequestAction{} + case StackRequestActionPlaceInContainer: + *x = &PlaceInContainerStackRequestAction{} + case StackRequestActionTakeOutContainer: + *x = &TakeOutContainerStackRequestAction{} + case StackRequestActionLabTableCombine: + *x = &LabTableCombineStackRequestAction{} + case StackRequestActionBeaconPayment: + *x = &BeaconPaymentStackRequestAction{} + case StackRequestActionMineBlock: + *x = &MineBlockStackRequestAction{} + case StackRequestActionCraftRecipe: + *x = &CraftRecipeStackRequestAction{} + case StackRequestActionCraftRecipeAuto: + *x = &AutoCraftRecipeStackRequestAction{} + case StackRequestActionCraftCreative: + *x = &CraftCreativeStackRequestAction{} + case StackRequestActionCraftRecipeOptional: + *x = &CraftRecipeOptionalStackRequestAction{} + case StackRequestActionCraftGrindstone: + *x = &CraftGrindstoneRecipeStackRequestAction{} + case StackRequestActionCraftLoom: + *x = &CraftLoomRecipeStackRequestAction{} + case StackRequestActionCraftNonImplementedDeprecated: + *x = &CraftNonImplementedStackRequestAction{} + case StackRequestActionCraftResultsDeprecated: + *x = &CraftResultsDeprecatedStackRequestAction{} + default: + return false + } + return true +} + +const ( + ItemStackResponseStatusOK = iota + ItemStackResponseStatusError + ItemStackResponseStatusInvalidRequestActionType + ItemStackResponseStatusActionRequestNotAllowed + ItemStackResponseStatusScreenHandlerEndRequestFailed + ItemStackResponseStatusItemRequestActionHandlerCommitFailed + ItemStackResponseStatusInvalidRequestCraftActionType + ItemStackResponseStatusInvalidCraftRequest + ItemStackResponseStatusInvalidCraftRequestScreen + ItemStackResponseStatusInvalidCraftResult + ItemStackResponseStatusInvalidCraftResultIndex + ItemStackResponseStatusInvalidCraftResultItem + ItemStackResponseStatusInvalidItemNetId + ItemStackResponseStatusMissingCreatedOutputContainer + ItemStackResponseStatusFailedToSetCreatedItemOutputSlot + ItemStackResponseStatusRequestAlreadyInProgress + ItemStackResponseStatusFailedToInitSparseContainer + ItemStackResponseStatusResultTransferFailed + ItemStackResponseStatusExpectedItemSlotNotFullyConsumed + ItemStackResponseStatusExpectedAnywhereItemNotFullyConsumed + ItemStackResponseStatusItemAlreadyConsumedFromSlot + ItemStackResponseStatusConsumedTooMuchFromSlot + ItemStackResponseStatusMismatchSlotExpectedConsumedItem + ItemStackResponseStatusMismatchSlotExpectedConsumedItemNetIdVariant + ItemStackResponseStatusFailedToMatchExpectedSlotConsumedItem + ItemStackResponseStatusFailedToMatchExpectedAllowedAnywhereConsumedItem + ItemStackResponseStatusConsumedItemOutOfAllowedSlotRange + ItemStackResponseStatusConsumedItemNotAllowed + ItemStackResponseStatusPlayerNotInCreativeMode + ItemStackResponseStatusInvalidExperimentalRecipeRequest + ItemStackResponseStatusFailedToCraftCreative + ItemStackResponseStatusFailedToGetLevelRecipe + ItemStackResponseStatusFailedToFindRecipeByNetId + ItemStackResponseStatusMismatchedCraftingSize + ItemStackResponseStatusMissingInputSparseContainer + ItemStackResponseStatusMismatchedRecipeForInputGridItems + ItemStackResponseStatusEmptyCraftResults + ItemStackResponseStatusFailedToEnchant + ItemStackResponseStatusMissingInputItem + ItemStackResponseStatusInsufficientPlayerLevelToEnchant + ItemStackResponseStatusMissingMaterialItem + ItemStackResponseStatusMissingActor + ItemStackResponseStatusUnknownPrimaryEffect + ItemStackResponseStatusPrimaryEffectOutOfRange + ItemStackResponseStatusPrimaryEffectUnavailable + ItemStackResponseStatusSecondaryEffectOutOfRange + ItemStackResponseStatusSecondaryEffectUnavailable + ItemStackResponseStatusDstContainerEqualToCreatedOutputContainer + ItemStackResponseStatusDstContainerAndSlotEqualToSrcContainerAndSlot + ItemStackResponseStatusFailedToValidateSrcSlot + ItemStackResponseStatusFailedToValidateDstSlot + ItemStackResponseStatusInvalidAdjustedAmount + ItemStackResponseStatusInvalidItemSetType + ItemStackResponseStatusInvalidTransferAmount + ItemStackResponseStatusCannotSwapItem + ItemStackResponseStatusCannotPlaceItem + ItemStackResponseStatusUnhandledItemSetType + ItemStackResponseStatusInvalidRemovedAmount + ItemStackResponseStatusInvalidRegion + ItemStackResponseStatusCannotDropItem + ItemStackResponseStatusCannotDestroyItem + ItemStackResponseStatusInvalidSourceContainer + ItemStackResponseStatusItemNotConsumed + ItemStackResponseStatusInvalidNumCrafts + ItemStackResponseStatusInvalidCraftResultStackSize + ItemStackResponseStatusCannotRemoveItem + ItemStackResponseStatusCannotConsumeItem + ItemStackResponseStatusScreenStackError +) + +// ItemStackResponse is a response to an individual ItemStackRequest. +type ItemStackResponse struct { + // Status specifies if the request with the RequestID below was successful. If this is the case, the + // ContainerInfo below will have information on what slots ended up changing. If not, the container info + // will be empty. + // A non-0 status means an error occurred and will result in the action being reverted. + Status uint8 + // RequestID is the unique ID of the request that this response is in reaction to. If rejected, the client + // will undo the actions from the request with this ID. + RequestID int32 + // ContainerInfo holds information on the containers that had their contents changed as a result of the + // request. + ContainerInfo []StackResponseContainerInfo +} + +func (x *ItemStackResponse) ToLatest() protocol.ItemStackResponse { + ret := protocol.ItemStackResponse{ + Status: x.Status, + RequestID: x.RequestID, + ContainerInfo: make([]protocol.StackResponseContainerInfo, len(x.ContainerInfo)), + } + for i, v := range x.ContainerInfo { + ret.ContainerInfo[i] = protocol.StackResponseContainerInfo{ + Container: v.Container, + SlotInfo: make([]protocol.StackResponseSlotInfo, len(v.SlotInfo)), + } + for j, w := range v.SlotInfo { + ret.ContainerInfo[i].SlotInfo[j] = protocol.StackResponseSlotInfo{ + Slot: w.Slot, + HotbarSlot: w.HotbarSlot, + Count: w.Count, + StackNetworkID: w.StackNetworkID, + CustomName: w.CustomName, + FilteredCustomName: w.FilteredCustomName, + DurabilityCorrection: w.DurabilityCorrection, + } + } + } + return ret +} + +// Marshal encodes/decodes an ItemStackResponse. +func (x *ItemStackResponse) Marshal(r protocol.IO) { + r.Uint8(&x.Status) + r.Varint32(&x.RequestID) + if x.Status == ItemStackResponseStatusOK { + protocol.Slice(r, &x.ContainerInfo) + } +} + +// StackResponseContainerInfo holds information on what slots in a container have what item stack in them. +type StackResponseContainerInfo struct { + // Container is the FullContainerName that describes the container that the slots that follow are in. For + // the main inventory, the ContainerID seems to be 0x1b. Fur the cursor, this value seems to be 0x3a. For + // the crafting grid, this value seems to be 0x0d. + Container protocol.FullContainerName + // SlotInfo holds information on what item stack should be present in specific slots in the container. + SlotInfo []StackResponseSlotInfo +} + +// Marshal encodes/decodes a StackResponseContainerInfo. +func (x *StackResponseContainerInfo) Marshal(r protocol.IO) { + protocol.Single(r, &x.Container) + protocol.Slice(r, &x.SlotInfo) +} + +// StackResponseSlotInfo holds information on what item stack should be present in a specific slot. +type StackResponseSlotInfo struct { + // Slot and HotbarSlot seem to be the same value every time: The slot that was actually changed. I'm not + // sure if these slots ever differ. + Slot, HotbarSlot byte + // Count is the total count of the item stack. This count will be shown client-side after the response is + // sent to the client. + Count byte + // StackNetworkID is the network ID of the new stack at a specific slot. + StackNetworkID int32 + // CustomName is the custom name of the item stack. It is used in relation to text filtering. + CustomName string + // FilteredCustomName is a filtered version of CustomName with all the profanity removed. The client will + // use this over CustomName if this field is not empty and they have the "Filter Profanity" setting enabled. + FilteredCustomName string + // DurabilityCorrection is the current durability of the item stack. This durability will be shown + // client-side after the response is sent to the client. + DurabilityCorrection int32 +} + +// Marshal encodes/decodes a StackResponseSlotInfo. +func (x *StackResponseSlotInfo) Marshal(r protocol.IO) { + r.Uint8(&x.Slot) + r.Uint8(&x.HotbarSlot) + r.Uint8(&x.Count) + r.Varint32(&x.StackNetworkID) + if x.Slot != x.HotbarSlot { + r.InvalidValue(x.HotbarSlot, "hotbar slot", "hot bar slot must be equal to normal slot") + } + r.String(&x.CustomName) + if IsProtoGTE(r, ID766) { + r.String(&x.FilteredCustomName) + } + r.Varint32(&x.DurabilityCorrection) +} + +// StackRequestAction represents a single action related to the inventory present in an ItemStackRequest. +// The action is one of the concrete types below, each of which are indicative of a different action by the +// client, such as moving an item around the inventory or placing a block. It is an alias of Marshaler. +type StackRequestAction interface { + protocol.Marshaler +} + +const ( + StackRequestActionTake = iota + StackRequestActionPlace + StackRequestActionSwap + StackRequestActionDrop + StackRequestActionDestroy + StackRequestActionConsume + StackRequestActionCreate + StackRequestActionPlaceInContainer + StackRequestActionTakeOutContainer + StackRequestActionLabTableCombine + StackRequestActionBeaconPayment + StackRequestActionMineBlock + StackRequestActionCraftRecipe + StackRequestActionCraftRecipeAuto + StackRequestActionCraftCreative + StackRequestActionCraftRecipeOptional + StackRequestActionCraftGrindstone + StackRequestActionCraftLoom + StackRequestActionCraftNonImplementedDeprecated + StackRequestActionCraftResultsDeprecated +) + +// transferStackRequestAction is the structure shared by StackRequestActions that transfer items from one +// slot into another. +type transferStackRequestAction struct { + // Count is the count of the item in the source slot that was taken towards the destination slot. + Count byte + // Source and Destination point to the source slot from which Count of the item stack were taken and the + // destination slot to which this item was moved. + Source, Destination StackRequestSlotInfo +} + +// Marshal ... +func (a *transferStackRequestAction) Marshal(r protocol.IO) { + r.Uint8(&a.Count) + StackReqSlotInfo(r, &a.Source) + StackReqSlotInfo(r, &a.Destination) +} + +// TakeStackRequestAction is sent by the client to the server to take x amount of items from one slot in a +// container to the cursor. +type TakeStackRequestAction struct { + transferStackRequestAction +} + +// PlaceStackRequestAction is sent by the client to the server to place x amount of items from one slot into +// another slot, such as when shift clicking an item in the inventory to move it around or when moving an item +// in the cursor into a slot. +type PlaceStackRequestAction struct { + transferStackRequestAction +} + +// SwapStackRequestAction is sent by the client to swap the item in its cursor with an item present in another +// container. The two item stacks swap places. +type SwapStackRequestAction struct { + // Source and Destination point to the source slot from which Count of the item stack were taken and the + // destination slot to which this item was moved. + Source, Destination StackRequestSlotInfo +} + +// Marshal ... +func (a *SwapStackRequestAction) Marshal(r protocol.IO) { + StackReqSlotInfo(r, &a.Source) + StackReqSlotInfo(r, &a.Destination) +} + +// DropStackRequestAction is sent by the client when it drops an item out of the inventory when it has its +// inventory opened. This action is not sent when a player drops an item out of the hotbar using the Q button +// (or the equivalent on mobile). The InventoryTransaction packet is still used for that action, regardless of +// whether the item stack network IDs are used or not. +type DropStackRequestAction struct { + // Count is the count of the item in the source slot that was taken towards the destination slot. + Count byte + // Source is the source slot from which items were dropped to the ground. + Source StackRequestSlotInfo + // Randomly seems to be set to false in most cases. I'm not entirely sure what this does, but this is what + // vanilla calls this field. + Randomly bool +} + +// Marshal ... +func (a *DropStackRequestAction) Marshal(r protocol.IO) { + r.Uint8(&a.Count) + StackReqSlotInfo(r, &a.Source) + r.Bool(&a.Randomly) +} + +// DestroyStackRequestAction is sent by the client when it destroys an item in creative mode by moving it +// back into the creative inventory. +type DestroyStackRequestAction struct { + // Count is the count of the item in the source slot that was destroyed. + Count byte + // Source is the source slot from which items came that were destroyed by moving them into the creative + // inventory. + Source StackRequestSlotInfo +} + +// Marshal ... +func (a *DestroyStackRequestAction) Marshal(r protocol.IO) { + r.Uint8(&a.Count) + StackReqSlotInfo(r, &a.Source) +} + +// ConsumeStackRequestAction is sent by the client when it uses an item to craft another item. The original +// item is 'consumed'. +type ConsumeStackRequestAction struct { + DestroyStackRequestAction +} + +// CreateStackRequestAction is sent by the client when an item is created through being used as part of a +// recipe. For example, when milk is used to craft a cake, the buckets are leftover. The buckets are moved to +// the slot sent by the client here. +// Note that before this is sent, an action for consuming all items in the crafting table/grid is sent. Items +// that are not fully consumed when used for a recipe should not be destroyed there, but instead, should be +// turned into their respective resulting items. +type CreateStackRequestAction struct { + // ResultsSlot is the slot in the inventory in which the results of the crafting ingredients are to be + // placed. + ResultsSlot byte +} + +// Marshal ... +func (a *CreateStackRequestAction) Marshal(r protocol.IO) { + r.Uint8(&a.ResultsSlot) +} + +// PlaceInContainerStackRequestAction currently has no known purpose. +type PlaceInContainerStackRequestAction struct { + transferStackRequestAction +} + +// TakeOutContainerStackRequestAction currently has no known purpose. +type TakeOutContainerStackRequestAction struct { + transferStackRequestAction +} + +// LabTableCombineStackRequestAction is sent by the client when it uses a lab table to combine item stacks. +type LabTableCombineStackRequestAction struct{} + +// Marshal ... +func (a *LabTableCombineStackRequestAction) Marshal(protocol.IO) {} + +// BeaconPaymentStackRequestAction is sent by the client when it submits an item to enable effects from a +// beacon. These items will have been moved into the beacon item slot in advance. +type BeaconPaymentStackRequestAction struct { + // PrimaryEffect and SecondaryEffect are the effects that were selected from the beacon. + PrimaryEffect, SecondaryEffect int32 +} + +// Marshal ... +func (a *BeaconPaymentStackRequestAction) Marshal(r protocol.IO) { + r.Varint32(&a.PrimaryEffect) + r.Varint32(&a.SecondaryEffect) +} + +// MineBlockStackRequestAction is sent by the client when it breaks a block. +type MineBlockStackRequestAction struct { + // HotbarSlot is the slot held by the player while mining a block. + HotbarSlot int32 + // PredictedDurability is the durability of the item that the client assumes to be present at the time. + PredictedDurability int32 + // StackNetworkID is the unique stack ID that the client assumes to be present at the time. The server + // must check if these IDs match. If they do not match, servers should reject the stack request that the + // action holding this info was in. + StackNetworkID int32 +} + +// Marshal ... +func (a *MineBlockStackRequestAction) Marshal(r protocol.IO) { + r.Varint32(&a.HotbarSlot) + r.Varint32(&a.PredictedDurability) + r.Varint32(&a.StackNetworkID) +} + +// CraftRecipeStackRequestAction is sent by the client the moment it begins crafting an item. This is the +// first action sent, before the Consume and Create item stack request actions. +// This action is also sent when an item is enchanted. Enchanting should be treated mostly the same way as +// crafting, where the old item is consumed. +type CraftRecipeStackRequestAction struct { + // RecipeNetworkID is the network ID of the recipe that is about to be crafted. This network ID matches + // one of the recipes sent in the CraftingData packet, where each of the recipes have a RecipeNetworkID as + // of 1.16. + RecipeNetworkID uint32 + // NumberOfCrafts is how many times the recipe was crafted. This field appears to be boilerplate and + // has no effect. + NumberOfCrafts byte +} + +// Marshal ... +func (a *CraftRecipeStackRequestAction) Marshal(r protocol.IO) { + r.Varuint32(&a.RecipeNetworkID) + r.Uint8(&a.NumberOfCrafts) +} + +// AutoCraftRecipeStackRequestAction is sent by the client similarly to the CraftRecipeStackRequestAction. The +// only difference is that the recipe is automatically created and crafted by shift clicking the recipe book. +type AutoCraftRecipeStackRequestAction struct { + // RecipeNetworkID is the network ID of the recipe that is about to be crafted. This network ID matches + // one of the recipes sent in the CraftingData packet, where each of the recipes have a RecipeNetworkID as + // of 1.16. + RecipeNetworkID uint32 + // NumberOfCrafts is how many times the recipe was crafted. This field is just a duplicate of TimesCrafted. + NumberOfCrafts byte + // TimesCrafted is how many times the recipe was crafted. + TimesCrafted byte + // Ingredients is a slice of ItemDescriptorCount that contains the ingredients that were used to craft the recipe. + // It is not exactly clear what this is used for, but it is sent by the vanilla client. + Ingredients []protocol.ItemDescriptorCount +} + +// Marshal ... +func (a *AutoCraftRecipeStackRequestAction) Marshal(r protocol.IO) { + r.Varuint32(&a.RecipeNetworkID) + r.Uint8(&a.NumberOfCrafts) + r.Uint8(&a.TimesCrafted) + protocol.FuncSlice(r, &a.Ingredients, r.ItemDescriptorCount) +} + +// CraftCreativeStackRequestAction is sent by the client when it takes an item out fo the creative inventory. +// The item is thus not really crafted, but instantly created. +type CraftCreativeStackRequestAction struct { + // CreativeItemNetworkID is the network ID of the creative item that is being created. This is one of the + // creative item network IDs sent in the CreativeContent packet. + CreativeItemNetworkID uint32 + // NumberOfCrafts is how many times the recipe was crafted. This field appears to be boilerplate and + // has no effect. + NumberOfCrafts byte +} + +// Marshal ... +func (a *CraftCreativeStackRequestAction) Marshal(r protocol.IO) { + r.Varuint32(&a.CreativeItemNetworkID) + r.Uint8(&a.NumberOfCrafts) +} + +// CraftRecipeOptionalStackRequestAction is sent when using an anvil. When this action is sent, the +// FilterStrings field in the respective stack request is non-empty and contains the name of the item created +// using the anvil or cartography table. +type CraftRecipeOptionalStackRequestAction struct { + // RecipeNetworkID is the network ID of the multi-recipe that is about to be crafted. This network ID matches + // one of the multi-recipes sent in the CraftingData packet, where each of the recipes have a RecipeNetworkID as + // of 1.16. + RecipeNetworkID uint32 + // FilterStringIndex is the index of a filter string sent in a ItemStackRequest. + FilterStringIndex int32 +} + +// Marshal ... +func (c *CraftRecipeOptionalStackRequestAction) Marshal(r protocol.IO) { + r.Varuint32(&c.RecipeNetworkID) + r.Int32(&c.FilterStringIndex) +} + +// CraftGrindstoneRecipeStackRequestAction is sent when a grindstone recipe is crafted. It contains the RecipeNetworkID +// to identify the recipe crafted, and the cost for crafting the recipe. +type CraftGrindstoneRecipeStackRequestAction struct { + // RecipeNetworkID is the network ID of the recipe that is about to be crafted. This network ID matches + // one of the recipes sent in the CraftingData packet, where each of the recipes have a RecipeNetworkID as + // of 1.16. + RecipeNetworkID uint32 + // NumberOfCrafts is how many times the recipe was crafted. This field appears to be boilerplate and + // has no effect. + NumberOfCrafts byte + // Cost is the cost of the recipe that was crafted. + Cost int32 +} + +// Marshal ... +func (c *CraftGrindstoneRecipeStackRequestAction) Marshal(r protocol.IO) { + r.Varuint32(&c.RecipeNetworkID) + r.Uint8(&c.NumberOfCrafts) + r.Varint32(&c.Cost) +} + +// CraftLoomRecipeStackRequestAction is sent when a loom recipe is crafted. It simply contains the +// pattern identifier to figure out what pattern is meant to be applied to the item. +type CraftLoomRecipeStackRequestAction struct { + // Pattern is the pattern identifier for the loom recipe. + Pattern string + // TimesCrafted is how many times the recipe was crafted. + TimesCrafted byte +} + +// Marshal ... +func (c *CraftLoomRecipeStackRequestAction) Marshal(r protocol.IO) { + r.String(&c.Pattern) + r.Uint8(&c.TimesCrafted) +} + +// CraftNonImplementedStackRequestAction is an action sent for inventory actions that aren't yet implemented +// in the new system. These include, for example, anvils. +type CraftNonImplementedStackRequestAction struct{} + +// Marshal ... +func (*CraftNonImplementedStackRequestAction) Marshal(protocol.IO) {} + +// CraftResultsDeprecatedStackRequestAction is an additional, deprecated packet sent by the client after +// crafting. It holds the final results and the amount of times the recipe was crafted. It shouldn't be used. +// This action is also sent when an item is enchanted. Enchanting should be treated mostly the same way as +// crafting, where the old item is consumed. +type CraftResultsDeprecatedStackRequestAction struct { + ResultItems []protocol.ItemStack + TimesCrafted byte +} + +// Marshal ... +func (a *CraftResultsDeprecatedStackRequestAction) Marshal(r protocol.IO) { + protocol.FuncSlice(r, &a.ResultItems, r.Item) + r.Uint8(&a.TimesCrafted) +} + +// StackRequestSlotInfo holds information on a specific slot client-side. +type StackRequestSlotInfo struct { + // Container is the FullContainerName that describes the container that the slot is in. + Container protocol.FullContainerName + // Slot is the index of the slot within the container with the ContainerID above. + Slot byte + // StackNetworkID is the unique stack ID that the client assumes to be present in this slot. The server + // must check if these IDs match. If they do not match, servers should reject the stack request that the + // action holding this info was in. + StackNetworkID int32 +} + +// StackReqSlotInfo reads/writes a StackRequestSlotInfo x using IO r. +func StackReqSlotInfo(r protocol.IO, x *StackRequestSlotInfo) { + protocol.Single(r, &x.Container) + r.Uint8(&x.Slot) + r.Varint32(&x.StackNetworkID) +} diff --git a/legacyver/proto/resource_pack.go b/legacyver/proto/resource_pack.go new file mode 100644 index 0000000..b626f67 --- /dev/null +++ b/legacyver/proto/resource_pack.go @@ -0,0 +1,79 @@ +package proto + +import ( + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/protocol" +) + +// TexturePackInfo represents a texture pack's info sent over network. It holds information about the +// texture pack such as its name, description and version. +type TexturePackInfo struct { + // UUID is the UUID of the texture pack. Each texture pack downloaded must have a different UUID in + // order for the client to be able to handle them properly. + UUID uuid.UUID + // Version is the version of the texture pack. The client will cache texture packs sent by the server as + // long as they carry the same version. Sending a texture pack with a different version than previously + // will force the client to re-download it. + Version string + // Size is the total size in bytes that the texture pack occupies. This is the size of the compressed + // archive (zip) of the texture pack. + Size uint64 + // ContentKey is the key used to decrypt the behaviour pack if it is encrypted. This is generally the case + // for marketplace texture packs. + ContentKey string + // SubPackName ... + SubPackName string + // ContentIdentity is another UUID for the resource pack, and is generally set for marketplace texture + // packs. It is also required for client-side validations when the resource pack is encrypted. + ContentIdentity string + // HasScripts specifies if the texture packs has any scripts in it. A client will only download the + // behaviour pack if it supports scripts, which, up to 1.11, only includes Windows 10. + HasScripts bool + // AddonPack specifies if the texture pack is from an addon. + AddonPack bool + // RTXEnabled specifies if the texture pack uses the raytracing technology introduced in 1.16.200. + RTXEnabled bool + // DownloadURL is a URL that the client can use to download the pack instead of the server sending it in + // chunks, which it will continue to do if this field is left empty. + DownloadURL string +} + +func (x *TexturePackInfo) ToLatest() protocol.TexturePackInfo { + return protocol.TexturePackInfo{ + UUID: x.UUID, + Version: x.Version, + Size: x.Size, + ContentKey: x.ContentKey, + SubPackName: x.SubPackName, + ContentIdentity: x.ContentIdentity, + HasScripts: x.HasScripts, + AddonPack: x.AddonPack, + RTXEnabled: x.RTXEnabled, + DownloadURL: x.DownloadURL, + } +} + +// Marshal encodes/decodes a TexturePackInfo. +func (x *TexturePackInfo) Marshal(r protocol.IO) { + if IsProtoGTE(r, ID766) { + r.UUID(&x.UUID) + } else { + if IsReader(r) { + uuidStr := "" + r.String(&uuidStr) + x.UUID = uuid.MustParse(uuidStr) + } else { + uuidStr := x.UUID.String() + r.String(&uuidStr) + } + } + r.String(&x.Version) + r.Uint64(&x.Size) + r.String(&x.ContentKey) + r.String(&x.SubPackName) + r.String(&x.ContentIdentity) + r.Bool(&x.HasScripts) + r.Bool(&x.AddonPack) + r.Bool(&x.RTXEnabled) + r.String(&x.DownloadURL) +} diff --git a/legacyver/proto/type.go b/legacyver/proto/type.go new file mode 100644 index 0000000..880a295 --- /dev/null +++ b/legacyver/proto/type.go @@ -0,0 +1,5 @@ +package proto + +type legacyType struct { + ProtocolID int32 +} diff --git a/legacyver/protocol.go b/legacyver/protocol.go new file mode 100644 index 0000000..421968f --- /dev/null +++ b/legacyver/protocol.go @@ -0,0 +1,215 @@ +package legacyver + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/legacypacket" + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +var ( + packetPoolClient packet.Pool + packetPoolServer packet.Pool +) + +func init() { + packetPoolClient = packet.NewClientPool() + packetPoolServer = packet.NewServerPool() + + packetPoolServer[packet.IDItemStackResponse] = func() packet.Packet { return &legacypacket.ItemStackResponse{} } + packetPoolServer[packet.IDResourcePacksInfo] = func() packet.Packet { return &legacypacket.ResourcePacksInfo{} } + + packetPoolClient[packet.IDPlayerAuthInput] = func() packet.Packet { return &legacypacket.PlayerAuthInput{} } +} + +type Protocol struct { + ver string + id int32 + + blockTranslator BlockTranslator + itemTranslator ItemTranslator +} + +func (p *Protocol) Ver() string { + return p.ver +} + +func (p *Protocol) ID() int32 { + return p.id +} + +func (p *Protocol) Packets(listener bool) packet.Pool { + if listener { + return packetPoolClient + } + return packetPoolServer +} + +func (p *Protocol) NewReader(r minecraft.ByteReader, shieldID int32, enableLimits bool) protocol.IO { + return proto.NewReader(protocol.NewReader(r, shieldID, enableLimits), p.id) +} + +func (p *Protocol) NewWriter(w minecraft.ByteWriter, shieldID int32) protocol.IO { + return proto.NewWriter(protocol.NewWriter(w, shieldID), p.id) +} + +func (p *Protocol) ConvertToLatest(pk packet.Packet, conn *minecraft.Conn) []packet.Packet { + return p.blockTranslator.UpgradeBlockPackets( + p.itemTranslator.UpgradeItemPackets(p.upgradePackets([]packet.Packet{pk}, conn), conn), + conn) +} + +func (p *Protocol) ConvertFromLatest(pk packet.Packet, conn *minecraft.Conn) []packet.Packet { + return p.downgradePackets(p.blockTranslator.DowngradeBlockPackets( + p.itemTranslator.DowngradeItemPackets([]packet.Packet{pk}, conn), + conn), conn) +} + +func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) []packet.Packet { + for pkIndex, pk := range pks { + switch pk := pk.(type) { + case *packet.StartGame: + pk.GameVersion = p.ver + pk.BaseGameVersion = p.ver + case *packet.PlayerAuthInput: + inputData := pk.InputData + if p.ID() < proto.ID766 { + inputData = fitBitset(inputData, 64) + } + pks[pkIndex] = &legacypacket.PlayerAuthInput{ + Pitch: pk.Pitch, + Yaw: pk.Yaw, + Position: pk.Position, + MoveVector: pk.MoveVector, + HeadYaw: pk.HeadYaw, + InputData: inputData, + InputMode: pk.InputMode, + PlayMode: pk.PlayMode, + InteractionModel: pk.InteractionModel, + InteractPitch: pk.InteractPitch, + InteractYaw: pk.InteractYaw, + Tick: pk.Tick, + Delta: pk.Delta, + ItemInteractionData: pk.ItemInteractionData, + ItemStackRequest: pk.ItemStackRequest, + BlockActions: pk.BlockActions, + VehicleRotation: pk.VehicleRotation, + ClientPredictedVehicle: pk.ClientPredictedVehicle, + AnalogueMoveVector: pk.AnalogueMoveVector, + CameraOrientation: pk.CameraOrientation, + RawMoveVector: pk.RawMoveVector, + } + case *packet.ItemStackResponse: + responses := make([]proto.ItemStackResponse, len(pk.Responses)) + for i, r := range pk.Responses { + containerInfo := make([]proto.StackResponseContainerInfo, len(r.ContainerInfo)) + for j, c := range r.ContainerInfo { + slotInfo := make([]proto.StackResponseSlotInfo, len(c.SlotInfo)) + for k, s := range c.SlotInfo { + slotInfo[k] = proto.StackResponseSlotInfo{ + Slot: s.Slot, + HotbarSlot: s.HotbarSlot, + Count: s.Count, + StackNetworkID: s.StackNetworkID, + CustomName: s.CustomName, + FilteredCustomName: s.FilteredCustomName, + DurabilityCorrection: s.DurabilityCorrection, + } + } + containerInfo[j] = proto.StackResponseContainerInfo{ + Container: c.Container, + SlotInfo: slotInfo, + } + } + + responses[i] = proto.ItemStackResponse{ + Status: r.Status, + RequestID: r.RequestID, + ContainerInfo: containerInfo, + } + } + pks[pkIndex] = &legacypacket.ItemStackResponse{Responses: responses} + case *packet.ResourcePacksInfo: + texturePacks := make([]proto.TexturePackInfo, len(pk.TexturePacks)) + for i, t := range pk.TexturePacks { + texturePacks[i] = proto.TexturePackInfo{ + UUID: t.UUID, + Version: t.Version, + Size: t.Size, + ContentKey: t.ContentKey, + SubPackName: t.SubPackName, + ContentIdentity: t.ContentIdentity, + HasScripts: t.HasScripts, + AddonPack: t.AddonPack, + RTXEnabled: t.RTXEnabled, + DownloadURL: t.DownloadURL, + } + } + pks[pkIndex] = &legacypacket.ResourcePacksInfo{ + TexturePackRequired: pk.TexturePackRequired, + HasAddons: pk.HasAddons, + HasScripts: pk.HasScripts, + WorldTemplateUUID: pk.WorldTemplateUUID, + WorldTemplateVersion: pk.WorldTemplateVersion, + TexturePacks: texturePacks, + } + } + } + + return pks +} + +func (p *Protocol) upgradePackets(pks []packet.Packet, conn *minecraft.Conn) []packet.Packet { + for pkIndex, pk := range pks { + switch pk := pk.(type) { + case *packet.StartGame: + pk.GameVersion = p.ver + pk.BaseGameVersion = p.ver + case *legacypacket.PlayerAuthInput: + pks[pkIndex] = &packet.PlayerAuthInput{ + Pitch: pk.Pitch, + Yaw: pk.Yaw, + Position: pk.Position, + MoveVector: pk.MoveVector, + HeadYaw: pk.HeadYaw, + InputData: fitBitset(pk.InputData, packet.PlayerAuthInputBitsetSize), + InputMode: pk.InputMode, + PlayMode: pk.PlayMode, + InteractionModel: pk.InteractionModel, + InteractPitch: pk.InteractPitch, + InteractYaw: pk.InteractYaw, + Tick: pk.Tick, + Delta: pk.Delta, + ItemInteractionData: pk.ItemInteractionData, + ItemStackRequest: pk.ItemStackRequest, + BlockActions: pk.BlockActions, + VehicleRotation: pk.VehicleRotation, + ClientPredictedVehicle: pk.ClientPredictedVehicle, + AnalogueMoveVector: pk.AnalogueMoveVector, + CameraOrientation: pk.CameraOrientation, + RawMoveVector: pk.RawMoveVector, + } + case *legacypacket.ItemStackResponse: + responses := make([]protocol.ItemStackResponse, len(pk.Responses)) + for i, r := range pk.Responses { + responses[i] = r.ToLatest() + } + pks[pkIndex] = &packet.ItemStackResponse{Responses: responses} + case *legacypacket.ResourcePacksInfo: + texturePacks := make([]protocol.TexturePackInfo, len(pk.TexturePacks)) + for i, t := range pk.TexturePacks { + texturePacks[i] = t.ToLatest() + } + pks[pkIndex] = &packet.ResourcePacksInfo{ + TexturePackRequired: pk.TexturePackRequired, + HasAddons: pk.HasAddons, + HasScripts: pk.HasScripts, + WorldTemplateUUID: pk.WorldTemplateUUID, + WorldTemplateVersion: pk.WorldTemplateVersion, + TexturePacks: texturePacks, + } + } + } + return pks +} diff --git a/legacyver/required_item_list_748.json b/legacyver/required_item_list_748.json new file mode 100644 index 0000000..5d02118 --- /dev/null +++ b/legacyver/required_item_list_748.json @@ -0,0 +1,6998 @@ +{ + "minecraft:acacia_boat": { + "runtime_id": 405, + "component_based": false + }, + "minecraft:acacia_button": { + "runtime_id": -140, + "component_based": false + }, + "minecraft:acacia_chest_boat": { + "runtime_id": 679, + "component_based": false + }, + "minecraft:acacia_door": { + "runtime_id": 589, + "component_based": false + }, + "minecraft:acacia_double_slab": { + "runtime_id": -812, + "component_based": false + }, + "minecraft:acacia_fence": { + "runtime_id": -575, + "component_based": false + }, + "minecraft:acacia_fence_gate": { + "runtime_id": 187, + "component_based": false + }, + "minecraft:acacia_hanging_sign": { + "runtime_id": -504, + "component_based": false + }, + "minecraft:acacia_leaves": { + "runtime_id": 161, + "component_based": false + }, + "minecraft:acacia_log": { + "runtime_id": 162, + "component_based": false + }, + "minecraft:acacia_planks": { + "runtime_id": -742, + "component_based": false + }, + "minecraft:acacia_pressure_plate": { + "runtime_id": -150, + "component_based": false + }, + "minecraft:acacia_sapling": { + "runtime_id": -828, + "component_based": false + }, + "minecraft:acacia_sign": { + "runtime_id": 612, + "component_based": false + }, + "minecraft:acacia_slab": { + "runtime_id": -807, + "component_based": false + }, + "minecraft:acacia_stairs": { + "runtime_id": 163, + "component_based": false + }, + "minecraft:acacia_standing_sign": { + "runtime_id": -190, + "component_based": false + }, + "minecraft:acacia_trapdoor": { + "runtime_id": -145, + "component_based": false + }, + "minecraft:acacia_wall_sign": { + "runtime_id": -191, + "component_based": false + }, + "minecraft:acacia_wood": { + "runtime_id": -817, + "component_based": false + }, + "minecraft:activator_rail": { + "runtime_id": 126, + "component_based": false + }, + "minecraft:agent_spawn_egg": { + "runtime_id": 515, + "component_based": false + }, + "minecraft:air": { + "runtime_id": -158, + "component_based": false + }, + "minecraft:allay_spawn_egg": { + "runtime_id": 668, + "component_based": false + }, + "minecraft:allium": { + "runtime_id": -831, + "component_based": false + }, + "minecraft:allow": { + "runtime_id": 210, + "component_based": false + }, + "minecraft:amethyst_block": { + "runtime_id": -327, + "component_based": false + }, + "minecraft:amethyst_cluster": { + "runtime_id": -329, + "component_based": false + }, + "minecraft:amethyst_shard": { + "runtime_id": 661, + "component_based": false + }, + "minecraft:ancient_debris": { + "runtime_id": -271, + "component_based": false + }, + "minecraft:andesite": { + "runtime_id": -594, + "component_based": false + }, + "minecraft:andesite_double_slab": { + "runtime_id": -920, + "component_based": false + }, + "minecraft:andesite_slab": { + "runtime_id": -893, + "component_based": false + }, + "minecraft:andesite_stairs": { + "runtime_id": -171, + "component_based": false + }, + "minecraft:andesite_wall": { + "runtime_id": -974, + "component_based": false + }, + "minecraft:angler_pottery_sherd": { + "runtime_id": 693, + "component_based": false + }, + "minecraft:anvil": { + "runtime_id": 145, + "component_based": false + }, + "minecraft:apple": { + "runtime_id": 278, + "component_based": true + }, + "minecraft:archer_pottery_sherd": { + "runtime_id": 694, + "component_based": false + }, + "minecraft:armadillo_scute": { + "runtime_id": 740, + "component_based": false + }, + "minecraft:armadillo_spawn_egg": { + "runtime_id": 739, + "component_based": false + }, + "minecraft:armor_stand": { + "runtime_id": 585, + "component_based": false + }, + "minecraft:arms_up_pottery_sherd": { + "runtime_id": 695, + "component_based": false + }, + "minecraft:arrow": { + "runtime_id": 325, + "component_based": true + }, + "minecraft:axolotl_bucket": { + "runtime_id": 394, + "component_based": false + }, + "minecraft:axolotl_spawn_egg": { + "runtime_id": 530, + "component_based": false + }, + "minecraft:azalea": { + "runtime_id": -337, + "component_based": false + }, + "minecraft:azalea_leaves": { + "runtime_id": -324, + "component_based": false + }, + "minecraft:azalea_leaves_flowered": { + "runtime_id": -325, + "component_based": false + }, + "minecraft:azure_bluet": { + "runtime_id": -832, + "component_based": false + }, + "minecraft:baked_potato": { + "runtime_id": 303, + "component_based": false + }, + "minecraft:balloon": { + "runtime_id": 635, + "component_based": false + }, + "minecraft:bamboo": { + "runtime_id": -163, + "component_based": false + }, + "minecraft:bamboo_block": { + "runtime_id": -527, + "component_based": false + }, + "minecraft:bamboo_button": { + "runtime_id": -511, + "component_based": false + }, + "minecraft:bamboo_chest_raft": { + "runtime_id": 691, + "component_based": false + }, + "minecraft:bamboo_door": { + "runtime_id": -517, + "component_based": false + }, + "minecraft:bamboo_double_slab": { + "runtime_id": -521, + "component_based": false + }, + "minecraft:bamboo_fence": { + "runtime_id": -515, + "component_based": false + }, + "minecraft:bamboo_fence_gate": { + "runtime_id": -516, + "component_based": false + }, + "minecraft:bamboo_hanging_sign": { + "runtime_id": -522, + "component_based": false + }, + "minecraft:bamboo_mosaic": { + "runtime_id": -509, + "component_based": false + }, + "minecraft:bamboo_mosaic_double_slab": { + "runtime_id": -525, + "component_based": false + }, + "minecraft:bamboo_mosaic_slab": { + "runtime_id": -524, + "component_based": false + }, + "minecraft:bamboo_mosaic_stairs": { + "runtime_id": -523, + "component_based": false + }, + "minecraft:bamboo_planks": { + "runtime_id": -510, + "component_based": false + }, + "minecraft:bamboo_pressure_plate": { + "runtime_id": -514, + "component_based": false + }, + "minecraft:bamboo_raft": { + "runtime_id": 690, + "component_based": false + }, + "minecraft:bamboo_sapling": { + "runtime_id": -164, + "component_based": false + }, + "minecraft:bamboo_sign": { + "runtime_id": 689, + "component_based": false + }, + "minecraft:bamboo_slab": { + "runtime_id": -513, + "component_based": false + }, + "minecraft:bamboo_stairs": { + "runtime_id": -512, + "component_based": false + }, + "minecraft:bamboo_standing_sign": { + "runtime_id": -518, + "component_based": false + }, + "minecraft:bamboo_trapdoor": { + "runtime_id": -520, + "component_based": false + }, + "minecraft:bamboo_wall_sign": { + "runtime_id": -519, + "component_based": false + }, + "minecraft:banner": { + "runtime_id": 600, + "component_based": false + }, + "minecraft:banner_pattern": { + "runtime_id": 788, + "component_based": false + }, + "minecraft:barrel": { + "runtime_id": -203, + "component_based": false + }, + "minecraft:barrier": { + "runtime_id": -161, + "component_based": false + }, + "minecraft:basalt": { + "runtime_id": -234, + "component_based": false + }, + "minecraft:bat_spawn_egg": { + "runtime_id": 480, + "component_based": false + }, + "minecraft:beacon": { + "runtime_id": 138, + "component_based": false + }, + "minecraft:bed": { + "runtime_id": 444, + "component_based": false + }, + "minecraft:bedrock": { + "runtime_id": 7, + "component_based": false + }, + "minecraft:bee_nest": { + "runtime_id": -218, + "component_based": false + }, + "minecraft:bee_spawn_egg": { + "runtime_id": 522, + "component_based": false + }, + "minecraft:beef": { + "runtime_id": 295, + "component_based": false + }, + "minecraft:beehive": { + "runtime_id": -219, + "component_based": false + }, + "minecraft:beetroot": { + "runtime_id": 307, + "component_based": false + }, + "minecraft:beetroot_seeds": { + "runtime_id": 317, + "component_based": false + }, + "minecraft:beetroot_soup": { + "runtime_id": 308, + "component_based": false + }, + "minecraft:bell": { + "runtime_id": -206, + "component_based": false + }, + "minecraft:big_dripleaf": { + "runtime_id": -323, + "component_based": false + }, + "minecraft:birch_boat": { + "runtime_id": 402, + "component_based": false + }, + "minecraft:birch_button": { + "runtime_id": -141, + "component_based": false + }, + "minecraft:birch_chest_boat": { + "runtime_id": 676, + "component_based": false + }, + "minecraft:birch_door": { + "runtime_id": 587, + "component_based": false + }, + "minecraft:birch_double_slab": { + "runtime_id": -810, + "component_based": false + }, + "minecraft:birch_fence": { + "runtime_id": -576, + "component_based": false + }, + "minecraft:birch_fence_gate": { + "runtime_id": 184, + "component_based": false + }, + "minecraft:birch_hanging_sign": { + "runtime_id": -502, + "component_based": false + }, + "minecraft:birch_leaves": { + "runtime_id": -801, + "component_based": false + }, + "minecraft:birch_log": { + "runtime_id": -570, + "component_based": false + }, + "minecraft:birch_planks": { + "runtime_id": -740, + "component_based": false + }, + "minecraft:birch_pressure_plate": { + "runtime_id": -151, + "component_based": false + }, + "minecraft:birch_sapling": { + "runtime_id": -826, + "component_based": false + }, + "minecraft:birch_sign": { + "runtime_id": 610, + "component_based": false + }, + "minecraft:birch_slab": { + "runtime_id": -805, + "component_based": false + }, + "minecraft:birch_stairs": { + "runtime_id": 135, + "component_based": false + }, + "minecraft:birch_standing_sign": { + "runtime_id": -186, + "component_based": false + }, + "minecraft:birch_trapdoor": { + "runtime_id": -146, + "component_based": false + }, + "minecraft:birch_wall_sign": { + "runtime_id": -187, + "component_based": false + }, + "minecraft:birch_wood": { + "runtime_id": -815, + "component_based": false + }, + "minecraft:black_bundle": { + "runtime_id": 259, + "component_based": true + }, + "minecraft:black_candle": { + "runtime_id": -428, + "component_based": false + }, + "minecraft:black_candle_cake": { + "runtime_id": -445, + "component_based": false + }, + "minecraft:black_carpet": { + "runtime_id": -611, + "component_based": false + }, + "minecraft:black_concrete": { + "runtime_id": -642, + "component_based": false + }, + "minecraft:black_concrete_powder": { + "runtime_id": -723, + "component_based": false + }, + "minecraft:black_dye": { + "runtime_id": 421, + "component_based": false + }, + "minecraft:black_glazed_terracotta": { + "runtime_id": 235, + "component_based": false + }, + "minecraft:black_shulker_box": { + "runtime_id": -627, + "component_based": false + }, + "minecraft:black_stained_glass": { + "runtime_id": -687, + "component_based": false + }, + "minecraft:black_stained_glass_pane": { + "runtime_id": -657, + "component_based": false + }, + "minecraft:black_terracotta": { + "runtime_id": -738, + "component_based": false + }, + "minecraft:black_wool": { + "runtime_id": -554, + "component_based": false + }, + "minecraft:blackstone": { + "runtime_id": -273, + "component_based": false + }, + "minecraft:blackstone_double_slab": { + "runtime_id": -283, + "component_based": false + }, + "minecraft:blackstone_slab": { + "runtime_id": -282, + "component_based": false + }, + "minecraft:blackstone_stairs": { + "runtime_id": -276, + "component_based": false + }, + "minecraft:blackstone_wall": { + "runtime_id": -277, + "component_based": false + }, + "minecraft:blade_pottery_sherd": { + "runtime_id": 696, + "component_based": false + }, + "minecraft:blast_furnace": { + "runtime_id": -196, + "component_based": false + }, + "minecraft:blaze_powder": { + "runtime_id": 456, + "component_based": false + }, + "minecraft:blaze_rod": { + "runtime_id": 449, + "component_based": false + }, + "minecraft:blaze_spawn_egg": { + "runtime_id": 483, + "component_based": false + }, + "minecraft:bleach": { + "runtime_id": 633, + "component_based": false + }, + "minecraft:blue_bundle": { + "runtime_id": 266, + "component_based": true + }, + "minecraft:blue_candle": { + "runtime_id": -424, + "component_based": false + }, + "minecraft:blue_candle_cake": { + "runtime_id": -441, + "component_based": false + }, + "minecraft:blue_carpet": { + "runtime_id": -607, + "component_based": false + }, + "minecraft:blue_concrete": { + "runtime_id": -638, + "component_based": false + }, + "minecraft:blue_concrete_powder": { + "runtime_id": -719, + "component_based": false + }, + "minecraft:blue_dye": { + "runtime_id": 425, + "component_based": false + }, + "minecraft:blue_glazed_terracotta": { + "runtime_id": 231, + "component_based": false + }, + "minecraft:blue_ice": { + "runtime_id": -11, + "component_based": false + }, + "minecraft:blue_orchid": { + "runtime_id": -830, + "component_based": false + }, + "minecraft:blue_shulker_box": { + "runtime_id": -623, + "component_based": false + }, + "minecraft:blue_stained_glass": { + "runtime_id": -683, + "component_based": false + }, + "minecraft:blue_stained_glass_pane": { + "runtime_id": -653, + "component_based": false + }, + "minecraft:blue_terracotta": { + "runtime_id": -734, + "component_based": false + }, + "minecraft:blue_wool": { + "runtime_id": -563, + "component_based": false + }, + "minecraft:boat": { + "runtime_id": 786, + "component_based": false + }, + "minecraft:bogged_spawn_egg": { + "runtime_id": 490, + "component_based": false + }, + "minecraft:bolt_armor_trim_smithing_template": { + "runtime_id": 735, + "component_based": false + }, + "minecraft:bone": { + "runtime_id": 441, + "component_based": false + }, + "minecraft:bone_block": { + "runtime_id": 216, + "component_based": false + }, + "minecraft:bone_meal": { + "runtime_id": 437, + "component_based": false + }, + "minecraft:book": { + "runtime_id": 413, + "component_based": false + }, + "minecraft:bookshelf": { + "runtime_id": 47, + "component_based": false + }, + "minecraft:border_block": { + "runtime_id": 212, + "component_based": false + }, + "minecraft:bordure_indented_banner_pattern": { + "runtime_id": 619, + "component_based": false + }, + "minecraft:bow": { + "runtime_id": 324, + "component_based": false + }, + "minecraft:bowl": { + "runtime_id": 346, + "component_based": false + }, + "minecraft:brain_coral": { + "runtime_id": -581, + "component_based": false + }, + "minecraft:brain_coral_block": { + "runtime_id": -849, + "component_based": false + }, + "minecraft:brain_coral_fan": { + "runtime_id": -840, + "component_based": false + }, + "minecraft:brain_coral_wall_fan": { + "runtime_id": -904, + "component_based": false + }, + "minecraft:bread": { + "runtime_id": 283, + "component_based": false + }, + "minecraft:breeze_rod": { + "runtime_id": 274, + "component_based": true + }, + "minecraft:breeze_spawn_egg": { + "runtime_id": 529, + "component_based": false + }, + "minecraft:brewer_pottery_sherd": { + "runtime_id": 697, + "component_based": false + }, + "minecraft:brewing_stand": { + "runtime_id": 458, + "component_based": true + }, + "minecraft:brick": { + "runtime_id": 409, + "component_based": false + }, + "minecraft:brick_block": { + "runtime_id": 45, + "component_based": false + }, + "minecraft:brick_double_slab": { + "runtime_id": -880, + "component_based": false + }, + "minecraft:brick_slab": { + "runtime_id": -874, + "component_based": false + }, + "minecraft:brick_stairs": { + "runtime_id": 108, + "component_based": false + }, + "minecraft:brick_wall": { + "runtime_id": -976, + "component_based": false + }, + "minecraft:brown_bundle": { + "runtime_id": 261, + "component_based": true + }, + "minecraft:brown_candle": { + "runtime_id": -425, + "component_based": false + }, + "minecraft:brown_candle_cake": { + "runtime_id": -442, + "component_based": false + }, + "minecraft:brown_carpet": { + "runtime_id": -608, + "component_based": false + }, + "minecraft:brown_concrete": { + "runtime_id": -639, + "component_based": false + }, + "minecraft:brown_concrete_powder": { + "runtime_id": -720, + "component_based": false + }, + "minecraft:brown_dye": { + "runtime_id": 424, + "component_based": false + }, + "minecraft:brown_glazed_terracotta": { + "runtime_id": 232, + "component_based": false + }, + "minecraft:brown_mushroom": { + "runtime_id": 39, + "component_based": false + }, + "minecraft:brown_mushroom_block": { + "runtime_id": 99, + "component_based": false + }, + "minecraft:brown_shulker_box": { + "runtime_id": -624, + "component_based": false + }, + "minecraft:brown_stained_glass": { + "runtime_id": -684, + "component_based": false + }, + "minecraft:brown_stained_glass_pane": { + "runtime_id": -654, + "component_based": false + }, + "minecraft:brown_terracotta": { + "runtime_id": -735, + "component_based": false + }, + "minecraft:brown_wool": { + "runtime_id": -555, + "component_based": false + }, + "minecraft:brush": { + "runtime_id": 716, + "component_based": false + }, + "minecraft:bubble_column": { + "runtime_id": -160, + "component_based": false + }, + "minecraft:bubble_coral": { + "runtime_id": -582, + "component_based": false + }, + "minecraft:bubble_coral_block": { + "runtime_id": -850, + "component_based": false + }, + "minecraft:bubble_coral_fan": { + "runtime_id": -841, + "component_based": false + }, + "minecraft:bubble_coral_wall_fan": { + "runtime_id": -136, + "component_based": false + }, + "minecraft:bucket": { + "runtime_id": 385, + "component_based": false + }, + "minecraft:budding_amethyst": { + "runtime_id": -328, + "component_based": false + }, + "minecraft:bundle": { + "runtime_id": 269, + "component_based": true + }, + "minecraft:burn_pottery_sherd": { + "runtime_id": 698, + "component_based": false + }, + "minecraft:cactus": { + "runtime_id": 81, + "component_based": false + }, + "minecraft:cake": { + "runtime_id": 443, + "component_based": true + }, + "minecraft:calcite": { + "runtime_id": -326, + "component_based": false + }, + "minecraft:calibrated_sculk_sensor": { + "runtime_id": -580, + "component_based": false + }, + "minecraft:camel_spawn_egg": { + "runtime_id": 692, + "component_based": false + }, + "minecraft:camera": { + "runtime_id": 630, + "component_based": false + }, + "minecraft:campfire": { + "runtime_id": 624, + "component_based": true + }, + "minecraft:candle": { + "runtime_id": -412, + "component_based": false + }, + "minecraft:candle_cake": { + "runtime_id": -429, + "component_based": false + }, + "minecraft:carpet": { + "runtime_id": 745, + "component_based": false + }, + "minecraft:carrot": { + "runtime_id": 301, + "component_based": false + }, + "minecraft:carrot_on_a_stick": { + "runtime_id": 550, + "component_based": false + }, + "minecraft:carrots": { + "runtime_id": 141, + "component_based": false + }, + "minecraft:cartography_table": { + "runtime_id": -200, + "component_based": false + }, + "minecraft:carved_pumpkin": { + "runtime_id": -155, + "component_based": false + }, + "minecraft:cat_spawn_egg": { + "runtime_id": 516, + "component_based": false + }, + "minecraft:cauldron": { + "runtime_id": 459, + "component_based": true + }, + "minecraft:cave_spider_spawn_egg": { + "runtime_id": 484, + "component_based": false + }, + "minecraft:cave_vines": { + "runtime_id": -322, + "component_based": false + }, + "minecraft:cave_vines_body_with_berries": { + "runtime_id": -375, + "component_based": false + }, + "minecraft:cave_vines_head_with_berries": { + "runtime_id": -376, + "component_based": false + }, + "minecraft:chain": { + "runtime_id": 656, + "component_based": true + }, + "minecraft:chain_command_block": { + "runtime_id": 189, + "component_based": false + }, + "minecraft:chainmail_boots": { + "runtime_id": 367, + "component_based": false + }, + "minecraft:chainmail_chestplate": { + "runtime_id": 365, + "component_based": false + }, + "minecraft:chainmail_helmet": { + "runtime_id": 364, + "component_based": false + }, + "minecraft:chainmail_leggings": { + "runtime_id": 366, + "component_based": false + }, + "minecraft:charcoal": { + "runtime_id": 327, + "component_based": true + }, + "minecraft:chemical_heat": { + "runtime_id": 192, + "component_based": false + }, + "minecraft:chemistry_table": { + "runtime_id": 780, + "component_based": false + }, + "minecraft:cherry_boat": { + "runtime_id": 686, + "component_based": false + }, + "minecraft:cherry_button": { + "runtime_id": -530, + "component_based": false + }, + "minecraft:cherry_chest_boat": { + "runtime_id": 687, + "component_based": false + }, + "minecraft:cherry_door": { + "runtime_id": -531, + "component_based": false + }, + "minecraft:cherry_double_slab": { + "runtime_id": -540, + "component_based": false + }, + "minecraft:cherry_fence": { + "runtime_id": -532, + "component_based": false + }, + "minecraft:cherry_fence_gate": { + "runtime_id": -533, + "component_based": false + }, + "minecraft:cherry_hanging_sign": { + "runtime_id": -534, + "component_based": false + }, + "minecraft:cherry_leaves": { + "runtime_id": -548, + "component_based": false + }, + "minecraft:cherry_log": { + "runtime_id": -536, + "component_based": false + }, + "minecraft:cherry_planks": { + "runtime_id": -537, + "component_based": false + }, + "minecraft:cherry_pressure_plate": { + "runtime_id": -538, + "component_based": false + }, + "minecraft:cherry_sapling": { + "runtime_id": -547, + "component_based": false + }, + "minecraft:cherry_sign": { + "runtime_id": 688, + "component_based": false + }, + "minecraft:cherry_slab": { + "runtime_id": -539, + "component_based": false + }, + "minecraft:cherry_stairs": { + "runtime_id": -541, + "component_based": false + }, + "minecraft:cherry_standing_sign": { + "runtime_id": -542, + "component_based": false + }, + "minecraft:cherry_trapdoor": { + "runtime_id": -543, + "component_based": false + }, + "minecraft:cherry_wall_sign": { + "runtime_id": -544, + "component_based": false + }, + "minecraft:cherry_wood": { + "runtime_id": -546, + "component_based": false + }, + "minecraft:chest": { + "runtime_id": 54, + "component_based": false + }, + "minecraft:chest_boat": { + "runtime_id": 682, + "component_based": false + }, + "minecraft:chest_minecart": { + "runtime_id": 415, + "component_based": false + }, + "minecraft:chicken": { + "runtime_id": 297, + "component_based": false + }, + "minecraft:chicken_spawn_egg": { + "runtime_id": 462, + "component_based": false + }, + "minecraft:chipped_anvil": { + "runtime_id": -959, + "component_based": false + }, + "minecraft:chiseled_bookshelf": { + "runtime_id": -526, + "component_based": false + }, + "minecraft:chiseled_copper": { + "runtime_id": -760, + "component_based": false + }, + "minecraft:chiseled_deepslate": { + "runtime_id": -395, + "component_based": false + }, + "minecraft:chiseled_nether_bricks": { + "runtime_id": -302, + "component_based": false + }, + "minecraft:chiseled_polished_blackstone": { + "runtime_id": -279, + "component_based": false + }, + "minecraft:chiseled_quartz_block": { + "runtime_id": -953, + "component_based": false + }, + "minecraft:chiseled_red_sandstone": { + "runtime_id": -956, + "component_based": false + }, + "minecraft:chiseled_sandstone": { + "runtime_id": -944, + "component_based": false + }, + "minecraft:chiseled_stone_bricks": { + "runtime_id": -870, + "component_based": false + }, + "minecraft:chiseled_tuff": { + "runtime_id": -753, + "component_based": false + }, + "minecraft:chiseled_tuff_bricks": { + "runtime_id": -759, + "component_based": false + }, + "minecraft:chorus_flower": { + "runtime_id": 200, + "component_based": false + }, + "minecraft:chorus_fruit": { + "runtime_id": 591, + "component_based": false + }, + "minecraft:chorus_plant": { + "runtime_id": 240, + "component_based": false + }, + "minecraft:clay": { + "runtime_id": 82, + "component_based": false + }, + "minecraft:clay_ball": { + "runtime_id": 410, + "component_based": false + }, + "minecraft:client_request_placeholder_block": { + "runtime_id": -465, + "component_based": false + }, + "minecraft:clock": { + "runtime_id": 419, + "component_based": false + }, + "minecraft:coal": { + "runtime_id": 326, + "component_based": true + }, + "minecraft:coal_block": { + "runtime_id": 173, + "component_based": false + }, + "minecraft:coal_ore": { + "runtime_id": 16, + "component_based": false + }, + "minecraft:coarse_dirt": { + "runtime_id": -962, + "component_based": false + }, + "minecraft:coast_armor_trim_smithing_template": { + "runtime_id": 720, + "component_based": false + }, + "minecraft:cobbled_deepslate": { + "runtime_id": -379, + "component_based": false + }, + "minecraft:cobbled_deepslate_double_slab": { + "runtime_id": -396, + "component_based": false + }, + "minecraft:cobbled_deepslate_slab": { + "runtime_id": -380, + "component_based": false + }, + "minecraft:cobbled_deepslate_stairs": { + "runtime_id": -381, + "component_based": false + }, + "minecraft:cobbled_deepslate_wall": { + "runtime_id": -382, + "component_based": false + }, + "minecraft:cobblestone": { + "runtime_id": 4, + "component_based": false + }, + "minecraft:cobblestone_double_slab": { + "runtime_id": -879, + "component_based": false + }, + "minecraft:cobblestone_slab": { + "runtime_id": -873, + "component_based": false + }, + "minecraft:cobblestone_wall": { + "runtime_id": 139, + "component_based": false + }, + "minecraft:cocoa": { + "runtime_id": 127, + "component_based": false + }, + "minecraft:cocoa_beans": { + "runtime_id": 438, + "component_based": false + }, + "minecraft:cod": { + "runtime_id": 286, + "component_based": false + }, + "minecraft:cod_bucket": { + "runtime_id": 389, + "component_based": false + }, + "minecraft:cod_spawn_egg": { + "runtime_id": 508, + "component_based": false + }, + "minecraft:colored_torch_blue": { + "runtime_id": 204, + "component_based": false + }, + "minecraft:colored_torch_bp": { + "runtime_id": 784, + "component_based": false + }, + "minecraft:colored_torch_green": { + "runtime_id": -963, + "component_based": false + }, + "minecraft:colored_torch_purple": { + "runtime_id": -964, + "component_based": false + }, + "minecraft:colored_torch_red": { + "runtime_id": 202, + "component_based": false + }, + "minecraft:colored_torch_rg": { + "runtime_id": 783, + "component_based": false + }, + "minecraft:command_block": { + "runtime_id": 137, + "component_based": false + }, + "minecraft:command_block_minecart": { + "runtime_id": 596, + "component_based": false + }, + "minecraft:comparator": { + "runtime_id": 555, + "component_based": true + }, + "minecraft:compass": { + "runtime_id": 417, + "component_based": false + }, + "minecraft:composter": { + "runtime_id": -213, + "component_based": false + }, + "minecraft:compound": { + "runtime_id": 631, + "component_based": false + }, + "minecraft:compound_creator": { + "runtime_id": 238, + "component_based": false + }, + "minecraft:concrete": { + "runtime_id": 771, + "component_based": false + }, + "minecraft:concrete_powder": { + "runtime_id": 772, + "component_based": false + }, + "minecraft:conduit": { + "runtime_id": -157, + "component_based": false + }, + "minecraft:cooked_beef": { + "runtime_id": 296, + "component_based": false + }, + "minecraft:cooked_chicken": { + "runtime_id": 298, + "component_based": false + }, + "minecraft:cooked_cod": { + "runtime_id": 290, + "component_based": false + }, + "minecraft:cooked_mutton": { + "runtime_id": 584, + "component_based": false + }, + "minecraft:cooked_porkchop": { + "runtime_id": 285, + "component_based": false + }, + "minecraft:cooked_rabbit": { + "runtime_id": 311, + "component_based": false + }, + "minecraft:cooked_salmon": { + "runtime_id": 291, + "component_based": false + }, + "minecraft:cookie": { + "runtime_id": 293, + "component_based": false + }, + "minecraft:copper_block": { + "runtime_id": -340, + "component_based": false + }, + "minecraft:copper_bulb": { + "runtime_id": -776, + "component_based": false + }, + "minecraft:copper_door": { + "runtime_id": -784, + "component_based": false + }, + "minecraft:copper_grate": { + "runtime_id": -768, + "component_based": false + }, + "minecraft:copper_ingot": { + "runtime_id": 538, + "component_based": false + }, + "minecraft:copper_ore": { + "runtime_id": -311, + "component_based": false + }, + "minecraft:copper_trapdoor": { + "runtime_id": -792, + "component_based": false + }, + "minecraft:coral": { + "runtime_id": 767, + "component_based": false + }, + "minecraft:coral_block": { + "runtime_id": 749, + "component_based": false + }, + "minecraft:coral_fan": { + "runtime_id": 758, + "component_based": false + }, + "minecraft:coral_fan_dead": { + "runtime_id": 759, + "component_based": false + }, + "minecraft:cornflower": { + "runtime_id": -838, + "component_based": false + }, + "minecraft:cow_spawn_egg": { + "runtime_id": 463, + "component_based": false + }, + "minecraft:cracked_deepslate_bricks": { + "runtime_id": -410, + "component_based": false + }, + "minecraft:cracked_deepslate_tiles": { + "runtime_id": -409, + "component_based": false + }, + "minecraft:cracked_nether_bricks": { + "runtime_id": -303, + "component_based": false + }, + "minecraft:cracked_polished_blackstone_bricks": { + "runtime_id": -280, + "component_based": false + }, + "minecraft:cracked_stone_bricks": { + "runtime_id": -869, + "component_based": false + }, + "minecraft:crafter": { + "runtime_id": -313, + "component_based": false + }, + "minecraft:crafting_table": { + "runtime_id": 58, + "component_based": false + }, + "minecraft:creeper_banner_pattern": { + "runtime_id": 615, + "component_based": false + }, + "minecraft:creeper_head": { + "runtime_id": -968, + "component_based": false + }, + "minecraft:creeper_spawn_egg": { + "runtime_id": 468, + "component_based": false + }, + "minecraft:crimson_button": { + "runtime_id": -260, + "component_based": false + }, + "minecraft:crimson_door": { + "runtime_id": 653, + "component_based": false + }, + "minecraft:crimson_double_slab": { + "runtime_id": -266, + "component_based": false + }, + "minecraft:crimson_fence": { + "runtime_id": -256, + "component_based": false + }, + "minecraft:crimson_fence_gate": { + "runtime_id": -258, + "component_based": false + }, + "minecraft:crimson_fungus": { + "runtime_id": -228, + "component_based": false + }, + "minecraft:crimson_hanging_sign": { + "runtime_id": -506, + "component_based": false + }, + "minecraft:crimson_hyphae": { + "runtime_id": -299, + "component_based": false + }, + "minecraft:crimson_nylium": { + "runtime_id": -232, + "component_based": false + }, + "minecraft:crimson_planks": { + "runtime_id": -242, + "component_based": false + }, + "minecraft:crimson_pressure_plate": { + "runtime_id": -262, + "component_based": false + }, + "minecraft:crimson_roots": { + "runtime_id": -223, + "component_based": false + }, + "minecraft:crimson_sign": { + "runtime_id": 651, + "component_based": false + }, + "minecraft:crimson_slab": { + "runtime_id": -264, + "component_based": false + }, + "minecraft:crimson_stairs": { + "runtime_id": -254, + "component_based": false + }, + "minecraft:crimson_standing_sign": { + "runtime_id": -250, + "component_based": false + }, + "minecraft:crimson_stem": { + "runtime_id": -225, + "component_based": false + }, + "minecraft:crimson_trapdoor": { + "runtime_id": -246, + "component_based": false + }, + "minecraft:crimson_wall_sign": { + "runtime_id": -252, + "component_based": false + }, + "minecraft:crossbow": { + "runtime_id": 608, + "component_based": false + }, + "minecraft:crying_obsidian": { + "runtime_id": -289, + "component_based": false + }, + "minecraft:cut_copper": { + "runtime_id": -347, + "component_based": false + }, + "minecraft:cut_copper_slab": { + "runtime_id": -361, + "component_based": false + }, + "minecraft:cut_copper_stairs": { + "runtime_id": -354, + "component_based": false + }, + "minecraft:cut_red_sandstone": { + "runtime_id": -957, + "component_based": false + }, + "minecraft:cut_red_sandstone_double_slab": { + "runtime_id": -928, + "component_based": false + }, + "minecraft:cut_red_sandstone_slab": { + "runtime_id": -901, + "component_based": false + }, + "minecraft:cut_sandstone": { + "runtime_id": -945, + "component_based": false + }, + "minecraft:cut_sandstone_double_slab": { + "runtime_id": -927, + "component_based": false + }, + "minecraft:cut_sandstone_slab": { + "runtime_id": -900, + "component_based": false + }, + "minecraft:cyan_bundle": { + "runtime_id": 265, + "component_based": true + }, + "minecraft:cyan_candle": { + "runtime_id": -422, + "component_based": false + }, + "minecraft:cyan_candle_cake": { + "runtime_id": -439, + "component_based": false + }, + "minecraft:cyan_carpet": { + "runtime_id": -605, + "component_based": false + }, + "minecraft:cyan_concrete": { + "runtime_id": -636, + "component_based": false + }, + "minecraft:cyan_concrete_powder": { + "runtime_id": -717, + "component_based": false + }, + "minecraft:cyan_dye": { + "runtime_id": 427, + "component_based": false + }, + "minecraft:cyan_glazed_terracotta": { + "runtime_id": 229, + "component_based": false + }, + "minecraft:cyan_shulker_box": { + "runtime_id": -621, + "component_based": false + }, + "minecraft:cyan_stained_glass": { + "runtime_id": -681, + "component_based": false + }, + "minecraft:cyan_stained_glass_pane": { + "runtime_id": -651, + "component_based": false + }, + "minecraft:cyan_terracotta": { + "runtime_id": -732, + "component_based": false + }, + "minecraft:cyan_wool": { + "runtime_id": -561, + "component_based": false + }, + "minecraft:damaged_anvil": { + "runtime_id": -960, + "component_based": false + }, + "minecraft:dandelion": { + "runtime_id": 37, + "component_based": false + }, + "minecraft:danger_pottery_sherd": { + "runtime_id": 699, + "component_based": false + }, + "minecraft:dark_oak_boat": { + "runtime_id": 406, + "component_based": false + }, + "minecraft:dark_oak_button": { + "runtime_id": -142, + "component_based": false + }, + "minecraft:dark_oak_chest_boat": { + "runtime_id": 680, + "component_based": false + }, + "minecraft:dark_oak_door": { + "runtime_id": 590, + "component_based": false + }, + "minecraft:dark_oak_double_slab": { + "runtime_id": -813, + "component_based": false + }, + "minecraft:dark_oak_fence": { + "runtime_id": -577, + "component_based": false + }, + "minecraft:dark_oak_fence_gate": { + "runtime_id": 186, + "component_based": false + }, + "minecraft:dark_oak_hanging_sign": { + "runtime_id": -505, + "component_based": false + }, + "minecraft:dark_oak_leaves": { + "runtime_id": -803, + "component_based": false + }, + "minecraft:dark_oak_log": { + "runtime_id": -572, + "component_based": false + }, + "minecraft:dark_oak_planks": { + "runtime_id": -743, + "component_based": false + }, + "minecraft:dark_oak_pressure_plate": { + "runtime_id": -152, + "component_based": false + }, + "minecraft:dark_oak_sapling": { + "runtime_id": -829, + "component_based": false + }, + "minecraft:dark_oak_sign": { + "runtime_id": 613, + "component_based": false + }, + "minecraft:dark_oak_slab": { + "runtime_id": -808, + "component_based": false + }, + "minecraft:dark_oak_stairs": { + "runtime_id": 164, + "component_based": false + }, + "minecraft:dark_oak_trapdoor": { + "runtime_id": -147, + "component_based": false + }, + "minecraft:dark_oak_wood": { + "runtime_id": -818, + "component_based": false + }, + "minecraft:dark_prismarine": { + "runtime_id": -947, + "component_based": false + }, + "minecraft:dark_prismarine_double_slab": { + "runtime_id": -913, + "component_based": false + }, + "minecraft:dark_prismarine_slab": { + "runtime_id": -886, + "component_based": false + }, + "minecraft:dark_prismarine_stairs": { + "runtime_id": -3, + "component_based": false + }, + "minecraft:darkoak_standing_sign": { + "runtime_id": -192, + "component_based": false + }, + "minecraft:darkoak_wall_sign": { + "runtime_id": -193, + "component_based": false + }, + "minecraft:daylight_detector": { + "runtime_id": 151, + "component_based": false + }, + "minecraft:daylight_detector_inverted": { + "runtime_id": 178, + "component_based": false + }, + "minecraft:dead_brain_coral": { + "runtime_id": -586, + "component_based": false + }, + "minecraft:dead_brain_coral_block": { + "runtime_id": -854, + "component_based": false + }, + "minecraft:dead_brain_coral_fan": { + "runtime_id": -844, + "component_based": false + }, + "minecraft:dead_brain_coral_wall_fan": { + "runtime_id": -906, + "component_based": false + }, + "minecraft:dead_bubble_coral": { + "runtime_id": -587, + "component_based": false + }, + "minecraft:dead_bubble_coral_block": { + "runtime_id": -855, + "component_based": false + }, + "minecraft:dead_bubble_coral_fan": { + "runtime_id": -845, + "component_based": false + }, + "minecraft:dead_bubble_coral_wall_fan": { + "runtime_id": -908, + "component_based": false + }, + "minecraft:dead_fire_coral": { + "runtime_id": -588, + "component_based": false + }, + "minecraft:dead_fire_coral_block": { + "runtime_id": -856, + "component_based": false + }, + "minecraft:dead_fire_coral_fan": { + "runtime_id": -846, + "component_based": false + }, + "minecraft:dead_fire_coral_wall_fan": { + "runtime_id": -909, + "component_based": false + }, + "minecraft:dead_horn_coral": { + "runtime_id": -589, + "component_based": false + }, + "minecraft:dead_horn_coral_block": { + "runtime_id": -857, + "component_based": false + }, + "minecraft:dead_horn_coral_fan": { + "runtime_id": -847, + "component_based": false + }, + "minecraft:dead_horn_coral_wall_fan": { + "runtime_id": -910, + "component_based": false + }, + "minecraft:dead_tube_coral": { + "runtime_id": -585, + "component_based": false + }, + "minecraft:dead_tube_coral_block": { + "runtime_id": -853, + "component_based": false + }, + "minecraft:dead_tube_coral_fan": { + "runtime_id": -134, + "component_based": false + }, + "minecraft:dead_tube_coral_wall_fan": { + "runtime_id": -905, + "component_based": false + }, + "minecraft:deadbush": { + "runtime_id": 32, + "component_based": false + }, + "minecraft:debug_stick": { + "runtime_id": 626, + "component_based": false + }, + "minecraft:decorated_pot": { + "runtime_id": -551, + "component_based": false + }, + "minecraft:deepslate": { + "runtime_id": -378, + "component_based": false + }, + "minecraft:deepslate_brick_double_slab": { + "runtime_id": -399, + "component_based": false + }, + "minecraft:deepslate_brick_slab": { + "runtime_id": -392, + "component_based": false + }, + "minecraft:deepslate_brick_stairs": { + "runtime_id": -393, + "component_based": false + }, + "minecraft:deepslate_brick_wall": { + "runtime_id": -394, + "component_based": false + }, + "minecraft:deepslate_bricks": { + "runtime_id": -391, + "component_based": false + }, + "minecraft:deepslate_coal_ore": { + "runtime_id": -406, + "component_based": false + }, + "minecraft:deepslate_copper_ore": { + "runtime_id": -408, + "component_based": false + }, + "minecraft:deepslate_diamond_ore": { + "runtime_id": -405, + "component_based": false + }, + "minecraft:deepslate_emerald_ore": { + "runtime_id": -407, + "component_based": false + }, + "minecraft:deepslate_gold_ore": { + "runtime_id": -402, + "component_based": false + }, + "minecraft:deepslate_iron_ore": { + "runtime_id": -401, + "component_based": false + }, + "minecraft:deepslate_lapis_ore": { + "runtime_id": -400, + "component_based": false + }, + "minecraft:deepslate_redstone_ore": { + "runtime_id": -403, + "component_based": false + }, + "minecraft:deepslate_tile_double_slab": { + "runtime_id": -398, + "component_based": false + }, + "minecraft:deepslate_tile_slab": { + "runtime_id": -388, + "component_based": false + }, + "minecraft:deepslate_tile_stairs": { + "runtime_id": -389, + "component_based": false + }, + "minecraft:deepslate_tile_wall": { + "runtime_id": -390, + "component_based": false + }, + "minecraft:deepslate_tiles": { + "runtime_id": -387, + "component_based": false + }, + "minecraft:deny": { + "runtime_id": 211, + "component_based": false + }, + "minecraft:deprecated_anvil": { + "runtime_id": -961, + "component_based": false + }, + "minecraft:deprecated_purpur_block_1": { + "runtime_id": -950, + "component_based": false + }, + "minecraft:deprecated_purpur_block_2": { + "runtime_id": -952, + "component_based": false + }, + "minecraft:detector_rail": { + "runtime_id": 28, + "component_based": false + }, + "minecraft:diamond": { + "runtime_id": 328, + "component_based": false + }, + "minecraft:diamond_axe": { + "runtime_id": 343, + "component_based": false + }, + "minecraft:diamond_block": { + "runtime_id": 57, + "component_based": false + }, + "minecraft:diamond_boots": { + "runtime_id": 375, + "component_based": false + }, + "minecraft:diamond_chestplate": { + "runtime_id": 373, + "component_based": false + }, + "minecraft:diamond_helmet": { + "runtime_id": 372, + "component_based": false + }, + "minecraft:diamond_hoe": { + "runtime_id": 357, + "component_based": false + }, + "minecraft:diamond_horse_armor": { + "runtime_id": 566, + "component_based": false + }, + "minecraft:diamond_leggings": { + "runtime_id": 374, + "component_based": false + }, + "minecraft:diamond_ore": { + "runtime_id": 56, + "component_based": false + }, + "minecraft:diamond_pickaxe": { + "runtime_id": 342, + "component_based": false + }, + "minecraft:diamond_shovel": { + "runtime_id": 341, + "component_based": false + }, + "minecraft:diamond_sword": { + "runtime_id": 340, + "component_based": false + }, + "minecraft:diorite": { + "runtime_id": -592, + "component_based": false + }, + "minecraft:diorite_double_slab": { + "runtime_id": -921, + "component_based": false + }, + "minecraft:diorite_slab": { + "runtime_id": -894, + "component_based": false + }, + "minecraft:diorite_stairs": { + "runtime_id": -170, + "component_based": false + }, + "minecraft:diorite_wall": { + "runtime_id": -973, + "component_based": false + }, + "minecraft:dirt": { + "runtime_id": 3, + "component_based": false + }, + "minecraft:dirt_with_roots": { + "runtime_id": -318, + "component_based": false + }, + "minecraft:disc_fragment_5": { + "runtime_id": 674, + "component_based": false + }, + "minecraft:dispenser": { + "runtime_id": 23, + "component_based": false + }, + "minecraft:dolphin_spawn_egg": { + "runtime_id": 512, + "component_based": false + }, + "minecraft:donkey_spawn_egg": { + "runtime_id": 493, + "component_based": false + }, + "minecraft:double_cut_copper_slab": { + "runtime_id": -368, + "component_based": false + }, + "minecraft:double_plant": { + "runtime_id": 765, + "component_based": false + }, + "minecraft:double_stone_block_slab": { + "runtime_id": 754, + "component_based": false + }, + "minecraft:double_stone_block_slab2": { + "runtime_id": 755, + "component_based": false + }, + "minecraft:double_stone_block_slab3": { + "runtime_id": 756, + "component_based": false + }, + "minecraft:double_stone_block_slab4": { + "runtime_id": 757, + "component_based": false + }, + "minecraft:dragon_breath": { + "runtime_id": 593, + "component_based": false + }, + "minecraft:dragon_egg": { + "runtime_id": 122, + "component_based": false + }, + "minecraft:dragon_head": { + "runtime_id": -969, + "component_based": false + }, + "minecraft:dried_kelp": { + "runtime_id": 292, + "component_based": false + }, + "minecraft:dried_kelp_block": { + "runtime_id": -139, + "component_based": false + }, + "minecraft:dripstone_block": { + "runtime_id": -317, + "component_based": false + }, + "minecraft:dropper": { + "runtime_id": 125, + "component_based": false + }, + "minecraft:drowned_spawn_egg": { + "runtime_id": 511, + "component_based": false + }, + "minecraft:dune_armor_trim_smithing_template": { + "runtime_id": 719, + "component_based": false + }, + "minecraft:dye": { + "runtime_id": 787, + "component_based": false + }, + "minecraft:echo_shard": { + "runtime_id": 684, + "component_based": false + }, + "minecraft:egg": { + "runtime_id": 416, + "component_based": false + }, + "minecraft:elder_guardian_spawn_egg": { + "runtime_id": 499, + "component_based": false + }, + "minecraft:element_0": { + "runtime_id": 36, + "component_based": false + }, + "minecraft:element_1": { + "runtime_id": -12, + "component_based": false + }, + "minecraft:element_10": { + "runtime_id": -21, + "component_based": false + }, + "minecraft:element_100": { + "runtime_id": -111, + "component_based": false + }, + "minecraft:element_101": { + "runtime_id": -112, + "component_based": false + }, + "minecraft:element_102": { + "runtime_id": -113, + "component_based": false + }, + "minecraft:element_103": { + "runtime_id": -114, + "component_based": false + }, + "minecraft:element_104": { + "runtime_id": -115, + "component_based": false + }, + "minecraft:element_105": { + "runtime_id": -116, + "component_based": false + }, + "minecraft:element_106": { + "runtime_id": -117, + "component_based": false + }, + "minecraft:element_107": { + "runtime_id": -118, + "component_based": false + }, + "minecraft:element_108": { + "runtime_id": -119, + "component_based": false + }, + "minecraft:element_109": { + "runtime_id": -120, + "component_based": false + }, + "minecraft:element_11": { + "runtime_id": -22, + "component_based": false + }, + "minecraft:element_110": { + "runtime_id": -121, + "component_based": false + }, + "minecraft:element_111": { + "runtime_id": -122, + "component_based": false + }, + "minecraft:element_112": { + "runtime_id": -123, + "component_based": false + }, + "minecraft:element_113": { + "runtime_id": -124, + "component_based": false + }, + "minecraft:element_114": { + "runtime_id": -125, + "component_based": false + }, + "minecraft:element_115": { + "runtime_id": -126, + "component_based": false + }, + "minecraft:element_116": { + "runtime_id": -127, + "component_based": false + }, + "minecraft:element_117": { + "runtime_id": -128, + "component_based": false + }, + "minecraft:element_118": { + "runtime_id": -129, + "component_based": false + }, + "minecraft:element_12": { + "runtime_id": -23, + "component_based": false + }, + "minecraft:element_13": { + "runtime_id": -24, + "component_based": false + }, + "minecraft:element_14": { + "runtime_id": -25, + "component_based": false + }, + "minecraft:element_15": { + "runtime_id": -26, + "component_based": false + }, + "minecraft:element_16": { + "runtime_id": -27, + "component_based": false + }, + "minecraft:element_17": { + "runtime_id": -28, + "component_based": false + }, + "minecraft:element_18": { + "runtime_id": -29, + "component_based": false + }, + "minecraft:element_19": { + "runtime_id": -30, + "component_based": false + }, + "minecraft:element_2": { + "runtime_id": -13, + "component_based": false + }, + "minecraft:element_20": { + "runtime_id": -31, + "component_based": false + }, + "minecraft:element_21": { + "runtime_id": -32, + "component_based": false + }, + "minecraft:element_22": { + "runtime_id": -33, + "component_based": false + }, + "minecraft:element_23": { + "runtime_id": -34, + "component_based": false + }, + "minecraft:element_24": { + "runtime_id": -35, + "component_based": false + }, + "minecraft:element_25": { + "runtime_id": -36, + "component_based": false + }, + "minecraft:element_26": { + "runtime_id": -37, + "component_based": false + }, + "minecraft:element_27": { + "runtime_id": -38, + "component_based": false + }, + "minecraft:element_28": { + "runtime_id": -39, + "component_based": false + }, + "minecraft:element_29": { + "runtime_id": -40, + "component_based": false + }, + "minecraft:element_3": { + "runtime_id": -14, + "component_based": false + }, + "minecraft:element_30": { + "runtime_id": -41, + "component_based": false + }, + "minecraft:element_31": { + "runtime_id": -42, + "component_based": false + }, + "minecraft:element_32": { + "runtime_id": -43, + "component_based": false + }, + "minecraft:element_33": { + "runtime_id": -44, + "component_based": false + }, + "minecraft:element_34": { + "runtime_id": -45, + "component_based": false + }, + "minecraft:element_35": { + "runtime_id": -46, + "component_based": false + }, + "minecraft:element_36": { + "runtime_id": -47, + "component_based": false + }, + "minecraft:element_37": { + "runtime_id": -48, + "component_based": false + }, + "minecraft:element_38": { + "runtime_id": -49, + "component_based": false + }, + "minecraft:element_39": { + "runtime_id": -50, + "component_based": false + }, + "minecraft:element_4": { + "runtime_id": -15, + "component_based": false + }, + "minecraft:element_40": { + "runtime_id": -51, + "component_based": false + }, + "minecraft:element_41": { + "runtime_id": -52, + "component_based": false + }, + "minecraft:element_42": { + "runtime_id": -53, + "component_based": false + }, + "minecraft:element_43": { + "runtime_id": -54, + "component_based": false + }, + "minecraft:element_44": { + "runtime_id": -55, + "component_based": false + }, + "minecraft:element_45": { + "runtime_id": -56, + "component_based": false + }, + "minecraft:element_46": { + "runtime_id": -57, + "component_based": false + }, + "minecraft:element_47": { + "runtime_id": -58, + "component_based": false + }, + "minecraft:element_48": { + "runtime_id": -59, + "component_based": false + }, + "minecraft:element_49": { + "runtime_id": -60, + "component_based": false + }, + "minecraft:element_5": { + "runtime_id": -16, + "component_based": false + }, + "minecraft:element_50": { + "runtime_id": -61, + "component_based": false + }, + "minecraft:element_51": { + "runtime_id": -62, + "component_based": false + }, + "minecraft:element_52": { + "runtime_id": -63, + "component_based": false + }, + "minecraft:element_53": { + "runtime_id": -64, + "component_based": false + }, + "minecraft:element_54": { + "runtime_id": -65, + "component_based": false + }, + "minecraft:element_55": { + "runtime_id": -66, + "component_based": false + }, + "minecraft:element_56": { + "runtime_id": -67, + "component_based": false + }, + "minecraft:element_57": { + "runtime_id": -68, + "component_based": false + }, + "minecraft:element_58": { + "runtime_id": -69, + "component_based": false + }, + "minecraft:element_59": { + "runtime_id": -70, + "component_based": false + }, + "minecraft:element_6": { + "runtime_id": -17, + "component_based": false + }, + "minecraft:element_60": { + "runtime_id": -71, + "component_based": false + }, + "minecraft:element_61": { + "runtime_id": -72, + "component_based": false + }, + "minecraft:element_62": { + "runtime_id": -73, + "component_based": false + }, + "minecraft:element_63": { + "runtime_id": -74, + "component_based": false + }, + "minecraft:element_64": { + "runtime_id": -75, + "component_based": false + }, + "minecraft:element_65": { + "runtime_id": -76, + "component_based": false + }, + "minecraft:element_66": { + "runtime_id": -77, + "component_based": false + }, + "minecraft:element_67": { + "runtime_id": -78, + "component_based": false + }, + "minecraft:element_68": { + "runtime_id": -79, + "component_based": false + }, + "minecraft:element_69": { + "runtime_id": -80, + "component_based": false + }, + "minecraft:element_7": { + "runtime_id": -18, + "component_based": false + }, + "minecraft:element_70": { + "runtime_id": -81, + "component_based": false + }, + "minecraft:element_71": { + "runtime_id": -82, + "component_based": false + }, + "minecraft:element_72": { + "runtime_id": -83, + "component_based": false + }, + "minecraft:element_73": { + "runtime_id": -84, + "component_based": false + }, + "minecraft:element_74": { + "runtime_id": -85, + "component_based": false + }, + "minecraft:element_75": { + "runtime_id": -86, + "component_based": false + }, + "minecraft:element_76": { + "runtime_id": -87, + "component_based": false + }, + "minecraft:element_77": { + "runtime_id": -88, + "component_based": false + }, + "minecraft:element_78": { + "runtime_id": -89, + "component_based": false + }, + "minecraft:element_79": { + "runtime_id": -90, + "component_based": false + }, + "minecraft:element_8": { + "runtime_id": -19, + "component_based": false + }, + "minecraft:element_80": { + "runtime_id": -91, + "component_based": false + }, + "minecraft:element_81": { + "runtime_id": -92, + "component_based": false + }, + "minecraft:element_82": { + "runtime_id": -93, + "component_based": false + }, + "minecraft:element_83": { + "runtime_id": -94, + "component_based": false + }, + "minecraft:element_84": { + "runtime_id": -95, + "component_based": false + }, + "minecraft:element_85": { + "runtime_id": -96, + "component_based": false + }, + "minecraft:element_86": { + "runtime_id": -97, + "component_based": false + }, + "minecraft:element_87": { + "runtime_id": -98, + "component_based": false + }, + "minecraft:element_88": { + "runtime_id": -99, + "component_based": false + }, + "minecraft:element_89": { + "runtime_id": -100, + "component_based": false + }, + "minecraft:element_9": { + "runtime_id": -20, + "component_based": false + }, + "minecraft:element_90": { + "runtime_id": -101, + "component_based": false + }, + "minecraft:element_91": { + "runtime_id": -102, + "component_based": false + }, + "minecraft:element_92": { + "runtime_id": -103, + "component_based": false + }, + "minecraft:element_93": { + "runtime_id": -104, + "component_based": false + }, + "minecraft:element_94": { + "runtime_id": -105, + "component_based": false + }, + "minecraft:element_95": { + "runtime_id": -106, + "component_based": false + }, + "minecraft:element_96": { + "runtime_id": -107, + "component_based": false + }, + "minecraft:element_97": { + "runtime_id": -108, + "component_based": false + }, + "minecraft:element_98": { + "runtime_id": -109, + "component_based": false + }, + "minecraft:element_99": { + "runtime_id": -110, + "component_based": false + }, + "minecraft:element_constructor": { + "runtime_id": -987, + "component_based": false + }, + "minecraft:elytra": { + "runtime_id": 597, + "component_based": false + }, + "minecraft:emerald": { + "runtime_id": 546, + "component_based": false + }, + "minecraft:emerald_block": { + "runtime_id": 133, + "component_based": false + }, + "minecraft:emerald_ore": { + "runtime_id": 129, + "component_based": false + }, + "minecraft:empty_map": { + "runtime_id": 549, + "component_based": false + }, + "minecraft:enchanted_book": { + "runtime_id": 554, + "component_based": false + }, + "minecraft:enchanted_golden_apple": { + "runtime_id": 281, + "component_based": false + }, + "minecraft:enchanting_table": { + "runtime_id": 116, + "component_based": false + }, + "minecraft:end_brick_stairs": { + "runtime_id": -178, + "component_based": false + }, + "minecraft:end_bricks": { + "runtime_id": 206, + "component_based": false + }, + "minecraft:end_crystal": { + "runtime_id": 790, + "component_based": false + }, + "minecraft:end_gateway": { + "runtime_id": 209, + "component_based": false + }, + "minecraft:end_portal": { + "runtime_id": 119, + "component_based": false + }, + "minecraft:end_portal_frame": { + "runtime_id": 120, + "component_based": false + }, + "minecraft:end_rod": { + "runtime_id": 208, + "component_based": false + }, + "minecraft:end_stone": { + "runtime_id": 121, + "component_based": false + }, + "minecraft:end_stone_brick_double_slab": { + "runtime_id": -167, + "component_based": false + }, + "minecraft:end_stone_brick_slab": { + "runtime_id": -162, + "component_based": false + }, + "minecraft:end_stone_brick_wall": { + "runtime_id": -980, + "component_based": false + }, + "minecraft:ender_chest": { + "runtime_id": 130, + "component_based": false + }, + "minecraft:ender_dragon_spawn_egg": { + "runtime_id": 535, + "component_based": false + }, + "minecraft:ender_eye": { + "runtime_id": 460, + "component_based": false + }, + "minecraft:ender_pearl": { + "runtime_id": 448, + "component_based": false + }, + "minecraft:enderman_spawn_egg": { + "runtime_id": 469, + "component_based": false + }, + "minecraft:endermite_spawn_egg": { + "runtime_id": 487, + "component_based": false + }, + "minecraft:evoker_spawn_egg": { + "runtime_id": 503, + "component_based": false + }, + "minecraft:experience_bottle": { + "runtime_id": 542, + "component_based": false + }, + "minecraft:explorer_pottery_sherd": { + "runtime_id": 700, + "component_based": false + }, + "minecraft:exposed_chiseled_copper": { + "runtime_id": -761, + "component_based": false + }, + "minecraft:exposed_copper": { + "runtime_id": -341, + "component_based": false + }, + "minecraft:exposed_copper_bulb": { + "runtime_id": -777, + "component_based": false + }, + "minecraft:exposed_copper_door": { + "runtime_id": -785, + "component_based": false + }, + "minecraft:exposed_copper_grate": { + "runtime_id": -769, + "component_based": false + }, + "minecraft:exposed_copper_trapdoor": { + "runtime_id": -793, + "component_based": false + }, + "minecraft:exposed_cut_copper": { + "runtime_id": -348, + "component_based": false + }, + "minecraft:exposed_cut_copper_slab": { + "runtime_id": -362, + "component_based": false + }, + "minecraft:exposed_cut_copper_stairs": { + "runtime_id": -355, + "component_based": false + }, + "minecraft:exposed_double_cut_copper_slab": { + "runtime_id": -369, + "component_based": false + }, + "minecraft:eye_armor_trim_smithing_template": { + "runtime_id": 723, + "component_based": false + }, + "minecraft:farmland": { + "runtime_id": 60, + "component_based": false + }, + "minecraft:feather": { + "runtime_id": 352, + "component_based": false + }, + "minecraft:fence": { + "runtime_id": 747, + "component_based": false + }, + "minecraft:fence_gate": { + "runtime_id": 107, + "component_based": false + }, + "minecraft:fermented_spider_eye": { + "runtime_id": 455, + "component_based": false + }, + "minecraft:fern": { + "runtime_id": -848, + "component_based": false + }, + "minecraft:field_masoned_banner_pattern": { + "runtime_id": 618, + "component_based": false + }, + "minecraft:filled_map": { + "runtime_id": 446, + "component_based": false + }, + "minecraft:fire": { + "runtime_id": 51, + "component_based": false + }, + "minecraft:fire_charge": { + "runtime_id": 543, + "component_based": false + }, + "minecraft:fire_coral": { + "runtime_id": -583, + "component_based": false + }, + "minecraft:fire_coral_block": { + "runtime_id": -851, + "component_based": false + }, + "minecraft:fire_coral_fan": { + "runtime_id": -842, + "component_based": false + }, + "minecraft:fire_coral_wall_fan": { + "runtime_id": -907, + "component_based": false + }, + "minecraft:firework_rocket": { + "runtime_id": 552, + "component_based": false + }, + "minecraft:firework_star": { + "runtime_id": 553, + "component_based": false + }, + "minecraft:fishing_rod": { + "runtime_id": 418, + "component_based": true + }, + "minecraft:fletching_table": { + "runtime_id": -201, + "component_based": false + }, + "minecraft:flint": { + "runtime_id": 381, + "component_based": false + }, + "minecraft:flint_and_steel": { + "runtime_id": 323, + "component_based": false + }, + "minecraft:flow_armor_trim_smithing_template": { + "runtime_id": 734, + "component_based": false + }, + "minecraft:flow_banner_pattern": { + "runtime_id": 622, + "component_based": false + }, + "minecraft:flow_pottery_sherd": { + "runtime_id": 701, + "component_based": false + }, + "minecraft:flower_banner_pattern": { + "runtime_id": 614, + "component_based": false + }, + "minecraft:flower_pot": { + "runtime_id": 548, + "component_based": true + }, + "minecraft:flowering_azalea": { + "runtime_id": -338, + "component_based": false + }, + "minecraft:flowing_lava": { + "runtime_id": 10, + "component_based": false + }, + "minecraft:flowing_water": { + "runtime_id": 8, + "component_based": false + }, + "minecraft:fox_spawn_egg": { + "runtime_id": 518, + "component_based": false + }, + "minecraft:frame": { + "runtime_id": 547, + "component_based": true + }, + "minecraft:friend_pottery_sherd": { + "runtime_id": 702, + "component_based": false + }, + "minecraft:frog_spawn": { + "runtime_id": -468, + "component_based": false + }, + "minecraft:frog_spawn_egg": { + "runtime_id": 665, + "component_based": false + }, + "minecraft:frosted_ice": { + "runtime_id": 207, + "component_based": false + }, + "minecraft:furnace": { + "runtime_id": 61, + "component_based": false + }, + "minecraft:ghast_spawn_egg": { + "runtime_id": 481, + "component_based": false + }, + "minecraft:ghast_tear": { + "runtime_id": 451, + "component_based": false + }, + "minecraft:gilded_blackstone": { + "runtime_id": -281, + "component_based": false + }, + "minecraft:glass": { + "runtime_id": 20, + "component_based": false + }, + "minecraft:glass_bottle": { + "runtime_id": 454, + "component_based": false + }, + "minecraft:glass_pane": { + "runtime_id": 102, + "component_based": false + }, + "minecraft:glistering_melon_slice": { + "runtime_id": 461, + "component_based": false + }, + "minecraft:globe_banner_pattern": { + "runtime_id": 621, + "component_based": false + }, + "minecraft:glow_berries": { + "runtime_id": 791, + "component_based": false + }, + "minecraft:glow_frame": { + "runtime_id": 660, + "component_based": true + }, + "minecraft:glow_ink_sac": { + "runtime_id": 537, + "component_based": false + }, + "minecraft:glow_lichen": { + "runtime_id": -411, + "component_based": false + }, + "minecraft:glow_squid_spawn_egg": { + "runtime_id": 532, + "component_based": false + }, + "minecraft:glow_stick": { + "runtime_id": 638, + "component_based": false + }, + "minecraft:glowingobsidian": { + "runtime_id": 246, + "component_based": false + }, + "minecraft:glowstone": { + "runtime_id": 89, + "component_based": false + }, + "minecraft:glowstone_dust": { + "runtime_id": 420, + "component_based": false + }, + "minecraft:goat_horn": { + "runtime_id": 664, + "component_based": false + }, + "minecraft:goat_spawn_egg": { + "runtime_id": 531, + "component_based": false + }, + "minecraft:gold_block": { + "runtime_id": 41, + "component_based": false + }, + "minecraft:gold_ingot": { + "runtime_id": 330, + "component_based": false + }, + "minecraft:gold_nugget": { + "runtime_id": 452, + "component_based": false + }, + "minecraft:gold_ore": { + "runtime_id": 14, + "component_based": false + }, + "minecraft:golden_apple": { + "runtime_id": 280, + "component_based": false + }, + "minecraft:golden_axe": { + "runtime_id": 350, + "component_based": false + }, + "minecraft:golden_boots": { + "runtime_id": 379, + "component_based": false + }, + "minecraft:golden_carrot": { + "runtime_id": 305, + "component_based": false + }, + "minecraft:golden_chestplate": { + "runtime_id": 377, + "component_based": false + }, + "minecraft:golden_helmet": { + "runtime_id": 376, + "component_based": false + }, + "minecraft:golden_hoe": { + "runtime_id": 358, + "component_based": false + }, + "minecraft:golden_horse_armor": { + "runtime_id": 565, + "component_based": false + }, + "minecraft:golden_leggings": { + "runtime_id": 378, + "component_based": false + }, + "minecraft:golden_pickaxe": { + "runtime_id": 349, + "component_based": false + }, + "minecraft:golden_rail": { + "runtime_id": 27, + "component_based": false + }, + "minecraft:golden_shovel": { + "runtime_id": 348, + "component_based": false + }, + "minecraft:golden_sword": { + "runtime_id": 347, + "component_based": false + }, + "minecraft:granite": { + "runtime_id": -590, + "component_based": false + }, + "minecraft:granite_double_slab": { + "runtime_id": -923, + "component_based": false + }, + "minecraft:granite_slab": { + "runtime_id": -896, + "component_based": false + }, + "minecraft:granite_stairs": { + "runtime_id": -169, + "component_based": false + }, + "minecraft:granite_wall": { + "runtime_id": -972, + "component_based": false + }, + "minecraft:grass_block": { + "runtime_id": 2, + "component_based": false + }, + "minecraft:grass_path": { + "runtime_id": 198, + "component_based": false + }, + "minecraft:gravel": { + "runtime_id": 13, + "component_based": false + }, + "minecraft:gray_bundle": { + "runtime_id": 264, + "component_based": true + }, + "minecraft:gray_candle": { + "runtime_id": -420, + "component_based": false + }, + "minecraft:gray_candle_cake": { + "runtime_id": -437, + "component_based": false + }, + "minecraft:gray_carpet": { + "runtime_id": -603, + "component_based": false + }, + "minecraft:gray_concrete": { + "runtime_id": -634, + "component_based": false + }, + "minecraft:gray_concrete_powder": { + "runtime_id": -715, + "component_based": false + }, + "minecraft:gray_dye": { + "runtime_id": 429, + "component_based": false + }, + "minecraft:gray_glazed_terracotta": { + "runtime_id": 227, + "component_based": false + }, + "minecraft:gray_shulker_box": { + "runtime_id": -619, + "component_based": false + }, + "minecraft:gray_stained_glass": { + "runtime_id": -679, + "component_based": false + }, + "minecraft:gray_stained_glass_pane": { + "runtime_id": -649, + "component_based": false + }, + "minecraft:gray_terracotta": { + "runtime_id": -730, + "component_based": false + }, + "minecraft:gray_wool": { + "runtime_id": -553, + "component_based": false + }, + "minecraft:green_bundle": { + "runtime_id": 262, + "component_based": true + }, + "minecraft:green_candle": { + "runtime_id": -426, + "component_based": false + }, + "minecraft:green_candle_cake": { + "runtime_id": -443, + "component_based": false + }, + "minecraft:green_carpet": { + "runtime_id": -609, + "component_based": false + }, + "minecraft:green_concrete": { + "runtime_id": -640, + "component_based": false + }, + "minecraft:green_concrete_powder": { + "runtime_id": -721, + "component_based": false + }, + "minecraft:green_dye": { + "runtime_id": 423, + "component_based": false + }, + "minecraft:green_glazed_terracotta": { + "runtime_id": 233, + "component_based": false + }, + "minecraft:green_shulker_box": { + "runtime_id": -625, + "component_based": false + }, + "minecraft:green_stained_glass": { + "runtime_id": -685, + "component_based": false + }, + "minecraft:green_stained_glass_pane": { + "runtime_id": -655, + "component_based": false + }, + "minecraft:green_terracotta": { + "runtime_id": -736, + "component_based": false + }, + "minecraft:green_wool": { + "runtime_id": -560, + "component_based": false + }, + "minecraft:grindstone": { + "runtime_id": -195, + "component_based": false + }, + "minecraft:guardian_spawn_egg": { + "runtime_id": 488, + "component_based": false + }, + "minecraft:gunpowder": { + "runtime_id": 353, + "component_based": false + }, + "minecraft:guster_banner_pattern": { + "runtime_id": 623, + "component_based": false + }, + "minecraft:guster_pottery_sherd": { + "runtime_id": 703, + "component_based": false + }, + "minecraft:hanging_roots": { + "runtime_id": -319, + "component_based": false + }, + "minecraft:hard_black_stained_glass": { + "runtime_id": -702, + "component_based": false + }, + "minecraft:hard_black_stained_glass_pane": { + "runtime_id": -672, + "component_based": false + }, + "minecraft:hard_blue_stained_glass": { + "runtime_id": -698, + "component_based": false + }, + "minecraft:hard_blue_stained_glass_pane": { + "runtime_id": -668, + "component_based": false + }, + "minecraft:hard_brown_stained_glass": { + "runtime_id": -699, + "component_based": false + }, + "minecraft:hard_brown_stained_glass_pane": { + "runtime_id": -669, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass": { + "runtime_id": -696, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass_pane": { + "runtime_id": -666, + "component_based": false + }, + "minecraft:hard_glass": { + "runtime_id": 253, + "component_based": false + }, + "minecraft:hard_glass_pane": { + "runtime_id": 190, + "component_based": false + }, + "minecraft:hard_gray_stained_glass": { + "runtime_id": -694, + "component_based": false + }, + "minecraft:hard_gray_stained_glass_pane": { + "runtime_id": -664, + "component_based": false + }, + "minecraft:hard_green_stained_glass": { + "runtime_id": -700, + "component_based": false + }, + "minecraft:hard_green_stained_glass_pane": { + "runtime_id": -670, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass": { + "runtime_id": -690, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass_pane": { + "runtime_id": -660, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass": { + "runtime_id": -695, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass_pane": { + "runtime_id": -665, + "component_based": false + }, + "minecraft:hard_lime_stained_glass": { + "runtime_id": -692, + "component_based": false + }, + "minecraft:hard_lime_stained_glass_pane": { + "runtime_id": -662, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass": { + "runtime_id": -689, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass_pane": { + "runtime_id": -659, + "component_based": false + }, + "minecraft:hard_orange_stained_glass": { + "runtime_id": -688, + "component_based": false + }, + "minecraft:hard_orange_stained_glass_pane": { + "runtime_id": -658, + "component_based": false + }, + "minecraft:hard_pink_stained_glass": { + "runtime_id": -693, + "component_based": false + }, + "minecraft:hard_pink_stained_glass_pane": { + "runtime_id": -663, + "component_based": false + }, + "minecraft:hard_purple_stained_glass": { + "runtime_id": -697, + "component_based": false + }, + "minecraft:hard_purple_stained_glass_pane": { + "runtime_id": -667, + "component_based": false + }, + "minecraft:hard_red_stained_glass": { + "runtime_id": -701, + "component_based": false + }, + "minecraft:hard_red_stained_glass_pane": { + "runtime_id": -671, + "component_based": false + }, + "minecraft:hard_stained_glass": { + "runtime_id": 781, + "component_based": false + }, + "minecraft:hard_stained_glass_pane": { + "runtime_id": 782, + "component_based": false + }, + "minecraft:hard_white_stained_glass": { + "runtime_id": 254, + "component_based": false + }, + "minecraft:hard_white_stained_glass_pane": { + "runtime_id": 191, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass": { + "runtime_id": -691, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass_pane": { + "runtime_id": -661, + "component_based": false + }, + "minecraft:hardened_clay": { + "runtime_id": 172, + "component_based": false + }, + "minecraft:hay_block": { + "runtime_id": 170, + "component_based": false + }, + "minecraft:heart_of_the_sea": { + "runtime_id": 604, + "component_based": false + }, + "minecraft:heart_pottery_sherd": { + "runtime_id": 704, + "component_based": false + }, + "minecraft:heartbreak_pottery_sherd": { + "runtime_id": 705, + "component_based": false + }, + "minecraft:heavy_core": { + "runtime_id": -316, + "component_based": false + }, + "minecraft:heavy_weighted_pressure_plate": { + "runtime_id": 148, + "component_based": false + }, + "minecraft:hoglin_spawn_egg": { + "runtime_id": 524, + "component_based": false + }, + "minecraft:honey_block": { + "runtime_id": -220, + "component_based": false + }, + "minecraft:honey_bottle": { + "runtime_id": 628, + "component_based": false + }, + "minecraft:honeycomb": { + "runtime_id": 627, + "component_based": false + }, + "minecraft:honeycomb_block": { + "runtime_id": -221, + "component_based": false + }, + "minecraft:hopper": { + "runtime_id": 560, + "component_based": true + }, + "minecraft:hopper_minecart": { + "runtime_id": 559, + "component_based": false + }, + "minecraft:horn_coral": { + "runtime_id": -584, + "component_based": false + }, + "minecraft:horn_coral_block": { + "runtime_id": -852, + "component_based": false + }, + "minecraft:horn_coral_fan": { + "runtime_id": -843, + "component_based": false + }, + "minecraft:horn_coral_wall_fan": { + "runtime_id": -137, + "component_based": false + }, + "minecraft:horse_spawn_egg": { + "runtime_id": 485, + "component_based": false + }, + "minecraft:host_armor_trim_smithing_template": { + "runtime_id": 733, + "component_based": false + }, + "minecraft:howl_pottery_sherd": { + "runtime_id": 706, + "component_based": false + }, + "minecraft:husk_spawn_egg": { + "runtime_id": 491, + "component_based": false + }, + "minecraft:ice": { + "runtime_id": 79, + "component_based": false + }, + "minecraft:ice_bomb": { + "runtime_id": 632, + "component_based": false + }, + "minecraft:infested_chiseled_stone_bricks": { + "runtime_id": -862, + "component_based": false + }, + "minecraft:infested_cobblestone": { + "runtime_id": -858, + "component_based": false + }, + "minecraft:infested_cracked_stone_bricks": { + "runtime_id": -861, + "component_based": false + }, + "minecraft:infested_deepslate": { + "runtime_id": -454, + "component_based": false + }, + "minecraft:infested_mossy_stone_bricks": { + "runtime_id": -860, + "component_based": false + }, + "minecraft:infested_stone": { + "runtime_id": 97, + "component_based": false + }, + "minecraft:infested_stone_bricks": { + "runtime_id": -859, + "component_based": false + }, + "minecraft:info_update": { + "runtime_id": 248, + "component_based": false + }, + "minecraft:info_update2": { + "runtime_id": 249, + "component_based": false + }, + "minecraft:ink_sac": { + "runtime_id": 439, + "component_based": false + }, + "minecraft:invisible_bedrock": { + "runtime_id": 95, + "component_based": false + }, + "minecraft:iron_axe": { + "runtime_id": 322, + "component_based": false + }, + "minecraft:iron_bars": { + "runtime_id": 101, + "component_based": false + }, + "minecraft:iron_block": { + "runtime_id": 42, + "component_based": false + }, + "minecraft:iron_boots": { + "runtime_id": 371, + "component_based": false + }, + "minecraft:iron_chestplate": { + "runtime_id": 369, + "component_based": false + }, + "minecraft:iron_door": { + "runtime_id": 397, + "component_based": false + }, + "minecraft:iron_golem_spawn_egg": { + "runtime_id": 533, + "component_based": false + }, + "minecraft:iron_helmet": { + "runtime_id": 368, + "component_based": false + }, + "minecraft:iron_hoe": { + "runtime_id": 356, + "component_based": false + }, + "minecraft:iron_horse_armor": { + "runtime_id": 564, + "component_based": false + }, + "minecraft:iron_ingot": { + "runtime_id": 329, + "component_based": false + }, + "minecraft:iron_leggings": { + "runtime_id": 370, + "component_based": false + }, + "minecraft:iron_nugget": { + "runtime_id": 602, + "component_based": false + }, + "minecraft:iron_ore": { + "runtime_id": 15, + "component_based": false + }, + "minecraft:iron_pickaxe": { + "runtime_id": 321, + "component_based": false + }, + "minecraft:iron_shovel": { + "runtime_id": 320, + "component_based": false + }, + "minecraft:iron_sword": { + "runtime_id": 331, + "component_based": false + }, + "minecraft:iron_trapdoor": { + "runtime_id": 167, + "component_based": false + }, + "minecraft:item.acacia_door": { + "runtime_id": 196, + "component_based": false + }, + "minecraft:item.bed": { + "runtime_id": 26, + "component_based": false + }, + "minecraft:item.beetroot": { + "runtime_id": 244, + "component_based": false + }, + "minecraft:item.birch_door": { + "runtime_id": 194, + "component_based": false + }, + "minecraft:item.brewing_stand": { + "runtime_id": 117, + "component_based": false + }, + "minecraft:item.cake": { + "runtime_id": 92, + "component_based": false + }, + "minecraft:item.camera": { + "runtime_id": 242, + "component_based": false + }, + "minecraft:item.campfire": { + "runtime_id": -209, + "component_based": false + }, + "minecraft:item.cauldron": { + "runtime_id": 118, + "component_based": false + }, + "minecraft:item.chain": { + "runtime_id": -286, + "component_based": false + }, + "minecraft:item.crimson_door": { + "runtime_id": -244, + "component_based": false + }, + "minecraft:item.dark_oak_door": { + "runtime_id": 197, + "component_based": false + }, + "minecraft:item.flower_pot": { + "runtime_id": 140, + "component_based": false + }, + "minecraft:item.frame": { + "runtime_id": 199, + "component_based": false + }, + "minecraft:item.glow_frame": { + "runtime_id": -339, + "component_based": false + }, + "minecraft:item.hopper": { + "runtime_id": 154, + "component_based": false + }, + "minecraft:item.iron_door": { + "runtime_id": 71, + "component_based": false + }, + "minecraft:item.jungle_door": { + "runtime_id": 195, + "component_based": false + }, + "minecraft:item.kelp": { + "runtime_id": -138, + "component_based": false + }, + "minecraft:item.mangrove_door": { + "runtime_id": -493, + "component_based": false + }, + "minecraft:item.nether_sprouts": { + "runtime_id": -238, + "component_based": false + }, + "minecraft:item.nether_wart": { + "runtime_id": 115, + "component_based": false + }, + "minecraft:item.reeds": { + "runtime_id": 83, + "component_based": false + }, + "minecraft:item.soul_campfire": { + "runtime_id": -290, + "component_based": false + }, + "minecraft:item.spruce_door": { + "runtime_id": 193, + "component_based": false + }, + "minecraft:item.warped_door": { + "runtime_id": -245, + "component_based": false + }, + "minecraft:item.wheat": { + "runtime_id": 59, + "component_based": false + }, + "minecraft:item.wooden_door": { + "runtime_id": 64, + "component_based": false + }, + "minecraft:jigsaw": { + "runtime_id": -211, + "component_based": false + }, + "minecraft:jukebox": { + "runtime_id": 84, + "component_based": false + }, + "minecraft:jungle_boat": { + "runtime_id": 403, + "component_based": false + }, + "minecraft:jungle_button": { + "runtime_id": -143, + "component_based": false + }, + "minecraft:jungle_chest_boat": { + "runtime_id": 677, + "component_based": false + }, + "minecraft:jungle_door": { + "runtime_id": 588, + "component_based": false + }, + "minecraft:jungle_double_slab": { + "runtime_id": -811, + "component_based": false + }, + "minecraft:jungle_fence": { + "runtime_id": -578, + "component_based": false + }, + "minecraft:jungle_fence_gate": { + "runtime_id": 185, + "component_based": false + }, + "minecraft:jungle_hanging_sign": { + "runtime_id": -503, + "component_based": false + }, + "minecraft:jungle_leaves": { + "runtime_id": -802, + "component_based": false + }, + "minecraft:jungle_log": { + "runtime_id": -571, + "component_based": false + }, + "minecraft:jungle_planks": { + "runtime_id": -741, + "component_based": false + }, + "minecraft:jungle_pressure_plate": { + "runtime_id": -153, + "component_based": false + }, + "minecraft:jungle_sapling": { + "runtime_id": -827, + "component_based": false + }, + "minecraft:jungle_sign": { + "runtime_id": 611, + "component_based": false + }, + "minecraft:jungle_slab": { + "runtime_id": -806, + "component_based": false + }, + "minecraft:jungle_stairs": { + "runtime_id": 136, + "component_based": false + }, + "minecraft:jungle_standing_sign": { + "runtime_id": -188, + "component_based": false + }, + "minecraft:jungle_trapdoor": { + "runtime_id": -148, + "component_based": false + }, + "minecraft:jungle_wall_sign": { + "runtime_id": -189, + "component_based": false + }, + "minecraft:jungle_wood": { + "runtime_id": -816, + "component_based": false + }, + "minecraft:kelp": { + "runtime_id": 408, + "component_based": true + }, + "minecraft:lab_table": { + "runtime_id": -988, + "component_based": false + }, + "minecraft:ladder": { + "runtime_id": 65, + "component_based": false + }, + "minecraft:lantern": { + "runtime_id": -208, + "component_based": false + }, + "minecraft:lapis_block": { + "runtime_id": 22, + "component_based": false + }, + "minecraft:lapis_lazuli": { + "runtime_id": 440, + "component_based": false + }, + "minecraft:lapis_ore": { + "runtime_id": 21, + "component_based": false + }, + "minecraft:large_amethyst_bud": { + "runtime_id": -330, + "component_based": false + }, + "minecraft:large_fern": { + "runtime_id": -865, + "component_based": false + }, + "minecraft:lava": { + "runtime_id": 11, + "component_based": false + }, + "minecraft:lava_bucket": { + "runtime_id": 388, + "component_based": false + }, + "minecraft:lead": { + "runtime_id": 580, + "component_based": false + }, + "minecraft:leather": { + "runtime_id": 407, + "component_based": false + }, + "minecraft:leather_boots": { + "runtime_id": 363, + "component_based": false + }, + "minecraft:leather_chestplate": { + "runtime_id": 361, + "component_based": false + }, + "minecraft:leather_helmet": { + "runtime_id": 360, + "component_based": false + }, + "minecraft:leather_horse_armor": { + "runtime_id": 563, + "component_based": false + }, + "minecraft:leather_leggings": { + "runtime_id": 362, + "component_based": false + }, + "minecraft:leaves": { + "runtime_id": 761, + "component_based": false + }, + "minecraft:leaves2": { + "runtime_id": 762, + "component_based": false + }, + "minecraft:lectern": { + "runtime_id": -194, + "component_based": false + }, + "minecraft:lever": { + "runtime_id": 69, + "component_based": false + }, + "minecraft:light_block": { + "runtime_id": 785, + "component_based": false + }, + "minecraft:light_block_0": { + "runtime_id": -215, + "component_based": false + }, + "minecraft:light_block_1": { + "runtime_id": -929, + "component_based": false + }, + "minecraft:light_block_10": { + "runtime_id": -938, + "component_based": false + }, + "minecraft:light_block_11": { + "runtime_id": -939, + "component_based": false + }, + "minecraft:light_block_12": { + "runtime_id": -940, + "component_based": false + }, + "minecraft:light_block_13": { + "runtime_id": -941, + "component_based": false + }, + "minecraft:light_block_14": { + "runtime_id": -942, + "component_based": false + }, + "minecraft:light_block_15": { + "runtime_id": -943, + "component_based": false + }, + "minecraft:light_block_2": { + "runtime_id": -930, + "component_based": false + }, + "minecraft:light_block_3": { + "runtime_id": -931, + "component_based": false + }, + "minecraft:light_block_4": { + "runtime_id": -932, + "component_based": false + }, + "minecraft:light_block_5": { + "runtime_id": -933, + "component_based": false + }, + "minecraft:light_block_6": { + "runtime_id": -934, + "component_based": false + }, + "minecraft:light_block_7": { + "runtime_id": -935, + "component_based": false + }, + "minecraft:light_block_8": { + "runtime_id": -936, + "component_based": false + }, + "minecraft:light_block_9": { + "runtime_id": -937, + "component_based": false + }, + "minecraft:light_blue_bundle": { + "runtime_id": 257, + "component_based": true + }, + "minecraft:light_blue_candle": { + "runtime_id": -416, + "component_based": false + }, + "minecraft:light_blue_candle_cake": { + "runtime_id": -433, + "component_based": false + }, + "minecraft:light_blue_carpet": { + "runtime_id": -599, + "component_based": false + }, + "minecraft:light_blue_concrete": { + "runtime_id": -630, + "component_based": false + }, + "minecraft:light_blue_concrete_powder": { + "runtime_id": -711, + "component_based": false + }, + "minecraft:light_blue_dye": { + "runtime_id": 433, + "component_based": false + }, + "minecraft:light_blue_glazed_terracotta": { + "runtime_id": 223, + "component_based": false + }, + "minecraft:light_blue_shulker_box": { + "runtime_id": -615, + "component_based": false + }, + "minecraft:light_blue_stained_glass": { + "runtime_id": -675, + "component_based": false + }, + "minecraft:light_blue_stained_glass_pane": { + "runtime_id": -645, + "component_based": false + }, + "minecraft:light_blue_terracotta": { + "runtime_id": -726, + "component_based": false + }, + "minecraft:light_blue_wool": { + "runtime_id": -562, + "component_based": false + }, + "minecraft:light_gray_bundle": { + "runtime_id": 273, + "component_based": true + }, + "minecraft:light_gray_candle": { + "runtime_id": -421, + "component_based": false + }, + "minecraft:light_gray_candle_cake": { + "runtime_id": -438, + "component_based": false + }, + "minecraft:light_gray_carpet": { + "runtime_id": -604, + "component_based": false + }, + "minecraft:light_gray_concrete": { + "runtime_id": -635, + "component_based": false + }, + "minecraft:light_gray_concrete_powder": { + "runtime_id": -716, + "component_based": false + }, + "minecraft:light_gray_dye": { + "runtime_id": 428, + "component_based": false + }, + "minecraft:light_gray_shulker_box": { + "runtime_id": -620, + "component_based": false + }, + "minecraft:light_gray_stained_glass": { + "runtime_id": -680, + "component_based": false + }, + "minecraft:light_gray_stained_glass_pane": { + "runtime_id": -650, + "component_based": false + }, + "minecraft:light_gray_terracotta": { + "runtime_id": -731, + "component_based": false + }, + "minecraft:light_gray_wool": { + "runtime_id": -552, + "component_based": false + }, + "minecraft:light_weighted_pressure_plate": { + "runtime_id": 147, + "component_based": false + }, + "minecraft:lightning_rod": { + "runtime_id": -312, + "component_based": false + }, + "minecraft:lilac": { + "runtime_id": -863, + "component_based": false + }, + "minecraft:lily_of_the_valley": { + "runtime_id": -839, + "component_based": false + }, + "minecraft:lime_bundle": { + "runtime_id": 263, + "component_based": true + }, + "minecraft:lime_candle": { + "runtime_id": -418, + "component_based": false + }, + "minecraft:lime_candle_cake": { + "runtime_id": -435, + "component_based": false + }, + "minecraft:lime_carpet": { + "runtime_id": -601, + "component_based": false + }, + "minecraft:lime_concrete": { + "runtime_id": -632, + "component_based": false + }, + "minecraft:lime_concrete_powder": { + "runtime_id": -713, + "component_based": false + }, + "minecraft:lime_dye": { + "runtime_id": 431, + "component_based": false + }, + "minecraft:lime_glazed_terracotta": { + "runtime_id": 225, + "component_based": false + }, + "minecraft:lime_shulker_box": { + "runtime_id": -617, + "component_based": false + }, + "minecraft:lime_stained_glass": { + "runtime_id": -677, + "component_based": false + }, + "minecraft:lime_stained_glass_pane": { + "runtime_id": -647, + "component_based": false + }, + "minecraft:lime_terracotta": { + "runtime_id": -728, + "component_based": false + }, + "minecraft:lime_wool": { + "runtime_id": -559, + "component_based": false + }, + "minecraft:lingering_potion": { + "runtime_id": 595, + "component_based": false + }, + "minecraft:lit_blast_furnace": { + "runtime_id": -214, + "component_based": false + }, + "minecraft:lit_deepslate_redstone_ore": { + "runtime_id": -404, + "component_based": false + }, + "minecraft:lit_furnace": { + "runtime_id": 62, + "component_based": false + }, + "minecraft:lit_pumpkin": { + "runtime_id": 91, + "component_based": false + }, + "minecraft:lit_redstone_lamp": { + "runtime_id": 124, + "component_based": false + }, + "minecraft:lit_redstone_ore": { + "runtime_id": 74, + "component_based": false + }, + "minecraft:lit_smoker": { + "runtime_id": -199, + "component_based": false + }, + "minecraft:llama_spawn_egg": { + "runtime_id": 501, + "component_based": false + }, + "minecraft:lodestone": { + "runtime_id": -222, + "component_based": false + }, + "minecraft:lodestone_compass": { + "runtime_id": 639, + "component_based": false + }, + "minecraft:log": { + "runtime_id": 746, + "component_based": false + }, + "minecraft:log2": { + "runtime_id": 769, + "component_based": false + }, + "minecraft:loom": { + "runtime_id": -204, + "component_based": false + }, + "minecraft:mace": { + "runtime_id": 344, + "component_based": false + }, + "minecraft:magenta_bundle": { + "runtime_id": 271, + "component_based": true + }, + "minecraft:magenta_candle": { + "runtime_id": -415, + "component_based": false + }, + "minecraft:magenta_candle_cake": { + "runtime_id": -432, + "component_based": false + }, + "minecraft:magenta_carpet": { + "runtime_id": -598, + "component_based": false + }, + "minecraft:magenta_concrete": { + "runtime_id": -629, + "component_based": false + }, + "minecraft:magenta_concrete_powder": { + "runtime_id": -710, + "component_based": false + }, + "minecraft:magenta_dye": { + "runtime_id": 434, + "component_based": false + }, + "minecraft:magenta_glazed_terracotta": { + "runtime_id": 222, + "component_based": false + }, + "minecraft:magenta_shulker_box": { + "runtime_id": -614, + "component_based": false + }, + "minecraft:magenta_stained_glass": { + "runtime_id": -674, + "component_based": false + }, + "minecraft:magenta_stained_glass_pane": { + "runtime_id": -644, + "component_based": false + }, + "minecraft:magenta_terracotta": { + "runtime_id": -725, + "component_based": false + }, + "minecraft:magenta_wool": { + "runtime_id": -565, + "component_based": false + }, + "minecraft:magma": { + "runtime_id": 213, + "component_based": false + }, + "minecraft:magma_cream": { + "runtime_id": 457, + "component_based": false + }, + "minecraft:magma_cube_spawn_egg": { + "runtime_id": 482, + "component_based": false + }, + "minecraft:mangrove_boat": { + "runtime_id": 672, + "component_based": false + }, + "minecraft:mangrove_button": { + "runtime_id": -487, + "component_based": false + }, + "minecraft:mangrove_chest_boat": { + "runtime_id": 681, + "component_based": false + }, + "minecraft:mangrove_door": { + "runtime_id": 670, + "component_based": false + }, + "minecraft:mangrove_double_slab": { + "runtime_id": -499, + "component_based": false + }, + "minecraft:mangrove_fence": { + "runtime_id": -491, + "component_based": false + }, + "minecraft:mangrove_fence_gate": { + "runtime_id": -492, + "component_based": false + }, + "minecraft:mangrove_hanging_sign": { + "runtime_id": -508, + "component_based": false + }, + "minecraft:mangrove_leaves": { + "runtime_id": -472, + "component_based": false + }, + "minecraft:mangrove_log": { + "runtime_id": -484, + "component_based": false + }, + "minecraft:mangrove_planks": { + "runtime_id": -486, + "component_based": false + }, + "minecraft:mangrove_pressure_plate": { + "runtime_id": -490, + "component_based": false + }, + "minecraft:mangrove_propagule": { + "runtime_id": -474, + "component_based": false + }, + "minecraft:mangrove_roots": { + "runtime_id": -482, + "component_based": false + }, + "minecraft:mangrove_sign": { + "runtime_id": 671, + "component_based": false + }, + "minecraft:mangrove_slab": { + "runtime_id": -489, + "component_based": false + }, + "minecraft:mangrove_stairs": { + "runtime_id": -488, + "component_based": false + }, + "minecraft:mangrove_standing_sign": { + "runtime_id": -494, + "component_based": false + }, + "minecraft:mangrove_trapdoor": { + "runtime_id": -496, + "component_based": false + }, + "minecraft:mangrove_wall_sign": { + "runtime_id": -495, + "component_based": false + }, + "minecraft:mangrove_wood": { + "runtime_id": -497, + "component_based": false + }, + "minecraft:material_reducer": { + "runtime_id": -986, + "component_based": false + }, + "minecraft:medicine": { + "runtime_id": 636, + "component_based": false + }, + "minecraft:medium_amethyst_bud": { + "runtime_id": -331, + "component_based": false + }, + "minecraft:melon_block": { + "runtime_id": 103, + "component_based": false + }, + "minecraft:melon_seeds": { + "runtime_id": 315, + "component_based": false + }, + "minecraft:melon_slice": { + "runtime_id": 294, + "component_based": false + }, + "minecraft:melon_stem": { + "runtime_id": 105, + "component_based": false + }, + "minecraft:milk_bucket": { + "runtime_id": 386, + "component_based": false + }, + "minecraft:minecart": { + "runtime_id": 395, + "component_based": false + }, + "minecraft:miner_pottery_sherd": { + "runtime_id": 707, + "component_based": false + }, + "minecraft:mob_spawner": { + "runtime_id": 52, + "component_based": false + }, + "minecraft:mojang_banner_pattern": { + "runtime_id": 617, + "component_based": false + }, + "minecraft:monster_egg": { + "runtime_id": 770, + "component_based": false + }, + "minecraft:mooshroom_spawn_egg": { + "runtime_id": 467, + "component_based": false + }, + "minecraft:moss_block": { + "runtime_id": -320, + "component_based": false + }, + "minecraft:moss_carpet": { + "runtime_id": -335, + "component_based": false + }, + "minecraft:mossy_cobblestone": { + "runtime_id": 48, + "component_based": false + }, + "minecraft:mossy_cobblestone_double_slab": { + "runtime_id": -915, + "component_based": false + }, + "minecraft:mossy_cobblestone_slab": { + "runtime_id": -888, + "component_based": false + }, + "minecraft:mossy_cobblestone_stairs": { + "runtime_id": -179, + "component_based": false + }, + "minecraft:mossy_cobblestone_wall": { + "runtime_id": -971, + "component_based": false + }, + "minecraft:mossy_stone_brick_double_slab": { + "runtime_id": -168, + "component_based": false + }, + "minecraft:mossy_stone_brick_slab": { + "runtime_id": -166, + "component_based": false + }, + "minecraft:mossy_stone_brick_stairs": { + "runtime_id": -175, + "component_based": false + }, + "minecraft:mossy_stone_brick_wall": { + "runtime_id": -978, + "component_based": false + }, + "minecraft:mossy_stone_bricks": { + "runtime_id": -868, + "component_based": false + }, + "minecraft:mourner_pottery_sherd": { + "runtime_id": 708, + "component_based": false + }, + "minecraft:moving_block": { + "runtime_id": 250, + "component_based": false + }, + "minecraft:mud": { + "runtime_id": -473, + "component_based": false + }, + "minecraft:mud_brick_double_slab": { + "runtime_id": -479, + "component_based": false + }, + "minecraft:mud_brick_slab": { + "runtime_id": -478, + "component_based": false + }, + "minecraft:mud_brick_stairs": { + "runtime_id": -480, + "component_based": false + }, + "minecraft:mud_brick_wall": { + "runtime_id": -481, + "component_based": false + }, + "minecraft:mud_bricks": { + "runtime_id": -475, + "component_based": false + }, + "minecraft:muddy_mangrove_roots": { + "runtime_id": -483, + "component_based": false + }, + "minecraft:mule_spawn_egg": { + "runtime_id": 494, + "component_based": false + }, + "minecraft:mushroom_stem": { + "runtime_id": -1008, + "component_based": false + }, + "minecraft:mushroom_stew": { + "runtime_id": 282, + "component_based": false + }, + "minecraft:music_disc_11": { + "runtime_id": 577, + "component_based": true + }, + "minecraft:music_disc_13": { + "runtime_id": 567, + "component_based": true + }, + "minecraft:music_disc_5": { + "runtime_id": 673, + "component_based": true + }, + "minecraft:music_disc_blocks": { + "runtime_id": 569, + "component_based": true + }, + "minecraft:music_disc_cat": { + "runtime_id": 568, + "component_based": true + }, + "minecraft:music_disc_chirp": { + "runtime_id": 570, + "component_based": true + }, + "minecraft:music_disc_creator": { + "runtime_id": 777, + "component_based": true + }, + "minecraft:music_disc_creator_music_box": { + "runtime_id": 778, + "component_based": true + }, + "minecraft:music_disc_far": { + "runtime_id": 571, + "component_based": true + }, + "minecraft:music_disc_mall": { + "runtime_id": 572, + "component_based": true + }, + "minecraft:music_disc_mellohi": { + "runtime_id": 573, + "component_based": true + }, + "minecraft:music_disc_otherside": { + "runtime_id": 663, + "component_based": true + }, + "minecraft:music_disc_pigstep": { + "runtime_id": 657, + "component_based": true + }, + "minecraft:music_disc_precipice": { + "runtime_id": 779, + "component_based": true + }, + "minecraft:music_disc_relic": { + "runtime_id": 736, + "component_based": true + }, + "minecraft:music_disc_stal": { + "runtime_id": 574, + "component_based": true + }, + "minecraft:music_disc_strad": { + "runtime_id": 575, + "component_based": true + }, + "minecraft:music_disc_wait": { + "runtime_id": 578, + "component_based": true + }, + "minecraft:music_disc_ward": { + "runtime_id": 576, + "component_based": true + }, + "minecraft:mutton": { + "runtime_id": 583, + "component_based": false + }, + "minecraft:mycelium": { + "runtime_id": 110, + "component_based": false + }, + "minecraft:name_tag": { + "runtime_id": 581, + "component_based": false + }, + "minecraft:nautilus_shell": { + "runtime_id": 603, + "component_based": false + }, + "minecraft:nether_brick": { + "runtime_id": 112, + "component_based": false + }, + "minecraft:nether_brick_double_slab": { + "runtime_id": -883, + "component_based": false + }, + "minecraft:nether_brick_fence": { + "runtime_id": 113, + "component_based": false + }, + "minecraft:nether_brick_slab": { + "runtime_id": -877, + "component_based": false + }, + "minecraft:nether_brick_stairs": { + "runtime_id": 114, + "component_based": false + }, + "minecraft:nether_brick_wall": { + "runtime_id": -979, + "component_based": false + }, + "minecraft:nether_gold_ore": { + "runtime_id": -288, + "component_based": false + }, + "minecraft:nether_sprouts": { + "runtime_id": 658, + "component_based": true + }, + "minecraft:nether_star": { + "runtime_id": 551, + "component_based": false + }, + "minecraft:nether_wart": { + "runtime_id": 316, + "component_based": false + }, + "minecraft:nether_wart_block": { + "runtime_id": 214, + "component_based": false + }, + "minecraft:netherbrick": { + "runtime_id": 556, + "component_based": false + }, + "minecraft:netherite_axe": { + "runtime_id": 643, + "component_based": false + }, + "minecraft:netherite_block": { + "runtime_id": -270, + "component_based": false + }, + "minecraft:netherite_boots": { + "runtime_id": 649, + "component_based": false + }, + "minecraft:netherite_chestplate": { + "runtime_id": 647, + "component_based": false + }, + "minecraft:netherite_helmet": { + "runtime_id": 646, + "component_based": false + }, + "minecraft:netherite_hoe": { + "runtime_id": 644, + "component_based": false + }, + "minecraft:netherite_ingot": { + "runtime_id": 645, + "component_based": false + }, + "minecraft:netherite_leggings": { + "runtime_id": 648, + "component_based": false + }, + "minecraft:netherite_pickaxe": { + "runtime_id": 642, + "component_based": false + }, + "minecraft:netherite_scrap": { + "runtime_id": 650, + "component_based": false + }, + "minecraft:netherite_shovel": { + "runtime_id": 641, + "component_based": false + }, + "minecraft:netherite_sword": { + "runtime_id": 640, + "component_based": false + }, + "minecraft:netherite_upgrade_smithing_template": { + "runtime_id": 717, + "component_based": false + }, + "minecraft:netherrack": { + "runtime_id": 87, + "component_based": false + }, + "minecraft:netherreactor": { + "runtime_id": 247, + "component_based": false + }, + "minecraft:normal_stone_double_slab": { + "runtime_id": -926, + "component_based": false + }, + "minecraft:normal_stone_slab": { + "runtime_id": -899, + "component_based": false + }, + "minecraft:normal_stone_stairs": { + "runtime_id": -180, + "component_based": false + }, + "minecraft:noteblock": { + "runtime_id": 25, + "component_based": false + }, + "minecraft:npc_spawn_egg": { + "runtime_id": 498, + "component_based": false + }, + "minecraft:oak_boat": { + "runtime_id": 401, + "component_based": false + }, + "minecraft:oak_chest_boat": { + "runtime_id": 675, + "component_based": false + }, + "minecraft:oak_double_slab": { + "runtime_id": 157, + "component_based": false + }, + "minecraft:oak_fence": { + "runtime_id": 85, + "component_based": false + }, + "minecraft:oak_hanging_sign": { + "runtime_id": -500, + "component_based": false + }, + "minecraft:oak_leaves": { + "runtime_id": 18, + "component_based": false + }, + "minecraft:oak_log": { + "runtime_id": 17, + "component_based": false + }, + "minecraft:oak_planks": { + "runtime_id": 5, + "component_based": false + }, + "minecraft:oak_sapling": { + "runtime_id": 6, + "component_based": false + }, + "minecraft:oak_sign": { + "runtime_id": 383, + "component_based": false + }, + "minecraft:oak_slab": { + "runtime_id": 158, + "component_based": false + }, + "minecraft:oak_stairs": { + "runtime_id": 53, + "component_based": false + }, + "minecraft:oak_wood": { + "runtime_id": -212, + "component_based": false + }, + "minecraft:observer": { + "runtime_id": 251, + "component_based": false + }, + "minecraft:obsidian": { + "runtime_id": 49, + "component_based": false + }, + "minecraft:ocelot_spawn_egg": { + "runtime_id": 478, + "component_based": false + }, + "minecraft:ochre_froglight": { + "runtime_id": -471, + "component_based": false + }, + "minecraft:ominous_bottle": { + "runtime_id": 629, + "component_based": false + }, + "minecraft:ominous_trial_key": { + "runtime_id": 276, + "component_based": true + }, + "minecraft:orange_bundle": { + "runtime_id": 258, + "component_based": true + }, + "minecraft:orange_candle": { + "runtime_id": -414, + "component_based": false + }, + "minecraft:orange_candle_cake": { + "runtime_id": -431, + "component_based": false + }, + "minecraft:orange_carpet": { + "runtime_id": -597, + "component_based": false + }, + "minecraft:orange_concrete": { + "runtime_id": -628, + "component_based": false + }, + "minecraft:orange_concrete_powder": { + "runtime_id": -709, + "component_based": false + }, + "minecraft:orange_dye": { + "runtime_id": 435, + "component_based": false + }, + "minecraft:orange_glazed_terracotta": { + "runtime_id": 221, + "component_based": false + }, + "minecraft:orange_shulker_box": { + "runtime_id": -613, + "component_based": false + }, + "minecraft:orange_stained_glass": { + "runtime_id": -673, + "component_based": false + }, + "minecraft:orange_stained_glass_pane": { + "runtime_id": -643, + "component_based": false + }, + "minecraft:orange_terracotta": { + "runtime_id": -724, + "component_based": false + }, + "minecraft:orange_tulip": { + "runtime_id": -834, + "component_based": false + }, + "minecraft:orange_wool": { + "runtime_id": -557, + "component_based": false + }, + "minecraft:oxeye_daisy": { + "runtime_id": -837, + "component_based": false + }, + "minecraft:oxidized_chiseled_copper": { + "runtime_id": -763, + "component_based": false + }, + "minecraft:oxidized_copper": { + "runtime_id": -343, + "component_based": false + }, + "minecraft:oxidized_copper_bulb": { + "runtime_id": -779, + "component_based": false + }, + "minecraft:oxidized_copper_door": { + "runtime_id": -787, + "component_based": false + }, + "minecraft:oxidized_copper_grate": { + "runtime_id": -771, + "component_based": false + }, + "minecraft:oxidized_copper_trapdoor": { + "runtime_id": -795, + "component_based": false + }, + "minecraft:oxidized_cut_copper": { + "runtime_id": -350, + "component_based": false + }, + "minecraft:oxidized_cut_copper_slab": { + "runtime_id": -364, + "component_based": false + }, + "minecraft:oxidized_cut_copper_stairs": { + "runtime_id": -357, + "component_based": false + }, + "minecraft:oxidized_double_cut_copper_slab": { + "runtime_id": -371, + "component_based": false + }, + "minecraft:packed_ice": { + "runtime_id": 174, + "component_based": false + }, + "minecraft:packed_mud": { + "runtime_id": -477, + "component_based": false + }, + "minecraft:painting": { + "runtime_id": 382, + "component_based": false + }, + "minecraft:panda_spawn_egg": { + "runtime_id": 517, + "component_based": false + }, + "minecraft:paper": { + "runtime_id": 412, + "component_based": false + }, + "minecraft:parrot_spawn_egg": { + "runtime_id": 506, + "component_based": false + }, + "minecraft:pearlescent_froglight": { + "runtime_id": -469, + "component_based": false + }, + "minecraft:peony": { + "runtime_id": -867, + "component_based": false + }, + "minecraft:petrified_oak_double_slab": { + "runtime_id": -903, + "component_based": false + }, + "minecraft:petrified_oak_slab": { + "runtime_id": -902, + "component_based": false + }, + "minecraft:phantom_membrane": { + "runtime_id": 607, + "component_based": false + }, + "minecraft:phantom_spawn_egg": { + "runtime_id": 514, + "component_based": false + }, + "minecraft:pig_spawn_egg": { + "runtime_id": 464, + "component_based": false + }, + "minecraft:piglin_banner_pattern": { + "runtime_id": 620, + "component_based": false + }, + "minecraft:piglin_brute_spawn_egg": { + "runtime_id": 527, + "component_based": false + }, + "minecraft:piglin_head": { + "runtime_id": -970, + "component_based": false + }, + "minecraft:piglin_spawn_egg": { + "runtime_id": 525, + "component_based": false + }, + "minecraft:pillager_spawn_egg": { + "runtime_id": 519, + "component_based": false + }, + "minecraft:pink_bundle": { + "runtime_id": 272, + "component_based": true + }, + "minecraft:pink_candle": { + "runtime_id": -419, + "component_based": false + }, + "minecraft:pink_candle_cake": { + "runtime_id": -436, + "component_based": false + }, + "minecraft:pink_carpet": { + "runtime_id": -602, + "component_based": false + }, + "minecraft:pink_concrete": { + "runtime_id": -633, + "component_based": false + }, + "minecraft:pink_concrete_powder": { + "runtime_id": -714, + "component_based": false + }, + "minecraft:pink_dye": { + "runtime_id": 430, + "component_based": false + }, + "minecraft:pink_glazed_terracotta": { + "runtime_id": 226, + "component_based": false + }, + "minecraft:pink_petals": { + "runtime_id": -549, + "component_based": false + }, + "minecraft:pink_shulker_box": { + "runtime_id": -618, + "component_based": false + }, + "minecraft:pink_stained_glass": { + "runtime_id": -678, + "component_based": false + }, + "minecraft:pink_stained_glass_pane": { + "runtime_id": -648, + "component_based": false + }, + "minecraft:pink_terracotta": { + "runtime_id": -729, + "component_based": false + }, + "minecraft:pink_tulip": { + "runtime_id": -836, + "component_based": false + }, + "minecraft:pink_wool": { + "runtime_id": -566, + "component_based": false + }, + "minecraft:piston": { + "runtime_id": 33, + "component_based": false + }, + "minecraft:piston_arm_collision": { + "runtime_id": 34, + "component_based": false + }, + "minecraft:pitcher_crop": { + "runtime_id": -574, + "component_based": false + }, + "minecraft:pitcher_plant": { + "runtime_id": -612, + "component_based": false + }, + "minecraft:pitcher_pod": { + "runtime_id": 319, + "component_based": false + }, + "minecraft:planks": { + "runtime_id": 766, + "component_based": false + }, + "minecraft:player_head": { + "runtime_id": -967, + "component_based": false + }, + "minecraft:plenty_pottery_sherd": { + "runtime_id": 709, + "component_based": false + }, + "minecraft:podzol": { + "runtime_id": 243, + "component_based": false + }, + "minecraft:pointed_dripstone": { + "runtime_id": -308, + "component_based": false + }, + "minecraft:poisonous_potato": { + "runtime_id": 304, + "component_based": false + }, + "minecraft:polar_bear_spawn_egg": { + "runtime_id": 500, + "component_based": false + }, + "minecraft:polished_andesite": { + "runtime_id": -595, + "component_based": false + }, + "minecraft:polished_andesite_double_slab": { + "runtime_id": -919, + "component_based": false + }, + "minecraft:polished_andesite_slab": { + "runtime_id": -892, + "component_based": false + }, + "minecraft:polished_andesite_stairs": { + "runtime_id": -174, + "component_based": false + }, + "minecraft:polished_basalt": { + "runtime_id": -235, + "component_based": false + }, + "minecraft:polished_blackstone": { + "runtime_id": -291, + "component_based": false + }, + "minecraft:polished_blackstone_brick_double_slab": { + "runtime_id": -285, + "component_based": false + }, + "minecraft:polished_blackstone_brick_slab": { + "runtime_id": -284, + "component_based": false + }, + "minecraft:polished_blackstone_brick_stairs": { + "runtime_id": -275, + "component_based": false + }, + "minecraft:polished_blackstone_brick_wall": { + "runtime_id": -278, + "component_based": false + }, + "minecraft:polished_blackstone_bricks": { + "runtime_id": -274, + "component_based": false + }, + "minecraft:polished_blackstone_button": { + "runtime_id": -296, + "component_based": false + }, + "minecraft:polished_blackstone_double_slab": { + "runtime_id": -294, + "component_based": false + }, + "minecraft:polished_blackstone_pressure_plate": { + "runtime_id": -295, + "component_based": false + }, + "minecraft:polished_blackstone_slab": { + "runtime_id": -293, + "component_based": false + }, + "minecraft:polished_blackstone_stairs": { + "runtime_id": -292, + "component_based": false + }, + "minecraft:polished_blackstone_wall": { + "runtime_id": -297, + "component_based": false + }, + "minecraft:polished_deepslate": { + "runtime_id": -383, + "component_based": false + }, + "minecraft:polished_deepslate_double_slab": { + "runtime_id": -397, + "component_based": false + }, + "minecraft:polished_deepslate_slab": { + "runtime_id": -384, + "component_based": false + }, + "minecraft:polished_deepslate_stairs": { + "runtime_id": -385, + "component_based": false + }, + "minecraft:polished_deepslate_wall": { + "runtime_id": -386, + "component_based": false + }, + "minecraft:polished_diorite": { + "runtime_id": -593, + "component_based": false + }, + "minecraft:polished_diorite_double_slab": { + "runtime_id": -922, + "component_based": false + }, + "minecraft:polished_diorite_slab": { + "runtime_id": -895, + "component_based": false + }, + "minecraft:polished_diorite_stairs": { + "runtime_id": -173, + "component_based": false + }, + "minecraft:polished_granite": { + "runtime_id": -591, + "component_based": false + }, + "minecraft:polished_granite_double_slab": { + "runtime_id": -924, + "component_based": false + }, + "minecraft:polished_granite_slab": { + "runtime_id": -897, + "component_based": false + }, + "minecraft:polished_granite_stairs": { + "runtime_id": -172, + "component_based": false + }, + "minecraft:polished_tuff": { + "runtime_id": -748, + "component_based": false + }, + "minecraft:polished_tuff_double_slab": { + "runtime_id": -750, + "component_based": false + }, + "minecraft:polished_tuff_slab": { + "runtime_id": -749, + "component_based": false + }, + "minecraft:polished_tuff_stairs": { + "runtime_id": -751, + "component_based": false + }, + "minecraft:polished_tuff_wall": { + "runtime_id": -752, + "component_based": false + }, + "minecraft:popped_chorus_fruit": { + "runtime_id": 592, + "component_based": false + }, + "minecraft:poppy": { + "runtime_id": 38, + "component_based": false + }, + "minecraft:porkchop": { + "runtime_id": 284, + "component_based": false + }, + "minecraft:portal": { + "runtime_id": 90, + "component_based": false + }, + "minecraft:potato": { + "runtime_id": 302, + "component_based": false + }, + "minecraft:potatoes": { + "runtime_id": 142, + "component_based": false + }, + "minecraft:potion": { + "runtime_id": 453, + "component_based": false + }, + "minecraft:powder_snow": { + "runtime_id": -306, + "component_based": false + }, + "minecraft:powder_snow_bucket": { + "runtime_id": 393, + "component_based": false + }, + "minecraft:powered_comparator": { + "runtime_id": 150, + "component_based": false + }, + "minecraft:powered_repeater": { + "runtime_id": 94, + "component_based": false + }, + "minecraft:prismarine": { + "runtime_id": 168, + "component_based": false + }, + "minecraft:prismarine_brick_double_slab": { + "runtime_id": -914, + "component_based": false + }, + "minecraft:prismarine_brick_slab": { + "runtime_id": -887, + "component_based": false + }, + "minecraft:prismarine_bricks": { + "runtime_id": -948, + "component_based": false + }, + "minecraft:prismarine_bricks_stairs": { + "runtime_id": -4, + "component_based": false + }, + "minecraft:prismarine_crystals": { + "runtime_id": 582, + "component_based": false + }, + "minecraft:prismarine_double_slab": { + "runtime_id": -912, + "component_based": false + }, + "minecraft:prismarine_shard": { + "runtime_id": 598, + "component_based": false + }, + "minecraft:prismarine_slab": { + "runtime_id": -885, + "component_based": false + }, + "minecraft:prismarine_stairs": { + "runtime_id": -2, + "component_based": false + }, + "minecraft:prismarine_wall": { + "runtime_id": -981, + "component_based": false + }, + "minecraft:prize_pottery_sherd": { + "runtime_id": 710, + "component_based": false + }, + "minecraft:pufferfish": { + "runtime_id": 289, + "component_based": false + }, + "minecraft:pufferfish_bucket": { + "runtime_id": 392, + "component_based": false + }, + "minecraft:pufferfish_spawn_egg": { + "runtime_id": 509, + "component_based": false + }, + "minecraft:pumpkin": { + "runtime_id": 86, + "component_based": false + }, + "minecraft:pumpkin_pie": { + "runtime_id": 306, + "component_based": false + }, + "minecraft:pumpkin_seeds": { + "runtime_id": 314, + "component_based": false + }, + "minecraft:pumpkin_stem": { + "runtime_id": 104, + "component_based": false + }, + "minecraft:purple_bundle": { + "runtime_id": 270, + "component_based": true + }, + "minecraft:purple_candle": { + "runtime_id": -423, + "component_based": false + }, + "minecraft:purple_candle_cake": { + "runtime_id": -440, + "component_based": false + }, + "minecraft:purple_carpet": { + "runtime_id": -606, + "component_based": false + }, + "minecraft:purple_concrete": { + "runtime_id": -637, + "component_based": false + }, + "minecraft:purple_concrete_powder": { + "runtime_id": -718, + "component_based": false + }, + "minecraft:purple_dye": { + "runtime_id": 426, + "component_based": false + }, + "minecraft:purple_glazed_terracotta": { + "runtime_id": 219, + "component_based": false + }, + "minecraft:purple_shulker_box": { + "runtime_id": -622, + "component_based": false + }, + "minecraft:purple_stained_glass": { + "runtime_id": -682, + "component_based": false + }, + "minecraft:purple_stained_glass_pane": { + "runtime_id": -652, + "component_based": false + }, + "minecraft:purple_terracotta": { + "runtime_id": -733, + "component_based": false + }, + "minecraft:purple_wool": { + "runtime_id": -564, + "component_based": false + }, + "minecraft:purpur_block": { + "runtime_id": 201, + "component_based": false + }, + "minecraft:purpur_double_slab": { + "runtime_id": -911, + "component_based": false + }, + "minecraft:purpur_pillar": { + "runtime_id": -951, + "component_based": false + }, + "minecraft:purpur_slab": { + "runtime_id": -884, + "component_based": false + }, + "minecraft:purpur_stairs": { + "runtime_id": 203, + "component_based": false + }, + "minecraft:quartz": { + "runtime_id": 557, + "component_based": false + }, + "minecraft:quartz_block": { + "runtime_id": 155, + "component_based": false + }, + "minecraft:quartz_bricks": { + "runtime_id": -304, + "component_based": false + }, + "minecraft:quartz_double_slab": { + "runtime_id": -882, + "component_based": false + }, + "minecraft:quartz_ore": { + "runtime_id": 153, + "component_based": false + }, + "minecraft:quartz_pillar": { + "runtime_id": -954, + "component_based": false + }, + "minecraft:quartz_slab": { + "runtime_id": -876, + "component_based": false + }, + "minecraft:quartz_stairs": { + "runtime_id": 156, + "component_based": false + }, + "minecraft:rabbit": { + "runtime_id": 310, + "component_based": false + }, + "minecraft:rabbit_foot": { + "runtime_id": 561, + "component_based": false + }, + "minecraft:rabbit_hide": { + "runtime_id": 562, + "component_based": false + }, + "minecraft:rabbit_spawn_egg": { + "runtime_id": 486, + "component_based": false + }, + "minecraft:rabbit_stew": { + "runtime_id": 312, + "component_based": false + }, + "minecraft:rail": { + "runtime_id": 66, + "component_based": false + }, + "minecraft:raiser_armor_trim_smithing_template": { + "runtime_id": 731, + "component_based": false + }, + "minecraft:rapid_fertilizer": { + "runtime_id": 634, + "component_based": false + }, + "minecraft:ravager_spawn_egg": { + "runtime_id": 521, + "component_based": false + }, + "minecraft:raw_copper": { + "runtime_id": 541, + "component_based": false + }, + "minecraft:raw_copper_block": { + "runtime_id": -452, + "component_based": false + }, + "minecraft:raw_gold": { + "runtime_id": 540, + "component_based": false + }, + "minecraft:raw_gold_block": { + "runtime_id": -453, + "component_based": false + }, + "minecraft:raw_iron": { + "runtime_id": 539, + "component_based": false + }, + "minecraft:raw_iron_block": { + "runtime_id": -451, + "component_based": false + }, + "minecraft:recovery_compass": { + "runtime_id": 683, + "component_based": false + }, + "minecraft:red_bundle": { + "runtime_id": 267, + "component_based": true + }, + "minecraft:red_candle": { + "runtime_id": -427, + "component_based": false + }, + "minecraft:red_candle_cake": { + "runtime_id": -444, + "component_based": false + }, + "minecraft:red_carpet": { + "runtime_id": -610, + "component_based": false + }, + "minecraft:red_concrete": { + "runtime_id": -641, + "component_based": false + }, + "minecraft:red_concrete_powder": { + "runtime_id": -722, + "component_based": false + }, + "minecraft:red_dye": { + "runtime_id": 422, + "component_based": false + }, + "minecraft:red_flower": { + "runtime_id": 764, + "component_based": false + }, + "minecraft:red_glazed_terracotta": { + "runtime_id": 234, + "component_based": false + }, + "minecraft:red_mushroom": { + "runtime_id": 40, + "component_based": false + }, + "minecraft:red_mushroom_block": { + "runtime_id": 100, + "component_based": false + }, + "minecraft:red_nether_brick": { + "runtime_id": 215, + "component_based": false + }, + "minecraft:red_nether_brick_double_slab": { + "runtime_id": -917, + "component_based": false + }, + "minecraft:red_nether_brick_slab": { + "runtime_id": -890, + "component_based": false + }, + "minecraft:red_nether_brick_stairs": { + "runtime_id": -184, + "component_based": false + }, + "minecraft:red_nether_brick_wall": { + "runtime_id": -983, + "component_based": false + }, + "minecraft:red_sand": { + "runtime_id": -949, + "component_based": false + }, + "minecraft:red_sandstone": { + "runtime_id": 179, + "component_based": false + }, + "minecraft:red_sandstone_double_slab": { + "runtime_id": 181, + "component_based": false + }, + "minecraft:red_sandstone_slab": { + "runtime_id": 182, + "component_based": false + }, + "minecraft:red_sandstone_stairs": { + "runtime_id": 180, + "component_based": false + }, + "minecraft:red_sandstone_wall": { + "runtime_id": -982, + "component_based": false + }, + "minecraft:red_shulker_box": { + "runtime_id": -626, + "component_based": false + }, + "minecraft:red_stained_glass": { + "runtime_id": -686, + "component_based": false + }, + "minecraft:red_stained_glass_pane": { + "runtime_id": -656, + "component_based": false + }, + "minecraft:red_terracotta": { + "runtime_id": -737, + "component_based": false + }, + "minecraft:red_tulip": { + "runtime_id": -833, + "component_based": false + }, + "minecraft:red_wool": { + "runtime_id": -556, + "component_based": false + }, + "minecraft:redstone": { + "runtime_id": 398, + "component_based": false + }, + "minecraft:redstone_block": { + "runtime_id": 152, + "component_based": false + }, + "minecraft:redstone_lamp": { + "runtime_id": 123, + "component_based": false + }, + "minecraft:redstone_ore": { + "runtime_id": 73, + "component_based": false + }, + "minecraft:redstone_torch": { + "runtime_id": 76, + "component_based": false + }, + "minecraft:redstone_wire": { + "runtime_id": 55, + "component_based": false + }, + "minecraft:reinforced_deepslate": { + "runtime_id": -466, + "component_based": false + }, + "minecraft:repeater": { + "runtime_id": 445, + "component_based": true + }, + "minecraft:repeating_command_block": { + "runtime_id": 188, + "component_based": false + }, + "minecraft:reserved6": { + "runtime_id": 255, + "component_based": false + }, + "minecraft:respawn_anchor": { + "runtime_id": -272, + "component_based": false + }, + "minecraft:rib_armor_trim_smithing_template": { + "runtime_id": 727, + "component_based": false + }, + "minecraft:rose_bush": { + "runtime_id": -866, + "component_based": false + }, + "minecraft:rotten_flesh": { + "runtime_id": 299, + "component_based": false + }, + "minecraft:saddle": { + "runtime_id": 396, + "component_based": false + }, + "minecraft:salmon": { + "runtime_id": 287, + "component_based": false + }, + "minecraft:salmon_bucket": { + "runtime_id": 390, + "component_based": false + }, + "minecraft:salmon_spawn_egg": { + "runtime_id": 510, + "component_based": false + }, + "minecraft:sand": { + "runtime_id": 12, + "component_based": false + }, + "minecraft:sandstone": { + "runtime_id": 24, + "component_based": false + }, + "minecraft:sandstone_double_slab": { + "runtime_id": -878, + "component_based": false + }, + "minecraft:sandstone_slab": { + "runtime_id": -872, + "component_based": false + }, + "minecraft:sandstone_stairs": { + "runtime_id": 128, + "component_based": false + }, + "minecraft:sandstone_wall": { + "runtime_id": -975, + "component_based": false + }, + "minecraft:sapling": { + "runtime_id": 760, + "component_based": false + }, + "minecraft:scaffolding": { + "runtime_id": -165, + "component_based": false + }, + "minecraft:scrape_pottery_sherd": { + "runtime_id": 711, + "component_based": false + }, + "minecraft:sculk": { + "runtime_id": -458, + "component_based": false + }, + "minecraft:sculk_catalyst": { + "runtime_id": -460, + "component_based": false + }, + "minecraft:sculk_sensor": { + "runtime_id": -307, + "component_based": false + }, + "minecraft:sculk_shrieker": { + "runtime_id": -461, + "component_based": false + }, + "minecraft:sculk_vein": { + "runtime_id": -459, + "component_based": false + }, + "minecraft:sea_lantern": { + "runtime_id": 169, + "component_based": false + }, + "minecraft:sea_pickle": { + "runtime_id": -156, + "component_based": false + }, + "minecraft:seagrass": { + "runtime_id": -130, + "component_based": false + }, + "minecraft:sentry_armor_trim_smithing_template": { + "runtime_id": 718, + "component_based": false + }, + "minecraft:shaper_armor_trim_smithing_template": { + "runtime_id": 732, + "component_based": false + }, + "minecraft:sheaf_pottery_sherd": { + "runtime_id": 712, + "component_based": false + }, + "minecraft:shears": { + "runtime_id": 447, + "component_based": false + }, + "minecraft:sheep_spawn_egg": { + "runtime_id": 465, + "component_based": false + }, + "minecraft:shelter_pottery_sherd": { + "runtime_id": 713, + "component_based": false + }, + "minecraft:shield": { + "runtime_id": 380, + "component_based": false + }, + "minecraft:short_grass": { + "runtime_id": 31, + "component_based": false + }, + "minecraft:shroomlight": { + "runtime_id": -230, + "component_based": false + }, + "minecraft:shulker_box": { + "runtime_id": 775, + "component_based": false + }, + "minecraft:shulker_shell": { + "runtime_id": 599, + "component_based": false + }, + "minecraft:shulker_spawn_egg": { + "runtime_id": 497, + "component_based": false + }, + "minecraft:silence_armor_trim_smithing_template": { + "runtime_id": 729, + "component_based": false + }, + "minecraft:silver_glazed_terracotta": { + "runtime_id": 228, + "component_based": false + }, + "minecraft:silverfish_spawn_egg": { + "runtime_id": 470, + "component_based": false + }, + "minecraft:skeleton_horse_spawn_egg": { + "runtime_id": 495, + "component_based": false + }, + "minecraft:skeleton_skull": { + "runtime_id": 144, + "component_based": false + }, + "minecraft:skeleton_spawn_egg": { + "runtime_id": 471, + "component_based": false + }, + "minecraft:skull": { + "runtime_id": 737, + "component_based": false + }, + "minecraft:skull_banner_pattern": { + "runtime_id": 616, + "component_based": false + }, + "minecraft:skull_pottery_sherd": { + "runtime_id": 714, + "component_based": false + }, + "minecraft:slime": { + "runtime_id": 165, + "component_based": false + }, + "minecraft:slime_ball": { + "runtime_id": 414, + "component_based": false + }, + "minecraft:slime_spawn_egg": { + "runtime_id": 472, + "component_based": false + }, + "minecraft:small_amethyst_bud": { + "runtime_id": -332, + "component_based": false + }, + "minecraft:small_dripleaf_block": { + "runtime_id": -336, + "component_based": false + }, + "minecraft:smithing_table": { + "runtime_id": -202, + "component_based": false + }, + "minecraft:smoker": { + "runtime_id": -198, + "component_based": false + }, + "minecraft:smooth_basalt": { + "runtime_id": -377, + "component_based": false + }, + "minecraft:smooth_quartz": { + "runtime_id": -955, + "component_based": false + }, + "minecraft:smooth_quartz_double_slab": { + "runtime_id": -925, + "component_based": false + }, + "minecraft:smooth_quartz_slab": { + "runtime_id": -898, + "component_based": false + }, + "minecraft:smooth_quartz_stairs": { + "runtime_id": -185, + "component_based": false + }, + "minecraft:smooth_red_sandstone": { + "runtime_id": -958, + "component_based": false + }, + "minecraft:smooth_red_sandstone_double_slab": { + "runtime_id": -918, + "component_based": false + }, + "minecraft:smooth_red_sandstone_slab": { + "runtime_id": -891, + "component_based": false + }, + "minecraft:smooth_red_sandstone_stairs": { + "runtime_id": -176, + "component_based": false + }, + "minecraft:smooth_sandstone": { + "runtime_id": -946, + "component_based": false + }, + "minecraft:smooth_sandstone_double_slab": { + "runtime_id": -916, + "component_based": false + }, + "minecraft:smooth_sandstone_slab": { + "runtime_id": -889, + "component_based": false + }, + "minecraft:smooth_sandstone_stairs": { + "runtime_id": -177, + "component_based": false + }, + "minecraft:smooth_stone": { + "runtime_id": -183, + "component_based": false + }, + "minecraft:smooth_stone_double_slab": { + "runtime_id": 43, + "component_based": false + }, + "minecraft:smooth_stone_slab": { + "runtime_id": 44, + "component_based": false + }, + "minecraft:sniffer_egg": { + "runtime_id": -596, + "component_based": false + }, + "minecraft:sniffer_spawn_egg": { + "runtime_id": 528, + "component_based": false + }, + "minecraft:snort_pottery_sherd": { + "runtime_id": 715, + "component_based": false + }, + "minecraft:snout_armor_trim_smithing_template": { + "runtime_id": 726, + "component_based": false + }, + "minecraft:snow": { + "runtime_id": 80, + "component_based": false + }, + "minecraft:snow_golem_spawn_egg": { + "runtime_id": 534, + "component_based": false + }, + "minecraft:snow_layer": { + "runtime_id": 78, + "component_based": false + }, + "minecraft:snowball": { + "runtime_id": 399, + "component_based": true + }, + "minecraft:soul_campfire": { + "runtime_id": 659, + "component_based": true + }, + "minecraft:soul_fire": { + "runtime_id": -237, + "component_based": false + }, + "minecraft:soul_lantern": { + "runtime_id": -269, + "component_based": false + }, + "minecraft:soul_sand": { + "runtime_id": 88, + "component_based": false + }, + "minecraft:soul_soil": { + "runtime_id": -236, + "component_based": false + }, + "minecraft:soul_torch": { + "runtime_id": -268, + "component_based": false + }, + "minecraft:sparkler": { + "runtime_id": 637, + "component_based": false + }, + "minecraft:spawn_egg": { + "runtime_id": 789, + "component_based": false + }, + "minecraft:spider_eye": { + "runtime_id": 300, + "component_based": false + }, + "minecraft:spider_spawn_egg": { + "runtime_id": 473, + "component_based": false + }, + "minecraft:spire_armor_trim_smithing_template": { + "runtime_id": 728, + "component_based": false + }, + "minecraft:splash_potion": { + "runtime_id": 594, + "component_based": false + }, + "minecraft:sponge": { + "runtime_id": 19, + "component_based": false + }, + "minecraft:spore_blossom": { + "runtime_id": -321, + "component_based": false + }, + "minecraft:spruce_boat": { + "runtime_id": 404, + "component_based": false + }, + "minecraft:spruce_button": { + "runtime_id": -144, + "component_based": false + }, + "minecraft:spruce_chest_boat": { + "runtime_id": 678, + "component_based": false + }, + "minecraft:spruce_door": { + "runtime_id": 586, + "component_based": false + }, + "minecraft:spruce_double_slab": { + "runtime_id": -809, + "component_based": false + }, + "minecraft:spruce_fence": { + "runtime_id": -579, + "component_based": false + }, + "minecraft:spruce_fence_gate": { + "runtime_id": 183, + "component_based": false + }, + "minecraft:spruce_hanging_sign": { + "runtime_id": -501, + "component_based": false + }, + "minecraft:spruce_leaves": { + "runtime_id": -800, + "component_based": false + }, + "minecraft:spruce_log": { + "runtime_id": -569, + "component_based": false + }, + "minecraft:spruce_planks": { + "runtime_id": -739, + "component_based": false + }, + "minecraft:spruce_pressure_plate": { + "runtime_id": -154, + "component_based": false + }, + "minecraft:spruce_sapling": { + "runtime_id": -825, + "component_based": false + }, + "minecraft:spruce_sign": { + "runtime_id": 609, + "component_based": false + }, + "minecraft:spruce_slab": { + "runtime_id": -804, + "component_based": false + }, + "minecraft:spruce_stairs": { + "runtime_id": 134, + "component_based": false + }, + "minecraft:spruce_standing_sign": { + "runtime_id": -181, + "component_based": false + }, + "minecraft:spruce_trapdoor": { + "runtime_id": -149, + "component_based": false + }, + "minecraft:spruce_wall_sign": { + "runtime_id": -182, + "component_based": false + }, + "minecraft:spruce_wood": { + "runtime_id": -814, + "component_based": false + }, + "minecraft:spyglass": { + "runtime_id": 662, + "component_based": false + }, + "minecraft:squid_spawn_egg": { + "runtime_id": 477, + "component_based": false + }, + "minecraft:stained_glass": { + "runtime_id": 773, + "component_based": false + }, + "minecraft:stained_glass_pane": { + "runtime_id": 774, + "component_based": false + }, + "minecraft:stained_hardened_clay": { + "runtime_id": 738, + "component_based": false + }, + "minecraft:standing_banner": { + "runtime_id": 176, + "component_based": false + }, + "minecraft:standing_sign": { + "runtime_id": 63, + "component_based": false + }, + "minecraft:stick": { + "runtime_id": 345, + "component_based": false + }, + "minecraft:sticky_piston": { + "runtime_id": 29, + "component_based": false + }, + "minecraft:sticky_piston_arm_collision": { + "runtime_id": -217, + "component_based": false + }, + "minecraft:stone": { + "runtime_id": 1, + "component_based": false + }, + "minecraft:stone_axe": { + "runtime_id": 339, + "component_based": false + }, + "minecraft:stone_block_slab": { + "runtime_id": 750, + "component_based": false + }, + "minecraft:stone_block_slab2": { + "runtime_id": 751, + "component_based": false + }, + "minecraft:stone_block_slab3": { + "runtime_id": 752, + "component_based": false + }, + "minecraft:stone_block_slab4": { + "runtime_id": 753, + "component_based": false + }, + "minecraft:stone_brick_double_slab": { + "runtime_id": -881, + "component_based": false + }, + "minecraft:stone_brick_slab": { + "runtime_id": -875, + "component_based": false + }, + "minecraft:stone_brick_stairs": { + "runtime_id": 109, + "component_based": false + }, + "minecraft:stone_brick_wall": { + "runtime_id": -977, + "component_based": false + }, + "minecraft:stone_bricks": { + "runtime_id": 98, + "component_based": false + }, + "minecraft:stone_button": { + "runtime_id": 77, + "component_based": false + }, + "minecraft:stone_hoe": { + "runtime_id": 355, + "component_based": false + }, + "minecraft:stone_pickaxe": { + "runtime_id": 338, + "component_based": false + }, + "minecraft:stone_pressure_plate": { + "runtime_id": 70, + "component_based": false + }, + "minecraft:stone_shovel": { + "runtime_id": 337, + "component_based": false + }, + "minecraft:stone_stairs": { + "runtime_id": 67, + "component_based": false + }, + "minecraft:stone_sword": { + "runtime_id": 336, + "component_based": false + }, + "minecraft:stonebrick": { + "runtime_id": 748, + "component_based": false + }, + "minecraft:stonecutter": { + "runtime_id": 245, + "component_based": false + }, + "minecraft:stonecutter_block": { + "runtime_id": -197, + "component_based": false + }, + "minecraft:stray_spawn_egg": { + "runtime_id": 489, + "component_based": false + }, + "minecraft:strider_spawn_egg": { + "runtime_id": 523, + "component_based": false + }, + "minecraft:string": { + "runtime_id": 351, + "component_based": true + }, + "minecraft:stripped_acacia_log": { + "runtime_id": -8, + "component_based": false + }, + "minecraft:stripped_acacia_wood": { + "runtime_id": -823, + "component_based": false + }, + "minecraft:stripped_bamboo_block": { + "runtime_id": -528, + "component_based": false + }, + "minecraft:stripped_birch_log": { + "runtime_id": -6, + "component_based": false + }, + "minecraft:stripped_birch_wood": { + "runtime_id": -821, + "component_based": false + }, + "minecraft:stripped_cherry_log": { + "runtime_id": -535, + "component_based": false + }, + "minecraft:stripped_cherry_wood": { + "runtime_id": -545, + "component_based": false + }, + "minecraft:stripped_crimson_hyphae": { + "runtime_id": -300, + "component_based": false + }, + "minecraft:stripped_crimson_stem": { + "runtime_id": -240, + "component_based": false + }, + "minecraft:stripped_dark_oak_log": { + "runtime_id": -9, + "component_based": false + }, + "minecraft:stripped_dark_oak_wood": { + "runtime_id": -824, + "component_based": false + }, + "minecraft:stripped_jungle_log": { + "runtime_id": -7, + "component_based": false + }, + "minecraft:stripped_jungle_wood": { + "runtime_id": -822, + "component_based": false + }, + "minecraft:stripped_mangrove_log": { + "runtime_id": -485, + "component_based": false + }, + "minecraft:stripped_mangrove_wood": { + "runtime_id": -498, + "component_based": false + }, + "minecraft:stripped_oak_log": { + "runtime_id": -10, + "component_based": false + }, + "minecraft:stripped_oak_wood": { + "runtime_id": -819, + "component_based": false + }, + "minecraft:stripped_spruce_log": { + "runtime_id": -5, + "component_based": false + }, + "minecraft:stripped_spruce_wood": { + "runtime_id": -820, + "component_based": false + }, + "minecraft:stripped_warped_hyphae": { + "runtime_id": -301, + "component_based": false + }, + "minecraft:stripped_warped_stem": { + "runtime_id": -241, + "component_based": false + }, + "minecraft:structure_block": { + "runtime_id": 252, + "component_based": false + }, + "minecraft:structure_void": { + "runtime_id": 217, + "component_based": false + }, + "minecraft:sugar": { + "runtime_id": 442, + "component_based": false + }, + "minecraft:sugar_cane": { + "runtime_id": 411, + "component_based": true + }, + "minecraft:sunflower": { + "runtime_id": 175, + "component_based": false + }, + "minecraft:suspicious_gravel": { + "runtime_id": -573, + "component_based": false + }, + "minecraft:suspicious_sand": { + "runtime_id": -529, + "component_based": false + }, + "minecraft:suspicious_stew": { + "runtime_id": 625, + "component_based": false + }, + "minecraft:sweet_berries": { + "runtime_id": 309, + "component_based": false + }, + "minecraft:sweet_berry_bush": { + "runtime_id": -207, + "component_based": false + }, + "minecraft:tadpole_bucket": { + "runtime_id": 667, + "component_based": false + }, + "minecraft:tadpole_spawn_egg": { + "runtime_id": 666, + "component_based": false + }, + "minecraft:tall_grass": { + "runtime_id": -864, + "component_based": false + }, + "minecraft:tallgrass": { + "runtime_id": 768, + "component_based": false + }, + "minecraft:target": { + "runtime_id": -239, + "component_based": false + }, + "minecraft:tide_armor_trim_smithing_template": { + "runtime_id": 725, + "component_based": false + }, + "minecraft:tinted_glass": { + "runtime_id": -334, + "component_based": false + }, + "minecraft:tnt": { + "runtime_id": 46, + "component_based": false + }, + "minecraft:tnt_minecart": { + "runtime_id": 558, + "component_based": false + }, + "minecraft:torch": { + "runtime_id": 50, + "component_based": false + }, + "minecraft:torchflower": { + "runtime_id": -568, + "component_based": false + }, + "minecraft:torchflower_crop": { + "runtime_id": -567, + "component_based": false + }, + "minecraft:torchflower_seeds": { + "runtime_id": 318, + "component_based": false + }, + "minecraft:totem_of_undying": { + "runtime_id": 601, + "component_based": false + }, + "minecraft:trader_llama_spawn_egg": { + "runtime_id": 685, + "component_based": false + }, + "minecraft:trapdoor": { + "runtime_id": 96, + "component_based": false + }, + "minecraft:trapped_chest": { + "runtime_id": 146, + "component_based": false + }, + "minecraft:trial_key": { + "runtime_id": 275, + "component_based": true + }, + "minecraft:trial_spawner": { + "runtime_id": -315, + "component_based": false + }, + "minecraft:trident": { + "runtime_id": 579, + "component_based": false + }, + "minecraft:trip_wire": { + "runtime_id": 132, + "component_based": false + }, + "minecraft:tripwire_hook": { + "runtime_id": 131, + "component_based": false + }, + "minecraft:tropical_fish": { + "runtime_id": 288, + "component_based": false + }, + "minecraft:tropical_fish_bucket": { + "runtime_id": 391, + "component_based": false + }, + "minecraft:tropical_fish_spawn_egg": { + "runtime_id": 507, + "component_based": false + }, + "minecraft:tube_coral": { + "runtime_id": -131, + "component_based": false + }, + "minecraft:tube_coral_block": { + "runtime_id": -132, + "component_based": false + }, + "minecraft:tube_coral_fan": { + "runtime_id": -133, + "component_based": false + }, + "minecraft:tube_coral_wall_fan": { + "runtime_id": -135, + "component_based": false + }, + "minecraft:tuff": { + "runtime_id": -333, + "component_based": false + }, + "minecraft:tuff_brick_double_slab": { + "runtime_id": -756, + "component_based": false + }, + "minecraft:tuff_brick_slab": { + "runtime_id": -755, + "component_based": false + }, + "minecraft:tuff_brick_stairs": { + "runtime_id": -757, + "component_based": false + }, + "minecraft:tuff_brick_wall": { + "runtime_id": -758, + "component_based": false + }, + "minecraft:tuff_bricks": { + "runtime_id": -754, + "component_based": false + }, + "minecraft:tuff_double_slab": { + "runtime_id": -745, + "component_based": false + }, + "minecraft:tuff_slab": { + "runtime_id": -744, + "component_based": false + }, + "minecraft:tuff_stairs": { + "runtime_id": -746, + "component_based": false + }, + "minecraft:tuff_wall": { + "runtime_id": -747, + "component_based": false + }, + "minecraft:turtle_egg": { + "runtime_id": -159, + "component_based": false + }, + "minecraft:turtle_helmet": { + "runtime_id": 606, + "component_based": false + }, + "minecraft:turtle_scute": { + "runtime_id": 605, + "component_based": false + }, + "minecraft:turtle_spawn_egg": { + "runtime_id": 513, + "component_based": false + }, + "minecraft:twisting_vines": { + "runtime_id": -287, + "component_based": false + }, + "minecraft:underwater_tnt": { + "runtime_id": -985, + "component_based": false + }, + "minecraft:underwater_torch": { + "runtime_id": 239, + "component_based": false + }, + "minecraft:undyed_shulker_box": { + "runtime_id": 205, + "component_based": false + }, + "minecraft:unknown": { + "runtime_id": -305, + "component_based": false + }, + "minecraft:unlit_redstone_torch": { + "runtime_id": 75, + "component_based": false + }, + "minecraft:unpowered_comparator": { + "runtime_id": 149, + "component_based": false + }, + "minecraft:unpowered_repeater": { + "runtime_id": 93, + "component_based": false + }, + "minecraft:vault": { + "runtime_id": -314, + "component_based": false + }, + "minecraft:verdant_froglight": { + "runtime_id": -470, + "component_based": false + }, + "minecraft:vex_armor_trim_smithing_template": { + "runtime_id": 724, + "component_based": false + }, + "minecraft:vex_spawn_egg": { + "runtime_id": 504, + "component_based": false + }, + "minecraft:villager_spawn_egg": { + "runtime_id": 476, + "component_based": false + }, + "minecraft:vindicator_spawn_egg": { + "runtime_id": 502, + "component_based": false + }, + "minecraft:vine": { + "runtime_id": 106, + "component_based": false + }, + "minecraft:wall_banner": { + "runtime_id": 177, + "component_based": false + }, + "minecraft:wall_sign": { + "runtime_id": 68, + "component_based": false + }, + "minecraft:wandering_trader_spawn_egg": { + "runtime_id": 520, + "component_based": false + }, + "minecraft:ward_armor_trim_smithing_template": { + "runtime_id": 722, + "component_based": false + }, + "minecraft:warden_spawn_egg": { + "runtime_id": 669, + "component_based": false + }, + "minecraft:warped_button": { + "runtime_id": -261, + "component_based": false + }, + "minecraft:warped_door": { + "runtime_id": 654, + "component_based": false + }, + "minecraft:warped_double_slab": { + "runtime_id": -267, + "component_based": false + }, + "minecraft:warped_fence": { + "runtime_id": -257, + "component_based": false + }, + "minecraft:warped_fence_gate": { + "runtime_id": -259, + "component_based": false + }, + "minecraft:warped_fungus": { + "runtime_id": -229, + "component_based": false + }, + "minecraft:warped_fungus_on_a_stick": { + "runtime_id": 655, + "component_based": true + }, + "minecraft:warped_hanging_sign": { + "runtime_id": -507, + "component_based": false + }, + "minecraft:warped_hyphae": { + "runtime_id": -298, + "component_based": false + }, + "minecraft:warped_nylium": { + "runtime_id": -233, + "component_based": false + }, + "minecraft:warped_planks": { + "runtime_id": -243, + "component_based": false + }, + "minecraft:warped_pressure_plate": { + "runtime_id": -263, + "component_based": false + }, + "minecraft:warped_roots": { + "runtime_id": -224, + "component_based": false + }, + "minecraft:warped_sign": { + "runtime_id": 652, + "component_based": false + }, + "minecraft:warped_slab": { + "runtime_id": -265, + "component_based": false + }, + "minecraft:warped_stairs": { + "runtime_id": -255, + "component_based": false + }, + "minecraft:warped_standing_sign": { + "runtime_id": -251, + "component_based": false + }, + "minecraft:warped_stem": { + "runtime_id": -226, + "component_based": false + }, + "minecraft:warped_trapdoor": { + "runtime_id": -247, + "component_based": false + }, + "minecraft:warped_wall_sign": { + "runtime_id": -253, + "component_based": false + }, + "minecraft:warped_wart_block": { + "runtime_id": -227, + "component_based": false + }, + "minecraft:water": { + "runtime_id": 9, + "component_based": false + }, + "minecraft:water_bucket": { + "runtime_id": 387, + "component_based": false + }, + "minecraft:waterlily": { + "runtime_id": 111, + "component_based": false + }, + "minecraft:waxed_chiseled_copper": { + "runtime_id": -764, + "component_based": false + }, + "minecraft:waxed_copper": { + "runtime_id": -344, + "component_based": false + }, + "minecraft:waxed_copper_bulb": { + "runtime_id": -780, + "component_based": false + }, + "minecraft:waxed_copper_door": { + "runtime_id": -788, + "component_based": false + }, + "minecraft:waxed_copper_grate": { + "runtime_id": -772, + "component_based": false + }, + "minecraft:waxed_copper_trapdoor": { + "runtime_id": -796, + "component_based": false + }, + "minecraft:waxed_cut_copper": { + "runtime_id": -351, + "component_based": false + }, + "minecraft:waxed_cut_copper_slab": { + "runtime_id": -365, + "component_based": false + }, + "minecraft:waxed_cut_copper_stairs": { + "runtime_id": -358, + "component_based": false + }, + "minecraft:waxed_double_cut_copper_slab": { + "runtime_id": -372, + "component_based": false + }, + "minecraft:waxed_exposed_chiseled_copper": { + "runtime_id": -765, + "component_based": false + }, + "minecraft:waxed_exposed_copper": { + "runtime_id": -345, + "component_based": false + }, + "minecraft:waxed_exposed_copper_bulb": { + "runtime_id": -781, + "component_based": false + }, + "minecraft:waxed_exposed_copper_door": { + "runtime_id": -789, + "component_based": false + }, + "minecraft:waxed_exposed_copper_grate": { + "runtime_id": -773, + "component_based": false + }, + "minecraft:waxed_exposed_copper_trapdoor": { + "runtime_id": -797, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper": { + "runtime_id": -352, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_slab": { + "runtime_id": -366, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_stairs": { + "runtime_id": -359, + "component_based": false + }, + "minecraft:waxed_exposed_double_cut_copper_slab": { + "runtime_id": -373, + "component_based": false + }, + "minecraft:waxed_oxidized_chiseled_copper": { + "runtime_id": -766, + "component_based": false + }, + "minecraft:waxed_oxidized_copper": { + "runtime_id": -446, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_bulb": { + "runtime_id": -783, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_door": { + "runtime_id": -791, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_grate": { + "runtime_id": -775, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_trapdoor": { + "runtime_id": -799, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper": { + "runtime_id": -447, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_slab": { + "runtime_id": -449, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_stairs": { + "runtime_id": -448, + "component_based": false + }, + "minecraft:waxed_oxidized_double_cut_copper_slab": { + "runtime_id": -450, + "component_based": false + }, + "minecraft:waxed_weathered_chiseled_copper": { + "runtime_id": -767, + "component_based": false + }, + "minecraft:waxed_weathered_copper": { + "runtime_id": -346, + "component_based": false + }, + "minecraft:waxed_weathered_copper_bulb": { + "runtime_id": -782, + "component_based": false + }, + "minecraft:waxed_weathered_copper_door": { + "runtime_id": -790, + "component_based": false + }, + "minecraft:waxed_weathered_copper_grate": { + "runtime_id": -774, + "component_based": false + }, + "minecraft:waxed_weathered_copper_trapdoor": { + "runtime_id": -798, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper": { + "runtime_id": -353, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_slab": { + "runtime_id": -367, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_stairs": { + "runtime_id": -360, + "component_based": false + }, + "minecraft:waxed_weathered_double_cut_copper_slab": { + "runtime_id": -374, + "component_based": false + }, + "minecraft:wayfinder_armor_trim_smithing_template": { + "runtime_id": 730, + "component_based": false + }, + "minecraft:weathered_chiseled_copper": { + "runtime_id": -762, + "component_based": false + }, + "minecraft:weathered_copper": { + "runtime_id": -342, + "component_based": false + }, + "minecraft:weathered_copper_bulb": { + "runtime_id": -778, + "component_based": false + }, + "minecraft:weathered_copper_door": { + "runtime_id": -786, + "component_based": false + }, + "minecraft:weathered_copper_grate": { + "runtime_id": -770, + "component_based": false + }, + "minecraft:weathered_copper_trapdoor": { + "runtime_id": -794, + "component_based": false + }, + "minecraft:weathered_cut_copper": { + "runtime_id": -349, + "component_based": false + }, + "minecraft:weathered_cut_copper_slab": { + "runtime_id": -363, + "component_based": false + }, + "minecraft:weathered_cut_copper_stairs": { + "runtime_id": -356, + "component_based": false + }, + "minecraft:weathered_double_cut_copper_slab": { + "runtime_id": -370, + "component_based": false + }, + "minecraft:web": { + "runtime_id": 30, + "component_based": false + }, + "minecraft:weeping_vines": { + "runtime_id": -231, + "component_based": false + }, + "minecraft:wet_sponge": { + "runtime_id": -984, + "component_based": false + }, + "minecraft:wheat": { + "runtime_id": 359, + "component_based": false + }, + "minecraft:wheat_seeds": { + "runtime_id": 313, + "component_based": false + }, + "minecraft:white_bundle": { + "runtime_id": 268, + "component_based": true + }, + "minecraft:white_candle": { + "runtime_id": -413, + "component_based": false + }, + "minecraft:white_candle_cake": { + "runtime_id": -430, + "component_based": false + }, + "minecraft:white_carpet": { + "runtime_id": 171, + "component_based": false + }, + "minecraft:white_concrete": { + "runtime_id": 236, + "component_based": false + }, + "minecraft:white_concrete_powder": { + "runtime_id": 237, + "component_based": false + }, + "minecraft:white_dye": { + "runtime_id": 436, + "component_based": false + }, + "minecraft:white_glazed_terracotta": { + "runtime_id": 220, + "component_based": false + }, + "minecraft:white_shulker_box": { + "runtime_id": 218, + "component_based": false + }, + "minecraft:white_stained_glass": { + "runtime_id": 241, + "component_based": false + }, + "minecraft:white_stained_glass_pane": { + "runtime_id": 160, + "component_based": false + }, + "minecraft:white_terracotta": { + "runtime_id": 159, + "component_based": false + }, + "minecraft:white_tulip": { + "runtime_id": -835, + "component_based": false + }, + "minecraft:white_wool": { + "runtime_id": 35, + "component_based": false + }, + "minecraft:wild_armor_trim_smithing_template": { + "runtime_id": 721, + "component_based": false + }, + "minecraft:wind_charge": { + "runtime_id": 277, + "component_based": true + }, + "minecraft:witch_spawn_egg": { + "runtime_id": 479, + "component_based": false + }, + "minecraft:wither_rose": { + "runtime_id": -216, + "component_based": false + }, + "minecraft:wither_skeleton_skull": { + "runtime_id": -965, + "component_based": false + }, + "minecraft:wither_skeleton_spawn_egg": { + "runtime_id": 492, + "component_based": false + }, + "minecraft:wither_spawn_egg": { + "runtime_id": 536, + "component_based": false + }, + "minecraft:wolf_armor": { + "runtime_id": 741, + "component_based": true + }, + "minecraft:wolf_spawn_egg": { + "runtime_id": 466, + "component_based": false + }, + "minecraft:wood": { + "runtime_id": 776, + "component_based": false + }, + "minecraft:wooden_axe": { + "runtime_id": 335, + "component_based": false + }, + "minecraft:wooden_button": { + "runtime_id": 143, + "component_based": false + }, + "minecraft:wooden_door": { + "runtime_id": 384, + "component_based": false + }, + "minecraft:wooden_hoe": { + "runtime_id": 354, + "component_based": false + }, + "minecraft:wooden_pickaxe": { + "runtime_id": 334, + "component_based": false + }, + "minecraft:wooden_pressure_plate": { + "runtime_id": 72, + "component_based": false + }, + "minecraft:wooden_shovel": { + "runtime_id": 333, + "component_based": false + }, + "minecraft:wooden_slab": { + "runtime_id": 763, + "component_based": false + }, + "minecraft:wooden_sword": { + "runtime_id": 332, + "component_based": false + }, + "minecraft:wool": { + "runtime_id": 744, + "component_based": false + }, + "minecraft:writable_book": { + "runtime_id": 544, + "component_based": false + }, + "minecraft:written_book": { + "runtime_id": 545, + "component_based": false + }, + "minecraft:yellow_bundle": { + "runtime_id": 260, + "component_based": true + }, + "minecraft:yellow_candle": { + "runtime_id": -417, + "component_based": false + }, + "minecraft:yellow_candle_cake": { + "runtime_id": -434, + "component_based": false + }, + "minecraft:yellow_carpet": { + "runtime_id": -600, + "component_based": false + }, + "minecraft:yellow_concrete": { + "runtime_id": -631, + "component_based": false + }, + "minecraft:yellow_concrete_powder": { + "runtime_id": -712, + "component_based": false + }, + "minecraft:yellow_dye": { + "runtime_id": 432, + "component_based": false + }, + "minecraft:yellow_glazed_terracotta": { + "runtime_id": 224, + "component_based": false + }, + "minecraft:yellow_shulker_box": { + "runtime_id": -616, + "component_based": false + }, + "minecraft:yellow_stained_glass": { + "runtime_id": -676, + "component_based": false + }, + "minecraft:yellow_stained_glass_pane": { + "runtime_id": -646, + "component_based": false + }, + "minecraft:yellow_terracotta": { + "runtime_id": -727, + "component_based": false + }, + "minecraft:yellow_wool": { + "runtime_id": -558, + "component_based": false + }, + "minecraft:zoglin_spawn_egg": { + "runtime_id": 526, + "component_based": false + }, + "minecraft:zombie_head": { + "runtime_id": -966, + "component_based": false + }, + "minecraft:zombie_horse_spawn_egg": { + "runtime_id": 496, + "component_based": false + }, + "minecraft:zombie_pigman_spawn_egg": { + "runtime_id": 475, + "component_based": false + }, + "minecraft:zombie_spawn_egg": { + "runtime_id": 474, + "component_based": false + }, + "minecraft:zombie_villager_spawn_egg": { + "runtime_id": 505, + "component_based": false + } +} diff --git a/legacyver/required_item_list_766.json b/legacyver/required_item_list_766.json new file mode 100644 index 0000000..c523dd6 --- /dev/null +++ b/legacyver/required_item_list_766.json @@ -0,0 +1,7158 @@ +{ + "minecraft:acacia_boat": { + "runtime_id": 405, + "component_based": false + }, + "minecraft:acacia_button": { + "runtime_id": -140, + "component_based": false + }, + "minecraft:acacia_chest_boat": { + "runtime_id": 680, + "component_based": false + }, + "minecraft:acacia_door": { + "runtime_id": 589, + "component_based": false + }, + "minecraft:acacia_double_slab": { + "runtime_id": -812, + "component_based": false + }, + "minecraft:acacia_fence": { + "runtime_id": -575, + "component_based": false + }, + "minecraft:acacia_fence_gate": { + "runtime_id": 187, + "component_based": false + }, + "minecraft:acacia_hanging_sign": { + "runtime_id": -504, + "component_based": false + }, + "minecraft:acacia_leaves": { + "runtime_id": 161, + "component_based": false + }, + "minecraft:acacia_log": { + "runtime_id": 162, + "component_based": false + }, + "minecraft:acacia_planks": { + "runtime_id": -742, + "component_based": false + }, + "minecraft:acacia_pressure_plate": { + "runtime_id": -150, + "component_based": false + }, + "minecraft:acacia_sapling": { + "runtime_id": -828, + "component_based": false + }, + "minecraft:acacia_sign": { + "runtime_id": 612, + "component_based": false + }, + "minecraft:acacia_slab": { + "runtime_id": -807, + "component_based": false + }, + "minecraft:acacia_stairs": { + "runtime_id": 163, + "component_based": false + }, + "minecraft:acacia_standing_sign": { + "runtime_id": -190, + "component_based": false + }, + "minecraft:acacia_trapdoor": { + "runtime_id": -145, + "component_based": false + }, + "minecraft:acacia_wall_sign": { + "runtime_id": -191, + "component_based": false + }, + "minecraft:acacia_wood": { + "runtime_id": -817, + "component_based": false + }, + "minecraft:activator_rail": { + "runtime_id": 126, + "component_based": false + }, + "minecraft:agent_spawn_egg": { + "runtime_id": 515, + "component_based": false + }, + "minecraft:air": { + "runtime_id": -158, + "component_based": false + }, + "minecraft:allay_spawn_egg": { + "runtime_id": 669, + "component_based": false + }, + "minecraft:allium": { + "runtime_id": -831, + "component_based": false + }, + "minecraft:allow": { + "runtime_id": 210, + "component_based": false + }, + "minecraft:amethyst_block": { + "runtime_id": -327, + "component_based": false + }, + "minecraft:amethyst_cluster": { + "runtime_id": -329, + "component_based": false + }, + "minecraft:amethyst_shard": { + "runtime_id": 662, + "component_based": false + }, + "minecraft:ancient_debris": { + "runtime_id": -271, + "component_based": false + }, + "minecraft:andesite": { + "runtime_id": -594, + "component_based": false + }, + "minecraft:andesite_double_slab": { + "runtime_id": -920, + "component_based": false + }, + "minecraft:andesite_slab": { + "runtime_id": -893, + "component_based": false + }, + "minecraft:andesite_stairs": { + "runtime_id": -171, + "component_based": false + }, + "minecraft:andesite_wall": { + "runtime_id": -974, + "component_based": false + }, + "minecraft:angler_pottery_sherd": { + "runtime_id": 694, + "component_based": false + }, + "minecraft:anvil": { + "runtime_id": 145, + "component_based": false + }, + "minecraft:apple": { + "runtime_id": 278, + "component_based": true + }, + "minecraft:archer_pottery_sherd": { + "runtime_id": 695, + "component_based": false + }, + "minecraft:armadillo_scute": { + "runtime_id": 741, + "component_based": false + }, + "minecraft:armadillo_spawn_egg": { + "runtime_id": 740, + "component_based": false + }, + "minecraft:armor_stand": { + "runtime_id": 585, + "component_based": false + }, + "minecraft:arms_up_pottery_sherd": { + "runtime_id": 696, + "component_based": false + }, + "minecraft:arrow": { + "runtime_id": 325, + "component_based": true + }, + "minecraft:axolotl_bucket": { + "runtime_id": 394, + "component_based": false + }, + "minecraft:axolotl_spawn_egg": { + "runtime_id": 530, + "component_based": false + }, + "minecraft:azalea": { + "runtime_id": -337, + "component_based": false + }, + "minecraft:azalea_leaves": { + "runtime_id": -324, + "component_based": false + }, + "minecraft:azalea_leaves_flowered": { + "runtime_id": -325, + "component_based": false + }, + "minecraft:azure_bluet": { + "runtime_id": -832, + "component_based": false + }, + "minecraft:baked_potato": { + "runtime_id": 303, + "component_based": false + }, + "minecraft:balloon": { + "runtime_id": 636, + "component_based": false + }, + "minecraft:bamboo": { + "runtime_id": -163, + "component_based": false + }, + "minecraft:bamboo_block": { + "runtime_id": -527, + "component_based": false + }, + "minecraft:bamboo_button": { + "runtime_id": -511, + "component_based": false + }, + "minecraft:bamboo_chest_raft": { + "runtime_id": 692, + "component_based": false + }, + "minecraft:bamboo_door": { + "runtime_id": -517, + "component_based": false + }, + "minecraft:bamboo_double_slab": { + "runtime_id": -521, + "component_based": false + }, + "minecraft:bamboo_fence": { + "runtime_id": -515, + "component_based": false + }, + "minecraft:bamboo_fence_gate": { + "runtime_id": -516, + "component_based": false + }, + "minecraft:bamboo_hanging_sign": { + "runtime_id": -522, + "component_based": false + }, + "minecraft:bamboo_mosaic": { + "runtime_id": -509, + "component_based": false + }, + "minecraft:bamboo_mosaic_double_slab": { + "runtime_id": -525, + "component_based": false + }, + "minecraft:bamboo_mosaic_slab": { + "runtime_id": -524, + "component_based": false + }, + "minecraft:bamboo_mosaic_stairs": { + "runtime_id": -523, + "component_based": false + }, + "minecraft:bamboo_planks": { + "runtime_id": -510, + "component_based": false + }, + "minecraft:bamboo_pressure_plate": { + "runtime_id": -514, + "component_based": false + }, + "minecraft:bamboo_raft": { + "runtime_id": 691, + "component_based": false + }, + "minecraft:bamboo_sapling": { + "runtime_id": -164, + "component_based": false + }, + "minecraft:bamboo_sign": { + "runtime_id": 690, + "component_based": false + }, + "minecraft:bamboo_slab": { + "runtime_id": -513, + "component_based": false + }, + "minecraft:bamboo_stairs": { + "runtime_id": -512, + "component_based": false + }, + "minecraft:bamboo_standing_sign": { + "runtime_id": -518, + "component_based": false + }, + "minecraft:bamboo_trapdoor": { + "runtime_id": -520, + "component_based": false + }, + "minecraft:bamboo_wall_sign": { + "runtime_id": -519, + "component_based": false + }, + "minecraft:banner": { + "runtime_id": 600, + "component_based": false + }, + "minecraft:banner_pattern": { + "runtime_id": 794, + "component_based": false + }, + "minecraft:barrel": { + "runtime_id": -203, + "component_based": false + }, + "minecraft:barrier": { + "runtime_id": -161, + "component_based": false + }, + "minecraft:basalt": { + "runtime_id": -234, + "component_based": false + }, + "minecraft:bat_spawn_egg": { + "runtime_id": 480, + "component_based": false + }, + "minecraft:beacon": { + "runtime_id": 138, + "component_based": false + }, + "minecraft:bed": { + "runtime_id": 444, + "component_based": false + }, + "minecraft:bedrock": { + "runtime_id": 7, + "component_based": false + }, + "minecraft:bee_nest": { + "runtime_id": -218, + "component_based": false + }, + "minecraft:bee_spawn_egg": { + "runtime_id": 522, + "component_based": false + }, + "minecraft:beef": { + "runtime_id": 295, + "component_based": false + }, + "minecraft:beehive": { + "runtime_id": -219, + "component_based": false + }, + "minecraft:beetroot": { + "runtime_id": 307, + "component_based": false + }, + "minecraft:beetroot_seeds": { + "runtime_id": 317, + "component_based": false + }, + "minecraft:beetroot_soup": { + "runtime_id": 308, + "component_based": false + }, + "minecraft:bell": { + "runtime_id": -206, + "component_based": false + }, + "minecraft:big_dripleaf": { + "runtime_id": -323, + "component_based": false + }, + "minecraft:birch_boat": { + "runtime_id": 402, + "component_based": false + }, + "minecraft:birch_button": { + "runtime_id": -141, + "component_based": false + }, + "minecraft:birch_chest_boat": { + "runtime_id": 677, + "component_based": false + }, + "minecraft:birch_door": { + "runtime_id": 587, + "component_based": false + }, + "minecraft:birch_double_slab": { + "runtime_id": -810, + "component_based": false + }, + "minecraft:birch_fence": { + "runtime_id": -576, + "component_based": false + }, + "minecraft:birch_fence_gate": { + "runtime_id": 184, + "component_based": false + }, + "minecraft:birch_hanging_sign": { + "runtime_id": -502, + "component_based": false + }, + "minecraft:birch_leaves": { + "runtime_id": -801, + "component_based": false + }, + "minecraft:birch_log": { + "runtime_id": -570, + "component_based": false + }, + "minecraft:birch_planks": { + "runtime_id": -740, + "component_based": false + }, + "minecraft:birch_pressure_plate": { + "runtime_id": -151, + "component_based": false + }, + "minecraft:birch_sapling": { + "runtime_id": -826, + "component_based": false + }, + "minecraft:birch_sign": { + "runtime_id": 610, + "component_based": false + }, + "minecraft:birch_slab": { + "runtime_id": -805, + "component_based": false + }, + "minecraft:birch_stairs": { + "runtime_id": 135, + "component_based": false + }, + "minecraft:birch_standing_sign": { + "runtime_id": -186, + "component_based": false + }, + "minecraft:birch_trapdoor": { + "runtime_id": -146, + "component_based": false + }, + "minecraft:birch_wall_sign": { + "runtime_id": -187, + "component_based": false + }, + "minecraft:birch_wood": { + "runtime_id": -815, + "component_based": false + }, + "minecraft:black_bundle": { + "runtime_id": 257, + "component_based": true + }, + "minecraft:black_candle": { + "runtime_id": -428, + "component_based": false + }, + "minecraft:black_candle_cake": { + "runtime_id": -445, + "component_based": false + }, + "minecraft:black_carpet": { + "runtime_id": -611, + "component_based": false + }, + "minecraft:black_concrete": { + "runtime_id": -642, + "component_based": false + }, + "minecraft:black_concrete_powder": { + "runtime_id": -723, + "component_based": false + }, + "minecraft:black_dye": { + "runtime_id": 421, + "component_based": false + }, + "minecraft:black_glazed_terracotta": { + "runtime_id": 235, + "component_based": false + }, + "minecraft:black_shulker_box": { + "runtime_id": -627, + "component_based": false + }, + "minecraft:black_stained_glass": { + "runtime_id": -687, + "component_based": false + }, + "minecraft:black_stained_glass_pane": { + "runtime_id": -657, + "component_based": false + }, + "minecraft:black_terracotta": { + "runtime_id": -738, + "component_based": false + }, + "minecraft:black_wool": { + "runtime_id": -554, + "component_based": false + }, + "minecraft:blackstone": { + "runtime_id": -273, + "component_based": false + }, + "minecraft:blackstone_double_slab": { + "runtime_id": -283, + "component_based": false + }, + "minecraft:blackstone_slab": { + "runtime_id": -282, + "component_based": false + }, + "minecraft:blackstone_stairs": { + "runtime_id": -276, + "component_based": false + }, + "minecraft:blackstone_wall": { + "runtime_id": -277, + "component_based": false + }, + "minecraft:blade_pottery_sherd": { + "runtime_id": 697, + "component_based": false + }, + "minecraft:blast_furnace": { + "runtime_id": -196, + "component_based": false + }, + "minecraft:blaze_powder": { + "runtime_id": 456, + "component_based": false + }, + "minecraft:blaze_rod": { + "runtime_id": 449, + "component_based": false + }, + "minecraft:blaze_spawn_egg": { + "runtime_id": 483, + "component_based": false + }, + "minecraft:bleach": { + "runtime_id": 634, + "component_based": false + }, + "minecraft:blue_bundle": { + "runtime_id": 258, + "component_based": true + }, + "minecraft:blue_candle": { + "runtime_id": -424, + "component_based": false + }, + "minecraft:blue_candle_cake": { + "runtime_id": -441, + "component_based": false + }, + "minecraft:blue_carpet": { + "runtime_id": -607, + "component_based": false + }, + "minecraft:blue_concrete": { + "runtime_id": -638, + "component_based": false + }, + "minecraft:blue_concrete_powder": { + "runtime_id": -719, + "component_based": false + }, + "minecraft:blue_dye": { + "runtime_id": 425, + "component_based": false + }, + "minecraft:blue_glazed_terracotta": { + "runtime_id": 231, + "component_based": false + }, + "minecraft:blue_ice": { + "runtime_id": -11, + "component_based": false + }, + "minecraft:blue_orchid": { + "runtime_id": -830, + "component_based": false + }, + "minecraft:blue_shulker_box": { + "runtime_id": -623, + "component_based": false + }, + "minecraft:blue_stained_glass": { + "runtime_id": -683, + "component_based": false + }, + "minecraft:blue_stained_glass_pane": { + "runtime_id": -653, + "component_based": false + }, + "minecraft:blue_terracotta": { + "runtime_id": -734, + "component_based": false + }, + "minecraft:blue_wool": { + "runtime_id": -563, + "component_based": false + }, + "minecraft:board": { + "runtime_id": 630, + "component_based": false + }, + "minecraft:boat": { + "runtime_id": 792, + "component_based": false + }, + "minecraft:bogged_spawn_egg": { + "runtime_id": 490, + "component_based": false + }, + "minecraft:bolt_armor_trim_smithing_template": { + "runtime_id": 736, + "component_based": false + }, + "minecraft:bone": { + "runtime_id": 441, + "component_based": false + }, + "minecraft:bone_block": { + "runtime_id": 216, + "component_based": false + }, + "minecraft:bone_meal": { + "runtime_id": 437, + "component_based": false + }, + "minecraft:book": { + "runtime_id": 413, + "component_based": false + }, + "minecraft:bookshelf": { + "runtime_id": 47, + "component_based": false + }, + "minecraft:border_block": { + "runtime_id": 212, + "component_based": false + }, + "minecraft:bordure_indented_banner_pattern": { + "runtime_id": 619, + "component_based": false + }, + "minecraft:bow": { + "runtime_id": 324, + "component_based": false + }, + "minecraft:bowl": { + "runtime_id": 346, + "component_based": false + }, + "minecraft:brain_coral": { + "runtime_id": -581, + "component_based": false + }, + "minecraft:brain_coral_block": { + "runtime_id": -849, + "component_based": false + }, + "minecraft:brain_coral_fan": { + "runtime_id": -840, + "component_based": false + }, + "minecraft:brain_coral_wall_fan": { + "runtime_id": -904, + "component_based": false + }, + "minecraft:bread": { + "runtime_id": 283, + "component_based": false + }, + "minecraft:breeze_rod": { + "runtime_id": 274, + "component_based": true + }, + "minecraft:breeze_spawn_egg": { + "runtime_id": 529, + "component_based": false + }, + "minecraft:brewer_pottery_sherd": { + "runtime_id": 698, + "component_based": false + }, + "minecraft:brewing_stand": { + "runtime_id": 458, + "component_based": true + }, + "minecraft:brick": { + "runtime_id": 409, + "component_based": false + }, + "minecraft:brick_block": { + "runtime_id": 45, + "component_based": false + }, + "minecraft:brick_double_slab": { + "runtime_id": -880, + "component_based": false + }, + "minecraft:brick_slab": { + "runtime_id": -874, + "component_based": false + }, + "minecraft:brick_stairs": { + "runtime_id": 108, + "component_based": false + }, + "minecraft:brick_wall": { + "runtime_id": -976, + "component_based": false + }, + "minecraft:brown_bundle": { + "runtime_id": 259, + "component_based": true + }, + "minecraft:brown_candle": { + "runtime_id": -425, + "component_based": false + }, + "minecraft:brown_candle_cake": { + "runtime_id": -442, + "component_based": false + }, + "minecraft:brown_carpet": { + "runtime_id": -608, + "component_based": false + }, + "minecraft:brown_concrete": { + "runtime_id": -639, + "component_based": false + }, + "minecraft:brown_concrete_powder": { + "runtime_id": -720, + "component_based": false + }, + "minecraft:brown_dye": { + "runtime_id": 424, + "component_based": false + }, + "minecraft:brown_glazed_terracotta": { + "runtime_id": 232, + "component_based": false + }, + "minecraft:brown_mushroom": { + "runtime_id": 39, + "component_based": false + }, + "minecraft:brown_mushroom_block": { + "runtime_id": 99, + "component_based": false + }, + "minecraft:brown_shulker_box": { + "runtime_id": -624, + "component_based": false + }, + "minecraft:brown_stained_glass": { + "runtime_id": -684, + "component_based": false + }, + "minecraft:brown_stained_glass_pane": { + "runtime_id": -654, + "component_based": false + }, + "minecraft:brown_terracotta": { + "runtime_id": -735, + "component_based": false + }, + "minecraft:brown_wool": { + "runtime_id": -555, + "component_based": false + }, + "minecraft:brush": { + "runtime_id": 717, + "component_based": false + }, + "minecraft:bubble_column": { + "runtime_id": -160, + "component_based": false + }, + "minecraft:bubble_coral": { + "runtime_id": -582, + "component_based": false + }, + "minecraft:bubble_coral_block": { + "runtime_id": -850, + "component_based": false + }, + "minecraft:bubble_coral_fan": { + "runtime_id": -841, + "component_based": false + }, + "minecraft:bubble_coral_wall_fan": { + "runtime_id": -136, + "component_based": false + }, + "minecraft:bucket": { + "runtime_id": 385, + "component_based": false + }, + "minecraft:budding_amethyst": { + "runtime_id": -328, + "component_based": false + }, + "minecraft:bundle": { + "runtime_id": 262, + "component_based": true + }, + "minecraft:burn_pottery_sherd": { + "runtime_id": 699, + "component_based": false + }, + "minecraft:cactus": { + "runtime_id": 81, + "component_based": false + }, + "minecraft:cake": { + "runtime_id": 443, + "component_based": true + }, + "minecraft:calcite": { + "runtime_id": -326, + "component_based": false + }, + "minecraft:calibrated_sculk_sensor": { + "runtime_id": -580, + "component_based": false + }, + "minecraft:camel_spawn_egg": { + "runtime_id": 693, + "component_based": false + }, + "minecraft:camera": { + "runtime_id": 631, + "component_based": false + }, + "minecraft:campfire": { + "runtime_id": 624, + "component_based": true + }, + "minecraft:candle": { + "runtime_id": -412, + "component_based": false + }, + "minecraft:candle_cake": { + "runtime_id": -429, + "component_based": false + }, + "minecraft:carpet": { + "runtime_id": 751, + "component_based": false + }, + "minecraft:carrot": { + "runtime_id": 301, + "component_based": false + }, + "minecraft:carrot_on_a_stick": { + "runtime_id": 550, + "component_based": false + }, + "minecraft:carrots": { + "runtime_id": 141, + "component_based": false + }, + "minecraft:cartography_table": { + "runtime_id": -200, + "component_based": false + }, + "minecraft:carved_pumpkin": { + "runtime_id": -155, + "component_based": false + }, + "minecraft:cat_spawn_egg": { + "runtime_id": 516, + "component_based": false + }, + "minecraft:cauldron": { + "runtime_id": 459, + "component_based": true + }, + "minecraft:cave_spider_spawn_egg": { + "runtime_id": 484, + "component_based": false + }, + "minecraft:cave_vines": { + "runtime_id": -322, + "component_based": false + }, + "minecraft:cave_vines_body_with_berries": { + "runtime_id": -375, + "component_based": false + }, + "minecraft:cave_vines_head_with_berries": { + "runtime_id": -376, + "component_based": false + }, + "minecraft:chain": { + "runtime_id": 657, + "component_based": true + }, + "minecraft:chain_command_block": { + "runtime_id": 189, + "component_based": false + }, + "minecraft:chainmail_boots": { + "runtime_id": 367, + "component_based": false + }, + "minecraft:chainmail_chestplate": { + "runtime_id": 365, + "component_based": false + }, + "minecraft:chainmail_helmet": { + "runtime_id": 364, + "component_based": false + }, + "minecraft:chainmail_leggings": { + "runtime_id": 366, + "component_based": false + }, + "minecraft:chalkboard": { + "runtime_id": 230, + "component_based": false + }, + "minecraft:charcoal": { + "runtime_id": 327, + "component_based": true + }, + "minecraft:chemical_heat": { + "runtime_id": 192, + "component_based": false + }, + "minecraft:chemistry_table": { + "runtime_id": 786, + "component_based": false + }, + "minecraft:cherry_boat": { + "runtime_id": 687, + "component_based": false + }, + "minecraft:cherry_button": { + "runtime_id": -530, + "component_based": false + }, + "minecraft:cherry_chest_boat": { + "runtime_id": 688, + "component_based": false + }, + "minecraft:cherry_door": { + "runtime_id": -531, + "component_based": false + }, + "minecraft:cherry_double_slab": { + "runtime_id": -540, + "component_based": false + }, + "minecraft:cherry_fence": { + "runtime_id": -532, + "component_based": false + }, + "minecraft:cherry_fence_gate": { + "runtime_id": -533, + "component_based": false + }, + "minecraft:cherry_hanging_sign": { + "runtime_id": -534, + "component_based": false + }, + "minecraft:cherry_leaves": { + "runtime_id": -548, + "component_based": false + }, + "minecraft:cherry_log": { + "runtime_id": -536, + "component_based": false + }, + "minecraft:cherry_planks": { + "runtime_id": -537, + "component_based": false + }, + "minecraft:cherry_pressure_plate": { + "runtime_id": -538, + "component_based": false + }, + "minecraft:cherry_sapling": { + "runtime_id": -547, + "component_based": false + }, + "minecraft:cherry_sign": { + "runtime_id": 689, + "component_based": false + }, + "minecraft:cherry_slab": { + "runtime_id": -539, + "component_based": false + }, + "minecraft:cherry_stairs": { + "runtime_id": -541, + "component_based": false + }, + "minecraft:cherry_standing_sign": { + "runtime_id": -542, + "component_based": false + }, + "minecraft:cherry_trapdoor": { + "runtime_id": -543, + "component_based": false + }, + "minecraft:cherry_wall_sign": { + "runtime_id": -544, + "component_based": false + }, + "minecraft:cherry_wood": { + "runtime_id": -546, + "component_based": false + }, + "minecraft:chest": { + "runtime_id": 54, + "component_based": false + }, + "minecraft:chest_boat": { + "runtime_id": 683, + "component_based": false + }, + "minecraft:chest_minecart": { + "runtime_id": 415, + "component_based": false + }, + "minecraft:chicken": { + "runtime_id": 297, + "component_based": false + }, + "minecraft:chicken_spawn_egg": { + "runtime_id": 462, + "component_based": false + }, + "minecraft:chipped_anvil": { + "runtime_id": -959, + "component_based": false + }, + "minecraft:chiseled_bookshelf": { + "runtime_id": -526, + "component_based": false + }, + "minecraft:chiseled_copper": { + "runtime_id": -760, + "component_based": false + }, + "minecraft:chiseled_deepslate": { + "runtime_id": -395, + "component_based": false + }, + "minecraft:chiseled_nether_bricks": { + "runtime_id": -302, + "component_based": false + }, + "minecraft:chiseled_polished_blackstone": { + "runtime_id": -279, + "component_based": false + }, + "minecraft:chiseled_quartz_block": { + "runtime_id": -953, + "component_based": false + }, + "minecraft:chiseled_red_sandstone": { + "runtime_id": -956, + "component_based": false + }, + "minecraft:chiseled_resin_bricks": { + "runtime_id": -1020, + "component_based": false + }, + "minecraft:chiseled_sandstone": { + "runtime_id": -944, + "component_based": false + }, + "minecraft:chiseled_stone_bricks": { + "runtime_id": -870, + "component_based": false + }, + "minecraft:chiseled_tuff": { + "runtime_id": -753, + "component_based": false + }, + "minecraft:chiseled_tuff_bricks": { + "runtime_id": -759, + "component_based": false + }, + "minecraft:chorus_flower": { + "runtime_id": 200, + "component_based": false + }, + "minecraft:chorus_fruit": { + "runtime_id": 591, + "component_based": false + }, + "minecraft:chorus_plant": { + "runtime_id": 240, + "component_based": false + }, + "minecraft:clay": { + "runtime_id": 82, + "component_based": false + }, + "minecraft:clay_ball": { + "runtime_id": 410, + "component_based": false + }, + "minecraft:client_request_placeholder_block": { + "runtime_id": -465, + "component_based": false + }, + "minecraft:clock": { + "runtime_id": 419, + "component_based": false + }, + "minecraft:closed_eyeblossom": { + "runtime_id": -1019, + "component_based": false + }, + "minecraft:coal": { + "runtime_id": 326, + "component_based": true + }, + "minecraft:coal_block": { + "runtime_id": 173, + "component_based": false + }, + "minecraft:coal_ore": { + "runtime_id": 16, + "component_based": false + }, + "minecraft:coarse_dirt": { + "runtime_id": -962, + "component_based": false + }, + "minecraft:coast_armor_trim_smithing_template": { + "runtime_id": 721, + "component_based": false + }, + "minecraft:cobbled_deepslate": { + "runtime_id": -379, + "component_based": false + }, + "minecraft:cobbled_deepslate_double_slab": { + "runtime_id": -396, + "component_based": false + }, + "minecraft:cobbled_deepslate_slab": { + "runtime_id": -380, + "component_based": false + }, + "minecraft:cobbled_deepslate_stairs": { + "runtime_id": -381, + "component_based": false + }, + "minecraft:cobbled_deepslate_wall": { + "runtime_id": -382, + "component_based": false + }, + "minecraft:cobblestone": { + "runtime_id": 4, + "component_based": false + }, + "minecraft:cobblestone_double_slab": { + "runtime_id": -879, + "component_based": false + }, + "minecraft:cobblestone_slab": { + "runtime_id": -873, + "component_based": false + }, + "minecraft:cobblestone_wall": { + "runtime_id": 139, + "component_based": false + }, + "minecraft:cocoa": { + "runtime_id": 127, + "component_based": false + }, + "minecraft:cocoa_beans": { + "runtime_id": 438, + "component_based": false + }, + "minecraft:cod": { + "runtime_id": 286, + "component_based": false + }, + "minecraft:cod_bucket": { + "runtime_id": 389, + "component_based": false + }, + "minecraft:cod_spawn_egg": { + "runtime_id": 508, + "component_based": false + }, + "minecraft:colored_torch_blue": { + "runtime_id": 204, + "component_based": false + }, + "minecraft:colored_torch_bp": { + "runtime_id": 790, + "component_based": false + }, + "minecraft:colored_torch_green": { + "runtime_id": -963, + "component_based": false + }, + "minecraft:colored_torch_purple": { + "runtime_id": -964, + "component_based": false + }, + "minecraft:colored_torch_red": { + "runtime_id": 202, + "component_based": false + }, + "minecraft:colored_torch_rg": { + "runtime_id": 789, + "component_based": false + }, + "minecraft:command_block": { + "runtime_id": 137, + "component_based": false + }, + "minecraft:command_block_minecart": { + "runtime_id": 596, + "component_based": false + }, + "minecraft:comparator": { + "runtime_id": 555, + "component_based": true + }, + "minecraft:compass": { + "runtime_id": 417, + "component_based": false + }, + "minecraft:composter": { + "runtime_id": -213, + "component_based": false + }, + "minecraft:compound": { + "runtime_id": 632, + "component_based": false + }, + "minecraft:compound_creator": { + "runtime_id": 238, + "component_based": false + }, + "minecraft:concrete": { + "runtime_id": 777, + "component_based": false + }, + "minecraft:concrete_powder": { + "runtime_id": 778, + "component_based": false + }, + "minecraft:conduit": { + "runtime_id": -157, + "component_based": false + }, + "minecraft:cooked_beef": { + "runtime_id": 296, + "component_based": false + }, + "minecraft:cooked_chicken": { + "runtime_id": 298, + "component_based": false + }, + "minecraft:cooked_cod": { + "runtime_id": 290, + "component_based": false + }, + "minecraft:cooked_mutton": { + "runtime_id": 584, + "component_based": false + }, + "minecraft:cooked_porkchop": { + "runtime_id": 285, + "component_based": false + }, + "minecraft:cooked_rabbit": { + "runtime_id": 311, + "component_based": false + }, + "minecraft:cooked_salmon": { + "runtime_id": 291, + "component_based": false + }, + "minecraft:cookie": { + "runtime_id": 293, + "component_based": false + }, + "minecraft:copper_block": { + "runtime_id": -340, + "component_based": false + }, + "minecraft:copper_bulb": { + "runtime_id": -776, + "component_based": false + }, + "minecraft:copper_door": { + "runtime_id": -784, + "component_based": false + }, + "minecraft:copper_grate": { + "runtime_id": -768, + "component_based": false + }, + "minecraft:copper_ingot": { + "runtime_id": 538, + "component_based": false + }, + "minecraft:copper_ore": { + "runtime_id": -311, + "component_based": false + }, + "minecraft:copper_trapdoor": { + "runtime_id": -792, + "component_based": false + }, + "minecraft:coral": { + "runtime_id": 773, + "component_based": false + }, + "minecraft:coral_block": { + "runtime_id": 755, + "component_based": false + }, + "minecraft:coral_fan": { + "runtime_id": 764, + "component_based": false + }, + "minecraft:coral_fan_dead": { + "runtime_id": 765, + "component_based": false + }, + "minecraft:cornflower": { + "runtime_id": -838, + "component_based": false + }, + "minecraft:cow_spawn_egg": { + "runtime_id": 463, + "component_based": false + }, + "minecraft:cracked_deepslate_bricks": { + "runtime_id": -410, + "component_based": false + }, + "minecraft:cracked_deepslate_tiles": { + "runtime_id": -409, + "component_based": false + }, + "minecraft:cracked_nether_bricks": { + "runtime_id": -303, + "component_based": false + }, + "minecraft:cracked_polished_blackstone_bricks": { + "runtime_id": -280, + "component_based": false + }, + "minecraft:cracked_stone_bricks": { + "runtime_id": -869, + "component_based": false + }, + "minecraft:crafter": { + "runtime_id": -313, + "component_based": false + }, + "minecraft:crafting_table": { + "runtime_id": 58, + "component_based": false + }, + "minecraft:creaking_heart": { + "runtime_id": -1012, + "component_based": false + }, + "minecraft:creaking_spawn_egg": { + "runtime_id": 748, + "component_based": false + }, + "minecraft:creeper_banner_pattern": { + "runtime_id": 615, + "component_based": false + }, + "minecraft:creeper_head": { + "runtime_id": -968, + "component_based": false + }, + "minecraft:creeper_spawn_egg": { + "runtime_id": 468, + "component_based": false + }, + "minecraft:crimson_button": { + "runtime_id": -260, + "component_based": false + }, + "minecraft:crimson_door": { + "runtime_id": 654, + "component_based": false + }, + "minecraft:crimson_double_slab": { + "runtime_id": -266, + "component_based": false + }, + "minecraft:crimson_fence": { + "runtime_id": -256, + "component_based": false + }, + "minecraft:crimson_fence_gate": { + "runtime_id": -258, + "component_based": false + }, + "minecraft:crimson_fungus": { + "runtime_id": -228, + "component_based": false + }, + "minecraft:crimson_hanging_sign": { + "runtime_id": -506, + "component_based": false + }, + "minecraft:crimson_hyphae": { + "runtime_id": -299, + "component_based": false + }, + "minecraft:crimson_nylium": { + "runtime_id": -232, + "component_based": false + }, + "minecraft:crimson_planks": { + "runtime_id": -242, + "component_based": false + }, + "minecraft:crimson_pressure_plate": { + "runtime_id": -262, + "component_based": false + }, + "minecraft:crimson_roots": { + "runtime_id": -223, + "component_based": false + }, + "minecraft:crimson_sign": { + "runtime_id": 652, + "component_based": false + }, + "minecraft:crimson_slab": { + "runtime_id": -264, + "component_based": false + }, + "minecraft:crimson_stairs": { + "runtime_id": -254, + "component_based": false + }, + "minecraft:crimson_standing_sign": { + "runtime_id": -250, + "component_based": false + }, + "minecraft:crimson_stem": { + "runtime_id": -225, + "component_based": false + }, + "minecraft:crimson_trapdoor": { + "runtime_id": -246, + "component_based": false + }, + "minecraft:crimson_wall_sign": { + "runtime_id": -252, + "component_based": false + }, + "minecraft:crossbow": { + "runtime_id": 608, + "component_based": false + }, + "minecraft:crying_obsidian": { + "runtime_id": -289, + "component_based": false + }, + "minecraft:cut_copper": { + "runtime_id": -347, + "component_based": false + }, + "minecraft:cut_copper_slab": { + "runtime_id": -361, + "component_based": false + }, + "minecraft:cut_copper_stairs": { + "runtime_id": -354, + "component_based": false + }, + "minecraft:cut_red_sandstone": { + "runtime_id": -957, + "component_based": false + }, + "minecraft:cut_red_sandstone_double_slab": { + "runtime_id": -928, + "component_based": false + }, + "minecraft:cut_red_sandstone_slab": { + "runtime_id": -901, + "component_based": false + }, + "minecraft:cut_sandstone": { + "runtime_id": -945, + "component_based": false + }, + "minecraft:cut_sandstone_double_slab": { + "runtime_id": -927, + "component_based": false + }, + "minecraft:cut_sandstone_slab": { + "runtime_id": -900, + "component_based": false + }, + "minecraft:cyan_bundle": { + "runtime_id": 265, + "component_based": true + }, + "minecraft:cyan_candle": { + "runtime_id": -422, + "component_based": false + }, + "minecraft:cyan_candle_cake": { + "runtime_id": -439, + "component_based": false + }, + "minecraft:cyan_carpet": { + "runtime_id": -605, + "component_based": false + }, + "minecraft:cyan_concrete": { + "runtime_id": -636, + "component_based": false + }, + "minecraft:cyan_concrete_powder": { + "runtime_id": -717, + "component_based": false + }, + "minecraft:cyan_dye": { + "runtime_id": 427, + "component_based": false + }, + "minecraft:cyan_glazed_terracotta": { + "runtime_id": 229, + "component_based": false + }, + "minecraft:cyan_shulker_box": { + "runtime_id": -621, + "component_based": false + }, + "minecraft:cyan_stained_glass": { + "runtime_id": -681, + "component_based": false + }, + "minecraft:cyan_stained_glass_pane": { + "runtime_id": -651, + "component_based": false + }, + "minecraft:cyan_terracotta": { + "runtime_id": -732, + "component_based": false + }, + "minecraft:cyan_wool": { + "runtime_id": -561, + "component_based": false + }, + "minecraft:damaged_anvil": { + "runtime_id": -960, + "component_based": false + }, + "minecraft:dandelion": { + "runtime_id": 37, + "component_based": false + }, + "minecraft:danger_pottery_sherd": { + "runtime_id": 700, + "component_based": false + }, + "minecraft:dark_oak_boat": { + "runtime_id": 406, + "component_based": false + }, + "minecraft:dark_oak_button": { + "runtime_id": -142, + "component_based": false + }, + "minecraft:dark_oak_chest_boat": { + "runtime_id": 681, + "component_based": false + }, + "minecraft:dark_oak_door": { + "runtime_id": 590, + "component_based": false + }, + "minecraft:dark_oak_double_slab": { + "runtime_id": -813, + "component_based": false + }, + "minecraft:dark_oak_fence": { + "runtime_id": -577, + "component_based": false + }, + "minecraft:dark_oak_fence_gate": { + "runtime_id": 186, + "component_based": false + }, + "minecraft:dark_oak_hanging_sign": { + "runtime_id": -505, + "component_based": false + }, + "minecraft:dark_oak_leaves": { + "runtime_id": -803, + "component_based": false + }, + "minecraft:dark_oak_log": { + "runtime_id": -572, + "component_based": false + }, + "minecraft:dark_oak_planks": { + "runtime_id": -743, + "component_based": false + }, + "minecraft:dark_oak_pressure_plate": { + "runtime_id": -152, + "component_based": false + }, + "minecraft:dark_oak_sapling": { + "runtime_id": -829, + "component_based": false + }, + "minecraft:dark_oak_sign": { + "runtime_id": 613, + "component_based": false + }, + "minecraft:dark_oak_slab": { + "runtime_id": -808, + "component_based": false + }, + "minecraft:dark_oak_stairs": { + "runtime_id": 164, + "component_based": false + }, + "minecraft:dark_oak_trapdoor": { + "runtime_id": -147, + "component_based": false + }, + "minecraft:dark_oak_wood": { + "runtime_id": -818, + "component_based": false + }, + "minecraft:dark_prismarine": { + "runtime_id": -947, + "component_based": false + }, + "minecraft:dark_prismarine_double_slab": { + "runtime_id": -913, + "component_based": false + }, + "minecraft:dark_prismarine_slab": { + "runtime_id": -886, + "component_based": false + }, + "minecraft:dark_prismarine_stairs": { + "runtime_id": -3, + "component_based": false + }, + "minecraft:darkoak_standing_sign": { + "runtime_id": -192, + "component_based": false + }, + "minecraft:darkoak_wall_sign": { + "runtime_id": -193, + "component_based": false + }, + "minecraft:daylight_detector": { + "runtime_id": 151, + "component_based": false + }, + "minecraft:daylight_detector_inverted": { + "runtime_id": 178, + "component_based": false + }, + "minecraft:dead_brain_coral": { + "runtime_id": -586, + "component_based": false + }, + "minecraft:dead_brain_coral_block": { + "runtime_id": -854, + "component_based": false + }, + "minecraft:dead_brain_coral_fan": { + "runtime_id": -844, + "component_based": false + }, + "minecraft:dead_brain_coral_wall_fan": { + "runtime_id": -906, + "component_based": false + }, + "minecraft:dead_bubble_coral": { + "runtime_id": -587, + "component_based": false + }, + "minecraft:dead_bubble_coral_block": { + "runtime_id": -855, + "component_based": false + }, + "minecraft:dead_bubble_coral_fan": { + "runtime_id": -845, + "component_based": false + }, + "minecraft:dead_bubble_coral_wall_fan": { + "runtime_id": -908, + "component_based": false + }, + "minecraft:dead_fire_coral": { + "runtime_id": -588, + "component_based": false + }, + "minecraft:dead_fire_coral_block": { + "runtime_id": -856, + "component_based": false + }, + "minecraft:dead_fire_coral_fan": { + "runtime_id": -846, + "component_based": false + }, + "minecraft:dead_fire_coral_wall_fan": { + "runtime_id": -909, + "component_based": false + }, + "minecraft:dead_horn_coral": { + "runtime_id": -589, + "component_based": false + }, + "minecraft:dead_horn_coral_block": { + "runtime_id": -857, + "component_based": false + }, + "minecraft:dead_horn_coral_fan": { + "runtime_id": -847, + "component_based": false + }, + "minecraft:dead_horn_coral_wall_fan": { + "runtime_id": -910, + "component_based": false + }, + "minecraft:dead_tube_coral": { + "runtime_id": -585, + "component_based": false + }, + "minecraft:dead_tube_coral_block": { + "runtime_id": -853, + "component_based": false + }, + "minecraft:dead_tube_coral_fan": { + "runtime_id": -134, + "component_based": false + }, + "minecraft:dead_tube_coral_wall_fan": { + "runtime_id": -905, + "component_based": false + }, + "minecraft:deadbush": { + "runtime_id": 32, + "component_based": false + }, + "minecraft:debug_stick": { + "runtime_id": 626, + "component_based": false + }, + "minecraft:decorated_pot": { + "runtime_id": -551, + "component_based": false + }, + "minecraft:deepslate": { + "runtime_id": -378, + "component_based": false + }, + "minecraft:deepslate_brick_double_slab": { + "runtime_id": -399, + "component_based": false + }, + "minecraft:deepslate_brick_slab": { + "runtime_id": -392, + "component_based": false + }, + "minecraft:deepslate_brick_stairs": { + "runtime_id": -393, + "component_based": false + }, + "minecraft:deepslate_brick_wall": { + "runtime_id": -394, + "component_based": false + }, + "minecraft:deepslate_bricks": { + "runtime_id": -391, + "component_based": false + }, + "minecraft:deepslate_coal_ore": { + "runtime_id": -406, + "component_based": false + }, + "minecraft:deepslate_copper_ore": { + "runtime_id": -408, + "component_based": false + }, + "minecraft:deepslate_diamond_ore": { + "runtime_id": -405, + "component_based": false + }, + "minecraft:deepslate_emerald_ore": { + "runtime_id": -407, + "component_based": false + }, + "minecraft:deepslate_gold_ore": { + "runtime_id": -402, + "component_based": false + }, + "minecraft:deepslate_iron_ore": { + "runtime_id": -401, + "component_based": false + }, + "minecraft:deepslate_lapis_ore": { + "runtime_id": -400, + "component_based": false + }, + "minecraft:deepslate_redstone_ore": { + "runtime_id": -403, + "component_based": false + }, + "minecraft:deepslate_tile_double_slab": { + "runtime_id": -398, + "component_based": false + }, + "minecraft:deepslate_tile_slab": { + "runtime_id": -388, + "component_based": false + }, + "minecraft:deepslate_tile_stairs": { + "runtime_id": -389, + "component_based": false + }, + "minecraft:deepslate_tile_wall": { + "runtime_id": -390, + "component_based": false + }, + "minecraft:deepslate_tiles": { + "runtime_id": -387, + "component_based": false + }, + "minecraft:deny": { + "runtime_id": 211, + "component_based": false + }, + "minecraft:deprecated_anvil": { + "runtime_id": -961, + "component_based": false + }, + "minecraft:deprecated_purpur_block_1": { + "runtime_id": -950, + "component_based": false + }, + "minecraft:deprecated_purpur_block_2": { + "runtime_id": -952, + "component_based": false + }, + "minecraft:detector_rail": { + "runtime_id": 28, + "component_based": false + }, + "minecraft:diamond": { + "runtime_id": 328, + "component_based": false + }, + "minecraft:diamond_axe": { + "runtime_id": 343, + "component_based": false + }, + "minecraft:diamond_block": { + "runtime_id": 57, + "component_based": false + }, + "minecraft:diamond_boots": { + "runtime_id": 375, + "component_based": false + }, + "minecraft:diamond_chestplate": { + "runtime_id": 373, + "component_based": false + }, + "minecraft:diamond_helmet": { + "runtime_id": 372, + "component_based": false + }, + "minecraft:diamond_hoe": { + "runtime_id": 357, + "component_based": false + }, + "minecraft:diamond_horse_armor": { + "runtime_id": 566, + "component_based": false + }, + "minecraft:diamond_leggings": { + "runtime_id": 374, + "component_based": false + }, + "minecraft:diamond_ore": { + "runtime_id": 56, + "component_based": false + }, + "minecraft:diamond_pickaxe": { + "runtime_id": 342, + "component_based": false + }, + "minecraft:diamond_shovel": { + "runtime_id": 341, + "component_based": false + }, + "minecraft:diamond_sword": { + "runtime_id": 340, + "component_based": false + }, + "minecraft:diorite": { + "runtime_id": -592, + "component_based": false + }, + "minecraft:diorite_double_slab": { + "runtime_id": -921, + "component_based": false + }, + "minecraft:diorite_slab": { + "runtime_id": -894, + "component_based": false + }, + "minecraft:diorite_stairs": { + "runtime_id": -170, + "component_based": false + }, + "minecraft:diorite_wall": { + "runtime_id": -973, + "component_based": false + }, + "minecraft:dirt": { + "runtime_id": 3, + "component_based": false + }, + "minecraft:dirt_with_roots": { + "runtime_id": -318, + "component_based": false + }, + "minecraft:disc_fragment_5": { + "runtime_id": 675, + "component_based": false + }, + "minecraft:dispenser": { + "runtime_id": 23, + "component_based": false + }, + "minecraft:dolphin_spawn_egg": { + "runtime_id": 512, + "component_based": false + }, + "minecraft:donkey_spawn_egg": { + "runtime_id": 493, + "component_based": false + }, + "minecraft:double_cut_copper_slab": { + "runtime_id": -368, + "component_based": false + }, + "minecraft:double_plant": { + "runtime_id": 771, + "component_based": false + }, + "minecraft:double_stone_block_slab": { + "runtime_id": 760, + "component_based": false + }, + "minecraft:double_stone_block_slab2": { + "runtime_id": 761, + "component_based": false + }, + "minecraft:double_stone_block_slab3": { + "runtime_id": 762, + "component_based": false + }, + "minecraft:double_stone_block_slab4": { + "runtime_id": 763, + "component_based": false + }, + "minecraft:dragon_breath": { + "runtime_id": 593, + "component_based": false + }, + "minecraft:dragon_egg": { + "runtime_id": 122, + "component_based": false + }, + "minecraft:dragon_head": { + "runtime_id": -969, + "component_based": false + }, + "minecraft:dried_kelp": { + "runtime_id": 292, + "component_based": false + }, + "minecraft:dried_kelp_block": { + "runtime_id": -139, + "component_based": false + }, + "minecraft:dripstone_block": { + "runtime_id": -317, + "component_based": false + }, + "minecraft:dropper": { + "runtime_id": 125, + "component_based": false + }, + "minecraft:drowned_spawn_egg": { + "runtime_id": 511, + "component_based": false + }, + "minecraft:dune_armor_trim_smithing_template": { + "runtime_id": 720, + "component_based": false + }, + "minecraft:dye": { + "runtime_id": 793, + "component_based": false + }, + "minecraft:echo_shard": { + "runtime_id": 685, + "component_based": false + }, + "minecraft:egg": { + "runtime_id": 416, + "component_based": false + }, + "minecraft:elder_guardian_spawn_egg": { + "runtime_id": 499, + "component_based": false + }, + "minecraft:element_0": { + "runtime_id": 36, + "component_based": false + }, + "minecraft:element_1": { + "runtime_id": -12, + "component_based": false + }, + "minecraft:element_10": { + "runtime_id": -21, + "component_based": false + }, + "minecraft:element_100": { + "runtime_id": -111, + "component_based": false + }, + "minecraft:element_101": { + "runtime_id": -112, + "component_based": false + }, + "minecraft:element_102": { + "runtime_id": -113, + "component_based": false + }, + "minecraft:element_103": { + "runtime_id": -114, + "component_based": false + }, + "minecraft:element_104": { + "runtime_id": -115, + "component_based": false + }, + "minecraft:element_105": { + "runtime_id": -116, + "component_based": false + }, + "minecraft:element_106": { + "runtime_id": -117, + "component_based": false + }, + "minecraft:element_107": { + "runtime_id": -118, + "component_based": false + }, + "minecraft:element_108": { + "runtime_id": -119, + "component_based": false + }, + "minecraft:element_109": { + "runtime_id": -120, + "component_based": false + }, + "minecraft:element_11": { + "runtime_id": -22, + "component_based": false + }, + "minecraft:element_110": { + "runtime_id": -121, + "component_based": false + }, + "minecraft:element_111": { + "runtime_id": -122, + "component_based": false + }, + "minecraft:element_112": { + "runtime_id": -123, + "component_based": false + }, + "minecraft:element_113": { + "runtime_id": -124, + "component_based": false + }, + "minecraft:element_114": { + "runtime_id": -125, + "component_based": false + }, + "minecraft:element_115": { + "runtime_id": -126, + "component_based": false + }, + "minecraft:element_116": { + "runtime_id": -127, + "component_based": false + }, + "minecraft:element_117": { + "runtime_id": -128, + "component_based": false + }, + "minecraft:element_118": { + "runtime_id": -129, + "component_based": false + }, + "minecraft:element_12": { + "runtime_id": -23, + "component_based": false + }, + "minecraft:element_13": { + "runtime_id": -24, + "component_based": false + }, + "minecraft:element_14": { + "runtime_id": -25, + "component_based": false + }, + "minecraft:element_15": { + "runtime_id": -26, + "component_based": false + }, + "minecraft:element_16": { + "runtime_id": -27, + "component_based": false + }, + "minecraft:element_17": { + "runtime_id": -28, + "component_based": false + }, + "minecraft:element_18": { + "runtime_id": -29, + "component_based": false + }, + "minecraft:element_19": { + "runtime_id": -30, + "component_based": false + }, + "minecraft:element_2": { + "runtime_id": -13, + "component_based": false + }, + "minecraft:element_20": { + "runtime_id": -31, + "component_based": false + }, + "minecraft:element_21": { + "runtime_id": -32, + "component_based": false + }, + "minecraft:element_22": { + "runtime_id": -33, + "component_based": false + }, + "minecraft:element_23": { + "runtime_id": -34, + "component_based": false + }, + "minecraft:element_24": { + "runtime_id": -35, + "component_based": false + }, + "minecraft:element_25": { + "runtime_id": -36, + "component_based": false + }, + "minecraft:element_26": { + "runtime_id": -37, + "component_based": false + }, + "minecraft:element_27": { + "runtime_id": -38, + "component_based": false + }, + "minecraft:element_28": { + "runtime_id": -39, + "component_based": false + }, + "minecraft:element_29": { + "runtime_id": -40, + "component_based": false + }, + "minecraft:element_3": { + "runtime_id": -14, + "component_based": false + }, + "minecraft:element_30": { + "runtime_id": -41, + "component_based": false + }, + "minecraft:element_31": { + "runtime_id": -42, + "component_based": false + }, + "minecraft:element_32": { + "runtime_id": -43, + "component_based": false + }, + "minecraft:element_33": { + "runtime_id": -44, + "component_based": false + }, + "minecraft:element_34": { + "runtime_id": -45, + "component_based": false + }, + "minecraft:element_35": { + "runtime_id": -46, + "component_based": false + }, + "minecraft:element_36": { + "runtime_id": -47, + "component_based": false + }, + "minecraft:element_37": { + "runtime_id": -48, + "component_based": false + }, + "minecraft:element_38": { + "runtime_id": -49, + "component_based": false + }, + "minecraft:element_39": { + "runtime_id": -50, + "component_based": false + }, + "minecraft:element_4": { + "runtime_id": -15, + "component_based": false + }, + "minecraft:element_40": { + "runtime_id": -51, + "component_based": false + }, + "minecraft:element_41": { + "runtime_id": -52, + "component_based": false + }, + "minecraft:element_42": { + "runtime_id": -53, + "component_based": false + }, + "minecraft:element_43": { + "runtime_id": -54, + "component_based": false + }, + "minecraft:element_44": { + "runtime_id": -55, + "component_based": false + }, + "minecraft:element_45": { + "runtime_id": -56, + "component_based": false + }, + "minecraft:element_46": { + "runtime_id": -57, + "component_based": false + }, + "minecraft:element_47": { + "runtime_id": -58, + "component_based": false + }, + "minecraft:element_48": { + "runtime_id": -59, + "component_based": false + }, + "minecraft:element_49": { + "runtime_id": -60, + "component_based": false + }, + "minecraft:element_5": { + "runtime_id": -16, + "component_based": false + }, + "minecraft:element_50": { + "runtime_id": -61, + "component_based": false + }, + "minecraft:element_51": { + "runtime_id": -62, + "component_based": false + }, + "minecraft:element_52": { + "runtime_id": -63, + "component_based": false + }, + "minecraft:element_53": { + "runtime_id": -64, + "component_based": false + }, + "minecraft:element_54": { + "runtime_id": -65, + "component_based": false + }, + "minecraft:element_55": { + "runtime_id": -66, + "component_based": false + }, + "minecraft:element_56": { + "runtime_id": -67, + "component_based": false + }, + "minecraft:element_57": { + "runtime_id": -68, + "component_based": false + }, + "minecraft:element_58": { + "runtime_id": -69, + "component_based": false + }, + "minecraft:element_59": { + "runtime_id": -70, + "component_based": false + }, + "minecraft:element_6": { + "runtime_id": -17, + "component_based": false + }, + "minecraft:element_60": { + "runtime_id": -71, + "component_based": false + }, + "minecraft:element_61": { + "runtime_id": -72, + "component_based": false + }, + "minecraft:element_62": { + "runtime_id": -73, + "component_based": false + }, + "minecraft:element_63": { + "runtime_id": -74, + "component_based": false + }, + "minecraft:element_64": { + "runtime_id": -75, + "component_based": false + }, + "minecraft:element_65": { + "runtime_id": -76, + "component_based": false + }, + "minecraft:element_66": { + "runtime_id": -77, + "component_based": false + }, + "minecraft:element_67": { + "runtime_id": -78, + "component_based": false + }, + "minecraft:element_68": { + "runtime_id": -79, + "component_based": false + }, + "minecraft:element_69": { + "runtime_id": -80, + "component_based": false + }, + "minecraft:element_7": { + "runtime_id": -18, + "component_based": false + }, + "minecraft:element_70": { + "runtime_id": -81, + "component_based": false + }, + "minecraft:element_71": { + "runtime_id": -82, + "component_based": false + }, + "minecraft:element_72": { + "runtime_id": -83, + "component_based": false + }, + "minecraft:element_73": { + "runtime_id": -84, + "component_based": false + }, + "minecraft:element_74": { + "runtime_id": -85, + "component_based": false + }, + "minecraft:element_75": { + "runtime_id": -86, + "component_based": false + }, + "minecraft:element_76": { + "runtime_id": -87, + "component_based": false + }, + "minecraft:element_77": { + "runtime_id": -88, + "component_based": false + }, + "minecraft:element_78": { + "runtime_id": -89, + "component_based": false + }, + "minecraft:element_79": { + "runtime_id": -90, + "component_based": false + }, + "minecraft:element_8": { + "runtime_id": -19, + "component_based": false + }, + "minecraft:element_80": { + "runtime_id": -91, + "component_based": false + }, + "minecraft:element_81": { + "runtime_id": -92, + "component_based": false + }, + "minecraft:element_82": { + "runtime_id": -93, + "component_based": false + }, + "minecraft:element_83": { + "runtime_id": -94, + "component_based": false + }, + "minecraft:element_84": { + "runtime_id": -95, + "component_based": false + }, + "minecraft:element_85": { + "runtime_id": -96, + "component_based": false + }, + "minecraft:element_86": { + "runtime_id": -97, + "component_based": false + }, + "minecraft:element_87": { + "runtime_id": -98, + "component_based": false + }, + "minecraft:element_88": { + "runtime_id": -99, + "component_based": false + }, + "minecraft:element_89": { + "runtime_id": -100, + "component_based": false + }, + "minecraft:element_9": { + "runtime_id": -20, + "component_based": false + }, + "minecraft:element_90": { + "runtime_id": -101, + "component_based": false + }, + "minecraft:element_91": { + "runtime_id": -102, + "component_based": false + }, + "minecraft:element_92": { + "runtime_id": -103, + "component_based": false + }, + "minecraft:element_93": { + "runtime_id": -104, + "component_based": false + }, + "minecraft:element_94": { + "runtime_id": -105, + "component_based": false + }, + "minecraft:element_95": { + "runtime_id": -106, + "component_based": false + }, + "minecraft:element_96": { + "runtime_id": -107, + "component_based": false + }, + "minecraft:element_97": { + "runtime_id": -108, + "component_based": false + }, + "minecraft:element_98": { + "runtime_id": -109, + "component_based": false + }, + "minecraft:element_99": { + "runtime_id": -110, + "component_based": false + }, + "minecraft:element_constructor": { + "runtime_id": -987, + "component_based": false + }, + "minecraft:elytra": { + "runtime_id": 597, + "component_based": false + }, + "minecraft:emerald": { + "runtime_id": 546, + "component_based": false + }, + "minecraft:emerald_block": { + "runtime_id": 133, + "component_based": false + }, + "minecraft:emerald_ore": { + "runtime_id": 129, + "component_based": false + }, + "minecraft:empty_map": { + "runtime_id": 549, + "component_based": false + }, + "minecraft:enchanted_book": { + "runtime_id": 554, + "component_based": false + }, + "minecraft:enchanted_golden_apple": { + "runtime_id": 281, + "component_based": false + }, + "minecraft:enchanting_table": { + "runtime_id": 116, + "component_based": false + }, + "minecraft:end_brick_stairs": { + "runtime_id": -178, + "component_based": false + }, + "minecraft:end_bricks": { + "runtime_id": 206, + "component_based": false + }, + "minecraft:end_crystal": { + "runtime_id": 796, + "component_based": false + }, + "minecraft:end_gateway": { + "runtime_id": 209, + "component_based": false + }, + "minecraft:end_portal": { + "runtime_id": 119, + "component_based": false + }, + "minecraft:end_portal_frame": { + "runtime_id": 120, + "component_based": false + }, + "minecraft:end_rod": { + "runtime_id": 208, + "component_based": false + }, + "minecraft:end_stone": { + "runtime_id": 121, + "component_based": false + }, + "minecraft:end_stone_brick_double_slab": { + "runtime_id": -167, + "component_based": false + }, + "minecraft:end_stone_brick_slab": { + "runtime_id": -162, + "component_based": false + }, + "minecraft:end_stone_brick_wall": { + "runtime_id": -980, + "component_based": false + }, + "minecraft:ender_chest": { + "runtime_id": 130, + "component_based": false + }, + "minecraft:ender_dragon_spawn_egg": { + "runtime_id": 535, + "component_based": false + }, + "minecraft:ender_eye": { + "runtime_id": 460, + "component_based": false + }, + "minecraft:ender_pearl": { + "runtime_id": 448, + "component_based": false + }, + "minecraft:enderman_spawn_egg": { + "runtime_id": 469, + "component_based": false + }, + "minecraft:endermite_spawn_egg": { + "runtime_id": 487, + "component_based": false + }, + "minecraft:evoker_spawn_egg": { + "runtime_id": 503, + "component_based": false + }, + "minecraft:experience_bottle": { + "runtime_id": 542, + "component_based": false + }, + "minecraft:explorer_pottery_sherd": { + "runtime_id": 701, + "component_based": false + }, + "minecraft:exposed_chiseled_copper": { + "runtime_id": -761, + "component_based": false + }, + "minecraft:exposed_copper": { + "runtime_id": -341, + "component_based": false + }, + "minecraft:exposed_copper_bulb": { + "runtime_id": -777, + "component_based": false + }, + "minecraft:exposed_copper_door": { + "runtime_id": -785, + "component_based": false + }, + "minecraft:exposed_copper_grate": { + "runtime_id": -769, + "component_based": false + }, + "minecraft:exposed_copper_trapdoor": { + "runtime_id": -793, + "component_based": false + }, + "minecraft:exposed_cut_copper": { + "runtime_id": -348, + "component_based": false + }, + "minecraft:exposed_cut_copper_slab": { + "runtime_id": -362, + "component_based": false + }, + "minecraft:exposed_cut_copper_stairs": { + "runtime_id": -355, + "component_based": false + }, + "minecraft:exposed_double_cut_copper_slab": { + "runtime_id": -369, + "component_based": false + }, + "minecraft:eye_armor_trim_smithing_template": { + "runtime_id": 724, + "component_based": false + }, + "minecraft:farmland": { + "runtime_id": 60, + "component_based": false + }, + "minecraft:feather": { + "runtime_id": 352, + "component_based": false + }, + "minecraft:fence": { + "runtime_id": 753, + "component_based": false + }, + "minecraft:fence_gate": { + "runtime_id": 107, + "component_based": false + }, + "minecraft:fermented_spider_eye": { + "runtime_id": 455, + "component_based": false + }, + "minecraft:fern": { + "runtime_id": -848, + "component_based": false + }, + "minecraft:field_masoned_banner_pattern": { + "runtime_id": 618, + "component_based": false + }, + "minecraft:filled_map": { + "runtime_id": 446, + "component_based": false + }, + "minecraft:fire": { + "runtime_id": 51, + "component_based": false + }, + "minecraft:fire_charge": { + "runtime_id": 543, + "component_based": false + }, + "minecraft:fire_coral": { + "runtime_id": -583, + "component_based": false + }, + "minecraft:fire_coral_block": { + "runtime_id": -851, + "component_based": false + }, + "minecraft:fire_coral_fan": { + "runtime_id": -842, + "component_based": false + }, + "minecraft:fire_coral_wall_fan": { + "runtime_id": -907, + "component_based": false + }, + "minecraft:firework_rocket": { + "runtime_id": 552, + "component_based": false + }, + "minecraft:firework_star": { + "runtime_id": 553, + "component_based": false + }, + "minecraft:fishing_rod": { + "runtime_id": 418, + "component_based": true + }, + "minecraft:fletching_table": { + "runtime_id": -201, + "component_based": false + }, + "minecraft:flint": { + "runtime_id": 381, + "component_based": false + }, + "minecraft:flint_and_steel": { + "runtime_id": 323, + "component_based": false + }, + "minecraft:flow_armor_trim_smithing_template": { + "runtime_id": 735, + "component_based": false + }, + "minecraft:flow_banner_pattern": { + "runtime_id": 622, + "component_based": false + }, + "minecraft:flow_pottery_sherd": { + "runtime_id": 702, + "component_based": false + }, + "minecraft:flower_banner_pattern": { + "runtime_id": 614, + "component_based": false + }, + "minecraft:flower_pot": { + "runtime_id": 548, + "component_based": true + }, + "minecraft:flowering_azalea": { + "runtime_id": -338, + "component_based": false + }, + "minecraft:flowing_lava": { + "runtime_id": 10, + "component_based": false + }, + "minecraft:flowing_water": { + "runtime_id": 8, + "component_based": false + }, + "minecraft:fox_spawn_egg": { + "runtime_id": 518, + "component_based": false + }, + "minecraft:frame": { + "runtime_id": 547, + "component_based": true + }, + "minecraft:friend_pottery_sherd": { + "runtime_id": 703, + "component_based": false + }, + "minecraft:frog_spawn": { + "runtime_id": -468, + "component_based": false + }, + "minecraft:frog_spawn_egg": { + "runtime_id": 666, + "component_based": false + }, + "minecraft:frosted_ice": { + "runtime_id": 207, + "component_based": false + }, + "minecraft:furnace": { + "runtime_id": 61, + "component_based": false + }, + "minecraft:ghast_spawn_egg": { + "runtime_id": 481, + "component_based": false + }, + "minecraft:ghast_tear": { + "runtime_id": 451, + "component_based": false + }, + "minecraft:gilded_blackstone": { + "runtime_id": -281, + "component_based": false + }, + "minecraft:glass": { + "runtime_id": 20, + "component_based": false + }, + "minecraft:glass_bottle": { + "runtime_id": 454, + "component_based": false + }, + "minecraft:glass_pane": { + "runtime_id": 102, + "component_based": false + }, + "minecraft:glistering_melon_slice": { + "runtime_id": 461, + "component_based": false + }, + "minecraft:globe_banner_pattern": { + "runtime_id": 621, + "component_based": false + }, + "minecraft:glow_berries": { + "runtime_id": 797, + "component_based": false + }, + "minecraft:glow_frame": { + "runtime_id": 661, + "component_based": true + }, + "minecraft:glow_ink_sac": { + "runtime_id": 537, + "component_based": false + }, + "minecraft:glow_lichen": { + "runtime_id": -411, + "component_based": false + }, + "minecraft:glow_squid_spawn_egg": { + "runtime_id": 532, + "component_based": false + }, + "minecraft:glow_stick": { + "runtime_id": 639, + "component_based": false + }, + "minecraft:glowingobsidian": { + "runtime_id": 246, + "component_based": false + }, + "minecraft:glowstone": { + "runtime_id": 89, + "component_based": false + }, + "minecraft:glowstone_dust": { + "runtime_id": 420, + "component_based": false + }, + "minecraft:goat_horn": { + "runtime_id": 665, + "component_based": false + }, + "minecraft:goat_spawn_egg": { + "runtime_id": 531, + "component_based": false + }, + "minecraft:gold_block": { + "runtime_id": 41, + "component_based": false + }, + "minecraft:gold_ingot": { + "runtime_id": 330, + "component_based": false + }, + "minecraft:gold_nugget": { + "runtime_id": 452, + "component_based": false + }, + "minecraft:gold_ore": { + "runtime_id": 14, + "component_based": false + }, + "minecraft:golden_apple": { + "runtime_id": 280, + "component_based": false + }, + "minecraft:golden_axe": { + "runtime_id": 350, + "component_based": false + }, + "minecraft:golden_boots": { + "runtime_id": 379, + "component_based": false + }, + "minecraft:golden_carrot": { + "runtime_id": 305, + "component_based": false + }, + "minecraft:golden_chestplate": { + "runtime_id": 377, + "component_based": false + }, + "minecraft:golden_helmet": { + "runtime_id": 376, + "component_based": false + }, + "minecraft:golden_hoe": { + "runtime_id": 358, + "component_based": false + }, + "minecraft:golden_horse_armor": { + "runtime_id": 565, + "component_based": false + }, + "minecraft:golden_leggings": { + "runtime_id": 378, + "component_based": false + }, + "minecraft:golden_pickaxe": { + "runtime_id": 349, + "component_based": false + }, + "minecraft:golden_rail": { + "runtime_id": 27, + "component_based": false + }, + "minecraft:golden_shovel": { + "runtime_id": 348, + "component_based": false + }, + "minecraft:golden_sword": { + "runtime_id": 347, + "component_based": false + }, + "minecraft:granite": { + "runtime_id": -590, + "component_based": false + }, + "minecraft:granite_double_slab": { + "runtime_id": -923, + "component_based": false + }, + "minecraft:granite_slab": { + "runtime_id": -896, + "component_based": false + }, + "minecraft:granite_stairs": { + "runtime_id": -169, + "component_based": false + }, + "minecraft:granite_wall": { + "runtime_id": -972, + "component_based": false + }, + "minecraft:grass_block": { + "runtime_id": 2, + "component_based": false + }, + "minecraft:grass_path": { + "runtime_id": 198, + "component_based": false + }, + "minecraft:gravel": { + "runtime_id": 13, + "component_based": false + }, + "minecraft:gray_bundle": { + "runtime_id": 268, + "component_based": true + }, + "minecraft:gray_candle": { + "runtime_id": -420, + "component_based": false + }, + "minecraft:gray_candle_cake": { + "runtime_id": -437, + "component_based": false + }, + "minecraft:gray_carpet": { + "runtime_id": -603, + "component_based": false + }, + "minecraft:gray_concrete": { + "runtime_id": -634, + "component_based": false + }, + "minecraft:gray_concrete_powder": { + "runtime_id": -715, + "component_based": false + }, + "minecraft:gray_dye": { + "runtime_id": 429, + "component_based": false + }, + "minecraft:gray_glazed_terracotta": { + "runtime_id": 227, + "component_based": false + }, + "minecraft:gray_shulker_box": { + "runtime_id": -619, + "component_based": false + }, + "minecraft:gray_stained_glass": { + "runtime_id": -679, + "component_based": false + }, + "minecraft:gray_stained_glass_pane": { + "runtime_id": -649, + "component_based": false + }, + "minecraft:gray_terracotta": { + "runtime_id": -730, + "component_based": false + }, + "minecraft:gray_wool": { + "runtime_id": -553, + "component_based": false + }, + "minecraft:green_bundle": { + "runtime_id": 269, + "component_based": true + }, + "minecraft:green_candle": { + "runtime_id": -426, + "component_based": false + }, + "minecraft:green_candle_cake": { + "runtime_id": -443, + "component_based": false + }, + "minecraft:green_carpet": { + "runtime_id": -609, + "component_based": false + }, + "minecraft:green_concrete": { + "runtime_id": -640, + "component_based": false + }, + "minecraft:green_concrete_powder": { + "runtime_id": -721, + "component_based": false + }, + "minecraft:green_dye": { + "runtime_id": 423, + "component_based": false + }, + "minecraft:green_glazed_terracotta": { + "runtime_id": 233, + "component_based": false + }, + "minecraft:green_shulker_box": { + "runtime_id": -625, + "component_based": false + }, + "minecraft:green_stained_glass": { + "runtime_id": -685, + "component_based": false + }, + "minecraft:green_stained_glass_pane": { + "runtime_id": -655, + "component_based": false + }, + "minecraft:green_terracotta": { + "runtime_id": -736, + "component_based": false + }, + "minecraft:green_wool": { + "runtime_id": -560, + "component_based": false + }, + "minecraft:grindstone": { + "runtime_id": -195, + "component_based": false + }, + "minecraft:guardian_spawn_egg": { + "runtime_id": 488, + "component_based": false + }, + "minecraft:gunpowder": { + "runtime_id": 353, + "component_based": false + }, + "minecraft:guster_banner_pattern": { + "runtime_id": 623, + "component_based": false + }, + "minecraft:guster_pottery_sherd": { + "runtime_id": 704, + "component_based": false + }, + "minecraft:hanging_roots": { + "runtime_id": -319, + "component_based": false + }, + "minecraft:hard_black_stained_glass": { + "runtime_id": -702, + "component_based": false + }, + "minecraft:hard_black_stained_glass_pane": { + "runtime_id": -672, + "component_based": false + }, + "minecraft:hard_blue_stained_glass": { + "runtime_id": -698, + "component_based": false + }, + "minecraft:hard_blue_stained_glass_pane": { + "runtime_id": -668, + "component_based": false + }, + "minecraft:hard_brown_stained_glass": { + "runtime_id": -699, + "component_based": false + }, + "minecraft:hard_brown_stained_glass_pane": { + "runtime_id": -669, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass": { + "runtime_id": -696, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass_pane": { + "runtime_id": -666, + "component_based": false + }, + "minecraft:hard_glass": { + "runtime_id": 253, + "component_based": false + }, + "minecraft:hard_glass_pane": { + "runtime_id": 190, + "component_based": false + }, + "minecraft:hard_gray_stained_glass": { + "runtime_id": -694, + "component_based": false + }, + "minecraft:hard_gray_stained_glass_pane": { + "runtime_id": -664, + "component_based": false + }, + "minecraft:hard_green_stained_glass": { + "runtime_id": -700, + "component_based": false + }, + "minecraft:hard_green_stained_glass_pane": { + "runtime_id": -670, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass": { + "runtime_id": -690, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass_pane": { + "runtime_id": -660, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass": { + "runtime_id": -695, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass_pane": { + "runtime_id": -665, + "component_based": false + }, + "minecraft:hard_lime_stained_glass": { + "runtime_id": -692, + "component_based": false + }, + "minecraft:hard_lime_stained_glass_pane": { + "runtime_id": -662, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass": { + "runtime_id": -689, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass_pane": { + "runtime_id": -659, + "component_based": false + }, + "minecraft:hard_orange_stained_glass": { + "runtime_id": -688, + "component_based": false + }, + "minecraft:hard_orange_stained_glass_pane": { + "runtime_id": -658, + "component_based": false + }, + "minecraft:hard_pink_stained_glass": { + "runtime_id": -693, + "component_based": false + }, + "minecraft:hard_pink_stained_glass_pane": { + "runtime_id": -663, + "component_based": false + }, + "minecraft:hard_purple_stained_glass": { + "runtime_id": -697, + "component_based": false + }, + "minecraft:hard_purple_stained_glass_pane": { + "runtime_id": -667, + "component_based": false + }, + "minecraft:hard_red_stained_glass": { + "runtime_id": -701, + "component_based": false + }, + "minecraft:hard_red_stained_glass_pane": { + "runtime_id": -671, + "component_based": false + }, + "minecraft:hard_stained_glass": { + "runtime_id": 787, + "component_based": false + }, + "minecraft:hard_stained_glass_pane": { + "runtime_id": 788, + "component_based": false + }, + "minecraft:hard_white_stained_glass": { + "runtime_id": 254, + "component_based": false + }, + "minecraft:hard_white_stained_glass_pane": { + "runtime_id": 191, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass": { + "runtime_id": -691, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass_pane": { + "runtime_id": -661, + "component_based": false + }, + "minecraft:hardened_clay": { + "runtime_id": 172, + "component_based": false + }, + "minecraft:hay_block": { + "runtime_id": 170, + "component_based": false + }, + "minecraft:heart_of_the_sea": { + "runtime_id": 604, + "component_based": false + }, + "minecraft:heart_pottery_sherd": { + "runtime_id": 705, + "component_based": false + }, + "minecraft:heartbreak_pottery_sherd": { + "runtime_id": 706, + "component_based": false + }, + "minecraft:heavy_core": { + "runtime_id": -316, + "component_based": false + }, + "minecraft:heavy_weighted_pressure_plate": { + "runtime_id": 148, + "component_based": false + }, + "minecraft:hoglin_spawn_egg": { + "runtime_id": 524, + "component_based": false + }, + "minecraft:honey_block": { + "runtime_id": -220, + "component_based": false + }, + "minecraft:honey_bottle": { + "runtime_id": 628, + "component_based": false + }, + "minecraft:honeycomb": { + "runtime_id": 627, + "component_based": false + }, + "minecraft:honeycomb_block": { + "runtime_id": -221, + "component_based": false + }, + "minecraft:hopper": { + "runtime_id": 560, + "component_based": true + }, + "minecraft:hopper_minecart": { + "runtime_id": 559, + "component_based": false + }, + "minecraft:horn_coral": { + "runtime_id": -584, + "component_based": false + }, + "minecraft:horn_coral_block": { + "runtime_id": -852, + "component_based": false + }, + "minecraft:horn_coral_fan": { + "runtime_id": -843, + "component_based": false + }, + "minecraft:horn_coral_wall_fan": { + "runtime_id": -137, + "component_based": false + }, + "minecraft:horse_spawn_egg": { + "runtime_id": 485, + "component_based": false + }, + "minecraft:host_armor_trim_smithing_template": { + "runtime_id": 734, + "component_based": false + }, + "minecraft:howl_pottery_sherd": { + "runtime_id": 707, + "component_based": false + }, + "minecraft:husk_spawn_egg": { + "runtime_id": 491, + "component_based": false + }, + "minecraft:ice": { + "runtime_id": 79, + "component_based": false + }, + "minecraft:ice_bomb": { + "runtime_id": 633, + "component_based": false + }, + "minecraft:infested_chiseled_stone_bricks": { + "runtime_id": -862, + "component_based": false + }, + "minecraft:infested_cobblestone": { + "runtime_id": -858, + "component_based": false + }, + "minecraft:infested_cracked_stone_bricks": { + "runtime_id": -861, + "component_based": false + }, + "minecraft:infested_deepslate": { + "runtime_id": -454, + "component_based": false + }, + "minecraft:infested_mossy_stone_bricks": { + "runtime_id": -860, + "component_based": false + }, + "minecraft:infested_stone": { + "runtime_id": 97, + "component_based": false + }, + "minecraft:infested_stone_bricks": { + "runtime_id": -859, + "component_based": false + }, + "minecraft:info_update": { + "runtime_id": 248, + "component_based": false + }, + "minecraft:info_update2": { + "runtime_id": 249, + "component_based": false + }, + "minecraft:ink_sac": { + "runtime_id": 439, + "component_based": false + }, + "minecraft:invisible_bedrock": { + "runtime_id": 95, + "component_based": false + }, + "minecraft:iron_axe": { + "runtime_id": 322, + "component_based": false + }, + "minecraft:iron_bars": { + "runtime_id": 101, + "component_based": false + }, + "minecraft:iron_block": { + "runtime_id": 42, + "component_based": false + }, + "minecraft:iron_boots": { + "runtime_id": 371, + "component_based": false + }, + "minecraft:iron_chestplate": { + "runtime_id": 369, + "component_based": false + }, + "minecraft:iron_door": { + "runtime_id": 397, + "component_based": false + }, + "minecraft:iron_golem_spawn_egg": { + "runtime_id": 533, + "component_based": false + }, + "minecraft:iron_helmet": { + "runtime_id": 368, + "component_based": false + }, + "minecraft:iron_hoe": { + "runtime_id": 356, + "component_based": false + }, + "minecraft:iron_horse_armor": { + "runtime_id": 564, + "component_based": false + }, + "minecraft:iron_ingot": { + "runtime_id": 329, + "component_based": false + }, + "minecraft:iron_leggings": { + "runtime_id": 370, + "component_based": false + }, + "minecraft:iron_nugget": { + "runtime_id": 602, + "component_based": false + }, + "minecraft:iron_ore": { + "runtime_id": 15, + "component_based": false + }, + "minecraft:iron_pickaxe": { + "runtime_id": 321, + "component_based": false + }, + "minecraft:iron_shovel": { + "runtime_id": 320, + "component_based": false + }, + "minecraft:iron_sword": { + "runtime_id": 331, + "component_based": false + }, + "minecraft:iron_trapdoor": { + "runtime_id": 167, + "component_based": false + }, + "minecraft:item.acacia_door": { + "runtime_id": 196, + "component_based": false + }, + "minecraft:item.bed": { + "runtime_id": 26, + "component_based": false + }, + "minecraft:item.beetroot": { + "runtime_id": 244, + "component_based": false + }, + "minecraft:item.birch_door": { + "runtime_id": 194, + "component_based": false + }, + "minecraft:item.brewing_stand": { + "runtime_id": 117, + "component_based": false + }, + "minecraft:item.cake": { + "runtime_id": 92, + "component_based": false + }, + "minecraft:item.camera": { + "runtime_id": 242, + "component_based": false + }, + "minecraft:item.campfire": { + "runtime_id": -209, + "component_based": false + }, + "minecraft:item.cauldron": { + "runtime_id": 118, + "component_based": false + }, + "minecraft:item.chain": { + "runtime_id": -286, + "component_based": false + }, + "minecraft:item.crimson_door": { + "runtime_id": -244, + "component_based": false + }, + "minecraft:item.dark_oak_door": { + "runtime_id": 197, + "component_based": false + }, + "minecraft:item.flower_pot": { + "runtime_id": 140, + "component_based": false + }, + "minecraft:item.frame": { + "runtime_id": 199, + "component_based": false + }, + "minecraft:item.glow_frame": { + "runtime_id": -339, + "component_based": false + }, + "minecraft:item.hopper": { + "runtime_id": 154, + "component_based": false + }, + "minecraft:item.iron_door": { + "runtime_id": 71, + "component_based": false + }, + "minecraft:item.jungle_door": { + "runtime_id": 195, + "component_based": false + }, + "minecraft:item.kelp": { + "runtime_id": -138, + "component_based": false + }, + "minecraft:item.mangrove_door": { + "runtime_id": -493, + "component_based": false + }, + "minecraft:item.nether_sprouts": { + "runtime_id": -238, + "component_based": false + }, + "minecraft:item.nether_wart": { + "runtime_id": 115, + "component_based": false + }, + "minecraft:item.reeds": { + "runtime_id": 83, + "component_based": false + }, + "minecraft:item.soul_campfire": { + "runtime_id": -290, + "component_based": false + }, + "minecraft:item.spruce_door": { + "runtime_id": 193, + "component_based": false + }, + "minecraft:item.warped_door": { + "runtime_id": -245, + "component_based": false + }, + "minecraft:item.wheat": { + "runtime_id": 59, + "component_based": false + }, + "minecraft:item.wooden_door": { + "runtime_id": 64, + "component_based": false + }, + "minecraft:jigsaw": { + "runtime_id": -211, + "component_based": false + }, + "minecraft:jukebox": { + "runtime_id": 84, + "component_based": false + }, + "minecraft:jungle_boat": { + "runtime_id": 403, + "component_based": false + }, + "minecraft:jungle_button": { + "runtime_id": -143, + "component_based": false + }, + "minecraft:jungle_chest_boat": { + "runtime_id": 678, + "component_based": false + }, + "minecraft:jungle_door": { + "runtime_id": 588, + "component_based": false + }, + "minecraft:jungle_double_slab": { + "runtime_id": -811, + "component_based": false + }, + "minecraft:jungle_fence": { + "runtime_id": -578, + "component_based": false + }, + "minecraft:jungle_fence_gate": { + "runtime_id": 185, + "component_based": false + }, + "minecraft:jungle_hanging_sign": { + "runtime_id": -503, + "component_based": false + }, + "minecraft:jungle_leaves": { + "runtime_id": -802, + "component_based": false + }, + "minecraft:jungle_log": { + "runtime_id": -571, + "component_based": false + }, + "minecraft:jungle_planks": { + "runtime_id": -741, + "component_based": false + }, + "minecraft:jungle_pressure_plate": { + "runtime_id": -153, + "component_based": false + }, + "minecraft:jungle_sapling": { + "runtime_id": -827, + "component_based": false + }, + "minecraft:jungle_sign": { + "runtime_id": 611, + "component_based": false + }, + "minecraft:jungle_slab": { + "runtime_id": -806, + "component_based": false + }, + "minecraft:jungle_stairs": { + "runtime_id": 136, + "component_based": false + }, + "minecraft:jungle_standing_sign": { + "runtime_id": -188, + "component_based": false + }, + "minecraft:jungle_trapdoor": { + "runtime_id": -148, + "component_based": false + }, + "minecraft:jungle_wall_sign": { + "runtime_id": -189, + "component_based": false + }, + "minecraft:jungle_wood": { + "runtime_id": -816, + "component_based": false + }, + "minecraft:kelp": { + "runtime_id": 408, + "component_based": true + }, + "minecraft:lab_table": { + "runtime_id": -988, + "component_based": false + }, + "minecraft:ladder": { + "runtime_id": 65, + "component_based": false + }, + "minecraft:lantern": { + "runtime_id": -208, + "component_based": false + }, + "minecraft:lapis_block": { + "runtime_id": 22, + "component_based": false + }, + "minecraft:lapis_lazuli": { + "runtime_id": 440, + "component_based": false + }, + "minecraft:lapis_ore": { + "runtime_id": 21, + "component_based": false + }, + "minecraft:large_amethyst_bud": { + "runtime_id": -330, + "component_based": false + }, + "minecraft:large_fern": { + "runtime_id": -865, + "component_based": false + }, + "minecraft:lava": { + "runtime_id": 11, + "component_based": false + }, + "minecraft:lava_bucket": { + "runtime_id": 388, + "component_based": false + }, + "minecraft:lead": { + "runtime_id": 580, + "component_based": false + }, + "minecraft:leather": { + "runtime_id": 407, + "component_based": false + }, + "minecraft:leather_boots": { + "runtime_id": 363, + "component_based": false + }, + "minecraft:leather_chestplate": { + "runtime_id": 361, + "component_based": false + }, + "minecraft:leather_helmet": { + "runtime_id": 360, + "component_based": false + }, + "minecraft:leather_horse_armor": { + "runtime_id": 563, + "component_based": false + }, + "minecraft:leather_leggings": { + "runtime_id": 362, + "component_based": false + }, + "minecraft:leaves": { + "runtime_id": 767, + "component_based": false + }, + "minecraft:leaves2": { + "runtime_id": 768, + "component_based": false + }, + "minecraft:lectern": { + "runtime_id": -194, + "component_based": false + }, + "minecraft:lever": { + "runtime_id": 69, + "component_based": false + }, + "minecraft:light_block": { + "runtime_id": 791, + "component_based": false + }, + "minecraft:light_block_0": { + "runtime_id": -215, + "component_based": false + }, + "minecraft:light_block_1": { + "runtime_id": -929, + "component_based": false + }, + "minecraft:light_block_10": { + "runtime_id": -938, + "component_based": false + }, + "minecraft:light_block_11": { + "runtime_id": -939, + "component_based": false + }, + "minecraft:light_block_12": { + "runtime_id": -940, + "component_based": false + }, + "minecraft:light_block_13": { + "runtime_id": -941, + "component_based": false + }, + "minecraft:light_block_14": { + "runtime_id": -942, + "component_based": false + }, + "minecraft:light_block_15": { + "runtime_id": -943, + "component_based": false + }, + "minecraft:light_block_2": { + "runtime_id": -930, + "component_based": false + }, + "minecraft:light_block_3": { + "runtime_id": -931, + "component_based": false + }, + "minecraft:light_block_4": { + "runtime_id": -932, + "component_based": false + }, + "minecraft:light_block_5": { + "runtime_id": -933, + "component_based": false + }, + "minecraft:light_block_6": { + "runtime_id": -934, + "component_based": false + }, + "minecraft:light_block_7": { + "runtime_id": -935, + "component_based": false + }, + "minecraft:light_block_8": { + "runtime_id": -936, + "component_based": false + }, + "minecraft:light_block_9": { + "runtime_id": -937, + "component_based": false + }, + "minecraft:light_blue_bundle": { + "runtime_id": 260, + "component_based": true + }, + "minecraft:light_blue_candle": { + "runtime_id": -416, + "component_based": false + }, + "minecraft:light_blue_candle_cake": { + "runtime_id": -433, + "component_based": false + }, + "minecraft:light_blue_carpet": { + "runtime_id": -599, + "component_based": false + }, + "minecraft:light_blue_concrete": { + "runtime_id": -630, + "component_based": false + }, + "minecraft:light_blue_concrete_powder": { + "runtime_id": -711, + "component_based": false + }, + "minecraft:light_blue_dye": { + "runtime_id": 433, + "component_based": false + }, + "minecraft:light_blue_glazed_terracotta": { + "runtime_id": 223, + "component_based": false + }, + "minecraft:light_blue_shulker_box": { + "runtime_id": -615, + "component_based": false + }, + "minecraft:light_blue_stained_glass": { + "runtime_id": -675, + "component_based": false + }, + "minecraft:light_blue_stained_glass_pane": { + "runtime_id": -645, + "component_based": false + }, + "minecraft:light_blue_terracotta": { + "runtime_id": -726, + "component_based": false + }, + "minecraft:light_blue_wool": { + "runtime_id": -562, + "component_based": false + }, + "minecraft:light_gray_bundle": { + "runtime_id": 263, + "component_based": true + }, + "minecraft:light_gray_candle": { + "runtime_id": -421, + "component_based": false + }, + "minecraft:light_gray_candle_cake": { + "runtime_id": -438, + "component_based": false + }, + "minecraft:light_gray_carpet": { + "runtime_id": -604, + "component_based": false + }, + "minecraft:light_gray_concrete": { + "runtime_id": -635, + "component_based": false + }, + "minecraft:light_gray_concrete_powder": { + "runtime_id": -716, + "component_based": false + }, + "minecraft:light_gray_dye": { + "runtime_id": 428, + "component_based": false + }, + "minecraft:light_gray_shulker_box": { + "runtime_id": -620, + "component_based": false + }, + "minecraft:light_gray_stained_glass": { + "runtime_id": -680, + "component_based": false + }, + "minecraft:light_gray_stained_glass_pane": { + "runtime_id": -650, + "component_based": false + }, + "minecraft:light_gray_terracotta": { + "runtime_id": -731, + "component_based": false + }, + "minecraft:light_gray_wool": { + "runtime_id": -552, + "component_based": false + }, + "minecraft:light_weighted_pressure_plate": { + "runtime_id": 147, + "component_based": false + }, + "minecraft:lightning_rod": { + "runtime_id": -312, + "component_based": false + }, + "minecraft:lilac": { + "runtime_id": -863, + "component_based": false + }, + "minecraft:lily_of_the_valley": { + "runtime_id": -839, + "component_based": false + }, + "minecraft:lime_bundle": { + "runtime_id": 270, + "component_based": true + }, + "minecraft:lime_candle": { + "runtime_id": -418, + "component_based": false + }, + "minecraft:lime_candle_cake": { + "runtime_id": -435, + "component_based": false + }, + "minecraft:lime_carpet": { + "runtime_id": -601, + "component_based": false + }, + "minecraft:lime_concrete": { + "runtime_id": -632, + "component_based": false + }, + "minecraft:lime_concrete_powder": { + "runtime_id": -713, + "component_based": false + }, + "minecraft:lime_dye": { + "runtime_id": 431, + "component_based": false + }, + "minecraft:lime_glazed_terracotta": { + "runtime_id": 225, + "component_based": false + }, + "minecraft:lime_shulker_box": { + "runtime_id": -617, + "component_based": false + }, + "minecraft:lime_stained_glass": { + "runtime_id": -677, + "component_based": false + }, + "minecraft:lime_stained_glass_pane": { + "runtime_id": -647, + "component_based": false + }, + "minecraft:lime_terracotta": { + "runtime_id": -728, + "component_based": false + }, + "minecraft:lime_wool": { + "runtime_id": -559, + "component_based": false + }, + "minecraft:lingering_potion": { + "runtime_id": 595, + "component_based": false + }, + "minecraft:lit_blast_furnace": { + "runtime_id": -214, + "component_based": false + }, + "minecraft:lit_deepslate_redstone_ore": { + "runtime_id": -404, + "component_based": false + }, + "minecraft:lit_furnace": { + "runtime_id": 62, + "component_based": false + }, + "minecraft:lit_pumpkin": { + "runtime_id": 91, + "component_based": false + }, + "minecraft:lit_redstone_lamp": { + "runtime_id": 124, + "component_based": false + }, + "minecraft:lit_redstone_ore": { + "runtime_id": 74, + "component_based": false + }, + "minecraft:lit_smoker": { + "runtime_id": -199, + "component_based": false + }, + "minecraft:llama_spawn_egg": { + "runtime_id": 501, + "component_based": false + }, + "minecraft:lodestone": { + "runtime_id": -222, + "component_based": false + }, + "minecraft:lodestone_compass": { + "runtime_id": 640, + "component_based": false + }, + "minecraft:log": { + "runtime_id": 752, + "component_based": false + }, + "minecraft:log2": { + "runtime_id": 775, + "component_based": false + }, + "minecraft:loom": { + "runtime_id": -204, + "component_based": false + }, + "minecraft:mace": { + "runtime_id": 344, + "component_based": false + }, + "minecraft:magenta_bundle": { + "runtime_id": 273, + "component_based": true + }, + "minecraft:magenta_candle": { + "runtime_id": -415, + "component_based": false + }, + "minecraft:magenta_candle_cake": { + "runtime_id": -432, + "component_based": false + }, + "minecraft:magenta_carpet": { + "runtime_id": -598, + "component_based": false + }, + "minecraft:magenta_concrete": { + "runtime_id": -629, + "component_based": false + }, + "minecraft:magenta_concrete_powder": { + "runtime_id": -710, + "component_based": false + }, + "minecraft:magenta_dye": { + "runtime_id": 434, + "component_based": false + }, + "minecraft:magenta_glazed_terracotta": { + "runtime_id": 222, + "component_based": false + }, + "minecraft:magenta_shulker_box": { + "runtime_id": -614, + "component_based": false + }, + "minecraft:magenta_stained_glass": { + "runtime_id": -674, + "component_based": false + }, + "minecraft:magenta_stained_glass_pane": { + "runtime_id": -644, + "component_based": false + }, + "minecraft:magenta_terracotta": { + "runtime_id": -725, + "component_based": false + }, + "minecraft:magenta_wool": { + "runtime_id": -565, + "component_based": false + }, + "minecraft:magma": { + "runtime_id": 213, + "component_based": false + }, + "minecraft:magma_cream": { + "runtime_id": 457, + "component_based": false + }, + "minecraft:magma_cube_spawn_egg": { + "runtime_id": 482, + "component_based": false + }, + "minecraft:mangrove_boat": { + "runtime_id": 673, + "component_based": false + }, + "minecraft:mangrove_button": { + "runtime_id": -487, + "component_based": false + }, + "minecraft:mangrove_chest_boat": { + "runtime_id": 682, + "component_based": false + }, + "minecraft:mangrove_door": { + "runtime_id": 671, + "component_based": false + }, + "minecraft:mangrove_double_slab": { + "runtime_id": -499, + "component_based": false + }, + "minecraft:mangrove_fence": { + "runtime_id": -491, + "component_based": false + }, + "minecraft:mangrove_fence_gate": { + "runtime_id": -492, + "component_based": false + }, + "minecraft:mangrove_hanging_sign": { + "runtime_id": -508, + "component_based": false + }, + "minecraft:mangrove_leaves": { + "runtime_id": -472, + "component_based": false + }, + "minecraft:mangrove_log": { + "runtime_id": -484, + "component_based": false + }, + "minecraft:mangrove_planks": { + "runtime_id": -486, + "component_based": false + }, + "minecraft:mangrove_pressure_plate": { + "runtime_id": -490, + "component_based": false + }, + "minecraft:mangrove_propagule": { + "runtime_id": -474, + "component_based": false + }, + "minecraft:mangrove_roots": { + "runtime_id": -482, + "component_based": false + }, + "minecraft:mangrove_sign": { + "runtime_id": 672, + "component_based": false + }, + "minecraft:mangrove_slab": { + "runtime_id": -489, + "component_based": false + }, + "minecraft:mangrove_stairs": { + "runtime_id": -488, + "component_based": false + }, + "minecraft:mangrove_standing_sign": { + "runtime_id": -494, + "component_based": false + }, + "minecraft:mangrove_trapdoor": { + "runtime_id": -496, + "component_based": false + }, + "minecraft:mangrove_wall_sign": { + "runtime_id": -495, + "component_based": false + }, + "minecraft:mangrove_wood": { + "runtime_id": -497, + "component_based": false + }, + "minecraft:material_reducer": { + "runtime_id": -986, + "component_based": false + }, + "minecraft:medicine": { + "runtime_id": 637, + "component_based": false + }, + "minecraft:medium_amethyst_bud": { + "runtime_id": -331, + "component_based": false + }, + "minecraft:melon_block": { + "runtime_id": 103, + "component_based": false + }, + "minecraft:melon_seeds": { + "runtime_id": 315, + "component_based": false + }, + "minecraft:melon_slice": { + "runtime_id": 294, + "component_based": false + }, + "minecraft:melon_stem": { + "runtime_id": 105, + "component_based": false + }, + "minecraft:milk_bucket": { + "runtime_id": 386, + "component_based": false + }, + "minecraft:minecart": { + "runtime_id": 395, + "component_based": false + }, + "minecraft:miner_pottery_sherd": { + "runtime_id": 708, + "component_based": false + }, + "minecraft:mob_spawner": { + "runtime_id": 52, + "component_based": false + }, + "minecraft:mojang_banner_pattern": { + "runtime_id": 617, + "component_based": false + }, + "minecraft:monster_egg": { + "runtime_id": 776, + "component_based": false + }, + "minecraft:mooshroom_spawn_egg": { + "runtime_id": 467, + "component_based": false + }, + "minecraft:moss_block": { + "runtime_id": -320, + "component_based": false + }, + "minecraft:moss_carpet": { + "runtime_id": -335, + "component_based": false + }, + "minecraft:mossy_cobblestone": { + "runtime_id": 48, + "component_based": false + }, + "minecraft:mossy_cobblestone_double_slab": { + "runtime_id": -915, + "component_based": false + }, + "minecraft:mossy_cobblestone_slab": { + "runtime_id": -888, + "component_based": false + }, + "minecraft:mossy_cobblestone_stairs": { + "runtime_id": -179, + "component_based": false + }, + "minecraft:mossy_cobblestone_wall": { + "runtime_id": -971, + "component_based": false + }, + "minecraft:mossy_stone_brick_double_slab": { + "runtime_id": -168, + "component_based": false + }, + "minecraft:mossy_stone_brick_slab": { + "runtime_id": -166, + "component_based": false + }, + "minecraft:mossy_stone_brick_stairs": { + "runtime_id": -175, + "component_based": false + }, + "minecraft:mossy_stone_brick_wall": { + "runtime_id": -978, + "component_based": false + }, + "minecraft:mossy_stone_bricks": { + "runtime_id": -868, + "component_based": false + }, + "minecraft:mourner_pottery_sherd": { + "runtime_id": 709, + "component_based": false + }, + "minecraft:moving_block": { + "runtime_id": 250, + "component_based": false + }, + "minecraft:mud": { + "runtime_id": -473, + "component_based": false + }, + "minecraft:mud_brick_double_slab": { + "runtime_id": -479, + "component_based": false + }, + "minecraft:mud_brick_slab": { + "runtime_id": -478, + "component_based": false + }, + "minecraft:mud_brick_stairs": { + "runtime_id": -480, + "component_based": false + }, + "minecraft:mud_brick_wall": { + "runtime_id": -481, + "component_based": false + }, + "minecraft:mud_bricks": { + "runtime_id": -475, + "component_based": false + }, + "minecraft:muddy_mangrove_roots": { + "runtime_id": -483, + "component_based": false + }, + "minecraft:mule_spawn_egg": { + "runtime_id": 494, + "component_based": false + }, + "minecraft:mushroom_stem": { + "runtime_id": -1008, + "component_based": false + }, + "minecraft:mushroom_stew": { + "runtime_id": 282, + "component_based": false + }, + "minecraft:music_disc_11": { + "runtime_id": 577, + "component_based": true + }, + "minecraft:music_disc_13": { + "runtime_id": 567, + "component_based": true + }, + "minecraft:music_disc_5": { + "runtime_id": 674, + "component_based": true + }, + "minecraft:music_disc_blocks": { + "runtime_id": 569, + "component_based": true + }, + "minecraft:music_disc_cat": { + "runtime_id": 568, + "component_based": true + }, + "minecraft:music_disc_chirp": { + "runtime_id": 570, + "component_based": true + }, + "minecraft:music_disc_creator": { + "runtime_id": 783, + "component_based": true + }, + "minecraft:music_disc_creator_music_box": { + "runtime_id": 784, + "component_based": true + }, + "minecraft:music_disc_far": { + "runtime_id": 571, + "component_based": true + }, + "minecraft:music_disc_mall": { + "runtime_id": 572, + "component_based": true + }, + "minecraft:music_disc_mellohi": { + "runtime_id": 573, + "component_based": true + }, + "minecraft:music_disc_otherside": { + "runtime_id": 664, + "component_based": true + }, + "minecraft:music_disc_pigstep": { + "runtime_id": 658, + "component_based": true + }, + "minecraft:music_disc_precipice": { + "runtime_id": 785, + "component_based": true + }, + "minecraft:music_disc_relic": { + "runtime_id": 737, + "component_based": true + }, + "minecraft:music_disc_stal": { + "runtime_id": 574, + "component_based": true + }, + "minecraft:music_disc_strad": { + "runtime_id": 575, + "component_based": true + }, + "minecraft:music_disc_wait": { + "runtime_id": 578, + "component_based": true + }, + "minecraft:music_disc_ward": { + "runtime_id": 576, + "component_based": true + }, + "minecraft:mutton": { + "runtime_id": 583, + "component_based": false + }, + "minecraft:mycelium": { + "runtime_id": 110, + "component_based": false + }, + "minecraft:name_tag": { + "runtime_id": 581, + "component_based": false + }, + "minecraft:nautilus_shell": { + "runtime_id": 603, + "component_based": false + }, + "minecraft:nether_brick": { + "runtime_id": 112, + "component_based": false + }, + "minecraft:nether_brick_double_slab": { + "runtime_id": -883, + "component_based": false + }, + "minecraft:nether_brick_fence": { + "runtime_id": 113, + "component_based": false + }, + "minecraft:nether_brick_slab": { + "runtime_id": -877, + "component_based": false + }, + "minecraft:nether_brick_stairs": { + "runtime_id": 114, + "component_based": false + }, + "minecraft:nether_brick_wall": { + "runtime_id": -979, + "component_based": false + }, + "minecraft:nether_gold_ore": { + "runtime_id": -288, + "component_based": false + }, + "minecraft:nether_sprouts": { + "runtime_id": 659, + "component_based": true + }, + "minecraft:nether_star": { + "runtime_id": 551, + "component_based": false + }, + "minecraft:nether_wart": { + "runtime_id": 316, + "component_based": false + }, + "minecraft:nether_wart_block": { + "runtime_id": 214, + "component_based": false + }, + "minecraft:netherbrick": { + "runtime_id": 556, + "component_based": false + }, + "minecraft:netherite_axe": { + "runtime_id": 644, + "component_based": false + }, + "minecraft:netherite_block": { + "runtime_id": -270, + "component_based": false + }, + "minecraft:netherite_boots": { + "runtime_id": 650, + "component_based": false + }, + "minecraft:netherite_chestplate": { + "runtime_id": 648, + "component_based": false + }, + "minecraft:netherite_helmet": { + "runtime_id": 647, + "component_based": false + }, + "minecraft:netherite_hoe": { + "runtime_id": 645, + "component_based": false + }, + "minecraft:netherite_ingot": { + "runtime_id": 646, + "component_based": false + }, + "minecraft:netherite_leggings": { + "runtime_id": 649, + "component_based": false + }, + "minecraft:netherite_pickaxe": { + "runtime_id": 643, + "component_based": false + }, + "minecraft:netherite_scrap": { + "runtime_id": 651, + "component_based": false + }, + "minecraft:netherite_shovel": { + "runtime_id": 642, + "component_based": false + }, + "minecraft:netherite_sword": { + "runtime_id": 641, + "component_based": false + }, + "minecraft:netherite_upgrade_smithing_template": { + "runtime_id": 718, + "component_based": false + }, + "minecraft:netherrack": { + "runtime_id": 87, + "component_based": false + }, + "minecraft:netherreactor": { + "runtime_id": 247, + "component_based": false + }, + "minecraft:normal_stone_double_slab": { + "runtime_id": -926, + "component_based": false + }, + "minecraft:normal_stone_slab": { + "runtime_id": -899, + "component_based": false + }, + "minecraft:normal_stone_stairs": { + "runtime_id": -180, + "component_based": false + }, + "minecraft:noteblock": { + "runtime_id": 25, + "component_based": false + }, + "minecraft:npc_spawn_egg": { + "runtime_id": 498, + "component_based": false + }, + "minecraft:oak_boat": { + "runtime_id": 401, + "component_based": false + }, + "minecraft:oak_chest_boat": { + "runtime_id": 676, + "component_based": false + }, + "minecraft:oak_double_slab": { + "runtime_id": 157, + "component_based": false + }, + "minecraft:oak_fence": { + "runtime_id": 85, + "component_based": false + }, + "minecraft:oak_hanging_sign": { + "runtime_id": -500, + "component_based": false + }, + "minecraft:oak_leaves": { + "runtime_id": 18, + "component_based": false + }, + "minecraft:oak_log": { + "runtime_id": 17, + "component_based": false + }, + "minecraft:oak_planks": { + "runtime_id": 5, + "component_based": false + }, + "minecraft:oak_sapling": { + "runtime_id": 6, + "component_based": false + }, + "minecraft:oak_sign": { + "runtime_id": 383, + "component_based": false + }, + "minecraft:oak_slab": { + "runtime_id": 158, + "component_based": false + }, + "minecraft:oak_stairs": { + "runtime_id": 53, + "component_based": false + }, + "minecraft:oak_wood": { + "runtime_id": -212, + "component_based": false + }, + "minecraft:observer": { + "runtime_id": 251, + "component_based": false + }, + "minecraft:obsidian": { + "runtime_id": 49, + "component_based": false + }, + "minecraft:ocelot_spawn_egg": { + "runtime_id": 478, + "component_based": false + }, + "minecraft:ochre_froglight": { + "runtime_id": -471, + "component_based": false + }, + "minecraft:ominous_bottle": { + "runtime_id": 629, + "component_based": false + }, + "minecraft:ominous_trial_key": { + "runtime_id": 275, + "component_based": true + }, + "minecraft:open_eyeblossom": { + "runtime_id": -1018, + "component_based": false + }, + "minecraft:orange_bundle": { + "runtime_id": 271, + "component_based": true + }, + "minecraft:orange_candle": { + "runtime_id": -414, + "component_based": false + }, + "minecraft:orange_candle_cake": { + "runtime_id": -431, + "component_based": false + }, + "minecraft:orange_carpet": { + "runtime_id": -597, + "component_based": false + }, + "minecraft:orange_concrete": { + "runtime_id": -628, + "component_based": false + }, + "minecraft:orange_concrete_powder": { + "runtime_id": -709, + "component_based": false + }, + "minecraft:orange_dye": { + "runtime_id": 435, + "component_based": false + }, + "minecraft:orange_glazed_terracotta": { + "runtime_id": 221, + "component_based": false + }, + "minecraft:orange_shulker_box": { + "runtime_id": -613, + "component_based": false + }, + "minecraft:orange_stained_glass": { + "runtime_id": -673, + "component_based": false + }, + "minecraft:orange_stained_glass_pane": { + "runtime_id": -643, + "component_based": false + }, + "minecraft:orange_terracotta": { + "runtime_id": -724, + "component_based": false + }, + "minecraft:orange_tulip": { + "runtime_id": -834, + "component_based": false + }, + "minecraft:orange_wool": { + "runtime_id": -557, + "component_based": false + }, + "minecraft:oxeye_daisy": { + "runtime_id": -837, + "component_based": false + }, + "minecraft:oxidized_chiseled_copper": { + "runtime_id": -763, + "component_based": false + }, + "minecraft:oxidized_copper": { + "runtime_id": -343, + "component_based": false + }, + "minecraft:oxidized_copper_bulb": { + "runtime_id": -779, + "component_based": false + }, + "minecraft:oxidized_copper_door": { + "runtime_id": -787, + "component_based": false + }, + "minecraft:oxidized_copper_grate": { + "runtime_id": -771, + "component_based": false + }, + "minecraft:oxidized_copper_trapdoor": { + "runtime_id": -795, + "component_based": false + }, + "minecraft:oxidized_cut_copper": { + "runtime_id": -350, + "component_based": false + }, + "minecraft:oxidized_cut_copper_slab": { + "runtime_id": -364, + "component_based": false + }, + "minecraft:oxidized_cut_copper_stairs": { + "runtime_id": -357, + "component_based": false + }, + "minecraft:oxidized_double_cut_copper_slab": { + "runtime_id": -371, + "component_based": false + }, + "minecraft:packed_ice": { + "runtime_id": 174, + "component_based": false + }, + "minecraft:packed_mud": { + "runtime_id": -477, + "component_based": false + }, + "minecraft:painting": { + "runtime_id": 382, + "component_based": false + }, + "minecraft:pale_hanging_moss": { + "runtime_id": -1011, + "component_based": false + }, + "minecraft:pale_moss_block": { + "runtime_id": -1009, + "component_based": false + }, + "minecraft:pale_moss_carpet": { + "runtime_id": -1010, + "component_based": false + }, + "minecraft:pale_oak_boat": { + "runtime_id": 745, + "component_based": false + }, + "minecraft:pale_oak_button": { + "runtime_id": -989, + "component_based": false + }, + "minecraft:pale_oak_chest_boat": { + "runtime_id": 746, + "component_based": false + }, + "minecraft:pale_oak_door": { + "runtime_id": -990, + "component_based": false + }, + "minecraft:pale_oak_double_slab": { + "runtime_id": -999, + "component_based": false + }, + "minecraft:pale_oak_fence": { + "runtime_id": -991, + "component_based": false + }, + "minecraft:pale_oak_fence_gate": { + "runtime_id": -992, + "component_based": false + }, + "minecraft:pale_oak_hanging_sign": { + "runtime_id": -993, + "component_based": false + }, + "minecraft:pale_oak_leaves": { + "runtime_id": -1007, + "component_based": false + }, + "minecraft:pale_oak_log": { + "runtime_id": -995, + "component_based": false + }, + "minecraft:pale_oak_planks": { + "runtime_id": -996, + "component_based": false + }, + "minecraft:pale_oak_pressure_plate": { + "runtime_id": -997, + "component_based": false + }, + "minecraft:pale_oak_sapling": { + "runtime_id": -1006, + "component_based": false + }, + "minecraft:pale_oak_sign": { + "runtime_id": 747, + "component_based": false + }, + "minecraft:pale_oak_slab": { + "runtime_id": -998, + "component_based": false + }, + "minecraft:pale_oak_stairs": { + "runtime_id": -1000, + "component_based": false + }, + "minecraft:pale_oak_standing_sign": { + "runtime_id": -1001, + "component_based": false + }, + "minecraft:pale_oak_trapdoor": { + "runtime_id": -1002, + "component_based": false + }, + "minecraft:pale_oak_wall_sign": { + "runtime_id": -1003, + "component_based": false + }, + "minecraft:pale_oak_wood": { + "runtime_id": -1005, + "component_based": false + }, + "minecraft:panda_spawn_egg": { + "runtime_id": 517, + "component_based": false + }, + "minecraft:paper": { + "runtime_id": 412, + "component_based": false + }, + "minecraft:parrot_spawn_egg": { + "runtime_id": 506, + "component_based": false + }, + "minecraft:pearlescent_froglight": { + "runtime_id": -469, + "component_based": false + }, + "minecraft:peony": { + "runtime_id": -867, + "component_based": false + }, + "minecraft:petrified_oak_double_slab": { + "runtime_id": -903, + "component_based": false + }, + "minecraft:petrified_oak_slab": { + "runtime_id": -902, + "component_based": false + }, + "minecraft:phantom_membrane": { + "runtime_id": 607, + "component_based": false + }, + "minecraft:phantom_spawn_egg": { + "runtime_id": 514, + "component_based": false + }, + "minecraft:pig_spawn_egg": { + "runtime_id": 464, + "component_based": false + }, + "minecraft:piglin_banner_pattern": { + "runtime_id": 620, + "component_based": false + }, + "minecraft:piglin_brute_spawn_egg": { + "runtime_id": 527, + "component_based": false + }, + "minecraft:piglin_head": { + "runtime_id": -970, + "component_based": false + }, + "minecraft:piglin_spawn_egg": { + "runtime_id": 525, + "component_based": false + }, + "minecraft:pillager_spawn_egg": { + "runtime_id": 519, + "component_based": false + }, + "minecraft:pink_bundle": { + "runtime_id": 264, + "component_based": true + }, + "minecraft:pink_candle": { + "runtime_id": -419, + "component_based": false + }, + "minecraft:pink_candle_cake": { + "runtime_id": -436, + "component_based": false + }, + "minecraft:pink_carpet": { + "runtime_id": -602, + "component_based": false + }, + "minecraft:pink_concrete": { + "runtime_id": -633, + "component_based": false + }, + "minecraft:pink_concrete_powder": { + "runtime_id": -714, + "component_based": false + }, + "minecraft:pink_dye": { + "runtime_id": 430, + "component_based": false + }, + "minecraft:pink_glazed_terracotta": { + "runtime_id": 226, + "component_based": false + }, + "minecraft:pink_petals": { + "runtime_id": -549, + "component_based": false + }, + "minecraft:pink_shulker_box": { + "runtime_id": -618, + "component_based": false + }, + "minecraft:pink_stained_glass": { + "runtime_id": -678, + "component_based": false + }, + "minecraft:pink_stained_glass_pane": { + "runtime_id": -648, + "component_based": false + }, + "minecraft:pink_terracotta": { + "runtime_id": -729, + "component_based": false + }, + "minecraft:pink_tulip": { + "runtime_id": -836, + "component_based": false + }, + "minecraft:pink_wool": { + "runtime_id": -566, + "component_based": false + }, + "minecraft:piston": { + "runtime_id": 33, + "component_based": false + }, + "minecraft:piston_arm_collision": { + "runtime_id": 34, + "component_based": false + }, + "minecraft:pitcher_crop": { + "runtime_id": -574, + "component_based": false + }, + "minecraft:pitcher_plant": { + "runtime_id": -612, + "component_based": false + }, + "minecraft:pitcher_pod": { + "runtime_id": 319, + "component_based": false + }, + "minecraft:planks": { + "runtime_id": 772, + "component_based": false + }, + "minecraft:player_head": { + "runtime_id": -967, + "component_based": false + }, + "minecraft:plenty_pottery_sherd": { + "runtime_id": 710, + "component_based": false + }, + "minecraft:podzol": { + "runtime_id": 243, + "component_based": false + }, + "minecraft:pointed_dripstone": { + "runtime_id": -308, + "component_based": false + }, + "minecraft:poisonous_potato": { + "runtime_id": 304, + "component_based": false + }, + "minecraft:polar_bear_spawn_egg": { + "runtime_id": 500, + "component_based": false + }, + "minecraft:polished_andesite": { + "runtime_id": -595, + "component_based": false + }, + "minecraft:polished_andesite_double_slab": { + "runtime_id": -919, + "component_based": false + }, + "minecraft:polished_andesite_slab": { + "runtime_id": -892, + "component_based": false + }, + "minecraft:polished_andesite_stairs": { + "runtime_id": -174, + "component_based": false + }, + "minecraft:polished_basalt": { + "runtime_id": -235, + "component_based": false + }, + "minecraft:polished_blackstone": { + "runtime_id": -291, + "component_based": false + }, + "minecraft:polished_blackstone_brick_double_slab": { + "runtime_id": -285, + "component_based": false + }, + "minecraft:polished_blackstone_brick_slab": { + "runtime_id": -284, + "component_based": false + }, + "minecraft:polished_blackstone_brick_stairs": { + "runtime_id": -275, + "component_based": false + }, + "minecraft:polished_blackstone_brick_wall": { + "runtime_id": -278, + "component_based": false + }, + "minecraft:polished_blackstone_bricks": { + "runtime_id": -274, + "component_based": false + }, + "minecraft:polished_blackstone_button": { + "runtime_id": -296, + "component_based": false + }, + "minecraft:polished_blackstone_double_slab": { + "runtime_id": -294, + "component_based": false + }, + "minecraft:polished_blackstone_pressure_plate": { + "runtime_id": -295, + "component_based": false + }, + "minecraft:polished_blackstone_slab": { + "runtime_id": -293, + "component_based": false + }, + "minecraft:polished_blackstone_stairs": { + "runtime_id": -292, + "component_based": false + }, + "minecraft:polished_blackstone_wall": { + "runtime_id": -297, + "component_based": false + }, + "minecraft:polished_deepslate": { + "runtime_id": -383, + "component_based": false + }, + "minecraft:polished_deepslate_double_slab": { + "runtime_id": -397, + "component_based": false + }, + "minecraft:polished_deepslate_slab": { + "runtime_id": -384, + "component_based": false + }, + "minecraft:polished_deepslate_stairs": { + "runtime_id": -385, + "component_based": false + }, + "minecraft:polished_deepslate_wall": { + "runtime_id": -386, + "component_based": false + }, + "minecraft:polished_diorite": { + "runtime_id": -593, + "component_based": false + }, + "minecraft:polished_diorite_double_slab": { + "runtime_id": -922, + "component_based": false + }, + "minecraft:polished_diorite_slab": { + "runtime_id": -895, + "component_based": false + }, + "minecraft:polished_diorite_stairs": { + "runtime_id": -173, + "component_based": false + }, + "minecraft:polished_granite": { + "runtime_id": -591, + "component_based": false + }, + "minecraft:polished_granite_double_slab": { + "runtime_id": -924, + "component_based": false + }, + "minecraft:polished_granite_slab": { + "runtime_id": -897, + "component_based": false + }, + "minecraft:polished_granite_stairs": { + "runtime_id": -172, + "component_based": false + }, + "minecraft:polished_tuff": { + "runtime_id": -748, + "component_based": false + }, + "minecraft:polished_tuff_double_slab": { + "runtime_id": -750, + "component_based": false + }, + "minecraft:polished_tuff_slab": { + "runtime_id": -749, + "component_based": false + }, + "minecraft:polished_tuff_stairs": { + "runtime_id": -751, + "component_based": false + }, + "minecraft:polished_tuff_wall": { + "runtime_id": -752, + "component_based": false + }, + "minecraft:popped_chorus_fruit": { + "runtime_id": 592, + "component_based": false + }, + "minecraft:poppy": { + "runtime_id": 38, + "component_based": false + }, + "minecraft:porkchop": { + "runtime_id": 284, + "component_based": false + }, + "minecraft:portal": { + "runtime_id": 90, + "component_based": false + }, + "minecraft:potato": { + "runtime_id": 302, + "component_based": false + }, + "minecraft:potatoes": { + "runtime_id": 142, + "component_based": false + }, + "minecraft:potion": { + "runtime_id": 453, + "component_based": false + }, + "minecraft:powder_snow": { + "runtime_id": -306, + "component_based": false + }, + "minecraft:powder_snow_bucket": { + "runtime_id": 393, + "component_based": false + }, + "minecraft:powered_comparator": { + "runtime_id": 150, + "component_based": false + }, + "minecraft:powered_repeater": { + "runtime_id": 94, + "component_based": false + }, + "minecraft:prismarine": { + "runtime_id": 168, + "component_based": false + }, + "minecraft:prismarine_brick_double_slab": { + "runtime_id": -914, + "component_based": false + }, + "minecraft:prismarine_brick_slab": { + "runtime_id": -887, + "component_based": false + }, + "minecraft:prismarine_bricks": { + "runtime_id": -948, + "component_based": false + }, + "minecraft:prismarine_bricks_stairs": { + "runtime_id": -4, + "component_based": false + }, + "minecraft:prismarine_crystals": { + "runtime_id": 582, + "component_based": false + }, + "minecraft:prismarine_double_slab": { + "runtime_id": -912, + "component_based": false + }, + "minecraft:prismarine_shard": { + "runtime_id": 598, + "component_based": false + }, + "minecraft:prismarine_slab": { + "runtime_id": -885, + "component_based": false + }, + "minecraft:prismarine_stairs": { + "runtime_id": -2, + "component_based": false + }, + "minecraft:prismarine_wall": { + "runtime_id": -981, + "component_based": false + }, + "minecraft:prize_pottery_sherd": { + "runtime_id": 711, + "component_based": false + }, + "minecraft:pufferfish": { + "runtime_id": 289, + "component_based": false + }, + "minecraft:pufferfish_bucket": { + "runtime_id": 392, + "component_based": false + }, + "minecraft:pufferfish_spawn_egg": { + "runtime_id": 509, + "component_based": false + }, + "minecraft:pumpkin": { + "runtime_id": 86, + "component_based": false + }, + "minecraft:pumpkin_pie": { + "runtime_id": 306, + "component_based": false + }, + "minecraft:pumpkin_seeds": { + "runtime_id": 314, + "component_based": false + }, + "minecraft:pumpkin_stem": { + "runtime_id": 104, + "component_based": false + }, + "minecraft:purple_bundle": { + "runtime_id": 266, + "component_based": true + }, + "minecraft:purple_candle": { + "runtime_id": -423, + "component_based": false + }, + "minecraft:purple_candle_cake": { + "runtime_id": -440, + "component_based": false + }, + "minecraft:purple_carpet": { + "runtime_id": -606, + "component_based": false + }, + "minecraft:purple_concrete": { + "runtime_id": -637, + "component_based": false + }, + "minecraft:purple_concrete_powder": { + "runtime_id": -718, + "component_based": false + }, + "minecraft:purple_dye": { + "runtime_id": 426, + "component_based": false + }, + "minecraft:purple_glazed_terracotta": { + "runtime_id": 219, + "component_based": false + }, + "minecraft:purple_shulker_box": { + "runtime_id": -622, + "component_based": false + }, + "minecraft:purple_stained_glass": { + "runtime_id": -682, + "component_based": false + }, + "minecraft:purple_stained_glass_pane": { + "runtime_id": -652, + "component_based": false + }, + "minecraft:purple_terracotta": { + "runtime_id": -733, + "component_based": false + }, + "minecraft:purple_wool": { + "runtime_id": -564, + "component_based": false + }, + "minecraft:purpur_block": { + "runtime_id": 201, + "component_based": false + }, + "minecraft:purpur_double_slab": { + "runtime_id": -911, + "component_based": false + }, + "minecraft:purpur_pillar": { + "runtime_id": -951, + "component_based": false + }, + "minecraft:purpur_slab": { + "runtime_id": -884, + "component_based": false + }, + "minecraft:purpur_stairs": { + "runtime_id": 203, + "component_based": false + }, + "minecraft:quartz": { + "runtime_id": 557, + "component_based": false + }, + "minecraft:quartz_block": { + "runtime_id": 155, + "component_based": false + }, + "minecraft:quartz_bricks": { + "runtime_id": -304, + "component_based": false + }, + "minecraft:quartz_double_slab": { + "runtime_id": -882, + "component_based": false + }, + "minecraft:quartz_ore": { + "runtime_id": 153, + "component_based": false + }, + "minecraft:quartz_pillar": { + "runtime_id": -954, + "component_based": false + }, + "minecraft:quartz_slab": { + "runtime_id": -876, + "component_based": false + }, + "minecraft:quartz_stairs": { + "runtime_id": 156, + "component_based": false + }, + "minecraft:rabbit": { + "runtime_id": 310, + "component_based": false + }, + "minecraft:rabbit_foot": { + "runtime_id": 561, + "component_based": false + }, + "minecraft:rabbit_hide": { + "runtime_id": 562, + "component_based": false + }, + "minecraft:rabbit_spawn_egg": { + "runtime_id": 486, + "component_based": false + }, + "minecraft:rabbit_stew": { + "runtime_id": 312, + "component_based": false + }, + "minecraft:rail": { + "runtime_id": 66, + "component_based": false + }, + "minecraft:raiser_armor_trim_smithing_template": { + "runtime_id": 732, + "component_based": false + }, + "minecraft:rapid_fertilizer": { + "runtime_id": 635, + "component_based": false + }, + "minecraft:ravager_spawn_egg": { + "runtime_id": 521, + "component_based": false + }, + "minecraft:raw_copper": { + "runtime_id": 541, + "component_based": false + }, + "minecraft:raw_copper_block": { + "runtime_id": -452, + "component_based": false + }, + "minecraft:raw_gold": { + "runtime_id": 540, + "component_based": false + }, + "minecraft:raw_gold_block": { + "runtime_id": -453, + "component_based": false + }, + "minecraft:raw_iron": { + "runtime_id": 539, + "component_based": false + }, + "minecraft:raw_iron_block": { + "runtime_id": -451, + "component_based": false + }, + "minecraft:recovery_compass": { + "runtime_id": 684, + "component_based": false + }, + "minecraft:red_bundle": { + "runtime_id": 272, + "component_based": true + }, + "minecraft:red_candle": { + "runtime_id": -427, + "component_based": false + }, + "minecraft:red_candle_cake": { + "runtime_id": -444, + "component_based": false + }, + "minecraft:red_carpet": { + "runtime_id": -610, + "component_based": false + }, + "minecraft:red_concrete": { + "runtime_id": -641, + "component_based": false + }, + "minecraft:red_concrete_powder": { + "runtime_id": -722, + "component_based": false + }, + "minecraft:red_dye": { + "runtime_id": 422, + "component_based": false + }, + "minecraft:red_flower": { + "runtime_id": 770, + "component_based": false + }, + "minecraft:red_glazed_terracotta": { + "runtime_id": 234, + "component_based": false + }, + "minecraft:red_mushroom": { + "runtime_id": 40, + "component_based": false + }, + "minecraft:red_mushroom_block": { + "runtime_id": 100, + "component_based": false + }, + "minecraft:red_nether_brick": { + "runtime_id": 215, + "component_based": false + }, + "minecraft:red_nether_brick_double_slab": { + "runtime_id": -917, + "component_based": false + }, + "minecraft:red_nether_brick_slab": { + "runtime_id": -890, + "component_based": false + }, + "minecraft:red_nether_brick_stairs": { + "runtime_id": -184, + "component_based": false + }, + "minecraft:red_nether_brick_wall": { + "runtime_id": -983, + "component_based": false + }, + "minecraft:red_sand": { + "runtime_id": -949, + "component_based": false + }, + "minecraft:red_sandstone": { + "runtime_id": 179, + "component_based": false + }, + "minecraft:red_sandstone_double_slab": { + "runtime_id": 181, + "component_based": false + }, + "minecraft:red_sandstone_slab": { + "runtime_id": 182, + "component_based": false + }, + "minecraft:red_sandstone_stairs": { + "runtime_id": 180, + "component_based": false + }, + "minecraft:red_sandstone_wall": { + "runtime_id": -982, + "component_based": false + }, + "minecraft:red_shulker_box": { + "runtime_id": -626, + "component_based": false + }, + "minecraft:red_stained_glass": { + "runtime_id": -686, + "component_based": false + }, + "minecraft:red_stained_glass_pane": { + "runtime_id": -656, + "component_based": false + }, + "minecraft:red_terracotta": { + "runtime_id": -737, + "component_based": false + }, + "minecraft:red_tulip": { + "runtime_id": -833, + "component_based": false + }, + "minecraft:red_wool": { + "runtime_id": -556, + "component_based": false + }, + "minecraft:redstone": { + "runtime_id": 398, + "component_based": false + }, + "minecraft:redstone_block": { + "runtime_id": 152, + "component_based": false + }, + "minecraft:redstone_lamp": { + "runtime_id": 123, + "component_based": false + }, + "minecraft:redstone_ore": { + "runtime_id": 73, + "component_based": false + }, + "minecraft:redstone_torch": { + "runtime_id": 76, + "component_based": false + }, + "minecraft:redstone_wire": { + "runtime_id": 55, + "component_based": false + }, + "minecraft:reinforced_deepslate": { + "runtime_id": -466, + "component_based": false + }, + "minecraft:repeater": { + "runtime_id": 445, + "component_based": true + }, + "minecraft:repeating_command_block": { + "runtime_id": 188, + "component_based": false + }, + "minecraft:reserved6": { + "runtime_id": 255, + "component_based": false + }, + "minecraft:resin_block": { + "runtime_id": -1021, + "component_based": false + }, + "minecraft:resin_brick": { + "runtime_id": 749, + "component_based": false + }, + "minecraft:resin_brick_double_slab": { + "runtime_id": -1015, + "component_based": false + }, + "minecraft:resin_brick_slab": { + "runtime_id": -1014, + "component_based": false + }, + "minecraft:resin_brick_stairs": { + "runtime_id": -1016, + "component_based": false + }, + "minecraft:resin_brick_wall": { + "runtime_id": -1017, + "component_based": false + }, + "minecraft:resin_bricks": { + "runtime_id": -1013, + "component_based": false + }, + "minecraft:resin_clump": { + "runtime_id": -1022, + "component_based": false + }, + "minecraft:respawn_anchor": { + "runtime_id": -272, + "component_based": false + }, + "minecraft:rib_armor_trim_smithing_template": { + "runtime_id": 728, + "component_based": false + }, + "minecraft:rose_bush": { + "runtime_id": -866, + "component_based": false + }, + "minecraft:rotten_flesh": { + "runtime_id": 299, + "component_based": false + }, + "minecraft:saddle": { + "runtime_id": 396, + "component_based": false + }, + "minecraft:salmon": { + "runtime_id": 287, + "component_based": false + }, + "minecraft:salmon_bucket": { + "runtime_id": 390, + "component_based": false + }, + "minecraft:salmon_spawn_egg": { + "runtime_id": 510, + "component_based": false + }, + "minecraft:sand": { + "runtime_id": 12, + "component_based": false + }, + "minecraft:sandstone": { + "runtime_id": 24, + "component_based": false + }, + "minecraft:sandstone_double_slab": { + "runtime_id": -878, + "component_based": false + }, + "minecraft:sandstone_slab": { + "runtime_id": -872, + "component_based": false + }, + "minecraft:sandstone_stairs": { + "runtime_id": 128, + "component_based": false + }, + "minecraft:sandstone_wall": { + "runtime_id": -975, + "component_based": false + }, + "minecraft:sapling": { + "runtime_id": 766, + "component_based": false + }, + "minecraft:scaffolding": { + "runtime_id": -165, + "component_based": false + }, + "minecraft:scrape_pottery_sherd": { + "runtime_id": 712, + "component_based": false + }, + "minecraft:sculk": { + "runtime_id": -458, + "component_based": false + }, + "minecraft:sculk_catalyst": { + "runtime_id": -460, + "component_based": false + }, + "minecraft:sculk_sensor": { + "runtime_id": -307, + "component_based": false + }, + "minecraft:sculk_shrieker": { + "runtime_id": -461, + "component_based": false + }, + "minecraft:sculk_vein": { + "runtime_id": -459, + "component_based": false + }, + "minecraft:sea_lantern": { + "runtime_id": 169, + "component_based": false + }, + "minecraft:sea_pickle": { + "runtime_id": -156, + "component_based": false + }, + "minecraft:seagrass": { + "runtime_id": -130, + "component_based": false + }, + "minecraft:sentry_armor_trim_smithing_template": { + "runtime_id": 719, + "component_based": false + }, + "minecraft:shaper_armor_trim_smithing_template": { + "runtime_id": 733, + "component_based": false + }, + "minecraft:sheaf_pottery_sherd": { + "runtime_id": 713, + "component_based": false + }, + "minecraft:shears": { + "runtime_id": 447, + "component_based": false + }, + "minecraft:sheep_spawn_egg": { + "runtime_id": 465, + "component_based": false + }, + "minecraft:shelter_pottery_sherd": { + "runtime_id": 714, + "component_based": false + }, + "minecraft:shield": { + "runtime_id": 380, + "component_based": false + }, + "minecraft:short_grass": { + "runtime_id": 31, + "component_based": false + }, + "minecraft:shroomlight": { + "runtime_id": -230, + "component_based": false + }, + "minecraft:shulker_box": { + "runtime_id": 781, + "component_based": false + }, + "minecraft:shulker_shell": { + "runtime_id": 599, + "component_based": false + }, + "minecraft:shulker_spawn_egg": { + "runtime_id": 497, + "component_based": false + }, + "minecraft:silence_armor_trim_smithing_template": { + "runtime_id": 730, + "component_based": false + }, + "minecraft:silver_glazed_terracotta": { + "runtime_id": 228, + "component_based": false + }, + "minecraft:silverfish_spawn_egg": { + "runtime_id": 470, + "component_based": false + }, + "minecraft:skeleton_horse_spawn_egg": { + "runtime_id": 495, + "component_based": false + }, + "minecraft:skeleton_skull": { + "runtime_id": 144, + "component_based": false + }, + "minecraft:skeleton_spawn_egg": { + "runtime_id": 471, + "component_based": false + }, + "minecraft:skull": { + "runtime_id": 738, + "component_based": false + }, + "minecraft:skull_banner_pattern": { + "runtime_id": 616, + "component_based": false + }, + "minecraft:skull_pottery_sherd": { + "runtime_id": 715, + "component_based": false + }, + "minecraft:slime": { + "runtime_id": 165, + "component_based": false + }, + "minecraft:slime_ball": { + "runtime_id": 414, + "component_based": false + }, + "minecraft:slime_spawn_egg": { + "runtime_id": 472, + "component_based": false + }, + "minecraft:small_amethyst_bud": { + "runtime_id": -332, + "component_based": false + }, + "minecraft:small_dripleaf_block": { + "runtime_id": -336, + "component_based": false + }, + "minecraft:smithing_table": { + "runtime_id": -202, + "component_based": false + }, + "minecraft:smoker": { + "runtime_id": -198, + "component_based": false + }, + "minecraft:smooth_basalt": { + "runtime_id": -377, + "component_based": false + }, + "minecraft:smooth_quartz": { + "runtime_id": -955, + "component_based": false + }, + "minecraft:smooth_quartz_double_slab": { + "runtime_id": -925, + "component_based": false + }, + "minecraft:smooth_quartz_slab": { + "runtime_id": -898, + "component_based": false + }, + "minecraft:smooth_quartz_stairs": { + "runtime_id": -185, + "component_based": false + }, + "minecraft:smooth_red_sandstone": { + "runtime_id": -958, + "component_based": false + }, + "minecraft:smooth_red_sandstone_double_slab": { + "runtime_id": -918, + "component_based": false + }, + "minecraft:smooth_red_sandstone_slab": { + "runtime_id": -891, + "component_based": false + }, + "minecraft:smooth_red_sandstone_stairs": { + "runtime_id": -176, + "component_based": false + }, + "minecraft:smooth_sandstone": { + "runtime_id": -946, + "component_based": false + }, + "minecraft:smooth_sandstone_double_slab": { + "runtime_id": -916, + "component_based": false + }, + "minecraft:smooth_sandstone_slab": { + "runtime_id": -889, + "component_based": false + }, + "minecraft:smooth_sandstone_stairs": { + "runtime_id": -177, + "component_based": false + }, + "minecraft:smooth_stone": { + "runtime_id": -183, + "component_based": false + }, + "minecraft:smooth_stone_double_slab": { + "runtime_id": 43, + "component_based": false + }, + "minecraft:smooth_stone_slab": { + "runtime_id": 44, + "component_based": false + }, + "minecraft:sniffer_egg": { + "runtime_id": -596, + "component_based": false + }, + "minecraft:sniffer_spawn_egg": { + "runtime_id": 528, + "component_based": false + }, + "minecraft:snort_pottery_sherd": { + "runtime_id": 716, + "component_based": false + }, + "minecraft:snout_armor_trim_smithing_template": { + "runtime_id": 727, + "component_based": false + }, + "minecraft:snow": { + "runtime_id": 80, + "component_based": false + }, + "minecraft:snow_golem_spawn_egg": { + "runtime_id": 534, + "component_based": false + }, + "minecraft:snow_layer": { + "runtime_id": 78, + "component_based": false + }, + "minecraft:snowball": { + "runtime_id": 399, + "component_based": true + }, + "minecraft:soul_campfire": { + "runtime_id": 660, + "component_based": true + }, + "minecraft:soul_fire": { + "runtime_id": -237, + "component_based": false + }, + "minecraft:soul_lantern": { + "runtime_id": -269, + "component_based": false + }, + "minecraft:soul_sand": { + "runtime_id": 88, + "component_based": false + }, + "minecraft:soul_soil": { + "runtime_id": -236, + "component_based": false + }, + "minecraft:soul_torch": { + "runtime_id": -268, + "component_based": false + }, + "minecraft:sparkler": { + "runtime_id": 638, + "component_based": false + }, + "minecraft:spawn_egg": { + "runtime_id": 795, + "component_based": false + }, + "minecraft:spider_eye": { + "runtime_id": 300, + "component_based": false + }, + "minecraft:spider_spawn_egg": { + "runtime_id": 473, + "component_based": false + }, + "minecraft:spire_armor_trim_smithing_template": { + "runtime_id": 729, + "component_based": false + }, + "minecraft:splash_potion": { + "runtime_id": 594, + "component_based": false + }, + "minecraft:sponge": { + "runtime_id": 19, + "component_based": false + }, + "minecraft:spore_blossom": { + "runtime_id": -321, + "component_based": false + }, + "minecraft:spruce_boat": { + "runtime_id": 404, + "component_based": false + }, + "minecraft:spruce_button": { + "runtime_id": -144, + "component_based": false + }, + "minecraft:spruce_chest_boat": { + "runtime_id": 679, + "component_based": false + }, + "minecraft:spruce_door": { + "runtime_id": 586, + "component_based": false + }, + "minecraft:spruce_double_slab": { + "runtime_id": -809, + "component_based": false + }, + "minecraft:spruce_fence": { + "runtime_id": -579, + "component_based": false + }, + "minecraft:spruce_fence_gate": { + "runtime_id": 183, + "component_based": false + }, + "minecraft:spruce_hanging_sign": { + "runtime_id": -501, + "component_based": false + }, + "minecraft:spruce_leaves": { + "runtime_id": -800, + "component_based": false + }, + "minecraft:spruce_log": { + "runtime_id": -569, + "component_based": false + }, + "minecraft:spruce_planks": { + "runtime_id": -739, + "component_based": false + }, + "minecraft:spruce_pressure_plate": { + "runtime_id": -154, + "component_based": false + }, + "minecraft:spruce_sapling": { + "runtime_id": -825, + "component_based": false + }, + "minecraft:spruce_sign": { + "runtime_id": 609, + "component_based": false + }, + "minecraft:spruce_slab": { + "runtime_id": -804, + "component_based": false + }, + "minecraft:spruce_stairs": { + "runtime_id": 134, + "component_based": false + }, + "minecraft:spruce_standing_sign": { + "runtime_id": -181, + "component_based": false + }, + "minecraft:spruce_trapdoor": { + "runtime_id": -149, + "component_based": false + }, + "minecraft:spruce_wall_sign": { + "runtime_id": -182, + "component_based": false + }, + "minecraft:spruce_wood": { + "runtime_id": -814, + "component_based": false + }, + "minecraft:spyglass": { + "runtime_id": 663, + "component_based": false + }, + "minecraft:squid_spawn_egg": { + "runtime_id": 477, + "component_based": false + }, + "minecraft:stained_glass": { + "runtime_id": 779, + "component_based": false + }, + "minecraft:stained_glass_pane": { + "runtime_id": 780, + "component_based": false + }, + "minecraft:stained_hardened_clay": { + "runtime_id": 739, + "component_based": false + }, + "minecraft:standing_banner": { + "runtime_id": 176, + "component_based": false + }, + "minecraft:standing_sign": { + "runtime_id": 63, + "component_based": false + }, + "minecraft:stick": { + "runtime_id": 345, + "component_based": false + }, + "minecraft:sticky_piston": { + "runtime_id": 29, + "component_based": false + }, + "minecraft:sticky_piston_arm_collision": { + "runtime_id": -217, + "component_based": false + }, + "minecraft:stone": { + "runtime_id": 1, + "component_based": false + }, + "minecraft:stone_axe": { + "runtime_id": 339, + "component_based": false + }, + "minecraft:stone_block_slab": { + "runtime_id": 756, + "component_based": false + }, + "minecraft:stone_block_slab2": { + "runtime_id": 757, + "component_based": false + }, + "minecraft:stone_block_slab3": { + "runtime_id": 758, + "component_based": false + }, + "minecraft:stone_block_slab4": { + "runtime_id": 759, + "component_based": false + }, + "minecraft:stone_brick_double_slab": { + "runtime_id": -881, + "component_based": false + }, + "minecraft:stone_brick_slab": { + "runtime_id": -875, + "component_based": false + }, + "minecraft:stone_brick_stairs": { + "runtime_id": 109, + "component_based": false + }, + "minecraft:stone_brick_wall": { + "runtime_id": -977, + "component_based": false + }, + "minecraft:stone_bricks": { + "runtime_id": 98, + "component_based": false + }, + "minecraft:stone_button": { + "runtime_id": 77, + "component_based": false + }, + "minecraft:stone_hoe": { + "runtime_id": 355, + "component_based": false + }, + "minecraft:stone_pickaxe": { + "runtime_id": 338, + "component_based": false + }, + "minecraft:stone_pressure_plate": { + "runtime_id": 70, + "component_based": false + }, + "minecraft:stone_shovel": { + "runtime_id": 337, + "component_based": false + }, + "minecraft:stone_stairs": { + "runtime_id": 67, + "component_based": false + }, + "minecraft:stone_sword": { + "runtime_id": 336, + "component_based": false + }, + "minecraft:stonebrick": { + "runtime_id": 754, + "component_based": false + }, + "minecraft:stonecutter": { + "runtime_id": 245, + "component_based": false + }, + "minecraft:stonecutter_block": { + "runtime_id": -197, + "component_based": false + }, + "minecraft:stray_spawn_egg": { + "runtime_id": 489, + "component_based": false + }, + "minecraft:strider_spawn_egg": { + "runtime_id": 523, + "component_based": false + }, + "minecraft:string": { + "runtime_id": 351, + "component_based": true + }, + "minecraft:stripped_acacia_log": { + "runtime_id": -8, + "component_based": false + }, + "minecraft:stripped_acacia_wood": { + "runtime_id": -823, + "component_based": false + }, + "minecraft:stripped_bamboo_block": { + "runtime_id": -528, + "component_based": false + }, + "minecraft:stripped_birch_log": { + "runtime_id": -6, + "component_based": false + }, + "minecraft:stripped_birch_wood": { + "runtime_id": -821, + "component_based": false + }, + "minecraft:stripped_cherry_log": { + "runtime_id": -535, + "component_based": false + }, + "minecraft:stripped_cherry_wood": { + "runtime_id": -545, + "component_based": false + }, + "minecraft:stripped_crimson_hyphae": { + "runtime_id": -300, + "component_based": false + }, + "minecraft:stripped_crimson_stem": { + "runtime_id": -240, + "component_based": false + }, + "minecraft:stripped_dark_oak_log": { + "runtime_id": -9, + "component_based": false + }, + "minecraft:stripped_dark_oak_wood": { + "runtime_id": -824, + "component_based": false + }, + "minecraft:stripped_jungle_log": { + "runtime_id": -7, + "component_based": false + }, + "minecraft:stripped_jungle_wood": { + "runtime_id": -822, + "component_based": false + }, + "minecraft:stripped_mangrove_log": { + "runtime_id": -485, + "component_based": false + }, + "minecraft:stripped_mangrove_wood": { + "runtime_id": -498, + "component_based": false + }, + "minecraft:stripped_oak_log": { + "runtime_id": -10, + "component_based": false + }, + "minecraft:stripped_oak_wood": { + "runtime_id": -819, + "component_based": false + }, + "minecraft:stripped_pale_oak_log": { + "runtime_id": -994, + "component_based": false + }, + "minecraft:stripped_pale_oak_wood": { + "runtime_id": -1004, + "component_based": false + }, + "minecraft:stripped_spruce_log": { + "runtime_id": -5, + "component_based": false + }, + "minecraft:stripped_spruce_wood": { + "runtime_id": -820, + "component_based": false + }, + "minecraft:stripped_warped_hyphae": { + "runtime_id": -301, + "component_based": false + }, + "minecraft:stripped_warped_stem": { + "runtime_id": -241, + "component_based": false + }, + "minecraft:structure_block": { + "runtime_id": 252, + "component_based": false + }, + "minecraft:structure_void": { + "runtime_id": 217, + "component_based": false + }, + "minecraft:sugar": { + "runtime_id": 442, + "component_based": false + }, + "minecraft:sugar_cane": { + "runtime_id": 411, + "component_based": true + }, + "minecraft:sunflower": { + "runtime_id": 175, + "component_based": false + }, + "minecraft:suspicious_gravel": { + "runtime_id": -573, + "component_based": false + }, + "minecraft:suspicious_sand": { + "runtime_id": -529, + "component_based": false + }, + "minecraft:suspicious_stew": { + "runtime_id": 625, + "component_based": false + }, + "minecraft:sweet_berries": { + "runtime_id": 309, + "component_based": false + }, + "minecraft:sweet_berry_bush": { + "runtime_id": -207, + "component_based": false + }, + "minecraft:tadpole_bucket": { + "runtime_id": 668, + "component_based": false + }, + "minecraft:tadpole_spawn_egg": { + "runtime_id": 667, + "component_based": false + }, + "minecraft:tall_grass": { + "runtime_id": -864, + "component_based": false + }, + "minecraft:tallgrass": { + "runtime_id": 774, + "component_based": false + }, + "minecraft:target": { + "runtime_id": -239, + "component_based": false + }, + "minecraft:tide_armor_trim_smithing_template": { + "runtime_id": 726, + "component_based": false + }, + "minecraft:tinted_glass": { + "runtime_id": -334, + "component_based": false + }, + "minecraft:tnt": { + "runtime_id": 46, + "component_based": false + }, + "minecraft:tnt_minecart": { + "runtime_id": 558, + "component_based": false + }, + "minecraft:torch": { + "runtime_id": 50, + "component_based": false + }, + "minecraft:torchflower": { + "runtime_id": -568, + "component_based": false + }, + "minecraft:torchflower_crop": { + "runtime_id": -567, + "component_based": false + }, + "minecraft:torchflower_seeds": { + "runtime_id": 318, + "component_based": false + }, + "minecraft:totem_of_undying": { + "runtime_id": 601, + "component_based": false + }, + "minecraft:trader_llama_spawn_egg": { + "runtime_id": 686, + "component_based": false + }, + "minecraft:trapdoor": { + "runtime_id": 96, + "component_based": false + }, + "minecraft:trapped_chest": { + "runtime_id": 146, + "component_based": false + }, + "minecraft:trial_key": { + "runtime_id": 276, + "component_based": true + }, + "minecraft:trial_spawner": { + "runtime_id": -315, + "component_based": false + }, + "minecraft:trident": { + "runtime_id": 579, + "component_based": false + }, + "minecraft:trip_wire": { + "runtime_id": 132, + "component_based": false + }, + "minecraft:tripwire_hook": { + "runtime_id": 131, + "component_based": false + }, + "minecraft:tropical_fish": { + "runtime_id": 288, + "component_based": false + }, + "minecraft:tropical_fish_bucket": { + "runtime_id": 391, + "component_based": false + }, + "minecraft:tropical_fish_spawn_egg": { + "runtime_id": 507, + "component_based": false + }, + "minecraft:tube_coral": { + "runtime_id": -131, + "component_based": false + }, + "minecraft:tube_coral_block": { + "runtime_id": -132, + "component_based": false + }, + "minecraft:tube_coral_fan": { + "runtime_id": -133, + "component_based": false + }, + "minecraft:tube_coral_wall_fan": { + "runtime_id": -135, + "component_based": false + }, + "minecraft:tuff": { + "runtime_id": -333, + "component_based": false + }, + "minecraft:tuff_brick_double_slab": { + "runtime_id": -756, + "component_based": false + }, + "minecraft:tuff_brick_slab": { + "runtime_id": -755, + "component_based": false + }, + "minecraft:tuff_brick_stairs": { + "runtime_id": -757, + "component_based": false + }, + "minecraft:tuff_brick_wall": { + "runtime_id": -758, + "component_based": false + }, + "minecraft:tuff_bricks": { + "runtime_id": -754, + "component_based": false + }, + "minecraft:tuff_double_slab": { + "runtime_id": -745, + "component_based": false + }, + "minecraft:tuff_slab": { + "runtime_id": -744, + "component_based": false + }, + "minecraft:tuff_stairs": { + "runtime_id": -746, + "component_based": false + }, + "minecraft:tuff_wall": { + "runtime_id": -747, + "component_based": false + }, + "minecraft:turtle_egg": { + "runtime_id": -159, + "component_based": false + }, + "minecraft:turtle_helmet": { + "runtime_id": 606, + "component_based": false + }, + "minecraft:turtle_scute": { + "runtime_id": 605, + "component_based": false + }, + "minecraft:turtle_spawn_egg": { + "runtime_id": 513, + "component_based": false + }, + "minecraft:twisting_vines": { + "runtime_id": -287, + "component_based": false + }, + "minecraft:underwater_tnt": { + "runtime_id": -985, + "component_based": false + }, + "minecraft:underwater_torch": { + "runtime_id": 239, + "component_based": false + }, + "minecraft:undyed_shulker_box": { + "runtime_id": 205, + "component_based": false + }, + "minecraft:unknown": { + "runtime_id": -305, + "component_based": false + }, + "minecraft:unlit_redstone_torch": { + "runtime_id": 75, + "component_based": false + }, + "minecraft:unpowered_comparator": { + "runtime_id": 149, + "component_based": false + }, + "minecraft:unpowered_repeater": { + "runtime_id": 93, + "component_based": false + }, + "minecraft:vault": { + "runtime_id": -314, + "component_based": false + }, + "minecraft:verdant_froglight": { + "runtime_id": -470, + "component_based": false + }, + "minecraft:vex_armor_trim_smithing_template": { + "runtime_id": 725, + "component_based": false + }, + "minecraft:vex_spawn_egg": { + "runtime_id": 504, + "component_based": false + }, + "minecraft:villager_spawn_egg": { + "runtime_id": 476, + "component_based": false + }, + "minecraft:vindicator_spawn_egg": { + "runtime_id": 502, + "component_based": false + }, + "minecraft:vine": { + "runtime_id": 106, + "component_based": false + }, + "minecraft:wall_banner": { + "runtime_id": 177, + "component_based": false + }, + "minecraft:wall_sign": { + "runtime_id": 68, + "component_based": false + }, + "minecraft:wandering_trader_spawn_egg": { + "runtime_id": 520, + "component_based": false + }, + "minecraft:ward_armor_trim_smithing_template": { + "runtime_id": 723, + "component_based": false + }, + "minecraft:warden_spawn_egg": { + "runtime_id": 670, + "component_based": false + }, + "minecraft:warped_button": { + "runtime_id": -261, + "component_based": false + }, + "minecraft:warped_door": { + "runtime_id": 655, + "component_based": false + }, + "minecraft:warped_double_slab": { + "runtime_id": -267, + "component_based": false + }, + "minecraft:warped_fence": { + "runtime_id": -257, + "component_based": false + }, + "minecraft:warped_fence_gate": { + "runtime_id": -259, + "component_based": false + }, + "minecraft:warped_fungus": { + "runtime_id": -229, + "component_based": false + }, + "minecraft:warped_fungus_on_a_stick": { + "runtime_id": 656, + "component_based": true + }, + "minecraft:warped_hanging_sign": { + "runtime_id": -507, + "component_based": false + }, + "minecraft:warped_hyphae": { + "runtime_id": -298, + "component_based": false + }, + "minecraft:warped_nylium": { + "runtime_id": -233, + "component_based": false + }, + "minecraft:warped_planks": { + "runtime_id": -243, + "component_based": false + }, + "minecraft:warped_pressure_plate": { + "runtime_id": -263, + "component_based": false + }, + "minecraft:warped_roots": { + "runtime_id": -224, + "component_based": false + }, + "minecraft:warped_sign": { + "runtime_id": 653, + "component_based": false + }, + "minecraft:warped_slab": { + "runtime_id": -265, + "component_based": false + }, + "minecraft:warped_stairs": { + "runtime_id": -255, + "component_based": false + }, + "minecraft:warped_standing_sign": { + "runtime_id": -251, + "component_based": false + }, + "minecraft:warped_stem": { + "runtime_id": -226, + "component_based": false + }, + "minecraft:warped_trapdoor": { + "runtime_id": -247, + "component_based": false + }, + "minecraft:warped_wall_sign": { + "runtime_id": -253, + "component_based": false + }, + "minecraft:warped_wart_block": { + "runtime_id": -227, + "component_based": false + }, + "minecraft:water": { + "runtime_id": 9, + "component_based": false + }, + "minecraft:water_bucket": { + "runtime_id": 387, + "component_based": false + }, + "minecraft:waterlily": { + "runtime_id": 111, + "component_based": false + }, + "minecraft:waxed_chiseled_copper": { + "runtime_id": -764, + "component_based": false + }, + "minecraft:waxed_copper": { + "runtime_id": -344, + "component_based": false + }, + "minecraft:waxed_copper_bulb": { + "runtime_id": -780, + "component_based": false + }, + "minecraft:waxed_copper_door": { + "runtime_id": -788, + "component_based": false + }, + "minecraft:waxed_copper_grate": { + "runtime_id": -772, + "component_based": false + }, + "minecraft:waxed_copper_trapdoor": { + "runtime_id": -796, + "component_based": false + }, + "minecraft:waxed_cut_copper": { + "runtime_id": -351, + "component_based": false + }, + "minecraft:waxed_cut_copper_slab": { + "runtime_id": -365, + "component_based": false + }, + "minecraft:waxed_cut_copper_stairs": { + "runtime_id": -358, + "component_based": false + }, + "minecraft:waxed_double_cut_copper_slab": { + "runtime_id": -372, + "component_based": false + }, + "minecraft:waxed_exposed_chiseled_copper": { + "runtime_id": -765, + "component_based": false + }, + "minecraft:waxed_exposed_copper": { + "runtime_id": -345, + "component_based": false + }, + "minecraft:waxed_exposed_copper_bulb": { + "runtime_id": -781, + "component_based": false + }, + "minecraft:waxed_exposed_copper_door": { + "runtime_id": -789, + "component_based": false + }, + "minecraft:waxed_exposed_copper_grate": { + "runtime_id": -773, + "component_based": false + }, + "minecraft:waxed_exposed_copper_trapdoor": { + "runtime_id": -797, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper": { + "runtime_id": -352, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_slab": { + "runtime_id": -366, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_stairs": { + "runtime_id": -359, + "component_based": false + }, + "minecraft:waxed_exposed_double_cut_copper_slab": { + "runtime_id": -373, + "component_based": false + }, + "minecraft:waxed_oxidized_chiseled_copper": { + "runtime_id": -766, + "component_based": false + }, + "minecraft:waxed_oxidized_copper": { + "runtime_id": -446, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_bulb": { + "runtime_id": -783, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_door": { + "runtime_id": -791, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_grate": { + "runtime_id": -775, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_trapdoor": { + "runtime_id": -799, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper": { + "runtime_id": -447, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_slab": { + "runtime_id": -449, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_stairs": { + "runtime_id": -448, + "component_based": false + }, + "minecraft:waxed_oxidized_double_cut_copper_slab": { + "runtime_id": -450, + "component_based": false + }, + "minecraft:waxed_weathered_chiseled_copper": { + "runtime_id": -767, + "component_based": false + }, + "minecraft:waxed_weathered_copper": { + "runtime_id": -346, + "component_based": false + }, + "minecraft:waxed_weathered_copper_bulb": { + "runtime_id": -782, + "component_based": false + }, + "minecraft:waxed_weathered_copper_door": { + "runtime_id": -790, + "component_based": false + }, + "minecraft:waxed_weathered_copper_grate": { + "runtime_id": -774, + "component_based": false + }, + "minecraft:waxed_weathered_copper_trapdoor": { + "runtime_id": -798, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper": { + "runtime_id": -353, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_slab": { + "runtime_id": -367, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_stairs": { + "runtime_id": -360, + "component_based": false + }, + "minecraft:waxed_weathered_double_cut_copper_slab": { + "runtime_id": -374, + "component_based": false + }, + "minecraft:wayfinder_armor_trim_smithing_template": { + "runtime_id": 731, + "component_based": false + }, + "minecraft:weathered_chiseled_copper": { + "runtime_id": -762, + "component_based": false + }, + "minecraft:weathered_copper": { + "runtime_id": -342, + "component_based": false + }, + "minecraft:weathered_copper_bulb": { + "runtime_id": -778, + "component_based": false + }, + "minecraft:weathered_copper_door": { + "runtime_id": -786, + "component_based": false + }, + "minecraft:weathered_copper_grate": { + "runtime_id": -770, + "component_based": false + }, + "minecraft:weathered_copper_trapdoor": { + "runtime_id": -794, + "component_based": false + }, + "minecraft:weathered_cut_copper": { + "runtime_id": -349, + "component_based": false + }, + "minecraft:weathered_cut_copper_slab": { + "runtime_id": -363, + "component_based": false + }, + "minecraft:weathered_cut_copper_stairs": { + "runtime_id": -356, + "component_based": false + }, + "minecraft:weathered_double_cut_copper_slab": { + "runtime_id": -370, + "component_based": false + }, + "minecraft:web": { + "runtime_id": 30, + "component_based": false + }, + "minecraft:weeping_vines": { + "runtime_id": -231, + "component_based": false + }, + "minecraft:wet_sponge": { + "runtime_id": -984, + "component_based": false + }, + "minecraft:wheat": { + "runtime_id": 359, + "component_based": false + }, + "minecraft:wheat_seeds": { + "runtime_id": 313, + "component_based": false + }, + "minecraft:white_bundle": { + "runtime_id": 261, + "component_based": true + }, + "minecraft:white_candle": { + "runtime_id": -413, + "component_based": false + }, + "minecraft:white_candle_cake": { + "runtime_id": -430, + "component_based": false + }, + "minecraft:white_carpet": { + "runtime_id": 171, + "component_based": false + }, + "minecraft:white_concrete": { + "runtime_id": 236, + "component_based": false + }, + "minecraft:white_concrete_powder": { + "runtime_id": 237, + "component_based": false + }, + "minecraft:white_dye": { + "runtime_id": 436, + "component_based": false + }, + "minecraft:white_glazed_terracotta": { + "runtime_id": 220, + "component_based": false + }, + "minecraft:white_shulker_box": { + "runtime_id": 218, + "component_based": false + }, + "minecraft:white_stained_glass": { + "runtime_id": 241, + "component_based": false + }, + "minecraft:white_stained_glass_pane": { + "runtime_id": 160, + "component_based": false + }, + "minecraft:white_terracotta": { + "runtime_id": 159, + "component_based": false + }, + "minecraft:white_tulip": { + "runtime_id": -835, + "component_based": false + }, + "minecraft:white_wool": { + "runtime_id": 35, + "component_based": false + }, + "minecraft:wild_armor_trim_smithing_template": { + "runtime_id": 722, + "component_based": false + }, + "minecraft:wind_charge": { + "runtime_id": 277, + "component_based": true + }, + "minecraft:witch_spawn_egg": { + "runtime_id": 479, + "component_based": false + }, + "minecraft:wither_rose": { + "runtime_id": -216, + "component_based": false + }, + "minecraft:wither_skeleton_skull": { + "runtime_id": -965, + "component_based": false + }, + "minecraft:wither_skeleton_spawn_egg": { + "runtime_id": 492, + "component_based": false + }, + "minecraft:wither_spawn_egg": { + "runtime_id": 536, + "component_based": false + }, + "minecraft:wolf_armor": { + "runtime_id": 742, + "component_based": true + }, + "minecraft:wolf_spawn_egg": { + "runtime_id": 466, + "component_based": false + }, + "minecraft:wood": { + "runtime_id": 782, + "component_based": false + }, + "minecraft:wooden_axe": { + "runtime_id": 335, + "component_based": false + }, + "minecraft:wooden_button": { + "runtime_id": 143, + "component_based": false + }, + "minecraft:wooden_door": { + "runtime_id": 384, + "component_based": false + }, + "minecraft:wooden_hoe": { + "runtime_id": 354, + "component_based": false + }, + "minecraft:wooden_pickaxe": { + "runtime_id": 334, + "component_based": false + }, + "minecraft:wooden_pressure_plate": { + "runtime_id": 72, + "component_based": false + }, + "minecraft:wooden_shovel": { + "runtime_id": 333, + "component_based": false + }, + "minecraft:wooden_slab": { + "runtime_id": 769, + "component_based": false + }, + "minecraft:wooden_sword": { + "runtime_id": 332, + "component_based": false + }, + "minecraft:wool": { + "runtime_id": 750, + "component_based": false + }, + "minecraft:writable_book": { + "runtime_id": 544, + "component_based": false + }, + "minecraft:written_book": { + "runtime_id": 545, + "component_based": false + }, + "minecraft:yellow_bundle": { + "runtime_id": 267, + "component_based": true + }, + "minecraft:yellow_candle": { + "runtime_id": -417, + "component_based": false + }, + "minecraft:yellow_candle_cake": { + "runtime_id": -434, + "component_based": false + }, + "minecraft:yellow_carpet": { + "runtime_id": -600, + "component_based": false + }, + "minecraft:yellow_concrete": { + "runtime_id": -631, + "component_based": false + }, + "minecraft:yellow_concrete_powder": { + "runtime_id": -712, + "component_based": false + }, + "minecraft:yellow_dye": { + "runtime_id": 432, + "component_based": false + }, + "minecraft:yellow_glazed_terracotta": { + "runtime_id": 224, + "component_based": false + }, + "minecraft:yellow_shulker_box": { + "runtime_id": -616, + "component_based": false + }, + "minecraft:yellow_stained_glass": { + "runtime_id": -676, + "component_based": false + }, + "minecraft:yellow_stained_glass_pane": { + "runtime_id": -646, + "component_based": false + }, + "minecraft:yellow_terracotta": { + "runtime_id": -727, + "component_based": false + }, + "minecraft:yellow_wool": { + "runtime_id": -558, + "component_based": false + }, + "minecraft:zoglin_spawn_egg": { + "runtime_id": 526, + "component_based": false + }, + "minecraft:zombie_head": { + "runtime_id": -966, + "component_based": false + }, + "minecraft:zombie_horse_spawn_egg": { + "runtime_id": 496, + "component_based": false + }, + "minecraft:zombie_pigman_spawn_egg": { + "runtime_id": 475, + "component_based": false + }, + "minecraft:zombie_spawn_egg": { + "runtime_id": 474, + "component_based": false + }, + "minecraft:zombie_villager_spawn_egg": { + "runtime_id": 505, + "component_based": false + } +} diff --git a/legacyver/v748.go b/legacyver/v748.go new file mode 100644 index 0000000..3e2a667 --- /dev/null +++ b/legacyver/v748.go @@ -0,0 +1,36 @@ +package legacyver + +import ( + _ "embed" + "github.com/akmalfairuz/legacy-version/internal/chunk" + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/akmalfairuz/legacy-version/mapping" +) + +const ( + // ItemVersion748 ... + ItemVersion748 = 221 + // BlockVersion748 ... + BlockVersion748 int32 = (1 << 24) | (21 << 16) | (40 << 8) +) + +var ( + //go:embed item_runtime_ids_748.nbt + itemRuntimeIDData748 []byte + //go:embed required_item_list_748.json + requiredItemList748 []byte + //go:embed block_states_748.nbt + blockStateData748 []byte +) + +func New748(direct bool) *Protocol { + itemMapping := mapping.NewItemMapping(itemRuntimeIDData748, requiredItemList748, ItemVersion748, false) + blockMapping := mapping.NewBlockMapping(blockStateData748) + + return &Protocol{ + ver: "1.21.40", + id: proto.ID748, + blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion748), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion748), false), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), + } +} diff --git a/legacyver/v766.go b/legacyver/v766.go new file mode 100644 index 0000000..b9d32ae --- /dev/null +++ b/legacyver/v766.go @@ -0,0 +1,25 @@ +package legacyver + +import ( + _ "embed" + "github.com/akmalfairuz/legacy-version/mapping" +) + +const ( + // ItemVersion766 ... + ItemVersion766 = 231 + // BlockVersion766 ... + BlockVersion766 int32 = (1 << 24) | (21 << 16) | (50 << 8) +) + +var ( + //go:embed item_runtime_ids_766.nbt + itemRuntimeIDData766 []byte + //go:embed required_item_list_766.json + requiredItemList766 []byte + //go:embed block_states_766.nbt + blockStateData766 []byte + + itemMappingLatest = mapping.NewItemMapping(itemRuntimeIDData766, requiredItemList766, ItemVersion766, false) + blockMappingLatest = mapping.NewBlockMapping(blockStateData766) +) diff --git a/main.go b/main.go new file mode 100644 index 0000000..ab714ec --- /dev/null +++ b/main.go @@ -0,0 +1,146 @@ +package main + +import ( + "errors" + "github.com/akmalfairuz/legacy-version/legacyver" + "github.com/pelletier/go-toml" + "github.com/sandertv/gophertunnel/minecraft" + "github.com/sandertv/gophertunnel/minecraft/auth" + "golang.org/x/oauth2" + "log" + "os" + "sync" +) + +// The following program implements a proxy that forwards players from one local address to a remote address. +func main() { + config := readConfig() + token, err := auth.RequestLiveToken() + if err != nil { + panic(err) + } + src := auth.RefreshTokenSource(token) + + p, err := minecraft.NewForeignStatusProvider(config.Connection.RemoteAddress) + if err != nil { + panic(err) + } + listener, err := minecraft.ListenConfig{ + StatusProvider: p, + AcceptedProtocols: []minecraft.Protocol{ + legacyver.New748(false), + }, + }.Listen("raknet", config.Connection.LocalAddress) + if err != nil { + panic(err) + } + defer listener.Close() + for { + c, err := listener.Accept() + if err != nil { + panic(err) + } + go handleConn(c.(*minecraft.Conn), listener, config, src) + } +} + +// handleConn handles a new incoming minecraft.Conn from the minecraft.Listener passed. +func handleConn(conn *minecraft.Conn, listener *minecraft.Listener, config config, src oauth2.TokenSource) { + serverConn, err := minecraft.Dialer{ + TokenSource: src, + ClientData: conn.ClientData(), + }.Dial("raknet", config.Connection.RemoteAddress) + if err != nil { + panic(err) + } + var g sync.WaitGroup + g.Add(2) + go func() { + if err := conn.StartGame(serverConn.GameData()); err != nil { + panic(err) + } + g.Done() + }() + go func() { + if err := serverConn.DoSpawn(); err != nil { + panic(err) + } + g.Done() + }() + g.Wait() + + go func() { + defer listener.Disconnect(conn, "connection lost") + defer serverConn.Close() + for { + pk, err := conn.ReadPacket() + if err != nil { + return + } + if err := serverConn.WritePacket(pk); err != nil { + var disc minecraft.DisconnectError + if ok := errors.As(err, &disc); ok { + _ = listener.Disconnect(conn, disc.Error()) + } + return + } + } + }() + go func() { + defer serverConn.Close() + defer listener.Disconnect(conn, "connection lost") + for { + pk, err := serverConn.ReadPacket() + if err != nil { + var disc minecraft.DisconnectError + if ok := errors.As(err, &disc); ok { + _ = listener.Disconnect(conn, disc.Error()) + } + return + } + if err := conn.WritePacket(pk); err != nil { + return + } + } + }() +} + +type config struct { + Connection struct { + LocalAddress string + RemoteAddress string + } +} + +func readConfig() config { + c := config{} + if _, err := os.Stat("config.toml"); os.IsNotExist(err) { + f, err := os.Create("config.toml") + if err != nil { + log.Fatalf("create config: %v", err) + } + data, err := toml.Marshal(c) + if err != nil { + log.Fatalf("encode default config: %v", err) + } + if _, err := f.Write(data); err != nil { + log.Fatalf("write default config: %v", err) + } + _ = f.Close() + } + data, err := os.ReadFile("config.toml") + if err != nil { + log.Fatalf("read config: %v", err) + } + if err := toml.Unmarshal(data, &c); err != nil { + log.Fatalf("decode config: %v", err) + } + if c.Connection.LocalAddress == "" { + c.Connection.LocalAddress = "0.0.0.0:19132" + } + data, _ = toml.Marshal(c) + if err := os.WriteFile("config.toml", data, 0644); err != nil { + log.Fatalf("write config: %v", err) + } + return c +} diff --git a/mapping/block.go b/mapping/block.go new file mode 100644 index 0000000..1a5d466 --- /dev/null +++ b/mapping/block.go @@ -0,0 +1,136 @@ +package mapping + +import ( + "bytes" + "github.com/akmalfairuz/legacy-version/internal" + "sort" + + "github.com/df-mc/worldupgrader/blockupgrader" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/segmentio/fasthash/fnv1" +) + +type Block interface { + // StateToRuntimeID converts a block state to a runtime ID. + StateToRuntimeID(blockupgrader.BlockState) (uint32, bool) + // RuntimeIDToState converts a runtime ID to a name and its state properties. + RuntimeIDToState(uint32) (blockupgrader.BlockState, bool) + // DowngradeBlockActorData downgrades the input sub chunk to a legacy block actor. + DowngradeBlockActorData(map[string]any) + // UpgradeBlockActorData upgrades the input sub chunk to the latest block actor. + UpgradeBlockActorData(map[string]any) + // Adjust adjusts the latest mappings to account for custom states. + Adjust([]protocol.BlockEntry) + Air() uint32 +} + +type DefaultBlockMapping struct { + // states holds a list of all possible vanilla block states. + states []blockupgrader.BlockState + // stateRuntimeIDs holds a map for looking up the runtime ID of a block by the stateHash it produces. + stateRuntimeIDs map[internal.StateHash]uint32 + // runtimeIDToState holds a map for looking up the blockState of a block by its runtime ID. + runtimeIDToState map[uint32]blockupgrader.BlockState + upgrader, downgrader func(map[string]any) map[string]any + + // airRID is the runtime ID of the air block in the latest version of the game. + airRID uint32 +} + +func NewBlockMapping(raw []byte) *DefaultBlockMapping { + dec := nbt.NewDecoder(bytes.NewBuffer(raw)) + + var states []blockupgrader.BlockState + stateRuntimeIDs := make(map[internal.StateHash]uint32) + runtimeIDToState := make(map[uint32]blockupgrader.BlockState) + var airRID *uint32 + + var s blockupgrader.BlockState + for { + if err := dec.Decode(&s); err != nil { + break + } + + rid := uint32(len(states)) + states = append(states, s) + if s.Name == "minecraft:air" { + airRID = &rid + } + + stateRuntimeIDs[internal.HashState(blockupgrader.Upgrade(s))] = rid + runtimeIDToState[rid] = s + } + if airRID == nil { + panic("couldn't find air") + } + + return &DefaultBlockMapping{ + states: states, + stateRuntimeIDs: stateRuntimeIDs, + runtimeIDToState: runtimeIDToState, + airRID: *airRID, + } +} + +func (m *DefaultBlockMapping) WithBlockActorRemapper(downgrader, upgrader func(map[string]any) map[string]any) *DefaultBlockMapping { + m.downgrader = downgrader + m.upgrader = upgrader + return m +} + +func (m *DefaultBlockMapping) StateToRuntimeID(state blockupgrader.BlockState) (uint32, bool) { + rid, ok := m.stateRuntimeIDs[internal.HashState(blockupgrader.Upgrade(state))] + return rid, ok +} + +func (m *DefaultBlockMapping) RuntimeIDToState(runtimeId uint32) (blockupgrader.BlockState, bool) { + state, found := m.runtimeIDToState[runtimeId] + return state, found +} + +func (m *DefaultBlockMapping) DowngradeBlockActorData(actorData map[string]any) { + if m.downgrader != nil { + m.downgrader(actorData) + } +} + +func (m *DefaultBlockMapping) UpgradeBlockActorData(actorData map[string]any) { + if m.upgrader != nil { + m.upgrader(actorData) + } +} + +func (m *DefaultBlockMapping) Adjust(entries []protocol.BlockEntry) { + if len(entries) == 0 { + return + } + + customStates := convert(entries) + var newStates []blockupgrader.BlockState + for _, state := range customStates { + if _, ok := m.StateToRuntimeID(state); !ok { + newStates = append(newStates, state) + } + } + if len(newStates) == 0 { + return + } + + adjustedStates := append(m.states, customStates...) + sort.SliceStable(adjustedStates, func(i, j int) bool { + stateOne, stateTwo := adjustedStates[i], adjustedStates[j] + return stateOne.Name != stateTwo.Name && fnv1.HashString64(stateOne.Name) < fnv1.HashString64(stateTwo.Name) + }) + + m.stateRuntimeIDs = make(map[internal.StateHash]uint32, len(adjustedStates)) + m.runtimeIDToState = make(map[uint32]blockupgrader.BlockState, len(adjustedStates)) + for rid, state := range adjustedStates { + m.stateRuntimeIDs[internal.HashState(blockupgrader.Upgrade(state))] = uint32(rid) + m.runtimeIDToState[uint32(rid)] = state + } +} + +func (m *DefaultBlockMapping) Air() uint32 { + return m.airRID +} diff --git a/mapping/custom_blocks.go b/mapping/custom_blocks.go new file mode 100644 index 0000000..d86f1dc --- /dev/null +++ b/mapping/custom_blocks.go @@ -0,0 +1,84 @@ +package mapping + +import ( + "github.com/akmalfairuz/legacy-version/internal" + "github.com/df-mc/worldupgrader/blockupgrader" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "golang.org/x/exp/maps" +) + +func convert(entries []protocol.BlockEntry) (states []blockupgrader.BlockState) { + for _, entry := range entries { + propertiesMap := map[string][]any{} + if props := jsonCheck[[]any](entry.Properties, "properties"); props != nil { + for _, prop := range *props { + prop := prop.(map[string]any) + name := jsonCheck[string](prop, "name") + enum := jsonCheck[[]any](prop, "enum") + if enum == nil { + int32Enum := jsonCheck[[]int32](prop, "enum") + if int32Enum != nil { + enum = &[]any{} + for _, i := range *int32Enum { + *enum = append(*enum, i) + } + } + } + if name == nil || enum == nil { + panic("could not find field `name` and `enum`") + } + propertiesMap[*name] = *enum + } + } + + combinations := make([]map[string]any, 0) + generateCombinationsRecursively(propertiesMap, internal.NewIterator(maps.Keys(propertiesMap)), map[string]any{}, &combinations) + if len(combinations) == 0 { + combinations = append(combinations, map[string]any{}) + } + + for _, combination := range combinations { + blockState := blockupgrader.BlockState{ + Name: entry.Name, + Properties: combination, + } + + states = append(states, blockState) + } + } + return +} + +func generateCombinationsRecursively[K comparable, V any](all map[K][]V, iterator *internal.Iterator[K], current map[K]V, output *[]map[K]V) { + if !iterator.HasNext() { + entry := map[K]V{} + for k, v := range current { + entry[k] = v + } + out := append(*output, entry) + *output = out + } else { + key := iterator.Next() + set := all[key] + + for _, value := range set { + current[key] = value + generateCombinationsRecursively(all, iterator, current, output) + delete(current, key) + } + + iterator.Previous() + } +} + +func jsonCheck[T any](json map[string]any, field string) *T { + fieldValue, found := json[field] + if !found { + return nil + } + castedValue, ok := fieldValue.(T) + if !ok { + return nil + } + return &castedValue +} diff --git a/mapping/item.go b/mapping/item.go new file mode 100644 index 0000000..e3babde --- /dev/null +++ b/mapping/item.go @@ -0,0 +1,109 @@ +package mapping + +import ( + "encoding/json" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "sync" +) + +type Item interface { + // ItemRuntimeIDToName converts an item runtime ID to a string ID. + ItemRuntimeIDToName(int32) (string, bool) + // ItemNameToRuntimeID converts a string ID to an item runtime ID. + ItemNameToRuntimeID(string) (int32, bool) + RegisterEntry(string) int32 + Air() int32 + ItemVersion() uint16 +} + +type DefaultItemMapping struct { + mu sync.Mutex + // itemRuntimeIDsToNames holds a map to translate item runtime IDs to string IDs. + itemRuntimeIDsToNames map[int32]string + // itemNamesToRuntimeIDs holds a map to translate item string IDs to runtime IDs. + itemNamesToRuntimeIDs map[string]int32 + airRID int32 + itemVersion uint16 +} + +func NewItemMapping(itemRuntimeIDData []byte, requiredItemList []byte, itemVersion uint16, direct bool) *DefaultItemMapping { + itemRuntimeIDsToNames := make(map[int32]string) + itemNamesToRuntimeIDs := make(map[string]int32) + var airRID *int32 + + if direct { + var items map[string]int32 + if err := nbt.Unmarshal(itemRuntimeIDData, &items); err != nil { + panic(err) + } + for name, rid := range items { + if name == "minecraft:air" { + airRID = &rid + } + + itemNamesToRuntimeIDs[name] = rid + itemRuntimeIDsToNames[rid] = name + } + } else { + var m map[string]struct { + RuntimeID int16 `json:"runtime_id"` + ComponentBased bool `json:"component_based"` + } + if err := json.Unmarshal(requiredItemList, &m); err != nil { + panic(err) + } + for name, data := range m { + rid := int32(data.RuntimeID) + if name == "minecraft:air" { + airRID = &rid + } + + itemNamesToRuntimeIDs[name] = rid + itemRuntimeIDsToNames[rid] = name + } + } + + if airRID == nil { + panic("couldn't find air") + } + + return &DefaultItemMapping{itemRuntimeIDsToNames: itemRuntimeIDsToNames, itemNamesToRuntimeIDs: itemNamesToRuntimeIDs, itemVersion: itemVersion} +} + +func (m *DefaultItemMapping) ItemRuntimeIDToName(runtimeID int32) (name string, found bool) { + defer m.mu.Unlock() + m.mu.Lock() + name, ok := m.itemRuntimeIDsToNames[runtimeID] + return name, ok +} + +func (m *DefaultItemMapping) ItemNameToRuntimeID(name string) (runtimeID int32, found bool) { + defer m.mu.Unlock() + m.mu.Lock() + rid, ok := m.itemNamesToRuntimeIDs[name] + return rid, ok +} + +func (m *DefaultItemMapping) RegisterEntry(name string) int32 { + defer m.mu.Unlock() + m.mu.Lock() + if rid, ok := m.itemNamesToRuntimeIDs[name]; ok { + return rid + } + nextRID := int32(len(m.itemRuntimeIDsToNames)) + m.itemNamesToRuntimeIDs[name] = nextRID + m.itemRuntimeIDsToNames[nextRID] = name + return nextRID +} + +func (m *DefaultItemMapping) Air() int32 { + defer m.mu.Unlock() + m.mu.Lock() + return m.airRID +} + +func (m *DefaultItemMapping) ItemVersion() uint16 { + defer m.mu.Unlock() + m.mu.Lock() + return m.itemVersion +} diff --git a/packbuilder/builder.go b/packbuilder/builder.go new file mode 100644 index 0000000..b9effd9 --- /dev/null +++ b/packbuilder/builder.go @@ -0,0 +1,71 @@ +package packbuilder + +import ( + "github.com/df-mc/dragonfly/server/item/category" + "golang.org/x/exp/maps" + "strings" +) + +// ComponentBuilder represents a builder that can be used to construct an item components map to be sent to a client. +type ComponentBuilder struct { + name string + identifier string + category category.Category + + properties map[string]any + components map[string]any +} + +// NewComponentBuilder returns a new component builder with the provided item data. +func NewComponentBuilder(name, identifier string, category category.Category) *ComponentBuilder { + return &ComponentBuilder{ + name: name, + identifier: identifier, + category: category, + + properties: make(map[string]any), + components: make(map[string]any), + } +} + +// AddProperty adds the provided property to the builder. +func (builder *ComponentBuilder) AddProperty(name string, value any) { + builder.properties[name] = value +} + +// AddComponent adds the provided component to the builder. +func (builder *ComponentBuilder) AddComponent(name string, value any) { + builder.components[name] = value +} + +// Construct constructs the final item components map and returns it. It also applies the default properties required +// for the item to work without modifying the original maps in the builder. +func (builder *ComponentBuilder) Construct() map[string]any { + properties := maps.Clone(builder.properties) + components := maps.Clone(builder.components) + builder.applyDefaultProperties(properties) + builder.applyDefaultComponents(components, properties) + return map[string]any{"components": components} +} + +// applyDefaultProperties applies the default properties to the provided map. It is important that this method does +// not modify the builder's properties map directly otherwise Empty() will return false in future use of the builder. +func (builder *ComponentBuilder) applyDefaultProperties(x map[string]any) { + x["minecraft:icon"] = map[string]any{ + "texture": strings.Split(builder.identifier, ":")[1], + } + x["creative_group"] = builder.category.Group() + x["creative_category"] = int32(builder.category.Uint8()) + if _, ok := x["max_stack_size"]; !ok { + x["max_stack_size"] = int32(64) + } +} + +// applyDefaultComponents applies the default components to the provided map. It is important that this method does not +// modify the builder's components map directly otherwise Empty() will return false in future use of the builder. +func (builder *ComponentBuilder) applyDefaultComponents(x, properties map[string]any) { + x["item_properties"] = properties + x["minecraft:display_name"] = map[string]any{ + "value": builder.name, + } +} diff --git a/packbuilder/components.go b/packbuilder/components.go new file mode 100644 index 0000000..bee89f9 --- /dev/null +++ b/packbuilder/components.go @@ -0,0 +1,119 @@ +package packbuilder + +import ( + "github.com/df-mc/dragonfly/server/item" + "github.com/df-mc/dragonfly/server/world" + "strings" +) + +// Components returns all the components of the given custom item. If the item has no components, a nil map and false +// are returned. +func Components(it world.CustomItem) map[string]any { + category := it.Category() + identifier, _ := it.EncodeItem() + name := strings.Split(identifier, ":")[1] + + builder := NewComponentBuilder(it.Name(), identifier, category) + + if x, ok := it.(item.Armour); ok { + builder.AddComponent("minecraft:armor", map[string]any{ + "protection": int32(x.DefencePoints()), + }) + builder.AddComponent("minecraft:knockback_resistance", map[string]any{ + "protection": float32(x.KnockBackResistance()), + }) + + var slot string + switch it.(type) { + case item.HelmetType: + slot = "slot.armor.head" + case item.ChestplateType: + slot = "slot.armor.chest" + case item.LeggingsType: + slot = "slot.armor.legs" + case item.BootsType: + slot = "slot.armor.feet" + } + builder.AddComponent("minecraft:wearable", map[string]any{ + "slot": slot, + }) + } + if x, ok := it.(item.Consumable); ok { + builder.AddProperty("use_duration", int32(x.ConsumeDuration().Seconds()*20)) + builder.AddComponent("minecraft:food", map[string]any{ + "can_always_eat": x.AlwaysConsumable(), + }) + + if y, ok := it.(item.Drinkable); ok && y.Drinkable() { + builder.AddProperty("use_animation", int32(2)) + } else { + builder.AddProperty("use_animation", int32(1)) + } + } + if x, ok := it.(item.Cooldown); ok { + builder.AddComponent("minecraft:cooldown", map[string]any{ + "category": name, + "duration": float32(x.Cooldown().Seconds()), + }) + } + if x, ok := it.(item.Durable); ok { + builder.AddComponent("minecraft:durability", map[string]any{ + "max_durability": int32(x.DurabilityInfo().MaxDurability), + }) + } + if x, ok := it.(item.MaxCounter); ok { + builder.AddProperty("max_stack_size", int32(x.MaxCount())) + } + if x, ok := it.(item.OffHand); ok { + builder.AddProperty("allow_off_hand", x.OffHand()) + } + if x, ok := it.(item.Throwable); ok { + // The data in minecraft:projectile is only used by vanilla server-side, but we must send at least an empty map + // so the client will play the throwing animation. + builder.AddComponent("minecraft:projectile", map[string]any{}) + builder.AddComponent("minecraft:throwable", map[string]any{ + "do_swing_animation": x.SwingAnimation(), + }) + } + if x, ok := it.(item.Glinted); ok { + builder.AddProperty("foil", x.Glinted()) + } + if x, ok := it.(item.HandEquipped); ok { + builder.AddProperty("hand_equipped", x.HandEquipped()) + } + itemScale := calculateItemScale(it) + builder.AddComponent("minecraft:render_offsets", map[string]any{ + "main_hand": map[string]any{ + "first_person": map[string]any{ + "scale": itemScale, + }, + "third_person": map[string]any{ + "scale": itemScale, + }, + }, + "off_hand": map[string]any{ + "first_person": map[string]any{ + "scale": itemScale, + }, + "third_person": map[string]any{ + "scale": itemScale, + }, + }, + }) + + return builder.Construct() +} + +// calculateItemScale calculates the scale of the item to be rendered to the player according to the given size. +func calculateItemScale(it world.CustomItem) []float32 { + width := float32(it.Texture().Bounds().Dx()) + height := float32(it.Texture().Bounds().Dy()) + var x, y, z float32 = 0.1, 0.1, 0.1 + if _, ok := it.(item.HandEquipped); ok { + x, y, z = 0.075, 0.125, 0.075 + } + newX := x / (width / 16) + newY := y / (height / 16) + newZ := z / (width / 16) + return []float32{newX, newY, newZ} +} diff --git a/packbuilder/items.go b/packbuilder/items.go new file mode 100644 index 0000000..b3e70d5 --- /dev/null +++ b/packbuilder/items.go @@ -0,0 +1,81 @@ +package packbuilder + +import ( + "encoding/json" + "fmt" + "github.com/df-mc/dragonfly/server/world" + "golang.org/x/image/colornames" + "image" + "image/png" + "os" + "path/filepath" + "strings" + _ "unsafe" // Imported for compiler directives. +) + +// buildItems builds all the item-related files for the resource pack. This includes textures, language +// entries and item atlas. +func buildItems(dir string, customItems []world.CustomItem) (count int, lang []string) { + if err := os.Mkdir(filepath.Join(dir, "items"), os.ModePerm); err != nil { + panic(err) + } + if err := os.MkdirAll(filepath.Join(dir, "textures/items"), os.ModePerm); err != nil { + panic(err) + } + + textureData := make(map[string]any) + for _, item := range customItems { + identifier, _ := item.EncodeItem() + lang = append(lang, fmt.Sprintf("item.%s.name=%s", identifier, item.Name())) + + name := strings.Split(identifier, ":")[1] + textureData[name] = map[string]string{"textures": fmt.Sprintf("textures/items/%s.png", name)} + + buildItemTexture(dir, name, item.Texture()) + + count++ + } + + buildItemAtlas(dir, map[string]any{ + "resource_pack_name": "vanilla", + "texture_name": "atlas.items", + "texture_data": textureData, + }) + return +} + +// buildItemTexture creates a PNG file for the item from the provided image and name and writes it to the pack. +func buildItemTexture(dir, name string, img image.Image) { + texture, err := os.Create(filepath.Join(dir, "textures/items", name+".png")) + if err != nil { + panic(err) + } + if img == nil { + im := image.NewAlpha(image.Rect(0, 0, 64, 64)) + for x := 0; x < im.Bounds().Dx(); x++ { + for y := 0; y < im.Bounds().Dy(); y++ { + im.Set(x, y, colornames.Goldenrod) + } + } + img = im + } + + if err := png.Encode(texture, img); err != nil { + _ = texture.Close() + panic(err) + } + if err := texture.Close(); err != nil { + panic(err) + } +} + +// buildItemAtlas creates the identifier to texture mapping and writes it to the pack. +func buildItemAtlas(dir string, atlas map[string]any) { + b, err := json.Marshal(atlas) + if err != nil { + panic(err) + } + if err := os.WriteFile(filepath.Join(dir, "textures/item_texture.json"), b, 0666); err != nil { + panic(err) + } +} diff --git a/packbuilder/lang.go b/packbuilder/lang.go new file mode 100644 index 0000000..d47e586 --- /dev/null +++ b/packbuilder/lang.go @@ -0,0 +1,17 @@ +package packbuilder + +import ( + "os" + "path/filepath" + "strings" +) + +// buildLanguageFile creates a lang file and writes all of the language entries to the pack. +func buildLanguageFile(dir string, lang []string) { + if err := os.Mkdir(filepath.Join(dir, "texts"), os.ModePerm); err != nil { + panic(err) + } + if err := os.WriteFile(filepath.Join(dir, "texts/en_US.lang"), []byte(strings.Join(lang, "\n")), 0666); err != nil { + panic(err) + } +} diff --git a/packbuilder/manifest.go b/packbuilder/manifest.go new file mode 100644 index 0000000..ce438ef --- /dev/null +++ b/packbuilder/manifest.go @@ -0,0 +1,52 @@ +package packbuilder + +import ( + "encoding/json" + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/resource" + "os" + "path/filepath" + "strconv" + "strings" +) + +// buildManifest creates a JSON manifest file for the client to be able to read the resource pack. It creates +// basic information and writes it to the pack. +func buildManifest(dir, version string, headerUUID, moduleUUID uuid.UUID) { + m, err := json.Marshal(resource.Manifest{ + FormatVersion: 2, + Header: resource.Header{ + Name: "dragonfly auto-generated resource pack", + Description: "This resource pack contains auto-generated content from dragonfly", + UUID: headerUUID, + Version: [3]int{0, 0, 1}, + MinimumGameVersion: parseVersion(version), + }, + Modules: []resource.Module{ + { + UUID: moduleUUID.String(), + Description: "This resource pack contains auto-generated content from dragonfly", + Type: "resources", + Version: [3]int{0, 0, 1}, + }, + }, + }) + if err != nil { + panic(err) + } + if err := os.WriteFile(filepath.Join(dir, "manifest.json"), m, 0666); err != nil { + panic(err) + } +} + +// parseVersion parses the version passed in the format of a.b.c as a [3]int. +func parseVersion(ver string) [3]int { + frag := strings.Split(ver, ".") + if len(frag) != 3 { + panic("invalid version number " + ver) + } + a, _ := strconv.ParseInt(frag[0], 10, 64) + b, _ := strconv.ParseInt(frag[1], 10, 64) + c, _ := strconv.ParseInt(frag[2], 10, 64) + return [3]int{int(a), int(b), int(c)} +} diff --git a/packbuilder/resource_pack.go b/packbuilder/resource_pack.go new file mode 100644 index 0000000..f8c1fbb --- /dev/null +++ b/packbuilder/resource_pack.go @@ -0,0 +1,40 @@ +package packbuilder + +import ( + "github.com/df-mc/dragonfly/server/world" + "github.com/rogpeppe/go-internal/dirhash" + "github.com/sandertv/gophertunnel/minecraft/resource" + "os" +) + +// BuildResourcePack builds a resource pack based on custom features that have been registered to the server. +// It creates a UUID based on the hash of the directory so the client will only be prompted to download it +// once it is changed. +func BuildResourcePack(customItems []world.CustomItem, version string) (*resource.Pack, bool) { + dir, err := os.MkdirTemp("", "dragonfly_resource_pack-") + if err != nil { + panic(err) + } + defer os.RemoveAll(dir) + + var assets int + var lang []string + + itemCount, itemLang := buildItems(dir, customItems) + assets += itemCount + lang = append(lang, itemLang...) + + if assets > 0 { + buildLanguageFile(dir, lang) + hash, err := dirhash.HashDir(dir, "", dirhash.Hash1) + if err != nil { + panic(err) + } + var header, module [16]byte + copy(header[:], hash) + copy(module[:], hash[16:]) + buildManifest(dir, version, header, module) + return resource.MustReadPath(dir), true + } + return nil, false +}