From fa36edcea4dc438388cec263ef2d2fb6259f265e Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action to run the entire test module or a specific class: Private guild channels for planning and organization (IC/OOC depending on game) Cyberpunk-style retro chat rooms (IC) In-game radio channels (IC) Group telephathy (IC) Walkie talkies (IC) Group telepathy (IC) Walkie-talkies (IC) Changed in version 1.0: Channel system changed to use a central ‘channel’ command and nicks instead of
@@ -265,7 +265,7 @@ channel/destroy channelname
Aliases are optional but can be good for obvious shortcuts everyone may want to
use. The description is used in channel-listings. You will automatically join a
channel you created and will be controlling it. You can also use If you control a channel you can also kick people off it: Add this custom command to your default cmdset and regular users wil now get an
+ Add this custom command to your default cmdset and regular users will now get an
access-denied error when trying to use use these switches. Note that Exits are in-game Objects connecting other objects (usually Rooms) together. Note that Exits are one-way objects, so in order for two Rooms to be linked bi-directionally, there will need to be two exits. An object named An exit has two things that separate them from other objects. The default exit functionality is all defined on the DefaultExit typeclass. You could in principle completely change how exits work in your game by overriding this - it’s not recommended though, unless you really know what you are doing). Exits are locked using an Exits are normally overridden on a case-by-case basis, but if you want to change the default exit createad by rooms like Exits are normally overridden on a case-by-case basis, but if you want to change the default exit created by rooms like If the move fails for whatever reason, the Exit will look for an Attribute For an example of how to create Exits programatically please see this guide.
evennia test --settings setings.py world.tests
+
evennia test --settings settings.py world.tests
channel/desc to
-change the description on a channel you wnn later.channel/boot mychannel = annoyinguser123 : stop spamming!
channel.at_post_channel_msg(message, **kwargs)Accounts and Objects both have their have separate sets of hooks.
-So make sure you modify the set actually used by your subcribers (or both).
+So make sure you modify the set actually used by your subscribers (or both).
Default channels all use Account subscribers.alia
a class-method that will happily remove found channel-aliases from the user linked to any
channel, not only from the channel the method is called on.
pre_join_channel(subscriber) - if this returns False, connection will be refused.post_join_channel(subscriber) - by default this sets up a users’s channel-nicks/aliases.post_join_channel(subscriber) - by default this sets up a users’ channel-nicks/aliases.pre_leave_channel(subscriber) - if this returns False, the user is not allowed to leave.post_leave_channel(subscriber) - this will clean up any channel aliases/nicks of the user.delete the standard typeclass-delete mechanism will also automatically un-subscribe all
diff --git a/docs/1.0/Components/Components-Overview.html b/docs/1.0/Components/Components-Overview.html
index 0223787ead..a04ca17cad 100644
--- a/docs/1.0/Components/Components-Overview.html
+++ b/docs/1.0/Components/Components-Overview.html
@@ -142,6 +142,7 @@
diff --git a/docs/1.0/Components/Exits.html b/docs/1.0/Components/Exits.html
index b3e7b9d904..bb111de4b1 100644
--- a/docs/1.0/Components/Exits.html
+++ b/docs/1.0/Components/Exits.html
@@ -63,6 +63,7 @@
@@ -123,6 +124,9 @@
+
north or in might be exits, as well as door, portal or jump out the window.
@@ -131,7 +135,7 @@
access_type called traverse and also make use of a few hook methods for giving feedback if the traversal fails. See evennia.DefaultExit for more info.dig , tunnel or open you can change it in settings:dig, tunnel or open you can change it in settings:BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
err_traverse on itself and display this as an error message. If this is not found, the Exit will instead call at_failed_traverse(obj) on itself.Creating Exits in code¶
+search - this controls if the object can be found with the
DefaultObject.search method (usually referred to with caller.search
in Commands). This is how to create entirely ‘undetectable’ in-game objects.
-If not setting this lock excplicitly, all objects are assumed searchable.
+If not setting this lock explicitly, all objects are assumed searchable.
Note that if you are aiming to make some _permanently invisible game system,
using a Script is a better bet.get- who may pick up the object and carry it around.
Next we need to craft a Lock of type get on our box. We want it to only be passed if the accessing
object has the attribute strength of the right value. For this we would need to create a lock
function that checks if attributes have a value greater than a given value. Luckily there is already
-such a one included in evennia (see evennia/locks/lockfuncs.py), called attr_gt.
evennia/locks/lockfuncs.py), called attr_gt.
So the lock string will look like this: get:attr_gt(strength, 50). We put this on the box now:
lock box = get:attr_gt(strength, 50)
evennia/evennia/locale/. You must make sure to have cloned this repository
from Evennia’s github before you can proceed.
-If you cannot find your language in evennia/evennia/locale/ it’s because noone
+
If you cannot find your language in evennia/evennia/locale/ it’s because no one
has translated it yet. Alternatively you might have the language but find the
translation bad … You are welcome to help improve the situation!
To start a new translation you need to first have cloned the Evennia repositry +
To start a new translation you need to first have cloned the Evennia repository with GIT and activated a python virtualenv as described on the Setup Quickstart page.
Go to evennia/evennia/ - that is, not your game dir, but inside the evennia/
diff --git a/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Building-Quickstart.html b/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Building-Quickstart.html
index 41f9499a0a..7f42e9f149 100644
--- a/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Building-Quickstart.html
+++ b/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Building-Quickstart.html
@@ -211,7 +211,7 @@ You see nothing special.
lock box = get:false()
Locks represent a rather big topic, but for now that will do what we want. This will lock the box so noone can lift it. The exception is superusers, they override all locks and will pick it +
Locks represent a rather big topic, but for now that will do what we want. This will lock the box so no one can lift it. The exception is superusers, they override all locks and will pick it up anyway. Make sure you are quelling your superuser powers and try to get the box now:
> get box
You can't get that.
@@ -251,7 +251,7 @@ You can't get that.
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
aliases = ['@update', '@type', '@parent', '@typeclasses', '@swap']¶aliases = ['@type', '@swap', '@typeclasses', '@parent', '@update']¶
search_index_entry = {'aliases': '@update @type @parent @typeclasses @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update type parent typeclasses swap', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry = {'aliases': '@type @swap @typeclasses @parent @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type swap typeclasses parent update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
Test the batch processor.
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp_8njtqif/126c37f21eaf9c8444e681e515ceaf9bece242a6/evennia/contrib/tutorials/red_button/red_button.py'>¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶search_index_entry = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
search_index_entry = {'aliases': 'quit abort chicken out q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit abort chicken out q', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'chicken out q abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry = {'aliases': '; shout whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' ; shout whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
search_index_entry = {'aliases': 'inventory i give inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory i give inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'i inv give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i inv give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
search_index_entry = {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶search_index_entry = {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶
search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
aliases = ['press button', 'push', 'press']¶
search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
aliases = ['smash lid', 'smash', 'break lid']¶
search_index_entry = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid smash break lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
aliases = ['press button', 'push', 'press']¶
search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
aliases = ['ex', 'l', 'get', 'examine', 'listen', 'feel']¶
search_index_entry = {'aliases': 'ex l get examine listen feel', 'category': 'general', 'key': 'look', 'no_prefix': ' ex l get examine listen feel', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
search_index_entry = {'aliases': 'move push pull shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move push pull shiftroot', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶search_index_entry = {'aliases': 'shiftroot push move pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot push move pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
aliases = ['button', 'push button', 'press button']¶aliases = ['press button', 'button', 'push button']¶
search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry = {'aliases': 'press button button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶
aliases = ['chop', 'fight', 'hit', 'stab', 'pierce', 'kill', 'defend', 'parry', 'slash', 'thrust', 'bash']¶aliases = ['pierce', 'slash', 'bash', 'parry', 'defend', 'hit', 'chop', 'thrust', 'kill', 'fight', 'stab']¶
search_index_entry = {'aliases': 'chop fight hit stab pierce kill defend parry slash thrust bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' chop fight hit stab pierce kill defend parry slash thrust bash', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry = {'aliases': 'pierce slash bash parry defend hit chop thrust kill fight stab', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' pierce slash bash parry defend hit chop thrust kill fight stab', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
aliases = ['feel around', 'fiddle', 'search', 'feel', 'l']¶aliases = ['search', 'l', 'fiddle', 'feel around', 'feel']¶
search_index_entry = {'aliases': 'feel around fiddle search feel l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around fiddle search feel l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'search l fiddle feel around feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search l fiddle feel around feel', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
directory = '/tmp/tmpqzpd_cbz/0ed7af48b4b721befa635008de2d6638036f29d2/evennia'¶directory = '/tmp/tmp_8njtqif/126c37f21eaf9c8444e681e515ceaf9bece242a6/evennia'¶
directory = '/tmp/tmpqzpd_cbz/0ed7af48b4b721befa635008de2d6638036f29d2/evennia/game_template'¶directory = '/tmp/tmp_8njtqif/126c37f21eaf9c8444e681e515ceaf9bece242a6/evennia/game_template'¶
aliases = [':A', ':x', ':h', ':>', ':<', ':S', ':f', ':w', ':wq', ':q!', ':j', ':fd', ':UU', ':dw', ':=', '::', ':p', ':::', ':fi', ':dd', ':r', ':q', ':y', ':i', ':u', ':echo', ':', ':uu', ':!', ':DD', ':s', ':I']¶aliases = [':u', ':dw', ':h', ':DD', ':fd', ':f', ':UU', ':<', '::', ':=', ':wq', ':q!', ':j', ':echo', ':>', ':x', ':r', ':s', ':i', ':uu', ':', ':A', ':dd', ':fi', ':!', ':I', ':p', ':S', ':q', ':::', ':y', ':w']¶
search_index_entry = {'aliases': ':A :x :h :> :< :S :f :w :wq :q! :j :fd :UU :dw := :: :p ::: :fi :dd :r :q :y :i :u :echo : :uu :! :DD :s :I', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :A :x :h :> :< :S :f :w :wq :q! :j :fd :UU :dw := :: :p ::: :fi :dd :r :q :y :i :u :echo : :uu :! :DD :s :I', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':u :dw :h :DD :fd :f :UU :< :: := :wq :q! :j :echo :> :x :r :s :i :uu : :A :dd :fi :! :I :p :S :q ::: :y :w', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :u :dw :h :DD :fd :f :UU :< :: := :wq :q! :j :echo :> :x :r :s :i :uu : :A :dd :fi :! :I :p :S :q ::: :y :w', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['n', 'yes', '__nomatch_command', 'a', 'abort', 'y', 'no']¶
search_index_entry = {'aliases': 'n yes __nomatch_command a abort y no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n yes __nomatch_command a abort y no', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['t', 'quit', 'top', 'previous', 'p', 'next', 'end', 'q', 'abort', 'n', 'a', 'e']¶aliases = ['n', 'top', 't', 'next', 'q', 'previous', 'p', 'end', 'abort', 'a', 'quit', 'e']¶
search_index_entry = {'aliases': 't quit top previous p next end q abort n a e', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t quit top previous p next end q abort n a e', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'n top t next q previous p end abort a quit e', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n top t next q previous p end abort a quit e', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
evennia.utils.test_resources.EvenniaTestCase(methodName='runTest')[source]¶
Bases: django.test.testcases.TestCase
For use with gamedir settings; Just like the normal test case, only for naming consistency.
+Notes:
+Inheriting from this class will bypass EvenniaTestMixin, and therefore +not setup some default objects. This can result in faster tests.
If you do inherit from this class for your unit tests, and have +overridden the tearDown() method, please also call flush_cache(). Not +doing so will result in flakey and order-dependent tests due to the +Django ID cache not being flushed.
ky9K6Li6db6_ zz!WTcECjW7AG(6z@R{^KLirDY6~lc<+@K~b5u;hKL=SAh5;KyR;T zQR(Azi4eZduoy%k^LC> zLE!w3y;vMp`}VLYOj&vW^O~TJcx%w|zN7cyImoup4ojXL7`}Cxw17aC`WNrPWoDKWVF l>^QuHKJT^=!3_@+F=FkglU-ngaoUVUG2n&s_)yDh`^c_vnu*^#99P(T?SJ z;`^^Wffl7qd&F1zDyD_WgF{<&B@xio0Y=%%Im96$j`1O#IB~YmYIRv6Y@#>Kec3c! z!5$(~sKzpWJMgqT>kmyg vO)| K&imtk6g)7|KFfA& z&ok$^9CF@I-_zAsap@GS7h~gbNwE5Xny#8bBT=!sB2VEt w1l zg4PEMphu`Y5z6`7H65J>#pdB;3<`UH$0}L`j42W?d|*+q(>af{%Q`a9=mZ9FPFffZ z|G;Qj^dVlfLR#gB_cJv5Q~pXuvsrl%pnz(u@M301uP}&{8@)m%WM=dVg^+pCD-;4| zMJom&bD|Y&z>Me!HB>&d0u7c8tuO=ULM!BOnUDkxmIp0pp~FYK9O!lUfEmz#?LY>W zhj_&bDd6kXfT11Y8a9}7T7%;I2$jLhUj+kJ@5Lk{rV^b;blUI $lPJ+PV-EOugDYfW>1 h4|KI7mg7c#a4rKjeuxE?dup;D z^x4`#e3AP+;Dg!@zj>muIwYFqc(W%O*O!2BdblefqT?WlCn)WM;;F2EKm^CIW`Dd` zC*T9y4@_9&sWCP52(`cjh)*l9Akk@s7c@4laM44>8Vfs6tg*1e#2O1dNUXqugoqVh z0AIaA3+Sm=r~%yNXWmm4%bTAi;(yU+RIjN9sqww@3MYVjUZVx|mup~j$8rRQ?pfAo z0gZ1B8^HSTEkQksRpA_ePb^ZF&0|KN_?KC$Mnf3Iw}lAiryzA{K SZh)BI08%4^-U3| z$$C8 _JrWSU-y34}8*LUqkRu ?te)yct~GJiME}HZIv^#tMv%N1hpmA4rlJhN@U8{AA;$1JUZLrb~~N*pH&~ z$@GZb+Xa$f%*v)2Xptf_eFS4k$pcN8Uq^Gw(qt%(JQnYNH&t$_zu^_fRNu1ro%I#5 z>sbWi*08!ylUUskjNhwAMN;Ee&?o*68=g}nNB yH;D7bMtCI%ti!}ORw<9B<^or$~eXw^0y>6UYUS#GD+aEs ?lmhv!u{1 Crg!kEG4Wj+JcMA`^p3Kag&S z)*el@ 0uvNcLQs-)}Zdpa^ zF%wZe)z*`}&Q$%K=z*rojWwP#+^GB#ZMS#BpwA6XENN2263 AeZhD48anKuV5@`oY^_tcL_0q2!ggC)6C1A6}qPJm0_o#Y8mO*rEvT*#ph^ z9b`TeHd(5v$3ew1-9V`LB|cZKNWO`1t*9m*uNBEu1NI|n|6sH%Xz_>KPxiIDZK*0F zn_3Kig=*?y{WaPt2d39JCm#S_Bc5 MciO>Rwwv4&_;O z^`v(H7Bpfe{U+E>$E0b`CgYR7fHHsk8)R3~btp-mwZ6I^tBQ2bZ-O$dY4w~9q6EP3 zHX8Z9W0e2(c1S0*`}I|ho`o}m@$BfHcbjRa-9qy1s?ITdL!CNZQ$&9E2FNz;+u=I$ zj!`jo#IquJFvjANx56{ydiyrgM}VTX!MKifO8tmG8=lE7*6vp92%3~CN!5SU_pGb3 zGtns_mOU-SDHADkTW6zbGCavX( Uiqo-pRXkes?&aU)?e1mY)a}<*p^69G@dx>3sz>KE4Y=Y1LIh+@2{ 3r5Lfb;1o>GA^)D+PVxxy2A$ zwSLv7d&Tif0zD09B$-6^K$1g3Zb$No?rS8AbR3MN6Wgmu5~;b8kLy%9jz5_xq~TN+ zI*~ogLL?#gvXF}IV-_muIGTl1YKHz@&LG6Ia)qCUiEA#A?OU@*$hdzsqv)2cd8A|3 znow#seMib4@hn=Pr(w^MNn~r591^l+$tSucOBU(av80ol70aD>U%Njzt$4<~B9Vqo zuL(sq?KPEzEPPEXx}mShq+{=ER?RqM!_$zES|{a*)|2;DaZ86tzUT!Hv4bJ6ik?F3 zV1VWp*X~~O@m_xiM@WBtmw* wEN3}JfM8e7$W>H6$&+thqu*d}l zRCxl|r3C;C_Il1NB886TGzN=etoO8WJ=0X*?YOdHx_hOi@6}hobfnG??`cT~*Ui>P z)WA6b?XX5B3BIiwnXm88S$ujh+hvh??&M#Ys6tn=dyjaC%+r4_Aw?$VzlIu|Aa^!H zBF<1yN!15RZt1%|Nt3&jd%{XuWJ5 ECs7Q;#kNGAW3Qmwikb71%I)JL@oJ> zTk(*MZ6PXgq{@F$m;5rUXAqw>)DXHLwtJ9_8m(p z5`Nc8mq5NPsHB=_OK$1s*ODeF%jR*laXleT)7%Q0R_uRO)RG N#8<$HZBIEGZZBf@Oj; z%?rnL1MVQgF|pXT5aago%u|7MH89zcsD)yJNy1Dnp(O=JoRW`|3WY|0y^KPQ8#t|v z_eFn^VuoZv>#=gJd?@dAT%51&eYaz!K6u&Qd#~Ufaj)Ke`gHT_$9G?@Z?X^HKi+(K z|LOnSwGfuiZ(nckK7P7Mh0d3o-|xP^`xKYX_s?IyM`dvR+q<~!t@8Y(@Z#SPl-`qu|@cG@ZAFrb_`0w9uZsWGW?Qb7% zKE01h;qLp*yW3dNaU$`@&AV@rvISXa n*H|fOA2i6{`e}X+$O+9S#Fe;`D YPy8@ J+C0l}}K8q@;U0WJOZ*CfJJgWvRKrsbYE}bUK X! z!OfU >nw_9UfX!iP2m4q^vc>{r4`s5r!E0zQq^11(For`pj+Y#G*PjCV{E zXp=r`^Y}D)%p)l@NBoRhu;_=5)_cVyqLL<)*sq3fBJ*H<;ar~sg2aE1v>(L5wq3l= z&cY#~KF^9&l3kw_zxY08MJ5d!zdbbVe^J`TRO^L*Lqcl3B9)|CulR`}I#Rh0`vcPv zhj%n}_DDLKwOunbLeu+H)cmSqJ?*l4k`J+a`zuoMJ=2OzYM$w8Y 7W?RV#KoTk zQ1FCi1s;?Ch%A2(4{(gGo4Ow>v8*+=yIhzg=QCH-5_X&`mORgI8*!|RbLBEDT8S}A z$#<@3rQ$$WlzR5B)LJP`KYBHK9gPl0={H((GmGuk6^rCtx~7$|JJ$@;%se%@l-#GL zl#1)rbW-wBO37n81jQmbhoEUC><~0Vu;rWJ%+{sD3)+9@De^i{QaG11M`3oLWt$40 z1L?E1PfvkUngLLgODO {zW>Bp0YPt%RerW|*b} z)#Ot0o|;lBu2a)V$syczl=S@H*e+q>k(^VQi6wvR7G{nq+1^Yl73-S`rD%WY^yvSX z_w2{?2Z}{<-aykz*cWJqiS?H?tHe6X6RX5}%9>W1S)L}BQl!z8Qi(H~PC~t7%_w@@ zQ#@{}c6b&Aext;g6Ano@%2Q4$xXBlsQgD)|q!MzGr__GX=VZ7 ybo|_9?Gx4V2dom9!8L|`STh}RZp@nDZ09aOeNl87nNwiSjRJ<4D zT;&0WOk%HVI!tDuX}q&(@pcN0 FcIrS<)xX klqK`_zbHkYj19^-Mzwn-QRkj 7Ldw-iQl=aYaJV`qYl;Nq?m^?PM|aJLfGouW?2u3+btXaaNYqw&n9% zB)%g(JyP(u#(!jG;Zvd?mi@e*z|&DkIRJh_$yrz67`s}$^Ws|m^e%^U6f4fyWWgLo zNX|M0%Q1iLtYUrtmihN%p3}b1vLCE0|G#*Ue&A1%k&->oxA;6olhw^|VD ?^t;w`Q3``RYjiOv-^L0_YwPO%->9Ex+XnP(!FmU>$k^S zq;f@}@8Zt>O+JCTgU6_ CH`4PMeUn6`4}RPdy~ZXgw>hv(!B&8 z0bl`Q pg7% z7KLa*{()=~BpUMl!p 6TPL@pX||lGA#(x>~DXf z;ABOIH`21%Pgy^oHTf3!{+yAnYPz>V_wRb)z+2(_k8H>GZ;bOlfyN2Ku$AFtt~Rf? zHzrQJ?V6T$FuPmO$?Ay*RU*WF18X$OZ$u}C$0ifm94#{Xl$T@A-bCK~KuT7KS`?z0 zv$5BcwdrRUXNYHidz%fO{q#n8|NMVOdH?;5^8Uvg<^9hzczYeA^+JyS0M;wj$w3x* zx>YAPBL_9?i^@^&JuTk^PtQ{aqHxWC7P5OY_Nf(mD#qWaFVw#SF>I#-c;@_|Y#W>A zytUlB?r3Pz0A)!-QwFSB8k)LCQPUVyy=tCDAzZSGK@6OSV+>HlH45*O8m}C%>#Ku2 zMq2)399RjEH%Kx5d4m!o+Uoa-msg&XQjuh9IX;&>SgnR!ZnE$KtDAg5;qb41DOp`y zSH&&0=%-(x;>qEP3|U?ky_g^s1;g#OJ|Xh5t_+RHrJ@~=$<_su5gFA@MxS(_C>26H zWl4vRy nnHhNOmO!Hf zvT*{99T{|G#00Et#fo2<<-$cy=Yz!8?yH?xCX)@~_}(FfMiP8}i1z7IX&|maKeCck zZ3@jJj%${MVg;dW*EK)X5K;mSC8 =j$z<&O)>L3Eq%^Z^iNS>Z)0 zUL4%U#}N5gj*cNR@faIJWM$pOLgeB;E{04h9d-5{6GNbO^X0u&2?PWRcj~k4s0ua{ zzmXMmb}5+tF(dnQe-Dq+mv7f8XcDL4G1h|13uM3rm!j9G3of<9l-)6TN8rTj`{t+E zAw`h*IRz4bk4>VY^{9`cs+)pFp<`LH_r<-goh*5;D1YT06imyTZox0-{qeu24yc1W zGv=c|Wsgm#4@5D12S+#Byny2y8UMY>gc7=gFESu_T)n4Nf1?jH LEq-vnxvzjM5u$DsF{Y!cj}qA{4iD z4dS~#2Q?vs5R~44K}ecu8ib^laEzV!B^qKSy+r+q;+B#>nd)iYJbc#OiKxEhn9h}6 zg)?<@qWX^$e`<{!%ImZHrmOf{q+NW5MU&OdaNzw}y8#ItHv2{{51^zTTOAGhba*L~ z%nELv@{dHRP3QEa$80)+JvK8|vtjlSvB~sQEYhR>AglS4{a%gyN1;_UJNMBcezW_q zkhuA}Dn2*6ul3jad*`4slkh=zTz!GT#CF{U1_z%Ne-{{hd{b~379OiCu;`?qu-+>x zph$gIzAUg8;ix|I%#bu-rj;QX@h<*>4KduAMi+rUB799BGtzbJfs_$hcueF>}WB z?iGmDxoyw{4r4v&u1_QeE#c`}G;Q!6^6-NfgMB>JvO3!voIpWI5e;812T*1ZQ4bZ3 z$i|>ZlWvwBe=1n_?!9s?z`bWa3E=JUZjRSZYH>uxj{`^#9g>e I~eA2cdRdvT7IC`A7=s_#Q 1~lb9D;h$Z2P7CLEpf1_hwNojYAUg;CtABMOdNm5A1 z8!0*ocp^n4F)yS@CE uBHGmQF(^l8y&jlS;r3t?4A@jn>qX z@JVYzX?dnoW{K%}ieBowp3sZuo& 15;uO7& z*aImBOs~kUq;b8@nhEIiDLgyx$y6{(-B^jTr29WeS;l{TYc^@V!Xt)BIL;TW(o`;( zEnHC45*R<4SR|?E35}P`Y?9GyO(!LN7U@9}5tG%IF@K$lOf=FNwOJ@7Fm$t!No@RP zA(n=T&2-Wl$vNhgly uECTo!$sjDgzWpeOa&_j?ly~_B=v! T4@HsHNynL%n6-@g3Ov(IgQh&KqdhfzNV9i zTl%`ACF^63hG_;Vxuc0vnyzSKmzLd6tP(J@iAqvQ$wVp qXi8+S^ zmW`ZJNzp;f+|qUt>$NutI*F84-@M?Im|;d=7j#S{MWfWr(l*IuVO4?#na nIZvvllqyfe` ;6uUJL5`4yLREdGR4I_jLF_Ypm O$$8ZY0$(Vjj%Pdi5#|O z9tnl5nNxH-nwg{%wvH&Jf1<>xg{_I$uk3;T-p2Piibq L6JKOh+;;sqp^1bu+ym5c|FY|^uTNh?+B=RKnLbRaB&4#-R; zEkCf(O2io~gc9@!3%O+6!a^xM-*C(=IgL-vYyClEE>{xhY4|3|e ?E7OyX~37i=PK zW1rwt*~C8cNpB1LOwGGsJRFZiHqxJ=6m=W@89tFW(a((X1LdiWETzvA9G>?@XOw_D zPGw8KoYRizjc5E+f86mxC_R6?a7)J#p5qkR^DLAi8~Q>d0Zacn# #5rE3_gT z{t>IlwtvJW1@oV(okukP6@_HXf6XaD^Iy|T$o$XKif#UDe^#;0f6YZ7Ay&-mHKMnU zn6gNSPGbHs>h#h}A_+}1ogo)@y6Fs|ge*Uu`JQ=+$Ur&~bYpAx%p7KChPI}XmWf3#kUh|T@Hlfr z-tK l04lpV0dQxd4O-Hp;zCLI afuC*iE dh&qgRmbe@CiK$HZEZRLM1C!sG@$-IXdo z-336UHx8`a&i3V1n@PR8ii`ytcsgY$bh_M9`W4r#b{u+J6n&c`+SSlx_e`Y{Vn@`4 zp8X|UJHY !1X2~g^C#TBmCgaMmWyhWUJ=trg!?!JA)0SucJD_iAmG3&HBZ(Y}(Zu zU4}6yvx0$kQ6?kgdq&HGM}pE&jppkOHE6ls9SHzaZq(-O@tM}6ndZI~H4+2^x)q z(e`IFbnA`JXiN+z&e8B~H#?&daob)DO6P<4e{}N@+%{LZS9Md+?7rzL{^SOe6`(u{ z*0&{jmhd8RG0u>I@C7dKLsp!`Kr^1G7c3t_lMuTrvx4$=phZ^kFs}_GI0x}5li!7g zuec&AJzR&%kPLcS7m?bY=e_LyIcw^Y)ie|Kpv(}9!=A|zC%W&JspRdX aW8TpaoW#j9mv^x9mkHBm4Cb~J{}Kf+b0r6>lI8Xi1i}stR{!oe*w!x zF5nPXs}PtLC(lF%iIs;dLSp2VAsBHIJNL3Zttr2$F YKfg zukJ}bkp4NFHZK~@`CTGn&wzFOMMuQv3Lg=k`|21^Zxgr9-Rh=wi?M& A{LJ&=+WHbY=8)Oc1?G?hSQ z_1-#yy>hpqX}@+i4yT}8uWp_WWb6l89J#2iLJS^H07w11{Qg#cZRucBWPX*&;{RD@ zXhlgr12Imilcb-Qlyq QCQv!HDS4QJVF%q-xKK z!HZknVfdQXci5=Ni~C&hWP{87N*`ERe$bQr+bZx10WaifREU3-O=E?oBjZ4P?)bO2 z^2^{&aSW~NZ-^_yHiehcdm6y%^L15-0jTSyG<8ZBdH4~qUoeD!NycI&4kiu9H6)mn ztX7R+5^-B6g2~8dxdSk-{6OkGmE+o3KH0a?+z>F4g7k;H8S5byfqj#WZPwKE$c|z# zQF BzrzS1b+_rsH0GDt+|#GVk0KUoK%e29>5AN+xoWCKIfhcFsv+u#qd>GEM@4 zfrxCcCO_iGS92SG`J*U*wJl=0%1qW3&yneG{KL)Uy3Zv zSv#~2NLDbPd z@F=(HCI3e1qNE+D^Enoc d@m6Er zF}P5gc6H5$mr&Q3rI%}go05#@V;w|0%#1pqnB=aO5)E@!JE`(S6y+WZNVdf;I~5Jd zdY73e+18@%@@s4HCaJZxP^+xkTKYit(295T{-Cr@`ruvPl$_#rK5H+#=6ti=b9P3P zmZK_v+cCD2j^KezR;oCNwd}gP3D+GOB FM~UKGbI9$H>T{{k0zvGA#*$N^k`WC_o*glAcUvMhETy@wQdPs$#Y;eqrS z?}% IT+mcsdJBk&8rla3z(e zoxnnYCAQ#RsHI&6EsuA~^ lr>?x>T zO#<7_(2YPZ=det1ZsffBN`tI-y7CkMd@~PBUl^r+1!P bU7 %Pk$s%f7ybrB+n8nnfR zk>kTnJ G-nkaHlT2)~f3T2$y z*vcI;wQ@_=Fv;4cA9@1+X0P<&6I%;joW*PX%;Z?ZrPUO!2)vb6?*M;KdUko?k`KTn zvPS}V`Hm4lOjmUJK!}y#^<2~k7Xj~mADW6HipC?pu{hO3^5o}`#p5-N=@MHH2sO@u zBz$WLosa0L@0M*XEOZ7r_6wi^Y$dzT^ynZof0xz6K3FbGh+XjxVsXTM*HpTDh}MXc zSA}KIg`zRWG3K=^1#N$eNibS_Ors&=PF3&|4jUB;#p7W)xsK+PJEHMCp77r9^?`IGAGU|2j^x`2w(i8cBYAY^ z-9dQ=oZRydnbClX7mn!Mhk|Lxwlx?w^9LI1AW$8}f21AZeu{0|zHnD#iwKlAb*;)1 zWdo}))j_3uhybi8DfUAgulLyU$nH3G(^aHo|Du=A&F}{@%^lnkY(khj%Cyh{r@eT@ z8KA?Okcl4ABuKzuCh?X7hW7|ga)P)gtfWOYbVM#0MZ+ @SktlL84Un48hxEtBS6LpB^5nVXqbSpLL+XJCh?VC*Uebx zRCadcs9+eRp+UppT@NBoO64H5YD?{Xag 2!fdQe=Z;e?Q=}=xQdINwy%)nxtvBzSlmHyUp2Djp>%B) z@nzHeKono~`%F(!Afxn`_C)zZ=$VPl)1$zUHn#kL;gl5D_%w_h{1sa!@S*Va4R2)r z1OsUd`vfI`pT`~hU*X_qbuD^I*W%}MEq*d5AOiWA6;uG@$D3O^2Ek2(e+5DSgT#FZ zRf~YXbfd-d-Z=eX9E#= qiJD3VuYMAdQ1$wOciN1MoY)-H_#`Vi$b|vQSl%U4NO!$#I}KZu`Xc9mN8%~ zpw+HzIi=oX0u`)pOY)rMf75h+5H!qjv^5T@(yf8+n?^6c!$vw#QiMT5S -{lX%CP!`mvn5`CpQ%6e=~@XnhA3)%=bpE zw18X*BV?klgOMNsSHVa; 1~@y(Eh)l|Bs}$yj~g;9wY^n&gFIxIf)Vw(SOQClLM}nryqn+O46KbG}t^(y$zo zmvHl{NPaLT#gRM_e=gLJg+VZ@!sLkon}40f03B;Si(ptk=~a-nYlcPyu-A8XE| tr*Pr=^*G%-hU=xW~%dk}0UOdCi17nh%sUg@)18p8CbyHA$ z6n*GD4v2UJ(Tgmfvx41UDi7}}{G|8>uyp!FDpt#*jPynXe_(*AYy_~_t#h1Q0j% zSn9fF1hDA&+j)c^4FIQY7WvcSRXl)}JYu|qc{}F(Gb~6ykZ#DD672PgkCzV$J9n{3 z@LMjPKJjizSrRcsFTOF>p%c^#aOUZNU1qTQ`2Lq~(;wGUoxP2yeu`xevYmj#!d*(l zVUaGU%dl9Ne^Odlq>a=T8tihZem}I`x3wdK*Yric@dzgvpu=b<7`9jdC+7pUm%oEy zZVe^E0j+fg_nAyaFulOO(XL{$<9gF|O^2o&^CR6nd~P}%YdgU}4lAc<600Tq3u|gX z@dT7zR}TPl&M-N;=&LnI!2hEXO?0(X$NjXk5tyfJf0j6^ %VQR7S^{7OXuG zwxqmsqK$#byVuR0)}nR}`qN2MmVKz@kO~Z(l8FsFN0~heOhbxHbpZmP&D|k+baaOa zqg>I@Wc`4KBl_z28h3Q?g+4hX6ev25>!^Vf(kK-|&wpWK$dg^_XHY2VcP^Z#_3~1a zKK^v+fA6(k0>6=c9f{tMxg!HtqZj8+ZMTR$$k-MOh?||*fZmrPxvDKjyj`SYK7fkT zIQ&;5vH|3;Yd>RRp~6@U%)Tmiwb1UYgV4Xf>J_Hnw+`+*xz1GH)vf${^WeU-;w|K= z)AZCuuXaNGL6ld+hS7ODHjG%IBTqV9sZa=@f2^sekc@+;2b(rli2B2*j0yWS=_off zo~m&)Z73B}B+$@crh55kwByUR9g4baYMo7XuN2CDMV#?~tgC#7@mE) D9h<5^ToyPkVYislnK+Hz~cvRAdlfPYP}RA=i1Bp=bnCm=b4T-rVBD%9mzA|EW5 zV~JexaO`aDmtpCyJu;|dqx{}p=B0yx{luaeDVALxdtK1hn9l>6J5eZ}edX3c>FaZV zaLJ!U4bTTLnd3K?T{E7v9F}bp8y&Irf8_=pvZKpCt3NmPXk5aw2HBp|hlRVeR16rY zEJGm;dKf(r-sMGbuvi;Q)1bjb2O$*N#frDKQ0iY(H*s|Jrk6OrTDdtxA8`iA62aU- z0AQJT2M8Dg*8l*sQ3eVS>C#eFKo~=30DxpRC<_8~p-`z4PH$-ay`kODJFsu(e?jtX zi|;pC9!s?zyLE)|7{YZ#6lFHa*qdsti+q)cBLbMN`~^d@@?1_hMnyxxa5jsE!Xa5W zE+-gt`NsaxTKq<34NvK;SG%dO 7&AnWXfdOq zI@%cpUX5naC@OS2T-aUUCJj$@f0XzTYNL=aRYoCztBVo~swxBNf0*`sSJ!Ulzw2x7 z_-DgD?+XYE+2*}nFBHQW13wIdzO)yB*qxh+AF*NToR-KKB_*}Ut;EU5{QDjsu0w`U z%k1O;JMz;MO#m&RB32+jh^%u`hXjWYaO~^>`r|4%K*J7!9EMAlzxSf5P(i;$s+( zFOgimJ}dss5-B$s;XH%$cLy9~ThTafF@P2Sv_x`tW~}(x63W%3vEtt?k%Bq48I2V# z&-EXcNM-|jXMq0Z0u-R>T)j3c{$YtU*3OOh(*~6KH>1-&<5zZO*fko p&t5Jp3hJ^<4;N=y*bKC3rE5Vf-ETLQqC zWHBHx)A<%5;0$|z{y_LPYP)a)0LrY>;g6$!%i5+XGiA93LuDSg-#8GWmk{EExCjY^ z>>nfszIIC(>?kBbw6cNenVgG!Jx!87zn&MVpGnnnLTp+fdqL20f2Fz1t9PHjUCU1& zc(+)W9zU!5=P~Sr8)!ZV%x+|5A#42PO^J-9zQ0z-{_ynrgFG-kFzBbIACMvM<-ZrL z0t81W2qWeD&5bM|Xcc)1gj6@I4*(+ Z^rdar&y(=nKtDk@V78?9>zmEc~7bD4S8yOKTpxXWCRU{2f zqw4qZNpPzk#vTBAv7zjd{fl(PR#NfehOOM< NYI6y&3|0Bx} z4a;eG*rw)Ae+&=IO?4cCql)6)!9kyCUpGNfH%CSMF=ZL_lOnMnfA5Lvvn+Z#4AT*@ zP{;*sc|elutNN|DvA%XIWE@?qDwoPx3j^{mVa((|lCCyu9wP+(XI2s}>#*JDKfQjd zg I#fc PuMjrYbXXqmNY!5 jz8(*)t1gz(1H;9)u-d9wuQvoZ${696P4`zed_U&qs*kqAVR#ES!$+nr4^+Auf_U z=pzKuSZ8`Te{3~9f{HfwLsMls%k8n@im|Gm`G*=e6bYzGpPh__Atx$X-4ETE56EGG zdmrggxj#jPIW&(`ltcFus`6U^qta)e)^bpKnnA?{Q)7av2=KDo2NzS%*apLF+AuGV z ae $qReL+Zv6Yz&<^CLp(Cs=o{t&!W+gIb{konl>a0@x!!i&MLLgH`?bG(~YMAljpM| zf5b58*lt 1mvz#E-hj#Wj7&_rbY$%?`)4_Pu#1x?& zmlLfo>(O-Owi3-(?wUc)#bzdB>8A*nMJrp$_9H`*+_dx3Mo8&}DliExmga{BT;|h2 zyPC*-*m=_x*@2cNIEt8M!)U*}|I^p#UfSqJ9I&{C4(QnG%I6roM)n+T`W0qD_f483g zwZoNO6=+@>*crj4I aYA9VRT80@q+aLQRP z*WLvNm-E~oH1c&&WI17jq{N~EhuS^$^X)tc3Fm2Fh_~9! 8?3f0wp0flTuLAtpwaFDDhP#2S{wwHgy zA%RJp8<7c2LFG3;e_EIN4#!|sYbG>u(?$WFE2zjlNisl0BB1Nw1R!BrB+wc|@9Q#5 zNA=Z)x#)EDd-bnTd6siPmI$`Vrxz9(vUxuhHrDE3hK`crIRvKN;zU0vTXXhD>x#^1 zJv|6u^Bd*9dZ+j5U_amKY2WC0)58?0if0chD+ zn)s9UR68ArZr5Yp-Ctj2MCv zFg`>V1AI>g`beH*q01V&l0i0hQCi>fXkioz{nUNb3ne3PusHJ=1Kx5N8x*^vA-Wu| zf{U;@DSw2gpN}F8{p8k%Qe%*Rc$~hL0SJeItogaxrPY{Dp!nk;2iA`FFPqAEM9NZn ze`v;1)U6#%&Z@A(*mtC*53Ht!gI@FXhQnUV^}kM^Y=*v0;2dyl-#h@K {4%G7bkZY?Si^G%&PX?-dHwt`7@;g?g|Y@r1(d z$6cTEY%27-9qRzd->FQWc-G|8herSo5O+2yxb)~Tc&OT0OGfsAu+n%teh5Mq3u-Xv z*baPPaB%DXV=%Grfn%_+?F?gZu<4Sb;XCw9jk&NcH|%%tD-C-b;>wTTuYYL_yBM=% z6OmWMrf!R+XuEEMo$ytEqGe`NcH-?iAeORi`x uMq^%qFd;MXWQ>{0&(luIYHU?+?-%g zotaDD%N@X>b7ctDlCGy2se2~&?dXn{(aez*fJh6ue1QWAQ02L4om_FLVb_yxx<&!+ zleM}ze?}~GPqZz#CXc HdCkR*_B%uGXDH^nvZz$MSUtA#6ab)*RRxsm~-UX*Wj6=~p)))};1Pc6{ z(5v9p7N*Whm5y( B5Wxy}>eCI9R*QM5kGQ?f+dChB_A?l8a7FdY?F ze}2EcwVghj0W2ijW|K}BHuDPR0N*JoOfzy@sd&wz<=dq@_Tp`wyfuPc<3k^@#E)%Z zzB1oHdfy)m&6HnhXr|)Ice%`^-~aNBtKg&9$9 5Fc;P1F}oukCpEz%8}=e^|ga@y*lFk&pF#^KKjtHl^g< E-u~vWgTqm{b+J-c9Hh4D4|b(U?d2l* z)ir|U!e<8rr_!ljI2I?hI^b9i%D5odCQS|)JZ)0@#oiUgv`7F4N!S0n`T7AJlj^)P zM$S)e*}s6_$&~r%0hPOs)V=sQ<4)`w1 s3{CM=FYaq0g>pT7~-8L!PSlq?S0 zUS*MRqD$lcb7|avE_u@U$u^slW4(JI-ifhH0= jxJWHl6DY zD_o}Y%}kYI2C (Y#9DM%aK9alCXL%WdRR#H;)^G>y;9X=~gs?Y^Z81 zO75|T;kl(aXn)Y%t;K#ySLv7ywtx(jbnneKo_gT$cVjzL>Wu~M@n@wni1FfD(-<$W zy_=*P=+q+INUC*$XDeUMs9D*ZHG-Hr14nqIf4h7>^1 IZh?bLC0El*e1p?4^{r~_|Y~)ZsO}om%Vb_h-F`58~b_Z&J0NNd>0Rm}ppauY* z< s_)|K?s}-ypo^#ytM~FSvjpuOydD4r#}Mj|tbcJ2aQ+lTpxbrLBfq5|x;XgjKwE^T!1_;=+(%J8vHbm( z`?By4U5R;#+$HJ*VOyLo2oK$kv9N8Y bff4i$A~1KX39w^PTo>Q}>&r;;(Z60OuV-MtZXf8n{G+`fO?}E` I1`>_kf{+ZO=S{# f3SeK#uQ^Lc~$hHlP#9Pnsl#Gc(i0V1Zwy_D^>w< zqq_xw7Z^?yjbOphWI0e#<~Nhy>Y vj~u?6}j=lvI5#SEE3MXR=K2J<99-(Vj1ryD*m zNJfeJ5s(eS)%%9_Uz*|ONgqT_pK{uow4poX=dm1EThgz)KWRSn-{~-RwHmkyfX@3N z9c_93V&47m0_*dRwJx0=e|J>tE{;2tSk_*XiXy>H#+g;@Nl%X(8Q$@I=JqEyYy36R zj!}zTe|?u5mOfi)g>34|USe;8T0WWOBdPr_?-vhyyXrd`IkS!3FJ@?0c}Yn(P3V_w zdTb-pgJICpPJ6RV!DdVA2c%)Pa|;+$?W;V~VU0*a_f{h?n7XPFf1ua>)CllXCp7}J z*@`YiY~DZ2bO$jG1*<6{U~t_vjDRh=Bv~C3Jm! W5ny^pAxV(}Wt8-y*(^U09uUeN7R2hTbvw~KfGNLlFv*hKWHaFy=r95|z3IvDmQw#J*+BoE zwH*cKs}2O5R0XE3*P8=2gO9%0ECx*%tMW}|n{v*;*vYpHe^Ne3B+m^FF9N`smzwP9 z5CqPA`w9r0QP&m($vnC61JWbMCd=CW;k0tB7D?kip5g8;ARvQYKLFAWAA>&8oNIxw zWqdFZ?}<9qGYl9{TX+}8V6ik1oZi`H&_jm- )+wZ&SmTV!L99{!WGUC8dtfJ7#3Iqavce>^aM>?3+zW3jTMcRf zGgn8lc7~RruQoK0>1sI#VPz~wICcP6OU<9n2 TE4D z%-P^@%QDk0fEH8E*as${uj}n*4&W%%HGk@yicK5=VRP~5vZRrie+t>=c2Nop(L8{G zK-$JOSkP>(*l`#XqdKXP#^9mmDIzGh;TR+sp7vScbxi|D(eoGBfqkdO@2DIvT_)W_ zqszU2f3fhVUR>aCd5qr2f;XP=14EwL`@U-`^Wildc(a EZ9w|6t?{wp&^5zQZmuYu zt}~T)b+;0H!8nfPng}!=cybV(A87sqL9Q$_H67!&F&5|`-oR4bq-HtcO_J%-c);>I znl~Lcj}}F?SWb^1cxcA_fFO6QF`GlpXn70P(RDg*?}EEnuH14Mt1I=ozi-@GJo2Xa zf1l}>4Ht5X {!W$XTVqZNOxxY z2IdR5G;g`^{hy@XH-FIG_hxgK$ccD!xyB0SjzFt+c+R*PQ&O}|Q{o|U?Y%y*?Xx{? z5VRhBr*ankTh}~2f2Vyjb~y!nCl^pce?OHzH2@Orx4XM<*J?@qA8a`M?}w&)Bway^ z51Td!1tTV_e&Y(rAJ??1rw#O{CjUWpCB2hc{;k J3(Q4)n1Ke2w8N|pmX$sf1BeiVmsnH-JnEEh$ie~uC4 z2#om5a*B!4v=|`#6B{61zLsdRKGIR_w~pSkCk)}HWlk^39 k`Fg Hb6#Ff0 2^lPQb6LJHfRXU zjRP+rp-hjpfW#CB!j+-G`k{Lu FAB6x5 zV~v*v*ug+fjSv@YHa}dLMrJJmL*G_;Mlc{%dNSaXt$i5oOEalE2?iGCf0;Ix0szBo zk0C$ G6Nxc{~1FsIm5#Fh&^2R z@n{I`Qdu5AAmov=kKu;Se?EpC$@& i`f2nHvU;gxqB69V-eEfbY3Z_lF3;x>QJ< zMvtg#O%_$%;x#*Bx8*FD+!+zWk%?1Dp2H-`$B^NYzhm4Wso4Y>e_%Y}C1^0KsXx<- zzd`g~&?ydna`OTaH%mN)LrxZ7feYWPp#%ITel*jG5$-Q=2p07(aESgc@I&KeWb_Dm z86GiEeiq&PK;G^w7P_lDj~d9&ZGeX|tXFA-@^G&b2<6^hB@p)&pgXopu-IPh5;mes z`x0ti?@QEas4p!4e}TIOVugV2rPo-91D9(U#DRr14B{O98m8u-JKB~cry<~QR|5#7 zJ8`BL_fQ{exmOi&b-X?RhW(3Xq7}12BVRgL))TTNU4McG3|5hv>}hAVO=G&)Xp_c# z@g4uNP@5P&tM5!4(J__-$TZ?VkiC)q`2!Zaj^2mF%6dw=fBX;#QVn`CLq7$CXO(Zk zVD6rSKc;|;^Q6MJghk{TP{l5npF+V6=Lh6D9nwBKQtv~)P*wy43#>X(^d_v*%-3c^ zGmtWr2U1J*!(yt)m4ytMOY6diP0@ul%%S9^W*L;aboD4kiPH+eT=LatIuK;>S7g_V z{m#a_CVa4(f3BdNE<=Eg^+3B_BNBCsuDm0jRR`Ml)7_zMKY WZ_&m7WEAJC0kQ z-O(&IJ-dUrY BeL?scVh6$VoA*+eOs)}QY06-;wzVhM}}D6=6D9*J}+c%917tDf$$z)3P*k! zcWUkmh(4F*R07jNyl25n3nZuVmKO4z3O`!Ne|IQ^XeWI-?FU}6#W v)=Bt 5c>i0-=U5dt8i|-L6yVQg;7Y`py7om1DiuU47SLr%P zHe3#GFWIgzg1vn6N@Mo2O_wX%OEz7hY%kejm9UF&yB)pe2nb2yN-CCN;$)xWz%DF+ zf04hw+QU-6lDcOb0>mW-Qm)>8x&3%)J nOP*EsoTzV3!vHIg0KmiqJiMLXg{!I|Qju1Mh17{Lg>Ob{*RvhHSS-dX49S5Z hCwhYP1UItUbJzC+3rgVBKU3MwKQf1p5G zg9|MBM|NSB+d<@0%X_l}+4X=z?^#_yifg)xK)z{Ck3K=l>q%LU6|ltiKtLrHY|lVj zu`ioPP!GZSzP+@?-bLcTh7wkynBa$e>OUI>=@!dB#~$)EL%-xw=J$XCd6$X5 g*w)}*s@fR3EM ^O zVi#!BZO!VOT)i _~Yl zmqKBv%~|; IWy?*=i?&>} zx@fA*o6lp&7bD7A^p;G$h#6F-Snrz21+SoDD;^;A22e1W&0KK@Or%;R>M63=^|WKl z9Lei?w7PObnbudH$iK++1;UnS-bq0d-efJyf0P)4#~Mep+$o78e|msy4*plc2GyCk zpm5V=8`?Hsc3l-W^3yMRgyeNcek|Hlrb(e8FZoNepoo|5(qyNHKg#TsQ6M&UeR#<> zE$ZS8f~Q8Z=e&_5If~YW_T=z2-b? (T+(6Dpyi@Nr%h{Z!p)dx4xQ5Nsqp z5nj=bdx4EQ5`GX{CF?Au&ta28(IS727mJHFM~me}HxD1Qz)LE)$lDNPo@1Gd%xPI> zjhsX@%4f|b>+QQhJUc2vI-tOT>`Dsv yN{=zTLZfa0cy*Bki;gJFLrbKzCL2b3lnGuz3N+{9|c4pjY>bc{xrbO1%T?q#9K zRvS3jl!rk{?N}{pm+!{?<)dS)MVk#vS&DNRkFte;3rt61twx}1h1borBDhBqPoLO; zCA-=Ei6Yu`K+amO#Ymj7?3=Drla;TP)3%oQE00a@xQ8A-FDtMCgv)=-AI!Q}(vXaM zjR0rcYpKwty_OAc*(cH=4f{kipk1#e1Df@bSXiq*>Mnqp%NeOiW^)b+&V0^Ehc=^g z81Uxw3JRoIy#fJfUgr=1&FrjrSaT!&kL;QDypOlJr@}~{7#^RKZGUkk>j&BYgb}AY z1L9*g(5jsZPWTI+r2T(9_3r&dHXYrbEaDe!PZo)bxaNG;5-+;ZS>To=t06!OsngUD zuw1hNKXZBZ<9z0_O+$sbMC(yKbJ322dBy-YPi%nGS|JTbbERZpEt4`4HBHI~*ET5? zPvfL`Os(S)7S2^_VNQvr6#(dKoP^q?l~$sSQzSd7Hkr}3 sBu{@&dv0}Pw*^gJDXYj+Z&D; >%>SoYoIRRLa> zlm-5-lvMGm@>#QB kig#vnQB@kLukEMdXuzOaP204V0tjCVDzOux< z?R)~_g`8x$a3d{QUHE~2G&x@JRJNf|QyX;^FKQ8wn^nDCrJIx(@{-NFKN+c?ksuyO z$>iSEoRoj1(6Am7NPw_ jxu2P&jIibjqU*= z 9B!VpC0y=%xFCGy!I-rr{VFS(_uuI-b~P< 9~bwV+$*m>p;ol2=7M~eKywo zM@ZRX77o5CI>8fCV4okT^mA|$Y4^aLG_Y0yy?j I_vP3hjMc*vI49g`WvuQ8Qg1Hk07K>f(IFU` zY|u 2<54iu!=A!z@V#gA)~9Lp6V< zd6o_ZxqbSLBhnv~{0I|2&m!T)(AVMc 9Wz-XansB Wt;3(9#= z&kNOje;o+S&!KR5M<@^!J`y^BWzc_dfv^mxE)Wjk(+1{xWhubkW)dC3-ON~F{ml$Z z)Z5DRPA$Y2g=aT2LI8Ecw452Eqx-QWUBGvPY^>ka1K}kI#{eM=_XIJl`JR9yXAQ5Q z{Tvt$FS5Ua7z{8JPB0617%_7ILreiq5CS@sND09yI)3aqMZ`9O5Lv=0R8W622$wdj z2d(-$+7Ad8_yXgKKhN*2=_s`yl=%KLd!og6dQUrQGtJ=-tPK9Wm`&SWfdh!E)hWg! zufGMxFPr`L!UJ{D#%Pzm=th0{so8&ETe<97uA#uIdaSaN)wGuze)t2{29D7MsH3Ei zKpXAsB)b{N=3KCg;GWVSC}Mwyfz|sSsHK0U1DE`Dr `@ zPbjp-8Dt!x -@@UtA32LB3%{@>ManrFC{*r`FfW1jA%%u8|u{^N1sfB@(gR`bd znkb^JXPse$!m5gp2HJw4!g`v63IirLr6n-(#Hu0+EDrR6A4ylkN&};(vKHWg2&R2p z&^Q%C^_MmfRsuh%*bslQl$-&O2dBz#N+%@oF0Q9Abv%|#=IPd2qN8g!23L-+6^r1$ zw%dnBo }i3DQP6v$3j!cwaEH(4eWZ9eMs E6&=C`88Hx=rlbVHKPkD$_BMf_8Jh+O@C o?*bP*A zqv`6&_&|HZ;Uy~|HR^-)c8;VYzL#ShvU#$CHw6B>FdlzR+<<6V{-dP#jF!cQp|7so zF!S}5-{j}wL(^3sCXm;4=mmzIa8niXg~_L}N<<8uq-1iLNmkLmpU#!L?BIQIA6c MD1nlUreiDdxLURb60@j_X`&*D;!DLYGa26ZM-#<|I9S`!HY=Ov$Jhpi z4ET^nJq>>tEG7;&5XC~KlU-2}c|&Ff^K$+`@@0v|`#twYYQh~H?~mE%LAwnl`KqD? zBZ$ r%nc!UIvF`K9 z _H)s3V3FYO30xkJxhi(}Nfn##vX1u6*yWom!j3QAu>X^b#gY!a zYwNnHD&9%l-g$Zs&ju(A!u4j!Hz$-Jjr9`bGkaonIHaq5dvwGH54YXq4%j&itxfWB zU)FyclZO*g#gTSFQRx#4` 3be&iwb=UlM_xV$6aKiVAd>g@6r0!X^+h<~2 z)5zs`Lgiw$dI+@LemZOs4?{jo2$=eTc7v=#wBxb=$F^tj2OGN*6GqpX>4)d-!_5VK za7+$@lgZs2e<6nq^ITGNln`%5F4fEGCfF;gng^QgNd7~fDBGi&k;0-Ss@IXa5F+~Y z<4)MCaM`Hddcr~W)&geG%fXQ#262>4)8f9CC!W4mfzlm?b&r815wa=s+{k1%q{{zq zB(UoLmy=iZ|4*!911)aZzv$PlpdBsVv#s@7E9rJ(e@z!sxdW)9VEo04liK9c2gCk{ ziO69(RGjxy^co>wnbS$tJv3P%m=?Qd5LpMB|H$+&q9Bx5x>Dzi_8`)Qnu0%mQ;t<_ za@LcPu=Y87Y`P-L^}xTk#I9)} @vY-U)!#YE(eXFNkA26JJ=b@U!g5F{~L&>E)2 zC~bQne^oOZk1-LXHos>jts%tSv$6z{qdKAcjun972H`?M
CXVe$0%ci4ge1#rJ&t-K$?%~k%L)P>e z18GNAA85x06)<50@_eqQkH!lOjbsi#_d^FHe~OB^TlN5Agp9ujlL2)TQF1<6u5tzz zXHuoiK;oZcKd^g{Xi}1a>j{)B?qXY>0MTxE_U@+~NdxSjh%si^*HJ;m;)?vBU|P)M zn~ry|(p2<>^2mB#8aN`i1SARJs+R-B3N4BOJ>Rovf1$-4B_-6m=ty1g*Psjo`jvFN ze{%`bkLkubBmHxoLkVMbRuTTc;UEr >)&Kjqo2|yfM^&a`A4dy?K%CIgCx= z`Be20UUac4Y=|IzRj?0UI-Ls9!Hd41OS!?zE_Jyzc*(7 o? `b=$c<{O<6)lVcBwV3*W@JuP2 zkAvEdfLnwdn251lTAK{x!h;{ZhrrmZz83>GCWCwk;9|75AL1daPD?HhyNyJGXM83j z7?|ME8$lXg1n5Y*7hmz>X f->vW%Oc%ARlA4E6pfzijdVNPN7 zn1=xYc^ IGxZpMu{n$Vnn%04E>=;!P+O^njt#f$3_BlVALIMC xtd~qtr*3sx7wW z-2)|kmdr%%ci66=ACKNoS^vnYYP;xuJc>VOdzNqu{$0|mljZl1e~eVglKW>?G%4%e zzh$ILSM~m#`<5bEcK;#v?51lM|C#lb-ZhgVKb}B7(5GbCi7}vV?1$I{kCvcC&H-jF z+26$SwExH4yKTp9WZQzjf<3w)?9&^xC6`^b{ZgBvD4FMo5{sltyY>qQm>EpMLIPO; zl2m&1gFoZc7~QY^e_{TTj vx2i>$D`6;?tVB9m87W&c|7@RYNMYQ{>nW?r_9}P%nucX z*o^Rq6grOipQ6x_%=i?Ij$w|csB kr|DGB1uv znU}|;%n!$;%%6@)nIDfynV*hH89Fj8m&c-verw`L8oy4dV;O`E6+52gd4qCCGB6t| zb}R$5p=L)hP#dasECaToX2eQ}sHErFZ=v<`Fcj{F2qQACF9*f1i#_pFba&K1Vm)9O!jKBhI02N3sHF)a`i2oI~A?XxKSa?pQ{iL(Pt8 z@HtfOSjM07>i^eo%}|x&*y5Jjyf`XtULKV;KOB`de>y5{emp8|j$(8BNVX`BXMf^& zHYbi}XX1FaC5~rL;&?VBj%PRGc(x*rZy(|~HzCYBe-Ou})p1M%k96PR7&je`bjRT+ zw;PUUP5-DC^p9#a|EQMok7^zNs21^$Y6btOmhZc@`(qfKab^B;_d|U&${g2V@mRMI zj&}dxXg3dzcjw?pw+)VW&)`@$431^DKx`EpLqjDt3XY*|659mF&>V?Pf}?1G#2!I* zBw2JMf9;Ie9+<9ac_#N(bJx_*YSkM2vgJB2ozfV>k8#2ukZl6MM9>J-lT-HNROoB6 zTw-I0fTn)SyN8?<@|9*=vpX4CRj=pfIaq`a5gE9PD0qyuX9|+MEb@}fo?iIQEPt&1 zkX&~(cApOuyNA5skJZjewI<6vo3%t#^^(*cf6LHQ@NBl54Qa{pj=g%@%o-_p%d{$s z9dGjHjvF0fZz|~iXu~&ayc#-4g(n9|F)t0t>c!)M60f1fFDvrjXwm4NrJgNnTS|Ag zc+AQbftB^ X zf2+WJv}afl-|$|4`W)- |vi9BGOl4kSf@g5=4w#S& zczN{>8pkqQllkMfB(xmXqJkYJj&n9wXLQ5?bJ-cIvcfQDW$x3=U!4bxb604U@Guok zWjst(QyC9e*;Lj!tJ`h1nscBd;SUpuf4K{MM>O}a<^#^{u5hY1O9l-IxDyt=IYv?e zjB_-{p|tZg&%qkZReD1dm}^89!aZ--5u(BT4SR?dv$T;0V)CV}v%|!3&V^+Y-8{?7 z2BycXfkmpj4XM|8(};J_=gl}ErA-8B$zgd9RWJ|O0M5U#X&`MLt7oxh1`F(me_@4f z!iu)AVw8LU#(9?N1WM2rq6{3eiP!~}>sNszpdL*ee&~2-f0DS-&3=3_Ly7&E;s*}< z@v#{vc;7u`#g@z;!*K(X{WybL`~7Gd*Eyl7SZ+u=cm1Li^T#E44!9>n)Yx!eu87gv z6jTjq55y);AaKT+OT_^y?1=H%f4*E}R#^7s95GUwl9Io7Jtgy^TCYQfOBgO-q{PC( zUO-8Tz_V5gb|`4 n4382G5;M`H-$4<7By5_9BeG*?4s&x`hsH!ky$ zg*M4!u*>SMdbn%0_sxQ8PU>bRp11=|V;Jh}`7Vze+m50cGuIzS6m@)Qe+&g4T*_vQ zL)6Kr(F9d_*H)VuV-bJwY8*}ck*iTWtg?5{UQf#rJImM$ey+B0{8)8Aq7ehtIKr@% zsCdl4)u)lbC-c?4Q9EWMD595_MsSQ;;2FU)Po;}EJ}?q^ZpG&-LVFz+2&B4fR?|+x z1mH{)unvCe$(KZ)e&Qvef9IHVN$}YwTt V#EkJrk;ISl$I!%&W#d@F# 5sR5fstG z+Yub2hPWemCU1`-M!E5rGpajFnb~WI>tj*Ph`5JxJY>LVPK0D;tGjYXRG9EiizM-7^ST4&)&NmIFn|8~hu% z9H_wu +a-e=9Wm(2ZF+8OaygW{rf8TR9m? zGGgUqEYp~klaX9eYa07-gsy4q!x6KlF_tHOO=C1u{F=r{s`xdHc%s-fjeQwrY;(r1 zY3$84V$2lH88#go1sgxB7)LW|Mlp_Rwqh1Bn;4IM0QG0BAA8LvLfA+xu84Rh6BsaL zF2Mrcf8d|9s(i>pufVAkaoA(VvD1)6jb- jFc@pUXhRm(?{?6kn1Sn`BY~q9K1XmwEZ>hnj~ ZZn2g_N$+iAg(euk-E9aqO=N$LP3}&MP3}$u>d!`qjTeW93&j)f zPQ8Bh1|598V4ool+CNg706%otGzC>yTeT+>AFav!pOZ@&yUoB? Tk;f46Wl?>qm~iZNVpnQ{7D(opBi9Gzy?JYh$@ z=4kc@$kVp^X81W8eGAj{ZT^sGwh}g^nzfW&$v4C%Zua}Y^R)eJ2Xl@}GC-cTl9=J= zs3aDq=_|>QXtqi+q?)yo(AgdIjuY1q4fUj3V4kL%)zN3Ed@vgW;D2sOz4J}Me?ow} z2MztxC?%|SDy4=!XMR`O+lj9H91uk_oLpYKzqtH(d3SbwetLU;cXfV!d2w@d@!@?) zc1+0s?&9Y5@a&66viMA=?2FHhw|GxLw #AzKO$-F`wk;UwfAs3&n*P16wgDYP2OEYbzWz>=AtV6;@Oc_@;QbVq zXKVx3zLc=ugjK`xb&z*?)80sDpV|YmQ7l2jz6q%!hJaJD1`h|PB!xrzcQL2*_u!wu z+#IOP9KO69ysR8YIl=L5L$E8k%a{JaOFX5B!<>b4$T3s#v=Gf&Ky92ee-=>#B@`5V z3|KveG;L9Vg~yq@zahmu1;xTMXF0J^&R0xqj0b7TfPChHa)?55-~w{k!tqrKhFDyl zv2YA2<|!Z+o|A*7-rNPn#`u*A3wCsis%%Nw&M+LZ5RxzXd~7rKsV0&+>%)QjRXge2 zb>ge_tzzq8#zHfsn5W2Ce|Sy~ntF2=7aQXN3(L%HjEQ8<0(0Ot#!fnSq4|1kOupU} z E>M+ezS z^B8j%XD|AL#j_trJh%-9LCFjwc{i&_%tI5GdB}$Mw4D6|6o+G$f0w!sLpe{Kp@pRN zZ(?F7@Af4NbxZ%}o2}R9H@Bzko`I{*Dd;h 8HsqJIea;Ji zrjI3BXJ20D4-a$3r6KLd&1?~9NmjqEp34~t8k*r~V0K;(+6R-lIpCJ{ybLv=rHDMu z9FIorbLORDM{)M$fAHTc L?k-wx#{N3dORE(a(j3*!{Jh@**-kvUnavpql36? zLCe&XwYv{GeeE7F%u%}yB$L+e0sg#6G vEsqV97LboxZNB^_2Bl!JED=tKf6gV;z6eI;=v^mL`*zaus~y zf+vpKOj-DPn9~=)KEWJ?aL6%fLF~iN)tU5p=Iu=SY_sP2 WxK7Jm*vTiQ zMr2`j=ssI~Cgrl3Hy+A;;XB2e+>C^AJ46nmmaI2me=pH%P+bk^+ E zB;q+VGKU!n2VI}XyRYTl)AHL$^jk+{A iv;cF2Gi4QxRL@B)+-_y{6>)j*Crj4K4MtjP&2pUkV zWzaJ^f6}`s>1dDYkw1}3I1TuUdHTzPPB@ gFJa(xw6qS^Fgmo+x&kY>w8Lxja@9=DxXzc$f;?w+NVD1n4oEsB@C}|cdsnUU z@>1h-7rs8-IG(VVJ0@jZXP;?~vEy|G_)SLbe?MKPgbT=|?r;p>+c@hAwmWkiCt}>t zp@-7;rNQGprZ&Qz4-P{5kDU;7W`GRkO#UvEcZ{V64Mg>yBkF~X!PQg3(Ht2$4B*~j z9S`GE62qV=_#iY48ICCqbNC+DFu(`ndha0Y4bE;KgwE3@qB{Uj&^3p>Xd)gI*^4Lg ze`%4uxctu>M8nHtC6m_^4SD*SGK8P2@EVwk?4A?{VVb9+=tOf?6`g7B%A&K)SzSKj zQRMk5O^1J&>{0j*mPrcd3|Yk&1SZcS1$Wl0QF#^x$;#Q1XZ9Rdxn{^|wzWKYMt88& z_g+2hxw@`C%}o7PpJtv;OJSL_-YGP5f7c6zYSL=qUwF_$22HA1NL*fp`FluhaL>+7 zs3+S}U3*;K)uh=}WkW)fehg(@1U-%wO+ov)vLwZ8-1nY5%?9YWzW(_+t3CHpCt&hl zBb 2u|Zz@9Y{Y!G#Z*CB *WrpvpY*Vle}^xfD*0TcldsBsBKMO|gLLSVjO}4{4;arJmy-i! zSC4hUCVz*E=0X&g!%>25;={4c)tL2Y{KtOwW#DgR9W3GMs#+h8ja?o&Am8-sPdx^H z9;rPD$(`0*%}>cXPiQ>mtyTx?Hv7DD^_Xxcd8XxD9eTEguSYXOMd~qNe}Utz-y&N) zlKI)5_%M4mmRZZ!EX&d=@XYF0i_c^^V |39aFi z$6$bdxS^4Odag9QCM(*-e~^0e 8uCn23o{2i&zId7Q%@>%vKewD z #Wo;JGWK5_5TYxw`_d5G>S8msLMP7cT^xvbw+DC(!lN!^peXY_a z`60hI)n;2{_2JX{WRtDPU7NQB`8woz2?gzb_Z8T`QZbM0m-nVR;in#9r{%!0#JZ(g zj5 Pp8EAW_>yxzG^)jHB_C5^J^AFZP5HxO28BY*9lb^J$#)? zhp$=<;?9Ln&-xV$fv&{YDh7%cU$-Dc&uOM0{EDNIeWy2*f6$Mc &wy zOwWqBUXx{B!}%nh00+zYxLX0!vwp=or=90NP-92xx{8`=Gl7U{HWz5CyL)nnPq42^ z$&Ylp4X;^P-E@zn*u-pU(%=!1!QkD=x42^3aYd8tvxvJdZS+3DK7{&!=KzFz)U;^Y z_*vCxiqRv-f4vyT4HL&x9y0SHhk)bo$Bwv0vK^$5EV7agC$i;TTW#`1RI?w)Qxyf? zCjpvfJ|4&-_;ClP)K(Qc5IQr}d`XwX+0BR!6T?UJm@GWMjDQD4<61z4Zw%2s9p}E( zd$dl$)N826G2=HT5RrjgfX8mk28l{Jj%(boU@Y&Le@%$}xegu2`0?xhT!)S0n5pFc zTnCDyd{riLT(T$8iFTiH^2o8dMofFgB_bL$A;ApIjcL#{&T(X8*0x5|j%m;)ARE7t zGX?qAN#K1t{XOX88}kXszDoY?y-_>`_a1}Fspz9uWu_oLY@M27jb=3cn8CvYWM839 z_1C^*e@`DxK@24t-nhxL;wv!sHhT`pK1GE(tCo4W`VLO&tw>R=lBQk$ysQ>U`XcH3 zp;RJ22eK#Y<^Pdw>byu_e*fZoL_+h(RxCC2Df~>}=g(%~?J68rggxD^{E#mqAYTZ` z7iP$XmX03GF0eaI7u9;5!3$|2m?G>M|6xHaf1$(#BJ!|j{D%`U4NA>?`O*!yBnwFH zpF+T7*w p^8Ly89{3lr@Gms@7asVRvG6Z7 zfB2Vf_!p6h^Fm9U7rw-K@gf%fg$D0QoR^W>ztpsU>C^t@i&*#<8oXP3cv&!IOV|-C zij<%Nrv#lWd}~r}!#FVH`O_u+W5jwO_t4k{RahDJ4Y`Mg@yDNCkUvF0{v;rOazg$& z0`kuS^3P^S{*+w^q6o@g#52O>bpBPBe;Ksr@Sb)S+AA34E)0%F)?c#{;`*l$CK>jB zW+kM{pUmk3#zlhqaTXA)g_yhCb(WXueVvty#}GI*_$B?Fu-_KwdhrO6c^QT*LtnyA zi2Tc+Ex^0rL7@zLne7~dLLTfz1mp_=`N9eLLj>dx0`dnZ KDgq>29fXGgKfwQHpeItpR56v4 zlc2`MB=$kL$*|^zXH!>gwWx|9f1)n%mH1@`g>?|FQ8>6JbR}F8?&2nkV^QGExHb9b zHm~u>TM)7q{#yAkqBmsI2KPo?;2ZkO(I1I`KgOW`C{cfOqy9Mt_0JOZ&o |pfwidsVL+b0>NaeU!osIqfB}DZg ^Z4pxFtwSVxp z%7+ +g LK_tBswOPB3aU@Sy64ErGHD{ %c|~XJ^chX1r+Hn{1O%9o3o2=-8|_n$<}9iy9*|i z5>Dnck-*;+)c;GU9=HUY(oS;mIjz*vH%xcGc0;7o alpFO;g%D z64IvC10Za+%lp*1!Piq}2$AX-XI+4#dH_|vg8<2*w;`x0w$xJEqklpd*q!P!T*?P2 zQQ%UjD+PRHV l%iEV3{n8*(!Z5 zys!)7UI};^^(fdZPjrH`F0IpgTZSlM6Me_rk)OLK)ZI* vws3dOF4w-lzYgwMVs;+@bqR^w%HeB6JiP|+7t8>+vo}Nb5pP~ z&wO}oOPh{-m;zRM8;n~kUOgz_lB757t{{d;4+F6X%UJ`YHM-kjA)@z1MhCa1cv%>@ z1pe=a#<_n=)rPsEZOOyNG7vt)(^s8?ha0}eQukyrDPIQ?_kVMIqz(?4e&Gq#OwKUD zwUNatR3n3UY*`ccmeQ1+t{R&-5@!hWMqG{hF5xG*LQ4#8gmsZin+;jy4`7AdwxwuO z&y9qeY`i(eJWzc-DzcO9BU5cCeaTMOho;bG2iMBiQKUlVY6mym*KUHgs){CksOmJ^ zwiWant!*e{ 6eMd% z`o5wuOkbRQZz#EgF!}%igm{nygIKYZ1y`E3b@fEpI%&RoEa*Q=PMPUFKz!L%@l85k zkAkeDbZrw_RnkR8$J*N}w9q G%Q)uw}tD-DlT^?6K6 zYjVHPkAI*vwjYhL&=`)$7=hQ>ue76p^9>JluDz|}B4d!g1gC^LCBn(gPiLp=EuE?P z_J?g6nB*^+V^SOTjg4AVv|X!XXqmtV_}>Za-I%oCdp9VJZ1&wm3yon{k?*sn+fB*` zEQWS<7>G5j+&$TD#At`DEB0194B{|yDEQH{Cx1eRj^#tXO4AfH%yCpuR4Zuyn>1_E zrrOpE0`qCSb!3XMMMV=!5XWgJmoT{`O{8QZB$JG007}AK9wgn7#x)|bK9oMx)jG|~ zCZ{7h*HF_IIX@b%Rmdg}LL@9ie|TzEmv-}$DeJ?!-j?GPZ8}$u#}>g|%Xc 0m6cO9=UamGKBTlh3`@I_!;vudb^b@8jm zWRyGSj!-3TxTBGkRvao-*e^Ep*tGB;wlzgBw2KWIIvr5m7i8VA+>42oMe>R}v+Q=p z3}n(!x-PK0Anan(OBeV@Wk|7)W!|Rnbbph1E~t95vI;H bsaP7?^1(3rAtIE93837@^Na5km+xgDHIx6C>1R)A^}sI3>~ zjGq;PsW}fI+dT*nqaS849_wG`^&Sf9I3^7t1iLLjL)cV=bjGRNwrObtF96dmgnzTo zaECeu09~^n2@8@) ==C+@#csQa-rk-JewYqnm)4t?Ibccd)}4TaCpEqO~5yubTwq%Zj$ODI~E zbJS^3!3=PwxF>DZA7UC*c>tR;aKcX(Z O_;AsHCha^ Q4|SrqM>{C%c^jt+ms# `hWjB{)7OS2<)RMJUYU;-#BGZ0?^@y2fb-&{b*3xW&ZFW zHMgCfwUWAkRu}{DXGs77WD+PxYYjT$YS+ld)F6w?X0m*Eno`IqIU>a!#j3QPOEGF- zMYv)fY$%J GjyQ!-UsoNYDNU$VX+8bNoSbq`ZRd1YMe9Uh&)mOv+O74%7*Sn`p!a?C2wQ^ zo;&i}41+nOgBq3BVSiPT5QZEMSFEdgmv(|_IfB; @e@YY7`Y;tB_L z@Awg~qz~sE^H12WAoCAO#x*=$qJz=S5!<<7 i$dg4M4=IqykO`2sk^W5JBt6`I8 zOCB;bFFd nlbKg8|vL~>b z0u$lRT3M(Daet_vXy}C9ujadn2@RcGBoLamaxmAH41aaRMeDfZGsz~ecm2j3dzH0x zUW#YbXeolZc2!%30j8jAK!85%jHUGPk>JT*bjLCOMk6;x+DdPR8LJc9qg@-ef&w&A zgxOB+n(YnwSt~e^PuR8+9Dv!u7!p=JS>)KZcTKVae}AT%tbH7#-x!+LRr$y7|Duyn z(z0n7$iY|^mRvhI8m37=G{IA0AQ~L=7B14I8PfuFL;52BOlXbUrJG&*NEJ05Pz#N9 z426g>$|PALWmwcehF0xea)mMpKlbL0Dq8f(7I?N{WC0sMTyze>g{{cfdCShLu<;~q ztujaFXn$A7hV-s;#}Vlna}QCjtZ*e_Tk`Y9={;$m3E{_;?~Ny|0yGVReP1P7po9lv z#hwKUi9?e;5JxX>*OCj~;GYmCz3Pr&>;c@0Ds3&)>>y%jU(pM#cNgpoqqBAH%PXA* z^9t`bOsZJH_EV88b2?D$PK`p}4BNNliM6ofbbs}to@0PS4S;*XC*%pUvk6o`x}7qr zJF2NNXfw98GAcDegJn=LvKAUOi>!!Jx^dRPE|^;NI#(C4eli4mOH#7kKws+jXzeiF z8IU&+>vQ4Z(~G6lMo)xreFoyLbb;eorPyH~CbaPGY!;VnTYMM-Pf-@tGwxo?_YYwM zaevz|OHid@C*RBzgmlWoB=Ygb2DT+>7_XunBh8j@hPP>J<1HhLZWdu4DAApL8Ze{g zal}kU@Zpz_rl^e9l08I1N>K4{4_Rb%8h>u#kqmZ9R;X5O+YR4pyeE&@Q|{;_d$fUQ zXI;32hf7#EY(zyko6_ _~PU^yb_py*4!Vc+6xtcw)4^x@=v z1YIZd7Fu=q<)ZM8Ed~Ta;+ {OwY^$TP (KgY%0EdQFj2B!v|x=rhC5tY%Z z)FmG4z1|k?EbdLs#zooz(wpPCqwlHMdZji3U_Gf _d~G@rE(y!2~LuU zgVSP@och@m>Ni`VF&@hGo4UqJi3ggi=dR)KPrHmNSaGCEcpRFBkO{LeP0JJ&cV)KD z7tx8*7kkYd{7KRiOn=jqe97Cfyj)nYOLfxZ96W4VfE12l1W+LTQ0|<$bS2S7`B*)7 zT4#%Pn-#?_g_W2 NpNC`27f$z&3l^R&1&BghNjv` zbY)N> q>E&;Yg)37P1nBE4Ssu5^!c$$b2?9^rBIqejjCo2 zfKQKAk~azWQq$wFJ$3j`%OeD?kYWr5SJI`g2c2z|HmE4~b4AujIRJPC7MK<>DuiUP zncLT~o7w99B7fWmh);7i$!3c|RWU+^J^))ZX6r~*5uyS-qp?pS^yEL0drO}8jLX`l z68&IC %dG3Yj9m~A8wItOI*HX zSL9 2yhn}3!-}|K|yv%D~k!jXSkrysiB^) zfM;0wN`GwY+QU&5amlM^GBCwDKeIA&8duVihr`t@UFK+_IIDL-`gkDZG!VV a>Hq#!^!1@ek5`_r6M)vzZ!e7p;n`EgDc2^Y`Gg?UKL1YAyZ59N%7~ z^|54dnK6jz15kV6s5W?w<1^W%G $0Qc!EsZtF6A%8D)FXC$Lai%b3*{eKeX#|~J!ON)FXEGC)*A^Eh}2Uo zE|qptFsqR`33aj4!BaeUCB9`s7Bq_P*^EvKvT08isQ*)fCep*M0gmg!yON#=@PFa( z&(TAG$Sx RUN^TIO zMY_#g2RRi+Ej+j<{KJYK4BHHo2!9^0xytH>*jB~504$Left;Cj!e(egoq97;MN(Pl zgNJlB=!yef<7;a+ayN)r`s+Ls>FLxfS52LcQp$oL=gHi_W`H_$$dYZ)PzAivlNH@% zpkRF*5a--0;a-XKa%jYC3wBS>!!JnV@DvjE3p H57tTB1>@%`D=>GjR|_4s(mv&mCNLxP6H;^zGH`s|mB_iuwD;Tcs9ROI2$ zhhs<`Skay}ohhEC=1pfXpMM8tYy%Bf)xqrD6RaxGSxxo8#(?2@Wk-Pf?@8wa##NY) zT^((CTWQimm9fcd3*?=Us>m;-*ra?D+T1BBAy}^n4t(F*f}|e0f+yWm0+wYRHKEU8 zmOfJ)6Yl8JKv`(UK{vdPL-PrKBW}}0J4~rSKy?)x=8_N&iUIsa-G3Wj;=u|I?p(v< ziHuD|C(3KxGYL#oyaK(KR#t>JokyrPQhtZWwjN{jFv$KQof7Wk y6^vYn3)lRL8v4h(Q`*M+O@7rpVFCyaD ziQI@^4uX~}9>FS0;eR=SJD}+c-iq(xG2A|-Xp(pVuSz =L^GtVis=%`nPk5qaD+*GWvV z?$Nj)_yrMpR5cIKXi? g3v%xeXJb(Y|1s;>222nAw4oN^- z8>?V03=IF-@nGR`WTwC>W-nugXl~{a=_l7tnV62^X2bRNC?X~yW$o}IBBF?d)a9b0 zT}m)G3yuHVA=g#uJP*?c72)|`J22b*4aVic*&jQqbKSm=X pCYQXOHI&bi8 z0nfZl(Z?zOp-f(*Cz>Sf{0)l+QX$$Q=F8|>pi1#d@ON #dF^5jg%9f%He|?eu z=t*FLHTLCOA&P;_;`*)MAh4l`em~eu1ZNV0;6*? 9P4N7Zlf(cl_ zL9%>M%;gUgl>4$I{V=qFFZ|WFaOI$>NwW ^s zGcMFr;9)-uMsWkYO;*DUGEMnP1AnYe^z#{BIgH@scrG+1b%g ByHxg=`on%+UGD!%bCX}P6JFdnnH>g`i)RWK&g7M zCv!UOF!5=a6D7 5_ zk%Y#G8Yv9`ZYAV7BU{Y6gGd;qn@#o%n>^fbJoht0Y8%xXoyiy_oy#aIcBPX|0QtIF zZsD>94Zj?tfKC2VaSv3aM*HA0tT2)0948LdaiQQc1+B)?H&J};s`(GF_0{Mku1rVM zhVV?+&tw QE1U^I9_;LMsK7TIQF){}`XTxel%AZ(>En^n(*m{OA&K}RiizYJp z4?8w?ATm8d33Ms!Ys8nGimg}-PFeCq3g*^e)RUG1h%JB^PFwN-y@8TJM~GfkEFx7B zQr!Z~hj(XoD!ucHFI+Zxz3(#?uj{H>+d2jGWBmdC9LV9mk_0em+ClJu1Am~KMV)V~ zvvlsuJ0 0mC&FuqT4gY?+2?3dxdWg-q!N-BVK6uE!fRMu+@s=EX9L2_@&~ zWz|JoSSHULD_9GIWOu=tJbRLw*(c)a`%D{Y%tlFO(TGQxJ6f2zWY)GB*kXkHep$&t zJ=0uG4L=OmMudRNgFJ*`8-Hx5AQ%j)8+fu4Exvko9ZkCR5cus~p%?RoS3lAByW!^K zK&K{#zVVa*xmSmGx_E{L5*S5q#3moVY=*8Da)|sgic^ySYsyO=KMMnE#aBgjpA~me z$)`%ns>Qm2x9>i@I(>I{b9Q}kb$erB)|&DtW}~Fm1DLXuIM-x^H-B$`$#Ci TfH8}k(g!mN^GLf zS7l~>kAeI0I?O%{(to&t^pxdzuOw|0NTc2gs6p&hxFn5}Fp5S5cE>?a!x(&{q@MUg z=G$y#OL*{NsSdyTLfv7|nyf2)zq-vFM`k3NIRB}Ou^p4|uDPR~vdFWBZ$yNwv?;U} z$y4Ue=CI}kHbJhx91eOT+IXEJ0rdyUG3&kowJlNj))a^C5`PxjP~v-e?A79QmD9N< z=n ~zb+eKI$vjl@BG?+=#z~Y3#Y{f-CU>ycHl+h~DfGS^nCZ5wBS{PoZ zR3|GQ8!v)`?_|Z0q9+(m=(ZzgAYuX^`$ppiz|W6p?WGlO 0oWw`|C`E`J2iw$8zVghNTs` vJWk8w`Vy0ZG~?HmkmMQkk4=uEj=9C zEc1s4QWLmiE3EmnU5GTqp!Gn%2+Y?qs5BI$1Whbfu6uC+^T`@PkO}62+HM#y#H^`i zv&Gy~uA(FIqROzxe5|U^5$QM-{m{82=;9#$=a$qv(PFx{y^0dVZ$K>Xm%JGP9|A0|m)#iwA0G>m;hY1hz(~5s z7#f9Tbb(>uSxQ&ZgFo-MY2?9xGM5_~0W1Nsmq;1`D*?@ybQ%FLLbHQ7r1HPE*;CL5 z^N#r^r`(@C>TZ0NQ&VqL4(dW-l|7&h>IfXI(5tFy;c47W`lim-L=GFxZIU50e-~bO zfcd_c<{AM`39|Lbm@!eXF&>va8v!Q*$b*+=8v#BW6phb5g_Br^xWxx-3|1*TN~|!O z#`2>ynh&LyzZ(HxIv>paehp6A0I-yziCJJ*3}7ype1nFG#eue8^&JXbX?BoF+&bPA z+f`mR;%|h$!eqZ02z6ya#B(*5SR4Ul0^vWGz8nE*0uhUsDIEbT0tQEyRviH&0^H!2 zdmRB@0)Xb1+Z_QY0`K^j1s(w;0ugkVD;@zq0`qW}Y#sp_0gIQ09sw#2kAe7D%^?5D z)KEONmqC}l9sz9~HHh|$**%;`!;@&(UznaAHWB$CZkRvxt-8N_jF(6s0kMD9I7r6? zP6OBxxuNF8XE?%8Z3tTM+|~tqrxs=r_jUE$*h{^EJP;5?6MXuQpdC;eioJgevlAXF zOmQ4gh= N8AcR-q6TCg7}92kDe$+IP=dZ9$7(WYGZIWXC%z%k1+;|rP7 zg+8}4;xC|&S#X~?8eKFdQsfJqgy}AT){f5H%xy$C7mobmXsvhHCQX0Dv4U|aFpw69 z5f)+Tz@9i_(=tbIY$opu-{ONv@>`=W2` s|hP2M2;!%Ip0ja3WL*dv>59L#S@NyFFtGdSn7Nwm~!>5;UuXZp#Fe$m- z7HuxBov*<}2&4wOrk;VZS=A80OC?MKVK8yEFrC_Ox1?#!^^|$>%`f;3i~elWQx5^H z8~kDkXDiwYoF3eaeZk&ld!tzt@2l7kB;HQJciU83; p_RporMe$4#I$k9_~Npr2dA4xx|U4kX)0-aQHrziy8?99D)s>Y9!V z3*)m_UcHPUzknm|a(9k?eR5kS#pq)M8JBlb`OY|1v^pk?+s;j#59*ZR6WdMJJ{k+C z;@{op;EoBn8livq3x0gVBh8A6H@A{!7^yy!1EAYWNzez|YNs-JNzsHAVQ5C%?Z)0S z4^** UDZ2Q zR+u^d09^t=It!OK7~~RzAV|W3blQFR@XA<+sXKp$f!$?(g;O7F3ADx)!m&0DLfzve zN`$h+MnGGH!U!9_mV_G_xMv_9a;WY_6XxR&!nl9o>r=QVA_C!)5H#g@prLlnqnDfp zxw-jeC`za8Ro#*$YJrAB7xwMe4$dNWBivD6={}%sNl}v4$HGJ1;vWk}ny%K1O&Agj z%HWd!D|vf)c4b9fH_K2|3@TACZ(a{k?I)=Fn7xzJ@{n&2?=fFI$`LH=us7*~7NuP5 zQhI-Bya1mdM52XA7I5r9Y;{H`1x0_nMksAp2fY8 KvaIfP^D2KfdCt IB|wwSk~g*oSNu`^5Nqw@&zdy5=ked-m$+vk_tBUnl?5erPv49_G?;i0ycCk zzuly?DhPWlk&Fg_8#*W0ZlE$H+{vd!OBRo1zQ~GnN!lzgVxv8jzZEVCckzFzur2o} zOFiL_+NX~h&h_W!4#&-^2>xCEG_Y-#c{@C;ZVn{IWSedK-3MF-O@x;nS+1h9h0`=s z86ELaIT=9OM;N6^m-eDr3(C} EnLcW0{C&qK{#Wpz6^LTw5n?hCNsmfnX4 z#mfWmE3D&F2zqkCbor8G4UT_i%FQBWApRUyiERiM;EqF|_g80$bayHfUQ;yj`!Z5`4NCjpn5sM7o8kLBMwL$j?7jzGA2b6~&RdC7rzTPK;X`ODJ_o zrIYoM8owHLsD1PcOXs07?)0vfy9diT5JyP$r5_Oq4>)cpRINWf2RwgV?0wZ56RJ-l z-s@pn#k2L~y^-8LJa|$LLh$klKP?zIMc8bL9o+Dt4nEB#sxEa3A4!H(4kol5(1dgF z@Mu=R6$8*AUBGKRsd%