From 257f3b1ec08cbf03cf6246cd0c469468df8a3973 Mon Sep 17 00:00:00 2001 From: kay27 Date: Mon, 7 Feb 2022 05:37:54 +0400 Subject: [PATCH 1/2] Rewrite chests callback processing and drops --- mods/ITEMS/mcl_chests/init.lua | 45 ++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 664104b64..c753aa5b6 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -291,27 +291,40 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end end - local function drop_items_chest(pos, oldnode, oldmetadata) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - if oldmetadata then - meta:from_table(oldmetadata) - end - local inv = meta:get_inventory() - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) + local function drop_item_stack(pos, stack) + if not stack or stack:is_empty() then return end + local drop_offset = vector.new(math.random() - 0.5, 0, math.random() - 0.5) + minetest.add_item(vector.add(pos, drop_offset), stack) end - local function on_chest_blast(pos) + local function drop_items_chest(pos, oldnode, oldmetadata, digger) + if oldmetadata and oldmetadata.inventory then + -- process after_dig_node callback + local main = oldmetadata.inventory.main + if not main then return end + for _, stack in pairs(main) do + drop_item_stack(pos, stack) + end + else + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, inv:get_size("main") do + drop_item_stack(pos, inv:get_stack("main", i)) + end + meta:from_table() + end + end + + local function on_chest_blast(pos, intensity) local node = minetest.get_node(pos) drop_items_chest(pos, node) minetest.remove_node(pos) + -- drop node itself with some probability depended on explosion intensity (1 for TNT): + if math.random(1, math.floor((intensity or 1) * 2)) ~= 1 then return end + local node_def = minetest.registered_nodes[node.name] + if not node_def then return end + local node_name = node_def.drop or node_def.name + drop_item_stack(pos, ItemStack(node_name)) end local function limit_put_list(stack, list) From bbd447b8612832b2929d2af19c7a9055041c17e3 Mon Sep 17 00:00:00 2001 From: kay27 Date: Mon, 7 Feb 2022 06:39:12 +0400 Subject: [PATCH 2/2] Add barrels by AFCMS as a part of mcl_chests --- mods/ITEMS/mcl_chests/init.lua | 152 +++++++++++++----- mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr | 2 + mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr | 2 + mods/ITEMS/mcl_chests/locale/template.txt | 2 + mods/ITEMS/mcl_chests/mod.conf | 1 + .../textures/mcl_barrels_barrel_bottom.png | Bin 0 -> 542 bytes .../textures/mcl_barrels_barrel_side.png | Bin 0 -> 499 bytes .../textures/mcl_barrels_barrel_top.png | Bin 0 -> 566 bytes .../textures/mcl_barrels_barrel_top_open.png | Bin 0 -> 421 bytes 9 files changed, 115 insertions(+), 44 deletions(-) create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_side.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top.png create mode 100644 mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_top_open.png diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index c753aa5b6..8b344d462 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,4 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize local mod_doc = minetest.get_modpath("doc") -- Chest Entity @@ -174,7 +176,7 @@ end]] local function player_chest_open(player, pos, node_name, textures, param2, double, sound, mesh, shulker) local name = player:get_player_name() open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh, shulker = shulker} - if animate_chests then + if animate_chests and not string.find(node_name, "barrel") then local dir = minetest.facedir_to_dir(param2) find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", dir):open(name) end @@ -226,6 +228,8 @@ local function chest_update_after_close(pos) minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) + elseif node.name == "mcl_chests:barrel_open" then + minetest.swap_node(pos, {name = "mcl_chests:barrel", param2 = node.param2}) end end @@ -236,7 +240,7 @@ local function player_chest_close(player) if open_chest == nil then return end - if animate_chests then + if animate_chests and not string.find(open_chest.node_name, "barrel") then find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name) end chest_update_after_close(open_chest.pos) @@ -491,10 +495,10 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -642,12 +646,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -790,12 +794,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -915,38 +919,6 @@ register_chest("trapped_chest_on", "trapped_chest" ) ---[[local function close_if_trapped_chest(pos, player) - local node = minetest.get_node(pos) - - if node.name == "mcl_chests:trapped_chest_on_small" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_left" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) - mesecon.receptor_off(pos, trapped_chest_mesecons_rules) - - local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") - mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) - - player_chest_close(player) - end -end]] - -- Disable chest when it has been closed minetest.register_on_player_receive_fields(function(player, formname, fields) if formname:find("mcl_chests:") == 1 then @@ -1003,10 +975,10 @@ minetest.register_node("mcl_chests:ender_chest", { }) local formspec_ender_chest = "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. + "label[0,0;"..F(C("#313131", S("Ender Chest"))).."]".. "list[current_player;enderchest;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1138,10 +1110,10 @@ local function formspec_shulker_box(name) name = S("Shulker Box") end return "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(C("#313131", name)).."]".. "list[context;main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1449,3 +1421,95 @@ minetest.register_lbm({ minetest.get_meta(pos):set_string("formspec", "") end, }) + +local function barrel_open(pos, node, clicker) + local name = minetest.get_meta(pos):get_string("name") + + if name == "" then + name = S("Barrel") + end + + local playername = clicker:get_player_name() + + minetest.show_formspec(playername, + "mcl_chests:barrel_"..pos.x.."_"..pos.y.."_"..pos.z, + table.concat({ + "size[9,8.75]", + "label[0,0;"..F(C("#313131", name)).."]", + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]", + mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3), + "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]", + "list[current_player;main;0,4.5;9,3;9]", + mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3), + "list[current_player;main;0,7.74;9,1;]", + mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1), + "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]", + "listring[current_player;main]", + }) + ) + + minetest.swap_node(pos, { name = "mcl_chests:barrel_open", param2 = node.param2 }) + player_chest_open(clicker, pos, "mcl_chests:barrel") +end + +minetest.register_node("mcl_chests:barrel", { + description = S("Barrel"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + tiles = {"mcl_barrels_barrel_top.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + on_place = function(itemstack, placer, pointed_thing) + minetest.rotate_and_place(itemstack, placer, pointed_thing, minetest.is_creative_enabled(placer:get_player_name()), {}, false) + return itemstack + end, + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) + end, + after_dig_node = drop_items_chest, + on_blast = on_blast, + on_rightclick = barrel_open, + on_destruct = close_forms, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +minetest.register_node("mcl_chests:barrel_open", { + description = S("Barrel Open"), + _tt_help = S("27 inventory slots"), + _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), + _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), + _doc_items_create_entry = false, + tiles = {"mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mcl_chests:barrel", + stack_max = 64, + sounds = mcl_sounds.node_sound_wood_defaults(), + groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1, not_in_creative_inventory = 1}, + after_dig_node = drop_items_chest, + on_blast = on_blast, + on_rightclick = barrel_open, + on_destruct = close_forms, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +--Minecraft Java Edition craft +minetest.register_craft({ + output = "mcl_chests:barrel", + recipe = { + {"group:wood", "group:wood_slab", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood_slab", "group:wood"}, + } +}) diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr index b84dac022..0956c8705 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.fr.tr @@ -34,3 +34,5 @@ Can be combined to a large chest=Peut être combiné à un grand coffre 27 interdimensional inventory slots=27 emplacements d'inventaire interdimensionnels Put items inside, retrieve them from any ender chest=Mettez des objets à l'intérieur, récupérez-les dans n'importe quel coffre Emits a redstone signal when opened=Émet un signal redstone à l'ouverture +Barrel=Tonneau +Barrels are containers which provide 27 inventory slots.=Les tonneaux sont des conteneurs qui offrent 27 emplacements d'inventaire. diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr index dc25458c2..f06ada538 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr @@ -34,3 +34,5 @@ Can be combined to a large chest=Можно объединить в большо 27 interdimensional inventory slots=27 межпространственных отсеков инвентаря Put items inside, retrieve them from any ender chest=Положите внутрь предмет и получите его из любого сундука Предела Emits a redstone signal when opened=Подаёт сигнал редстоуна, будучи открытым +Barrel=Бочка +Barrels are containers which provide 27 inventory slots.=Бочки это хранилища, предоставляющие 27 отсеков инвентаря. diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index d680c24c9..fffeaaac7 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -34,3 +34,5 @@ Can be combined to a large chest= 27 interdimensional inventory slots= Put items inside, retrieve them from any ender chest= Emits a redstone signal when opened= +Barrel= +Barrels are containers which provide 27 inventory slots.= diff --git a/mods/ITEMS/mcl_chests/mod.conf b/mods/ITEMS/mcl_chests/mod.conf index 0ff5129ca..a7c66a09e 100644 --- a/mods/ITEMS/mcl_chests/mod.conf +++ b/mods/ITEMS/mcl_chests/mod.conf @@ -1,3 +1,4 @@ name = mcl_chests +author = Wuzzy, Fleckenstein, AFCMS depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png b/mods/ITEMS/mcl_chests/textures/mcl_barrels_barrel_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5788061835706c6f4045a97ef519f3741ad999 GIT binary patch literal 542 zcmV+(0^$9MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0000XbVXQnLvm$dbZKvHAXI5>WdJfTF*7U;qFCU`a$lR5(v{l0Q$wFc8Jb#f@E&G&D_G3azNRFd#9o zFfg#NG4cIB07wX^}$@QE?LY4_>tYMrO< zbeKWYe)8t)=;{6jQPX@K?a;OxthGt-19h%PE=hWV8bYS?YQVv4Qs6+Bvl2QU4XTqA z0WvDfy6(~ticOu>WH?xkl%lgH#-TBxQKBIra|!-tyH!fl>HuVFg|W1j9w>;!YMnp< zVxd1Jnj=iFprG!nk65&UkmEn7tQ(p;Ce$~-HyH3|!EWexU*l0hbA$^3S~iSFa5prs z26*ATspgWm@B{~|5Xe|&LPvdpVoL>ALx_1R9#yk}%F8L|@@xtx!k gHG^YoB=$}F1C39vlPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jUA5 z5Ge)$lJ5xs00DDJL_t(I%gvKZZxb;Tg}+W`JRad8G^0qV3SvV+ND(aA^#A_=wyOmKD+t)@o}OgsuFa@qbkAe>Yh*UW-MFH{Gw)~ z4XeA3iITXmr>QGCUsG43SQamx85eD|;a{=TK3gmnj{sHG zGfOD}P)d!9x()zqEda*!4f1%2XC!OemSdzj5&5M$=W6zvwKg<$h2K4(t>gXd4a-(@ zecABi_nK{I`Sy9vuhkt*U9r}N?e=f4f!{q)%MvBalMdQ?<`?x~ALnJyi4FiC!n68$ zPA$bjn}TJldp!=hBZ3sx?glb#Jue}1&LfJ9GCw~FrlUvF6N0i7!@F*@!G%3i7Q^W2 z$S&*=#dzrdU=OCnp2_6Zu;=lUeED$2MjNJw-T(gcmg~1ud$n#N$ pREwy?iHOIDzH}$bQVez~Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jUA5 z5Go^KyJ(F700Fj1L_t(I%Y~E8Zqq;%g})|a&sgyg<4_7xMJ2YZV8fCPFTl(4AQ3y* zpte%l$ZnExH9t;M7LMIGb;a3?d}cgz&$;KGeE<6CQ7cKV6G~%=qY;I%T%2Z<#&*1M z9<3xTa-HyZx#HxxAX1>WEw?0B99=KN%N#+^@@9 zoU57X1W_6bfD~iGcFW?<@b0z7xIk$vVY}@vTI^RT#-Je7J476f@IDY{DY;I1FAr7G zK6qPfnhJ_NadlH-++V;xuEvzUTZb@0BalF|iN;9WT>yvzaQ^m1|6_ zoM$?nbmjk?Ujp#?Lq@7(PsX7fzkMLr2_jXJ>*a>UonZlF*(+A74V4X4Hgv|d)x^=L zlT#Y|)P-0Ga-EPmPx|(ZmryxRsCSL=(FkFj$NRw5P04Z<|2II-Oq}V2_4=NV=WlqQ zHT@sbecaCZpXQL70(Y)*K0-AbW|YuPggwCIK!T=@W7fo&!x$^>lFzu{b?9 z*w+8Bfk5rnr2CO)HA5Gj`^%W4)1&i;@!$U=F{)Zc6W&H-Nghz-Y;?L`_Wbv!z16dq zx9{#YSSZ$gu2N#{1*`tUb?xVVUVQJ=VxYKKtb6)n&e_k8|L*1%R8-M9xMu&)BALx? z1`AgleN^#^k-?B}^Mj>x9a99HoRq~}pa01!xZgfAcAAZLOlUOE%br6SrrvRCdVhCb zc>P*hYGc6L=PcV7l*+x@a6k6#J~PgVjRuZi6&J1A_W#|vHG$o&S~J5m_p}KJSv_C4 zOS)X(F~effDcprAiC$OzXB^vd&e=36Kh1H*g0_-*x*K&WOD8Rze`0~y@6uB)X=MTX zYuisSFjzge_nR51++t$)XR6y`(Jr0KZaQrxa;a8ZH_zF8WVv?@yV=xff0);(>;Q%# NgQu&X%Q~loCIAn3txf;{ literal 0 HcmV?d00001