From 3a36c425da1f1c1bf99e741be8ab40defbd70247 Mon Sep 17 00:00:00 2001 From: sys4-fr Date: Sat, 8 Sep 2018 00:36:44 +0200 Subject: [PATCH] Version MFF. --- README.md | 0 areas.lua | 92 ++++++++++++++++---------------- depends.txt | 0 init.lua | 10 ++-- land_title_register.lua | 14 ++--- marker_stone.lua | 0 textures/compass_side_top.png | Bin 684 -> 471 bytes textures/markers_mark.png | Bin 377 -> 281 bytes textures/markers_stone.png | Bin 793 -> 686 bytes textures/markers_stone_side.png | Bin 832 -> 743 bytes 10 files changed, 58 insertions(+), 58 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 areas.lua mode change 100644 => 100755 depends.txt mode change 100644 => 100755 init.lua mode change 100644 => 100755 land_title_register.lua mode change 100644 => 100755 marker_stone.lua mode change 100644 => 100755 textures/compass_side_top.png mode change 100644 => 100755 textures/markers_mark.png mode change 100644 => 100755 textures/markers_stone.png mode change 100644 => 100755 textures/markers_stone_side.png diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/areas.lua b/areas.lua old mode 100644 new mode 100755 index f804f7f..4888103 --- a/areas.lua +++ b/areas.lua @@ -107,7 +107,7 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se table.insert( id_list, id ); end end - + elseif( mode=='all' ) then title = 'All areas withhin '..tostring( markers.AREA_RANGE )..' m:'; @@ -142,7 +142,7 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se "label[4.7,0;"..tlabel.."]".. "label[0.5,8.5;Doubleclick to select area.]".. "label[4.7,8.5;Areas found: "..tostring( #id_list )..".]".. - "textlist[0.5,0.5;7,8;markers_area_list_selection;"; + "textlist[0.5,0.5;7,8;markers_area_list_selection;"; local liste = ''; for i,v in ipairs( id_list ) do @@ -150,7 +150,7 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se liste = liste..','; end liste = liste..minetest.formspec_escape( areas:toString( v ) ); - + end -- highlight selected entry @@ -159,14 +159,14 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se else formspec = formspec..liste..';]'; end - + local pname = player:get_player_name(); if( not( markers.menu_data_by_player[ pname ] )) then markers.menu_data_by_player[ pname ] = {}; end -- display information about the location of the area the player clicked on - if( selected + if( selected and id_list[ selected ] and areas.areas[ id_list[ selected ]] ) then @@ -185,7 +185,7 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se if( this_area.parent) then formspec = formspec.. - 'button[8.0,0.5;2,0.5;show_parent;'.. + 'button[8.0,0.5;2,0.5;show_parent;'.. minetest.formspec_escape( areas.areas[ this_area.parent ].name )..']'; end @@ -194,7 +194,7 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se 'button[8.0,1.0;2,0.5;list_subareas;'.. minetest.formspec_escape( 'List subareas ('..tostring( #subareas )..')')..']'; end - + if( mode=='player' ) then formspec = formspec.. @@ -222,8 +222,8 @@ markers.get_area_list_formspec = function(ppos, player, mode, pos, mode_data, se selected = id_list[ selected ], }; - - + + return formspec; end @@ -278,7 +278,7 @@ markers.get_area_desc_formspec = function( id, player, pos ) and this_area.parent and areas.areas[ this_area.parent ] and areas.areas[ this_area.parent ].owner == pname ) then - + formspec = formspec.. 'button_exit[8.0,1.0;2,0.5;delete;Delete subarea]'.. 'button_exit[8.0,2.0;2,0.5;list_player_areas;Player\'s areas]'; @@ -325,12 +325,12 @@ markers.get_area_desc_formspec = function( id, player, pos ) else formspec = formspec.. 'label[4.7,2.5;-none-]'; - + if( is_owner ) then formspec = formspec.. 'button_exit[8.0,2.5;2,0.5;add_owner;Add]'; end - end + end -- is the area a subarea? @@ -340,7 +340,7 @@ markers.get_area_desc_formspec = function( id, player, pos ) 'label[4.7,3.0;'..minetest.formspec_escape( areas.areas[ this_area.parent ].name..' ['..this_area.parent..']' )..']'.. 'button_exit[8.0,3.0;2,0.5;show_parent;Show main area]'; end - + -- does the area have subareas, i.e. is it a parent area for others? local sub_areas = {}; @@ -391,14 +391,14 @@ markers.get_area_desc_formspec = function( id, player, pos ) -- player selected markers.menu_data_by_player[ pname ] = { typ = 'show_area', - mode = nil, + mode = nil, pos = pos, mode_data = nil, list = nil, selected = id, }; - + return formspec; end @@ -413,10 +413,10 @@ markers.show_compass_marker = function( col_offset, row_offset, with_text, pos, -- TODO: what if checked with a land claim register? -- if possible, show how far the area streches into each direction relative to pos - if( pos.x >= pos1.x and pos.x <= pos2.x - and pos.y >= pos1.y and pos.y <= pos2.y + if( pos.x >= pos1.x and pos.x <= pos2.x + and pos.y >= pos1.y and pos.y <= pos2.y and pos.z >= pos1.z and pos.z <= pos2.z ) then - + if( with_text ) then formspec = formspec.. 'label[0.5,5.5;Dimensions of the area in relation to..]'.. @@ -468,7 +468,7 @@ markers.show_compass_marker = function( col_offset, row_offset, with_text, pos, 'label['..(col_offset+0.1)..','..(row_offset-0.80)..';'..starts_north..']'.. 'label['..(col_offset+0.1)..','..(row_offset+0.80)..';'..starts_south..']'; end - + return formspec; end @@ -483,32 +483,32 @@ markers.form_input_handler_areas = function( player, formname, fields) if( formname ~= "markers:info" or not( player ) or not( markers.menu_data_by_player[ pname ] )) then - + return false; end - + local menu_data = markers.menu_data_by_player[ pname ]; local formspec = ''; -- rename an area - if( fields.rename + if( fields.rename and menu_data.selected and areas.areas[ menu_data.selected ] and areas.areas[ menu_data.selected ].owner == pname ) then - + local area = areas.areas[ menu_data.selected ]; if( not( area.name )) then area.name = '-enter area name-'; end formspec = 'field[rename_new_name;Enter new name for area:;'..minetest.formspec_escape( area.name )..']'; - elseif( fields.rename_new_name + elseif( fields.rename_new_name and menu_data.selected and areas.areas[ menu_data.selected ] - and ((areas.areas[ menu_data.selected ].owner == pname ) + and ((areas.areas[ menu_data.selected ].owner == pname ) or minetest.check_player_privs(pname, {areas=true}))) then - + local area = areas.areas[ menu_data.selected ]; -- actually rename the area @@ -525,7 +525,7 @@ markers.form_input_handler_areas = function( player, formname, fields) elseif( fields.change_owner and menu_data.selected and areas.areas[ menu_data.selected ] ) then - + -- there are no checks here - those happen when the area is transferred local area = areas.areas[ menu_data.selected ]; formspec = 'field[change_owner_name;Give area \"'..minetest.formspec_escape( area.name )..'\" to player:;-enter name of NEW OWNER-]'; @@ -537,9 +537,9 @@ markers.form_input_handler_areas = function( player, formname, fields) local area = areas.areas[ menu_data.selected ]; -- only own areas can be transfered to another player (or if the areas priv is there) - if( area.owner ~= pname + if( area.owner ~= pname and not( minetest.check_player_privs(pname, {areas=true}))) then - + minetest.chat_send_player( pname, 'Permission denied. You do not own the area.'); elseif( not( areas:player_exists( fields.change_owner_name ))) then @@ -564,11 +564,11 @@ markers.form_input_handler_areas = function( player, formname, fields) and menu_data.selected and areas.areas[ menu_data.selected ] and areas.areas[ menu_data.selected ].owner == pname ) then - + local area = areas.areas[ menu_data.selected ]; formspec = 'field[add_owner_name;Grant access to area \"'..minetest.formspec_escape( area.name )..'\" to player:;-enter player name-]'; - elseif( fields.add_owner_name + elseif( fields.add_owner_name -- the player has to own the area already; we need a diffrent name here and fields.add_owner_name ~= pname and menu_data.selected @@ -608,20 +608,20 @@ markers.form_input_handler_areas = function( player, formname, fields) -- delete area - elseif( fields.delete + elseif( fields.delete and menu_data.selected and areas.areas[ menu_data.selected ] ) then local area = areas.areas[ menu_data.selected ]; -- a player can only delete own areas or subareas of own areas - if( area.owner ~= pname - and not( area.parent - and areas.areas[ area.parent ] + if( area.owner ~= pname + and not( area.parent + and areas.areas[ area.parent ] and areas.areas[ area.parent ].owner and areas.areas[ area.parent ].owner == pname ) and not( minetest.check_player_privs(pname, {areas=true}))) then - + minetest.chat_send_player( pname, 'Permission denied. You own neither the area itshelf nor its parent area.'); -- shwo the area where the renaming failed formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); @@ -634,10 +634,10 @@ markers.form_input_handler_areas = function( player, formname, fields) end - elseif( fields.delete_confirm + elseif( fields.delete_confirm and menu_data.selected and areas.areas[ menu_data.selected ] ) then - + local area = areas.areas[ menu_data.selected ]; local old_owner = area.owner; @@ -649,13 +649,13 @@ markers.form_input_handler_areas = function( player, formname, fields) end -- a player can only delete own areas or subareas of own areas - if( area.owner ~= pname - and not( area.parent - and areas.areas[ area.parent ] + if( area.owner ~= pname + and not( area.parent + and areas.areas[ area.parent ] and areas.areas[ area.parent ].owner and areas.areas[ area.parent ].owner == pname ) and not( minetest.check_player_privs(pname, {areas=true}))) then - + minetest.chat_send_player( pname, 'Permission denied. You own neither the area itshelf nor its parent area.'); -- shwo the renamed area formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); @@ -666,7 +666,7 @@ markers.form_input_handler_areas = function( player, formname, fields) formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); -- only areas without subareas can be deleted - elseif( #subareas > 0 ) then + elseif( #subareas > 0 ) then minetest.chat_send_player( pname, 'The area has '..tostring( #subareas )..' subarea(s). Please delete those first!'); formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); @@ -707,7 +707,7 @@ markers.form_input_handler_areas = function( player, formname, fields) elseif( fields.list_main_areas ) then formspec = markers.get_area_list_formspec(ppos, player, 'main_areas', menu_data.pos, nil, nil ); - + elseif( fields.list_areas_at and menu_data.pos ) then @@ -754,7 +754,7 @@ markers.show_marker_stone_formspec = function( player, pos ) local pname = player:get_player_name(); local ppos = pos - -- this table stores the list the player may have selected from; at the beginning, there is no list + -- this table stores the list the player may have selected from; at the beginning, there is no list if( not( markers.menu_data_by_player[ pname ] )) then markers.menu_data_by_player[ pname ] = { typ = 'area_list', @@ -801,7 +801,7 @@ markers.show_marker_stone_formspec = function( player, pos ) 'label[0.5,0.5;This position is not protected.]'.. 'button[1.0,1.5;2,0.5;list_main_areas;List all main areas]'.. 'button_exit[3.0,1.5;1,0.5;abort;OK]'; - + -- found exactly one areaa - display it elseif( #found_areas == 1 ) then diff --git a/depends.txt b/depends.txt old mode 100644 new mode 100755 diff --git a/init.lua b/init.lua old mode 100644 new mode 100755 index 2e72af0..615eeae --- a/init.lua +++ b/init.lua @@ -128,7 +128,7 @@ markers.marker_placed = function( pos, placer, itemstack ) end -- make sure the list does not grow too large - if( n > markers.MAX_MARKERS ) then + if( n > markers.MAX_MARKERS and minetest.get_player_privs(name)["megabuilder"] ~= true) then table.remove( markers.positions[ name ], 1 ); end end @@ -284,7 +284,7 @@ markers.get_marker_formspec = function(player, pos, error_msg) * (math.abs( coords[1].z - coords[2].z )+1); -- check if area is too large - if( markers.MAX_SIZE < size ) then + if( markers.MAX_SIZE < size and minetest.get_player_privs(name)["megabuilder"] ~= true) then return formspec_info.."Error: You can only protect\nareas of up to "..tostring( markers.MAX_SIZE ).."m^2.\n".. "Your marked area is "..tostring( size ).." m^2 large.]"; end @@ -374,19 +374,19 @@ markers.marker_on_receive_fields = function(pos, formname, fields, sender) local add_depth = tonumber( fields['add_depth'] ); local error_msg = ''; - if( not( add_height ) or add_height < 0 or add_height > markers.MAX_HEIGHT ) then + if( not( add_height ) or add_height < 0 or (add_height > markers.MAX_HEIGHT and minetest.get_player_privs(name)["megabuilder"] ~= true)) then minetest.chat_send_player( name, 'Please enter a number between 0 and '..tostring( markers.MAX_HEIGHT ).. ' in the field where the height of your area is requested. Your area will stretch that many blocks '.. 'up into the sky from the position of this marker onward.'); error_msg = 'The height value\nhas to be larger than 0\nand smaller than '..tostring( markers.MAX_HEIGHT ); - elseif( not( add_depth ) or add_depth < 0 or add_depth > markers.MAX_HEIGHT ) then + elseif( not( add_depth ) or add_depth < 0 or (add_depth > markers.MAX_HEIGHT and minetest.get_player_privs(name)["megabuilder"] ~= true)) then minetest.chat_send_player( name, 'Please enter a number between 0 and '..tostring( markers.MAX_HEIGHT ).. ' in the field where the depth of your area is requested. Your area will stretch that many blocks '.. 'into the ground from the position of this marker onward.'); error_msg = 'The depth value\nhas to be larger than 0\nand smaller than '..tostring( markers.MAX_HEIGHT ); - elseif( add_height + add_depth > markers.MAX_HEIGHT ) then + elseif( add_height + add_depth > markers.MAX_HEIGHT ) and minetest.get_player_privs(name)["megabuilder"] ~= true then minetest.chat_send_player( name, 'Sorry, your area exceeds the height limit. Height and depth added have to '.. 'be smaller than '..tostring( markers.MAX_HEIGHT )..'.'); error_msg = 'height + depth has to\nbe smaller than '..tostring( markers.MAX_HEIGHT )..'.' diff --git a/land_title_register.lua b/land_title_register.lua old mode 100644 new mode 100755 index 4156acb..607aac8 --- a/land_title_register.lua +++ b/land_title_register.lua @@ -3,7 +3,7 @@ minetest.register_tool( "markers:land_title_register", { description = "Land title register. Left-click with it to get information about who owns the land you clicked on.", - groups = {}, + groups = {}, inventory_image = "default_book.png", -- TODO wield_image = "", wield_scale = {x=1,y=1,z=1}, @@ -14,9 +14,9 @@ minetest.register_tool( "markers:land_title_register", full_punch_interval = 1.0, max_drop_level=0, groupcaps={ - fleshy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1}, - snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1}, - choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0} + fleshy={times={[2]=0.80, [3]=0.40}, uses = 1/0.05, maxlevel=1}, + snappy={times={[2]=0.80, [3]=0.40}, uses = 1/0.05, maxlevel=1}, + choppy={times={[3]=0.90}, uses = 1/0.05, maxlevel=0} } }, node_placement_prediction = nil, @@ -30,7 +30,7 @@ minetest.register_tool( "markers:land_title_register", -- the position is what we're actually looking for local pos = minetest.get_pointed_thing_position( pointed_thing, false ); -- not above - + if( not( pos ) or not( pos.x )) then minetest.chat_send_player( name, "Position not found."); return itemstack; @@ -41,7 +41,7 @@ minetest.register_tool( "markers:land_title_register", return itemstack; -- nothing consumed, nothing changed end, - + on_use = function(itemstack, placer, pointed_thing) @@ -51,7 +51,7 @@ minetest.register_tool( "markers:land_title_register", local name = placer:get_player_name(); local pos = minetest.get_pointed_thing_position( pointed_thing, false ); -- not above - + if( not( pos ) or not( pos.x )) then minetest.chat_send_player( name, "Position not found."); return itemstack; diff --git a/marker_stone.lua b/marker_stone.lua old mode 100644 new mode 100755 diff --git a/textures/compass_side_top.png b/textures/compass_side_top.png old mode 100644 new mode 100755 index 3c87c57b99a92dd5e3ad8d08c8217a4db7fcc95b..4ad1eb51b38cb6e238d1541701b6e9c2a9eff8b3 GIT binary patch delta 456 zcmZ3(dYyTKWIZzj1A~Sxe=v|b8Q>G*D*EiV!EaF$F?Lfic5`ud3vqTU33h8Bl4Q4) z;&71Wa0DV54ksB7XBiF`Ad=;DljC%kROSv;;|)^h z4bcE1zEBnJP))utO}=m~zDR8#;*ZwhuaD8?kJaUm(-Vl-6G+e(NHh>g0wKXeTp%(R&NCOzw-7F{5Gk}2DY6nNvl0FA zTlBZ6l-mbZageV(T^vIyZpEItUDjkE(E4!ZJe?@fsd8JshBz}Ba@3n?WUM~0=fAV% z%TK5Nf116O{e>Ds{)6AOTyZZlzg^>!YG4h0g8 qc(~w79_x$yiSIw|J1o5CB~yf<@=RNS{@*}vF?hQAxvXW z!l3O~!P7JkG7uN z!;x{skr;U(hu{#v`arku$*d={fot=IZ#yX;J{H|R6j$hcAU~Oc@quQ$N0tYy3yi0d zRrx^Oqe*j5*4WVW)4=w-z002ovPDHLk FV1mF)B$EID diff --git a/textures/markers_mark.png b/textures/markers_mark.png old mode 100644 new mode 100755 index 76cc6c09ceebdd13707ffe6d4b904dc3befd6ce8..6a7da6527e8dc78b3d5d868c2e25df016ed65d65 GIT binary patch delta 265 zcmV+k0rvj+0+|Ak8Gi!+001a04^sdD07XztR7L0K=jiC@>FMd}>gwz3>+J08?d|RE z?(XmJ@9^;O@$vEU^78ZZ^Z!Rj|4B*zOH2PvP5)0%|4~u@Q&ay{RsUC4|5;f{DXq-_ z0056kL_t&-83n({gKbGjgyQcHA~1spRM8rMyZI@10W-D@W?+U0S_AXsxMN)>*&XgU4oMzF z0AO7wGY4J`0A{Fy`E$tcdEWeQXv&K~l_$=9YNsXlsgle~0)JqrV%u(w1brf=4T#KF zX1@J=uO;u@(Hd00a|+zC@AE1_mv3eq$Bh0ddOn{KK|}zU+1(?el;Z9Hh$tf5y_6CW z03;$FkH;8;nUi+$BVvppBFPzJm>GZlLn-+M2m zj4=SzTHo(?!eS(y5fKroYBsgj6sonF8GzPW0yrY}ea{TbvWQ42#mrK&_ddqxywYSzb!gQz%LG{{ClncRMQ6$?xOwB7caw9XE~>O;a1T;fF~j zDzDSL8c$#DY}{NjST-Qc8TZCblVpN(H+nc>4%`Bu6q9}|e zNv0}{5GhG>T~mleoowQ=?I=pAL`YRtah!SWCY32Ppw0K6 zN8f%NLX}~tjDNAKn`xF7=cCE0T2a@r2q8_!dYt+5c~}Zjuj)9?WhU2kJzs>jrT<^1 z*KO&hMoTVyKW2)oYpUazhNh}2!>U-1^UCww;b<}#c=Khb8(JJ?4Ad~xZQ4mveEE8S zN|{o_(1IYjxI8LLj{3ISK)cz@M;fzC9dNj)R&~{1YkvW}rYU79FpW^s^;*-1xu_~d zWxchwAH+`uhN<5_Eb3a?d;j|Geu0<6<1>j!ANJk~UIBO0vAGZc(`h?2D@sja(yHFt zSi{qx-+=-khE{CFpNDhKK|fA&yntgKr`a-y7t7EvbU2_enGmY$+U~2(>+uv0AQhB0 z2AzU)R)1A12-@200ZW<}x^ChqK7D+rsmkf!YrA2h>w3Qf%Zq}0SP66~CD0u_yLdLd zZMhBno6Q5z>vh|*EW>YJis|EW>Bkf%D2f6`Ub_JrfEY%J<54x?%+00000NkvXX Hu0mjfKnO$N delta 781 zcmV+o1M>W?1(^nr8Gi-<001BJ|6u?C0^mtRK~y-)J(5jt)K&lh$ItKibJy$adb9Z| z2(?13I3ZO?z4XwZTaLZ-R8^JAHBC?}R0shAA%X11UVq!~**ygHI)~95#=5$AKAxYw z;KBU^%DSPd8>*@$2wWIJYlCfD2qCDO4!C15^7QG?$d4b+>3^zA{yx26ljSTIF-1}0 zx(?HcPr5BJ+K?<}yuG;Q>j#Ite{+fBC?=tgux&xx^)zkAY8j)oCXOexUC+&C%XV84 z1TIzGa{p*WS=EH0kFYG1l8Cabag@ZepsX4^S7Bk@G2pw0UlIB~d0vy{C6mBsnanuY zo0I1i0?Wb}Lw`}!B=Z@<7F1P>Qj*{QJmI%Ljw$N~-*=Ew^7j2Tb=C6f{F1>8h&T$d zEQ?tb^7$rZz24Gk%{Yt{MT0GE#&Kl5*)j>e|I=5?9lXFrbiF1`3#78~T!$zM@LdPT zktiwfTt(j-k|gHr{F43sg!Szf&vz;E8d*0TQcB|4gnzPZ`Q_JVNM&OSf$zIyS;^}+ zCv;tp<4ET56wh_Ixk-s<6J!{8XszkBVHgd2yE_OWa9u^$X`(2=5*Ev3hwD#kv@s}0 zvf7=KX2qSr4?M0uZ5T&*^8L4byxI^39>=FI!Ga&2JVN(|)iP!lP3X0zC~6k-2vN5k zu97f}+ZtRMOAZ~6>M&|_`Zh) zC~0F^0?%`K_{|aTF0NT7Gm5G~Daqmfg0}CG#te9_!@Z*wo~x*u7S9Vvw*?-+xygd8BPCTV;dv4YlQc70KIks(+ z=QVw&x&D01ZCW7Gv_L6^8Ag)%6m1NSBiZI9Q51f;(8X~ij*_%pj}R6XFq;O*ljCPR z|K~Nn@6dLd!3_Amiy1~j-yuy4{yKeyHU?=6v>A{>uugMUNz8vCcyp?(B-9810000< LMFvhpu0mjf@DzXh diff --git a/textures/markers_stone_side.png b/textures/markers_stone_side.png old mode 100644 new mode 100755 index 7230e74c093417b1d6d60284758a9cd6c5ca533f..cf22037b4da4329c80c2e85e290a91b08f1ad1fd GIT binary patch delta 730 zcmV<00ww*x2ImEk8Gix*005AYXf^-<0_Drv(7X0&`S<&T_;Xtt9BDL)xU%Q!LkeNF7*4P&HUr+^K?8KW;7=> zC!{b84b*^hA% zRRs~8-cCMQhUTA+zC2HlX*%+~=kV)dxz}~|#Ovy&`SSWzni2>kNeGdoWYFs{Rz5yH zCQ0J^r}OoGv47aGGKaGKG@EA``TL(mB`W0DCQT%-=jOSgH$5&`67AgH@Z#dd!{mOw z3VwX^Q*gk8fm>D5^K6Ss#^V^bqML%*&v9p*KOmJ zBAS;7p{A)$XVdqSC)+l^xjairaR?IEwW5fO&PRXUy??)caUBG)(`rJ~XmHL;CP+aY z+oH65_xmJCXuD-SeV(fg6a+yO1`tVouM;0JGL43AG!7B&c;lDX=5l?o4BfEWQF!?I z^|y?3Ld)+QTasjqsoSw3ElN#6QY~Fwj2MR(i60>lBx^pfyxbK_)6$h7tfR z%RnFQ-hF)dqU&l=@=8>?u8FEPbv2Ih-Cs73IG5A M07*qoM6N<$g6gm}T{9W)5=1d! z6cdICnpTGj^1MKj1Vm9Jic{eKgNnCrPmv$ycckHh>BWro#($&VZR7g^^}2%5RB_yZ zA}{E5TYQ;4aWolm|IY$NsnOI`WJwZ9(u_1o>9p#Efrn}8ESEN$jYAN|Z1-E(_L`lZ z!P>T{)j*)4R+Eu~AVR6hguchw^dp8=XS6rw^X)Yo&tp6qaJ&A({d|e4D(nn;sJhO} zlUI0Nh=?Fi6n_P-7c%U3$g-5Ht1DdBWi;Aj_ORss{*f$=5haP6yBR?c^4H(@ltqc$ zHgzIbV9@Up#~NyLKwf0H_A}l7E{BINxSU?_u(0_4%@0^BpW(1eSqj|VJt3!Aj^p^4 zrb?qy&~$}7$=Naw5ETu9lHJh(2a{t~>xljRA(rhk=zneDdl7OJr^vEQQ&+gYyXO7$ z2Gi8}>S!M?Ojubi-L8Rchl~%#{Bi!ClNTpgmP5PMMAWqgd7hJI1z{4=HVvXE<=wAS zTsLB?WpMLphSHF+EDL*WA<6>VgAUHdN7l6ls@7m-`*a2qUY_X8A66Keie_wKuUGu| z`fIX0Cx47mzG<5Xf`so!bUP+ul%&*aGD0PAd^je{MGhxp)TV)9Xi!$zPC%CB=?CdwF3Pw9! zk}N|mijqcMVRzVNZT-u$wWe*F%paan8w!*$KY#!7I|2pEXNT9Xj?r|LB+2M?OyuqU z7QQV|mY^8}j@vsd9xcB6_6<)@7WT?zu&vPV_t@Jz!fcsPNjxoWY{y4-9G_aPMw%7u z4hPtdkJ)OIWEG>)h%n9=?+>Xr6evZqqC}EJ1fXST$bX){