Main branch¶
-
+
Feat: EvMenu tooltips for multiple help categories in a node (Seannio)
Fix: Typo in evadventure twitch combat’s call of
create_combathandler.
From 035831f96384ba65f7485d286385abc4a2709ad7 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action Feat: EvMenu tooltips for multiple help categories in a node (Seannio) Fix: Typo in evadventure twitch combat’s call of Main branch¶
+
create_combathandler.
The EvMenu utility class is located in evennia/utils/evmenu.py.
-It allows for easily adding interactive menus to the game; for example to implement Character
-creation, building commands or similar. Below is an example of offering NPC conversation choices:
This is how the example menu at the top of this page will look in code:
from evennia.utils import evmenu
@@ -310,8 +309,7 @@ choose to point you to nodes that continue the conversation or maybe dump you
into combat!
Launching the menu¶
-Initializing the menu is done using a call to the evennia.utils.evmenu.EvMenu class. This is the
-most common way to do so - from inside a Command:
+Initializing the menu is done using a call to the evennia.utils.evmenu.EvMenu class. This is the most common way to do so - from inside a Command:
# in, for example gamedir/commands/command.py
from evennia.utils.evmenu import EvMenu
@@ -349,7 +347,7 @@ most common way to do so - from inside a startnode (str): is the name of the menu-node to start the menu at. Changing this means that you can jump into a menu tree at different positions depending on circumstance and thus possibly re-use menu entries.
cmdset_mergetype (str): This is usually one of “Replace” or “Union” (see [CmdSets](Command- Sets). The first means that the menu is exclusive - the user has no access to any other commands while in the menu. The Union mergetype means the menu co-exists with previous commands (and may overload them, so be careful as to what to name your menu entries in this case).
cmdset_priority (int): The priority with which to merge in the menu cmdset. This allows for advanced usage.
-auto_quit, auto_look, auto_help (bool): If either of these are True, the menu automatically makes a quit, look or help command available to the user. The main reason why you’d want to turn this off is if you want to use the aliases “q”, “l” or “h” for something in your menu. Nevertheless, at least quit is highly recommend - if False, the menu must itself supply an “exit node” (a node without any options), or the user will be stuck in the menu until the server reloads (or eternally if the menu is persistent)!
+auto_quit, auto_look, auto_help (bool): If either of these are True, the menu automatically makes a quit, look or help command available to the user. The main reason why you’d want to turn this off is if you want to use the aliases “q”, “l” or “h” for something in your menu. The auto_help also activates the ability to have arbitrary “tool tips” in your menu node (see below), At least quit is highly recommend - if False, the menu must itself supply an “exit node” (a node without any options), or the user will be stuck in the menu until the server reloads (or eternally if the menu is persistent)!
cmd_on_exit (str): This command string will be executed right after the menu has closed down. From experience, it’s useful to trigger a “look” command to make sure the user is aware of the change of state; but any command can be used. If set to None, no command will be triggered after exiting the menu.
persistent (bool) - if True, the menu will survive a reload (so the user will not be kicked
out by the reload - make sure they can exit on their own!)
@@ -387,24 +385,16 @@ menu. Temporary variables you store on a persistent
Input arguments to the node¶
-caller (Object or Account): The object using the menu - usually a Character but could also be a
-Session or Account depending on where the menu is used.
+caller (Object or Account): The object using the menu - usually a Character but could also be a Session or Account depending on where the menu is used.
raw_string (str): If this is given, it will be set to the exact text the user entered on the
-previous node (that is, the command entered to get to this node). On the starting-node of the
-menu, this will be an empty string, unless startnode_input was set.
-kwargs (dict): These extra keyword arguments are extra optional arguments passed to the node
-when the user makes a choice on the previous node. This may include things like status flags
-and details about which exact option was chosen (which can be impossible to determine from
-raw_string alone). Just what is passed in kwargs is up to you when you create the previous
-node.
+previous node (that is, the command entered to get to this node). On the starting-node of the menu, this will be an empty string, unless startnode_input was set.
+kwargs (dict): These extra keyword arguments are extra optional arguments passed to the node when the user makes a choice on the previous node. This may include things like status flags and details about which exact option was chosen (which can be impossible to determine from
+raw_string alone). Just what is passed in kwargs is up to you when you create the previous node.
@@ -412,11 +402,25 @@ node.
Each node function must return two variables, text and options.
text¶
-The text variable is a string or tuple. This text is what will be displayed when the user reaches this node. If this is a tuple, then the first element of the tuple will be considered the displayed text and the second the help-text to display when the user enters the help command on this node.
- text = ("This is the text to display", "This is the help text for this node")
+The text variable is either a string or a tuple. This is the simplest form:
+text = "Node text"
+
+
+This is what will be displayed as text in the menu node when entering it. You can modify this dynamically in the node if you want. Returning a None node text text is allowed - this leads to a node with no text and only options.
+text = ("Node text", "help text to show with h|elp")
+
+
+In this form, we also add an optional help text. If auto_help=True when initializing the EvMenu, the user will be able to use h or help to see this text when viewing this node. If the user were to provide a custom option overriding h or help, that will be shown instead.
+If auto_help=True and no help text is provided, using h|elp will give a generic error message.
+text = ("Node text", {"help topic 1": "Help 1",
+ ("help topic 2", "alias1", ...): "Help 2", ...})
+
+
+This is ‘tooltip’ or ‘multi-help category’ mode. This also requires auto_help=True when initializing the EvMenu. By providing a dict as the second element of the text tuple, the user will be able to help about any of these topics. Use a tuple as key to add multiple aliases to the same help entry. This allows the user to get more detailed help text without leaving the given node.
+Note that in ‘tooltip’ mode, the normal h|elp command won’t work. The h|elp entry must be added manually in the dict. As an example, this would reproduce the normal help functionality:
+text = ("Node text", {("help", "h"): "Help entry...", ...})
-Returning a None text is allowed and simply leads to a node with no text and only options. If the help text is not given, the menu will give a generic error message when using help.
options¶
diff --git a/docs/2.x/_modules/evennia/utils/evmenu.html b/docs/2.x/_modules/evennia/utils/evmenu.html
index 55b8ee5389..f69068ec1d 100644
--- a/docs/2.x/_modules/evennia/utils/evmenu.html
+++ b/docs/2.x/_modules/evennia/utils/evmenu.html
@@ -152,8 +152,11 @@
menu is immediately exited and the default "look" command is called.
- `text` (str, tuple or None): Text shown at this node. If a tuple, the
- second element in the tuple is a help text to display at this
- node when the user enters the menu help command there.
+ second element in the tuple holds either a string or a dict. If a string,
+ this is the help text to show when `auto_help` is active for the menu and
+ the user presses `h`. If a dict, this is a mapping of `'help topic': 'help text'` to
+ show in that menu. This can be used to show information without having to
+ switch to another node.
- `options` (tuple, dict or None): If `None`, this exits the menu.
If a single dict, this is a single-option node. If a tuple,
it should be a tuple of option dictionaries. Option dicts have the following keys:
@@ -998,10 +1001,21 @@
# validation of the node return values
# if the nodetext is a list/tuple, the second set is the help text.
- helptext = ""
+ # helptext can also be a dict, which allows for tooltip command-text (key-value) or
+ # ((key,aliases)-value) pairs.
+
if is_iter(nodetext):
nodetext, *helptext = nodetext
helptext = helptext[0] if helptext else ""
+
+ if isinstance(helptext, dict):
+ # handle both (key-value) and (key, aliases)-value pairs
+ _help_text = {}
+ for topic_keys, help_entry in helptext.items():
+ for topic_key in make_iter(topic_keys):
+ _help_text[topic_key.strip().lower()] = help_entry
+ helptext = _help_text
+
nodetext = "" if nodetext is None else str(nodetext)
# handle the helptext
@@ -1170,6 +1184,8 @@
self.goto(goto_node, raw_string, **(goto_kwargs or {}))
elif self.auto_look and cmd in ("look", "l"):
self.display_nodetext()
+ elif self.auto_help and isinstance(self.helptext, dict) and cmd in self.helptext:
+ self.display_tooltip(cmd)
elif self.auto_help and cmd in ("help", "h"):
self.display_helptext()
elif self.auto_quit and cmd in ("quit", "q", "exit"):
@@ -1192,6 +1208,9 @@
+
+
# formatters - override in a child class
[docs] def nodetext_formatter(self, nodetext):
diff --git a/docs/2.x/_sources/Coding/Changelog.md.txt b/docs/2.x/_sources/Coding/Changelog.md.txt
index af644b2dd9..c02b0302cf 100644
--- a/docs/2.x/_sources/Coding/Changelog.md.txt
+++ b/docs/2.x/_sources/Coding/Changelog.md.txt
@@ -2,6 +2,7 @@
## Main branch
+- Feat: EvMenu tooltips for multiple help categories in a node (Seannio)
- Fix: Typo in evadventure twitch combat's call of `create_combathandler`.
## Evennia 2.2.0
diff --git a/docs/2.x/_sources/Components/EvMenu.md.txt b/docs/2.x/_sources/Components/EvMenu.md.txt
index 74c4528bcf..8a1342c7ae 100644
--- a/docs/2.x/_sources/Components/EvMenu.md.txt
+++ b/docs/2.x/_sources/Components/EvMenu.md.txt
@@ -18,8 +18,7 @@ accepts specific options as input or free-form input. Depending what the player
chooses, they are forwarded to different nodes in the menu.
The `EvMenu` utility class is located in [evennia/utils/evmenu.py](evennia.utils.evmenu).
-It allows for easily adding interactive menus to the game; for example to implement Character
-creation, building commands or similar. Below is an example of offering NPC conversation choices:
+It allows for easily adding interactive menus to the game; for example to implement Character creation, building commands or similar. Below is an example of offering NPC conversation choices:
This is how the example menu at the top of this page will look in code:
@@ -175,8 +174,7 @@ into combat!
## Launching the menu
-Initializing the menu is done using a call to the `evennia.utils.evmenu.EvMenu` class. This is the
-most common way to do so - from inside a [Command](./Commands.md):
+Initializing the menu is done using a call to the `evennia.utils.evmenu.EvMenu` class. This is the most common way to do so - from inside a [Command](./Commands.md):
```python
# in, for example gamedir/commands/command.py
@@ -218,7 +216,7 @@ EvMenu(caller, menu_data,
- `startnode` (str): is the name of the menu-node to start the menu at. Changing this means that you can jump into a menu tree at different positions depending on circumstance and thus possibly re-use menu entries.
- `cmdset_mergetype` (str): This is usually one of "Replace" or "Union" (see [CmdSets](Command- Sets). The first means that the menu is exclusive - the user has no access to any other commands while in the menu. The Union mergetype means the menu co-exists with previous commands (and may overload them, so be careful as to what to name your menu entries in this case).
- `cmdset_priority` (int): The priority with which to merge in the menu cmdset. This allows for advanced usage.
- - `auto_quit`, `auto_look`, `auto_help` (bool): If either of these are `True`, the menu automatically makes a `quit`, `look` or `help` command available to the user. The main reason why you'd want to turn this off is if you want to use the aliases "q", "l" or "h" for something in your menu. Nevertheless, at least `quit` is highly recommend - if `False`, the menu *must* itself supply an "exit node" (a node without any options), or the user will be stuck in the menu until the server reloads (or eternally if the menu is `persistent`)!
+ - `auto_quit`, `auto_look`, `auto_help` (bool): If either of these are `True`, the menu automatically makes a `quit`, `look` or `help` command available to the user. The main reason why you'd want to turn this off is if you want to use the aliases "q", "l" or "h" for something in your menu. The `auto_help` also activates the ability to have arbitrary "tool tips" in your menu node (see below), At least `quit` is highly recommend - if `False`, the menu *must* itself supply an "exit node" (a node without any options), or the user will be stuck in the menu until the server reloads (or eternally if the menu is `persistent`)!
- `cmd_on_exit` (str): This command string will be executed right *after* the menu has closed down. From experience, it's useful to trigger a "look" command to make sure the user is aware of the change of state; but any command can be used. If set to `None`, no command will be triggered after exiting the menu.
- `persistent` (bool) - if `True`, the menu will survive a reload (so the user will not be kicked
out by the reload - make sure they can exit on their own!)
@@ -257,24 +255,16 @@ def menunodename3(caller, raw_string, **kwargs):
```
-> While all of the above forms are okay, it's recommended to stick to the third and last form since
-it
-> gives the most flexibility. The previous forms are mainly there for backwards compatibility with
-> existing menus from a time when EvMenu was less able.
+> While all of the above forms are okay, it's recommended to stick to the third and last form since it gives the most flexibility. The previous forms are mainly there for backwards compatibility with existing menus from a time when EvMenu was less able and may become deprecated at some time in the future.
### Input arguments to the node
- - `caller` (Object or Account): The object using the menu - usually a Character but could also be a
- Session or Account depending on where the menu is used.
+ - `caller` (Object or Account): The object using the menu - usually a Character but could also be a Session or Account depending on where the menu is used.
- `raw_string` (str): If this is given, it will be set to the exact text the user entered on the
- *previous* node (that is, the command entered to get to this node). On the starting-node of the
- menu, this will be an empty string, unless `startnode_input` was set.
- - `kwargs` (dict): These extra keyword arguments are extra optional arguments passed to the node
- when the user makes a choice on the *previous* node. This may include things like status flags
- and details about which exact option was chosen (which can be impossible to determine from
- `raw_string` alone). Just what is passed in `kwargs` is up to you when you create the previous
- node.
+ *previous* node (that is, the command entered to get to this node). On the starting-node of the menu, this will be an empty string, unless `startnode_input` was set.
+ - `kwargs` (dict): These extra keyword arguments are extra optional arguments passed to the node when the user makes a choice on the *previous* node. This may include things like status flags and details about which exact option was chosen (which can be impossible to determine from
+ `raw_string` alone). Just what is passed in `kwargs` is up to you when you create the previous node.
### Return values from the node
@@ -283,13 +273,34 @@ Each node function must return two variables, `text` and `options`.
#### text
-The `text` variable is a string or tuple. This text is what will be displayed when the user reaches this node. If this is a tuple, then the first element of the tuple will be considered the displayed text and the second the help-text to display when the user enters the `help` command on this node.
+The `text` variable is either a string or a tuple. This is the simplest form:
+
```python
- text = ("This is the text to display", "This is the help text for this node")
+text = "Node text"
```
-Returning a `None` text is allowed and simply leads to a node with no text and only options. If the help text is not given, the menu will give a generic error message when using `help`.
+This is what will be displayed as text in the menu node when entering it. You can modify this dynamically in the node if you want. Returning a `None` node text text is allowed - this leads to a node with no text and only options.
+```python
+text = ("Node text", "help text to show with h|elp")
+```
+
+In this form, we also add an optional help text. If `auto_help=True` when initializing the EvMenu, the user will be able to use `h` or `help` to see this text when viewing this node. If the user were to provide a custom option overriding `h` or `help`, that will be shown instead.
+
+If `auto_help=True` and no help text is provided, using `h|elp` will give a generic error message.
+
+```python
+text = ("Node text", {"help topic 1": "Help 1",
+ ("help topic 2", "alias1", ...): "Help 2", ...})
+```
+
+This is 'tooltip' or 'multi-help category' mode. This also requires `auto_help=True` when initializing the EvMenu. By providing a `dict` as the second element of the `text` tuple, the user will be able to help about any of these topics. Use a tuple as key to add multiple aliases to the same help entry. This allows the user to get more detailed help text without leaving the given node.
+
+Note that in 'tooltip' mode, the normal `h|elp` command won't work. The `h|elp` entry must be added manually in the dict. As an example, this would reproduce the normal help functionality:
+
+```python
+text = ("Node text", {("help", "h"): "Help entry...", ...})
+```
#### options
diff --git a/docs/2.x/api/evennia.commands.default.building.html b/docs/2.x/api/evennia.commands.default.building.html
index e5e3eca10e..2db54a8863 100644
--- a/docs/2.x/api/evennia.commands.default.building.html
+++ b/docs/2.x/api/evennia.commands.default.building.html
@@ -600,7 +600,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -641,7 +641,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
+search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
@@ -1353,7 +1353,7 @@ server settings.
-
-
aliases = ['@swap', '@update', '@parent', '@type', '@typeclasses']¶
+aliases = ['@update', '@type', '@swap', '@parent', '@typeclasses']¶
@@ -1384,7 +1384,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@swap @update @parent @type @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap update parent type typeclasses', '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': '@update @type @swap @parent @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update type swap parent typeclasses', '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 "}¶
@@ -1841,7 +1841,7 @@ one is given.
@@ -1872,7 +1872,7 @@ one is given.
-
-
search_index_entry = {'aliases': '@locate @search', 'category': 'building', 'key': '@find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
+search_index_entry = {'aliases': '@search @locate', 'category': 'building', 'key': '@find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
diff --git a/docs/2.x/api/evennia.commands.default.comms.html b/docs/2.x/api/evennia.commands.default.comms.html
index bc71ab84a5..5de183adbf 100644
--- a/docs/2.x/api/evennia.commands.default.comms.html
+++ b/docs/2.x/api/evennia.commands.default.comms.html
@@ -264,7 +264,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -789,7 +789,7 @@ don’t actually sub to yet.
-
-
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 "}¶
@@ -942,7 +942,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -962,7 +962,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
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 "}¶
diff --git a/docs/2.x/api/evennia.commands.default.general.html b/docs/2.x/api/evennia.commands.default.general.html
index 54a2ba138b..d4c8960c61 100644
--- a/docs/2.x/api/evennia.commands.default.general.html
+++ b/docs/2.x/api/evennia.commands.default.general.html
@@ -276,7 +276,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -308,7 +308,7 @@ for everyone to use, you need build privileges and the alias command.
-
-
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 '}¶
+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 '}¶
@@ -331,7 +331,7 @@ inv
@@ -362,7 +362,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
diff --git a/docs/2.x/api/evennia.commands.default.system.html b/docs/2.x/api/evennia.commands.default.system.html
index 4f4b66b558..dc97c889a1 100644
--- a/docs/2.x/api/evennia.commands.default.system.html
+++ b/docs/2.x/api/evennia.commands.default.system.html
@@ -691,7 +691,7 @@ See |luhttps://ww
@@ -737,7 +737,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
+search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
diff --git a/docs/2.x/api/evennia.commands.default.tests.html b/docs/2.x/api/evennia.commands.default.tests.html
index 708af4a5ec..58d655614f 100644
--- a/docs/2.x/api/evennia.commands.default.tests.html
+++ b/docs/2.x/api/evennia.commands.default.tests.html
@@ -963,7 +963,7 @@ main test suite started with
Test the batch processor.
-
-
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpcywdezmq/f40bfb679aaa60638ced507f64c97627e17881cd/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmprlci_f6c/0b030c078ae6d5ba6e59d11654f7ef99d42b1c08/evennia/contrib/tutorials/red_button/red_button.py'>¶
diff --git a/docs/2.x/api/evennia.commands.default.unloggedin.html b/docs/2.x/api/evennia.commands.default.unloggedin.html
index 00f420fbe4..16ba30dbd7 100644
--- a/docs/2.x/api/evennia.commands.default.unloggedin.html
+++ b/docs/2.x/api/evennia.commands.default.unloggedin.html
@@ -349,7 +349,7 @@ for simplicity. It shows a pane of info.
@@ -375,7 +375,7 @@ for simplicity. It shows a pane of info.
-
-
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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
index 2f227c560f..b095f3615c 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -343,7 +343,7 @@ for simplicity. It shows a pane of info.
@@ -369,7 +369,7 @@ for simplicity. It shows a pane of info.
-
-
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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
index 7d5faa367c..280ebcf386 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
@@ -124,7 +124,7 @@
@@ -205,7 +205,7 @@ on user permission.
-
-
search_index_entry = {'aliases': '@callbacks @callback @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callbacks callback calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
+search_index_entry = {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback callbacks calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index ca49eb74d4..7161fd5c59 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -168,7 +168,7 @@ aliases to an already joined channel.
@@ -199,7 +199,7 @@ aliases to an already joined channel.
-
-
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': '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 '}¶
@@ -225,7 +225,7 @@ for that channel.
@@ -256,7 +256,7 @@ for that channel.
-
-
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 "}¶
diff --git a/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 120797b7c1..fec6332087 100644
--- a/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -219,7 +219,7 @@ the operation will be general or on the room.
@@ -243,7 +243,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'q abort chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q abort chicken out 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': 'q quit chicken out abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q quit chicken out abort', '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 '}¶
@@ -379,7 +379,7 @@ shout
@@ -408,7 +408,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': '; whisper shout', 'category': 'general', 'key': 'say', 'no_prefix': ' ; whisper shout', '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 '}¶
@@ -498,7 +498,7 @@ looks and what actions is available.
@@ -527,7 +527,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex e examine unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex e examine unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'unfocus e examine ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus e examine ex', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
@@ -589,7 +589,7 @@ set in self.parse())
@@ -613,7 +613,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inventory inv i give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory inv i give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'inventory give i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory give i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html b/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
index 6b461fdbfa..ebcc660be2 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.barter.barter.html
@@ -753,7 +753,7 @@ try to influence the other part in the deal.
@@ -779,7 +779,7 @@ try to influence the other part in the deal.
-
-
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 "}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
index 7c96a8a017..2c3865a810 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -630,7 +630,7 @@ inv
@@ -661,7 +661,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
index f92fe04007..652a2fef7e 100644
--- a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -430,7 +430,7 @@ there is no room above/below you, your movement will fail.
@@ -453,7 +453,7 @@ to all the variables defined therein.
-
-
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': '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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.rpg.dice.dice.html b/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
index f83eaba61b..5008628379 100644
--- a/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/2.x/api/evennia.contrib.rpg.dice.dice.html
@@ -334,7 +334,7 @@ everyone but the person rolling.
@@ -360,7 +360,7 @@ everyone but the person rolling.
-
-
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 "}¶
+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 "}¶
diff --git a/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index c1c61a27f3..354dd6d3af 100644
--- a/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -881,7 +881,7 @@ Using the command without arguments will list all current recogs.
@@ -908,7 +908,7 @@ Using the command without arguments will list all current recogs.
-
-
search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
+search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html b/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
index 73fe4f65d0..5009392c4f 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
@@ -474,7 +474,7 @@ turn of combat, performing everyone’s actions in random order.
@@ -520,7 +520,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'hit turnbased combat', 'category': 'general', 'key': 'attack', 'no_prefix': ' hit turnbased combat', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}¶
+search_index_entry = {'aliases': 'turnbased combat hit', 'category': 'general', 'key': 'attack', 'no_prefix': ' turnbased combat hit', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/2.x/api/evennia.contrib.tutorials.evadventure.commands.html
index a8bfcc0523..ed02b786fb 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.evadventure.commands.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.evadventure.commands.html
@@ -200,7 +200,7 @@ self.args).
@@ -224,7 +224,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
index dc7d45f570..aafee76616 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -161,7 +161,7 @@ such as when closing the lid and un-blinding a character.
@@ -190,7 +190,7 @@ check if the lid is open or closed.
-
-
search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
@@ -260,7 +260,7 @@ check if the lid is open or closed.
@@ -287,7 +287,7 @@ break.
-
-
search_index_entry = {'aliases': 'break lid smash lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', '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 '}¶
+search_index_entry = {'aliases': 'smash smash lid break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash smash lid 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 '}¶
@@ -387,7 +387,7 @@ be mutually exclusive.
@@ -416,7 +416,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
@@ -514,7 +514,7 @@ be mutually exclusive.
-
-
aliases = ['feel', 'l', 'examine', 'listen', 'ex', 'get']¶
+aliases = ['l', 'examine', 'feel', 'get', 'listen', 'ex']¶
@@ -540,7 +540,7 @@ be mutually exclusive.
-
-
search_index_entry = {'aliases': 'feel l examine listen ex get', 'category': 'general', 'key': 'look', 'no_prefix': ' feel l examine listen ex get', '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': 'l examine feel get listen ex', 'category': 'general', 'key': 'look', 'no_prefix': ' l examine feel get listen ex', '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 "}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
index c0c53dccf0..e5b0bb8745 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -564,7 +564,7 @@ shift green root up/down
@@ -600,7 +600,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push shiftroot move pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push shiftroot 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 '}¶
+search_index_entry = {'aliases': 'pull shiftroot push move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull shiftroot push move', '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 '}¶
@@ -617,7 +617,7 @@ yellow/green - horizontal roots
-
-
aliases = ['press button', 'push button', 'button']¶
+aliases = ['push button', 'press button', 'button']¶
@@ -643,7 +643,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
+search_index_entry = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button press button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
@@ -787,7 +787,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['bash', 'thrust', 'fight', 'pierce', 'parry', 'chop', 'slash', 'defend', 'kill', 'hit', 'stab']¶
+aliases = ['pierce', 'thrust', 'bash', 'hit', 'kill', 'chop', 'parry', 'defend', 'slash', 'stab', 'fight']¶
@@ -813,7 +813,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'bash thrust fight pierce parry chop slash defend kill hit stab', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash thrust fight pierce parry chop slash defend kill hit 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': 'pierce thrust bash hit kill chop parry defend slash stab fight', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' pierce thrust bash hit kill chop parry defend slash stab fight', '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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 39fb4d1fe8..19ef3781ae 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -824,7 +824,7 @@ if they fall off the bridge.
@@ -850,7 +850,7 @@ if they fall off the bridge.
-
-
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 '}¶
@@ -976,7 +976,7 @@ to find something.
-
-
aliases = ['feel', 'l', 'fiddle', 'feel around', 'search']¶
+aliases = ['l', 'feel', 'feel around', 'fiddle', 'search']¶
@@ -1004,7 +1004,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'feel l fiddle feel around search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel l fiddle feel around search', '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': 'l feel feel around fiddle search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l feel feel around fiddle search', '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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
index 0ce4e2a391..fb8045317c 100644
--- a/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -216,7 +216,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmpcywdezmq/f40bfb679aaa60638ced507f64c97627e17881cd/evennia'¶
+directory = '/tmp/tmprlci_f6c/0b030c078ae6d5ba6e59d11654f7ef99d42b1c08/evennia'¶
@@ -277,7 +277,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpcywdezmq/f40bfb679aaa60638ced507f64c97627e17881cd/evennia/game_template'¶
+directory = '/tmp/tmprlci_f6c/0b030c078ae6d5ba6e59d11654f7ef99d42b1c08/evennia/game_template'¶
diff --git a/docs/2.x/api/evennia.utils.eveditor.html b/docs/2.x/api/evennia.utils.eveditor.html
index 344cf9ccfa..efe825a44c 100644
--- a/docs/2.x/api/evennia.utils.eveditor.html
+++ b/docs/2.x/api/evennia.utils.eveditor.html
@@ -344,7 +344,7 @@ indentation.
-
-
aliases = [':S', ':x', ':echo', ':', ':h', ':>', ':r', ':i', ':A', ':p', ':uu', ':!', ':y', ':f', ':=', ':I', ':w', ':q!', ':dw', ':::', ':UU', ':j', ':fi', ':wq', ':u', ':<', ':s', ':DD', ':q', ':dd', '::', ':fd']¶
+aliases = [':fd', ':', ':w', ':y', ':h', '::', ':UU', ':s', ':echo', ':u', ':q', ':i', ':A', ':fi', ':S', ':I', ':=', ':r', ':!', ':dw', ':j', ':q!', ':DD', ':<', ':uu', ':>', ':f', ':dd', ':x', ':wq', ':p', ':::']¶
@@ -372,7 +372,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':S :x :echo : :h :> :r :i :A :p :uu :! :y :f := :I :w :q! :dw ::: :UU :j :fi :wq :u :< :s :DD :q :dd :: :fd', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :S :x :echo : :h :> :r :i :A :p :uu :! :y :f := :I :w :q! :dw ::: :UU :j :fi :wq :u :< :s :DD :q :dd :: :fd', 'tags': '', 'text': '\n Commands for the editor\n '}¶
+search_index_entry = {'aliases': ':fd : :w :y :h :: :UU :s :echo :u :q :i :A :fi :S :I := :r :! :dw :j :q! :DD :< :uu :> :f :dd :x :wq :p :::', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :fd : :w :y :h :: :UU :s :echo :u :q :i :A :fi :S :I := :r :! :dw :j :q! :DD :< :uu :> :f :dd :x :wq :p :::', 'tags': '', 'text': '\n Commands for the editor\n '}¶
diff --git a/docs/2.x/api/evennia.utils.evmenu.html b/docs/2.x/api/evennia.utils.evmenu.html
index bc3356f1ac..b5c835eec4 100644
--- a/docs/2.x/api/evennia.utils.evmenu.html
+++ b/docs/2.x/api/evennia.utils.evmenu.html
@@ -172,8 +172,11 @@ returned as None as well. If the options are returned as None, the
menu is immediately exited and the default “look” command is called.
-- text (str, tuple or None): Text shown at this node. If a tuple, the
second element in the tuple is a help text to display at this
-node when the user enters the menu help command there.
+- text (str, tuple or None): Text shown at this node. If a tuple, the
second element in the tuple holds either a string or a dict. If a string,
+this is the help text to show when auto_help is active for the menu and
+the user presses h. If a dict, this is a mapping of ‘help topic’: ‘help text’ to
+show in that menu. This can be used to show information without having to
+switch to another node.
@@ -668,6 +671,11 @@ should also report errors directly to the user.
display_helptext()[source]¶
+
+
-
nodetext_formatter(nodetext)[source]¶
@@ -939,7 +947,7 @@ single question.
-
-
aliases = ['abort', 'a', 'no', '__nomatch_command', 'y', 'yes', 'n']¶
+aliases = ['y', '__nomatch_command', 'n', 'abort', 'yes', 'a', 'no']¶
@@ -965,7 +973,7 @@ single question.
-
-
search_index_entry = {'aliases': 'abort a no __nomatch_command y yes n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort a no __nomatch_command y yes n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'y __nomatch_command n abort yes a no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' y __nomatch_command n abort yes a no', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/2.x/api/evennia.utils.evmore.html b/docs/2.x/api/evennia.utils.evmore.html
index 6c3325fc70..28d09b93e1 100644
--- a/docs/2.x/api/evennia.utils.evmore.html
+++ b/docs/2.x/api/evennia.utils.evmore.html
@@ -145,7 +145,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['q', 'abort', 'previous', 't', 'end', 'e', 'p', 'next', 'quit', 'a', 'top', 'n']¶
+aliases = ['previous', 'end', 'p', 'e', 'quit', 'q', 't', 'n', 'abort', 'top', 'a', 'next']¶
@@ -171,7 +171,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'q abort previous t end e p next quit a top n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' q abort previous t end e p next quit a top n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'previous end p e quit q t n abort top a next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' previous end p e quit q t n abort top a next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
diff --git a/docs/2.x/genindex.html b/docs/2.x/genindex.html
index 9cee9e3c56..fefe19270b 100644
--- a/docs/2.x/genindex.html
+++ b/docs/2.x/genindex.html
@@ -5391,10 +5391,10 @@
DefaultRoom.MultipleObjectsReturned
-
-
+
- DefaultScript.DoesNotExist
- DefaultScript.MultipleObjectsReturned
@@ -5760,6 +5760,8 @@
- display_symbol_aliases (evennia.contrib.grid.xyzgrid.xymap_legend.InvisibleSmartMapLink attribute)
- display_title() (evennia.contrib.base_systems.building_menu.building_menu.BuildingMenu method)
+
+ - display_tooltip() (evennia.utils.evmenu.EvMenu method)
- distance_dec() (evennia.contrib.game_systems.turnbattle.tb_range.RangedCombatRules method)
diff --git a/docs/2.x/objects.inv b/docs/2.x/objects.inv
index e171e5b4a14d663e6a149936e12ebd9c75adf1e1..76189eba4eaf82308248b1ef3d99e1b44ef24819 100644
GIT binary patch
delta 109839
zcmV)YK&-$2gbIa)3b38me?$^JFeXaZ0!rSqfdPt}npJNR91H?j=ECcK4=7E%rfesV
z?-O~B9jIa{=@^YL^)3|Qdj5tYTWt*~Cl3!wYF9R*VEt~~Up_C$TC`cf%Tk<6q{|ip
zZpb?lYZcqF72dEZ*SJR#PoK*HOE%m63q`bPsLxuiMU2l__D$ER7-i76YN%UF{DY58
zAGn1czAd@k0K(;*0+TJ+C;^C*R@g6Nd)(ZuVI)rk-e+gqUtCr8gPhsIh*OgR@i7}{
z-A<(}`~^?aew*S3ej-^%x0j*#Mcd0z;v(L2zG;aU&FCy}OOjP^(L(C9=mad+ER<+2
z&pv`^F57gdFqdc@FEkhJ7$!86=-5bqQiZWd9iIo3C@B{IBF&yPcUz&d4zfvUE|U=29s&!)lQ7yp
zTx`V)KFM<7hFh|_@Du-Na&Y6RY(t@@I_fH3R5>0u>xH{YHz{7^C7VxwGSa*tK|GSG
zl)GYcQdOdd^^iaUq-^$v`7u_amya{`=~(28isTQ{;A5yWn=)}oLX*qdLOn{M`a^ZB
zVPg{vC_6sL4;Ql|O;I*O7$8;$z>%jZ2UDqzzpwz^U9A|0!pTI^QUI{&m^Wk?bqFXf
zh$w24O4}ZPmj!=&W_c{vNZ{2+CNdX?n`f;Fm**ZX2;WArBdwx8WUci67ahi~p#=^Y
z8M2PHbTc~QC|eb0H%$(40WnLsaFHw$M5Y64fTW8L8Eu(?#kP_;=@5*>mUUdiv$2I0
z%lkmZ#}Ph{D*9|}_>YjX#VQ%c7o_9WNO8
z>9P$2KVMdphV0Fy>dP&qU)>%^M~iQ?X5GuT1@Z0i^UYH=?R)D_wFLq~FhBU{06`EWX2l-*Zje=zPIp1?WbMk_0u
zejv?%W~g4Eb(1MLUn$%MSvbS|MT{?H9&
zUYYjZ6@aN^%UGTllygwe3)Oso9SF>Cp>X&_C=e7r5;}n8pyL8zIh?vcI1HaQFxM+h
z0k$@i=n&>+#tLh1W>})$R;G7qA-*U)y_pdLbT>@RnK3%LA1l%Yd^gC-`b#|!o`Z0I
z3=l$bPY}bZ?+G}v*YF0~Z-L?PM)o%lg8_!Z38vu=5iJ%$A)rBt=X3aSR-+=g|~s=uTCfS`e|Fs}IX{MnjDsr{hD_utBATKuB-w4*l59R9#c
z;XjJiwCxNWKwRCOVm$KtTVVW(?Y9$u57b2)(Jp<_jr#H{+kYyzeA%^JLxES#SZ7t)
z&|Yr%;Sbmt7)BSMj*>zGZM3tKY&MY1wO|*)J*5vQVuzt@_B~Kb|3L>X`NvMB`T+Ei
zV}VyWt6SF4X2{x(-j~lPw8iOW9HHX>R5%TDrFUfVA2SIC@n$*1Pniz~{svxuiA8)5
zw-NyS5nhSKdW65Yo>nh#M)F9W=}u7x$#912SZ;q{V^#dZl0M$+R|hNisViaV=3G#j
z8|*AIlBP0^q}jMH4N@}=g|=XVIx1oa1&ln}bzp)Rl&E}_gcpyc4RX_6+2XzNvfXBeTdT}4O(Z9!0BJwR3%I2A+nmo|{H0)A4lAz~>x10WBsE5mg`v7|Fk
zw{nS&uH6W(9A7Jv;C{5*$5Ea^Fc)n)i|_*xM^)@;fr?Skd!h>hAYyQTgI~`3Nbzut
z>InN`7##fV2Vjs-?FkU%U2K={^^-pp9l{0~F%TH5C_%7KN-na#O(1B>rU3#x170V(
zW)=+8K!S3`y6rk-SgyJ@jC_(dY*1#L1Nig07e}xdB
zfv!Se;C0VGn;uo8PvqmilT)x@%{C#iE;BkS%mVR1nxfiF_By(M)+j7FUHhd`DQdUm
zk$zsVwmQKPlmmucpwb&nS5L+V+8c(KtbkP12kY$|Nk@Dy$2es3WCd>s{C8m-P27NJ
z%lx6D_a&{04MksFxuNFkD}Tz*#V6L)pC*vE`_L;4JK?5X$QLG`VwH#(+DXY|nn_mE
zzMsyOyKLZnai7Y6VsDb_?uMhXu`xP)gLOH7Ao;RH@_x^)ky>yE
z$NOuxdC+DD(k2mr{Q13z62{MqP%z?Xqb+PNoJ>@Esvtm2l!%aAC
zFocVvhQ#?8_Z4rHk!v8EM>$`ZrM~$E&rDsk;gso%bRlz+=WH}6%)J(EC^H+#9#pQ#
z`Dkc`ArqXdJl1_axg1QacK<+S8g^0}k^NkB99Sgydjglo$6Pgb_(>I;@3M~eZ0z#Q
zjIiU2H}wC1XBv`@0!kX6^6|r4wmOm7t
z5X@I@ceXbfdSK`bX?XEtBet1jdNvFN@jUz{e%qX9>+3eB*wb|)OX`k&zWesIH8|n>
zM81uG;49MfWwzUABCcsk#eu*#EF?S^UAq
zuEK=TwPyO^W&3b*9~_f|;C*>))Nl0wH7dg
zP6tPV7{pOFti^pT&)j{j1Gzg2>mCD3B4m^2x#7ufNR|KJaA4K{FFUX5|6j|x9B6S{
z{+s^j3fj@)W4V>DwUTZp)-;jI9Y7rg<1b#E)Fx9O4CfyvB8TZvaXwGcIYPcNr<1CG
z|3Bv5Wjk&p+Yh`U2NE4-cJ@B@ejjV5Ru+KC>h@_8tb4Njvfw^o5DJd2
zl*^nnlb}N}ojm$gvD=g(Z#@NpZJ!o@k5#=|EcwF!-iURzodRdYufZ+?t+#|g-qI0I
zTft)PG;lS!n+#}5#mI`3)1(+7+h(Go7PcM}0>m!AFA7pl0e6=d#Uwav61uMQ)r4>@
zG@+B=?f&@VX_0T>LGh`ZB>8^mX4R0knG#a2V3WyUMQgv!SCeBtkh%#mofrszi*MAg
z@_Hejrr8(tK5HmeJyG*;Up4KbY8Lq<>6n-Iq|RH`VNL@`$8#ll3_f5OgxS7o+Ik`=
z0(-al!z7h3r}+@FpdJE+`^k99d1AN_D`f$QzwMefzni2tDYBN9lc}(16T77YAX2wa
zd(TrevQ`a>zMNmfji7j;&yXg08lF?E*IbaFY(Jf_~2i>!Gnms5e|K0!A$qJf(RqgVAqL!OO
zH~A(nvLHjQ5um&Enlu13RW{{#v!$)8f);?^ck(5fX`pu{mfF1B?j|V=6R%#-T6Fu=
zP7~qj#&)}Mx^`_xCwX|E>vp2GC}H?wLBL|wB3rF$(lpZ`*E!70r>^Rcd9hk%^@{au
zYw~rHwKTXBwjYi(>;Vvez7>8wuxF{i7x=cbz3J4}#Nh>B3agLPL$4IWhBKfm2K%N*
zC&Ccj^w4+Gl-u;!1vj@gJ@S^@5yNZDYcf-jVWxBDyxV?>jn2UW&PmdH;Ltuf}}j+3?%CVSfkw~VVh;3q?)Gw^(CY=%wxd#i>HDK-0S0RQAk=yw$CX|`
zF7A)3O#MU^s*g&eKSNKKAD2#lS>)}p74nzgLDn6eRxcs@HqT%6ghG#bd%s|Yu%CP8
zVp8b{I%2b0FOO5LSI4Q=>*pQ2n3ekenFlatt$uj+IiFdtu&pkpltM&Rg)%yOhqvyX3pRD88q=SQ4^uTj17X!ZMkk!_AvxgQp*>X^&k
zkBh86-lF#tZCh4HtKFaB&hGKni@z+I4Zk&WjQY`k0ptVudbHZX8c@A!+UHhKJA(Gi
zV*shk;yXB=b~H(|czImvygDv*ULTh_-yfGcKOC1jKOUDlKP_H0Yd9NrJSzQp@%lJa
zlBOo)@#N>!Mn5n7%soY?%;Grahl)aMMtDRD9mo7nQRql!e2PZLFvnBWIg(kOqR~;z
znN7q^?R5{
z(5&)Haz`_)O~xDt9d7PkHtK`CBto~R`ZW)DgUU}@sDZ||EN~*k81h8
zTf0Ao!5LTP&x_af(I|6VgT-UrLO9y}gQML%INqIuBi%MQ-aUh3-7q+o-2$;ya10HV
z*eE!Lwn=Og97A&?HVKZR1rmD%*^y*_(UG(>VtZh^rsa{`TFqTkKdV)1@XJ=4ymU%q
z2tURP{(x)~049P)puRX^KTd?cCd(x@h6rftw_4ogq>!&P+nU|U$f|lXH_yQ$bco2n
zT|~iStUXhZ%iFh`p_#`=brttnq5-AQhe*B*nZmB&(PA
z2THt#7Qd{>|DZ*qdzN~(sO>1-VtJpHYXU3l&0|&1n`Q7u$f7D2P3|@TvL}~7J;w%q
zrjdkBGH>J5=MshfAn8YIbdf=SV}(^KYfmM_%AL%%BHf;S>0~3^_&A834fS>NX%W}JEFOV
zHJ@;9cZpNISu$uyz@4z@%`uV+V4R~l4yB#1c@EZKuF@N#z+5A;5bk-qjt~vzZ`eb$
zn5B(05R
z_@U#S{Ym0RH~aC$3?=qsiXS-a$H!)z;JtXriXE9hhT{e%`*8-h_WRK^u5&_Dv0RgO
z?)pV3=8sG89B@yDsIlR`ToI$SDX1FK9*9kxK;Vosmx=>a*b(D@vwgY7tg!6MIbx(V
zB_)6FdP?SHwb_IWmoQwwNQs4my?~MwfoH80>`>6ydE+RG;MQjhdc+~5G4N5xkH!$h
zA3WNZCFaP{Xs(9No|o-{H!ky$g*M4!u*+&u-7T8kZL_4Ble(FSC+U0D2HJl5HE%bN7NUAcsX9;?zl
z9v=bsTga>Y(-7Q~VjE%@fCdXl4-EDT{qL-7>!-j;O@|!}8auHWMG-u?8G{}*3mHQY
zKNH!PC1y4`Dl_c)1EP8p{?{7?6~RA7>1~S@%?Cmm@)n+lK64{7@GL8Y#dA2
zcs3q0a7;TA_{Dt5K5BV+1V!}lb_B<$A?^sC$=jodQEoiujOxx(X7(E5`dCymBJQCa
z4;e6;6Cv5z@W9cW1|N(vs!^Ou=KjktBzS%Iwj=Wq36zo|?7~P1tJx9t^v>m@y7f
z1NxDF95BFMP~bM`zR*4-%!7`+7W_`foP4npl?jMq<|_Np#Y|WB;Tbby8Oayg>yCtv
zo41T48L@jamTAl;&Sqv6k6b#$sZD~@EEzdTE-!<1%8H(ObbSo0f?eE{`mEns`C
z1qQIOdj=uPfjnfua-ax#jei4|12yD<>mKMy#BSWg4?`GLkE5O=BO9&^3*HIAYc`#`46kX^duy
zU(*;#6~CqtPZYbRu`k1nZO-^LjlH=>jG3Z2!=_`SVB=>M<7h_BD8^CER?H%16XUTD
zp#H4&W3Smn2pg%z6%o&50t1H3C0M|JYy5Lsm3MjQ6*!e54tvZvb{ev%vFx6dqsFu2
zIfHA?c#6nz?RcWNQQ)3DQKPgyxJHcBylic@4p~}&U;%9b24n3PZOFp<-3~ewGjRQL
zByiNi=Ln97<@*un(c_U39HRy!BX~j^q!G}8_5p*CDP~}Y7X=r)a25$3yj~W6ha2B9
zkHC*PiW3JvX_1qtBU}5M?wnlqhuK9ETTUTs9JU`u=5%;n+y*I5V-4;8WMa_{E4w1vr|oAum~&K;0rIq!#0)=2C9yC~UrB~UvsIEI)vT3-&hDUhoVbQ)s4uz&=4rZF
z9etL{2eUB%{(VR4C*Kr*ECjfF(9l1PQo?$tQfk;U=69*Ro#@KX0Z}x=i;MG*=NG?T
zEKaY^PHxT?muFWO=hxTgpFW0U$AtVJ&aZC{&%V4T%P(}wzWma7i}wU{E7G)e_0$m_
zAd2uPC%^O_`Y7jg#D`_vZC6=K4w|~S)if<(T~)2OiGe`gwgm%!om`$@(Z5&KE}(SuxePo4)P&y+H2|TQ+q%*iX~{+Hz8HT
z5O7M?;Njquq;N=o5pzm^5B~Yf&4J3y;mgax%gS+-6CB?*1iO+&zVZ)V;weQO<}92;
zj+u(5g=p3SYU7-Lv4|Qdp`hSn!0IuiX^RRhJkH$x4Jqa+C>EYM%ZZJ0zG7lyJV;Xp
z^UK}*_<}N5U#%C%l*wHPkvL$6Z!*Iw#
zNWSLtvCZ74nn>oX4+rj7?WA+piD&Cu#n!`&g=R=GPm!^I@Vq!^>djqTY>WpiEHk$;
zCXzV|%z@h&JL%ko=K0!~e6uac0S0R}qM3@1i|xfTr03kl=q6jwn0XrdJUKR`m@}IU
zY%}JKIPRv`@{9ayUQVBm4zd@`eau~)z32}X&wd>7;5HltB{PiV-K-)p4^3R=AsgP)
za`q2U9FAFkUg|y!ceSMqX-OU-7hP1zKXNy2fvifcHSk6e$&y?*0p$
zeF-?-t6+zN;xW~r`+%bvR)pC};%BtxB7p{ZK74+BlSFhf1)rlZ>iCnELlt_qG?~2gso)bAy!WIebyjfnpkvQ@N?DQKF_>$xX(6!YpzdTm-_?-dw_VHJ9|G?~1VtKbtCJaOD+%EH&foW20|3Fat-Lyk!cVjq64&ZN&XZ)ehH
zn>E)buV#IMgC*0%bz1JiPCh9$A`7!ax7qRwDOb(B@lfsyFBEHXGZMz_5IKlive|-v
zy+p4;bv2-K=S2&ctybNNKoGQ$i09DA9A+dObbTK0zLs}S%WosmZyk|^Km&xrQnCk4
zhK<3MH@d;$WV?0MP9seuKJC8lvR%;znSb7!@S2m%79${_wQak=*CGxQA9gs2QhGPO
zr=bJa#XZTUji1^^d&;#48c?id&{H~p(mOBdXpicVKadMJ4fuw6`pbh(IG*W6wrlT6
z+2%{%ZhJWInytpN%QRoxfaL2*1f*hL!ocZhX&tO#bZDb>4OVbzhu7xix|y1Bldo0<
zdCcmNX0;0(kaSAmYdmT8p<3tVg~sPDe0{ocJYg?)Ov<>)zR(z`esd9>%96hCx&CL1-8<98(-I@8>hMQ59{y8Mbqk>{&49sXgmN8vkICMldVWEEc!m^_OV+*z|mhawnjxpz*7D>T-N8=Zd-bsA>bm+gGxb}2nt3`cg=Nlqr_juQT`v@>Nvnl_
z;Xw--G^t`Cad{Qy?;*9pJv%p{zSx!O+T&_blV)3$4GB&9F_d)?^f*>D1?}g`k`!-o
z-+S^j8=&L*`j^M7_S{RIfXRQ2Z~~IK^963E&y_0zd)7#>LDVT;hZLrgr;JD+pDofo
zWJSJOWXmOKn#E>Uw7IZ<82a7hB_dXXSMzIdum;LVK6`0;ix*$#D@`5#oXypM3(HMj
zswL+@q=%(EeCbrlXD^-5tj91^P3jVn;oD8eU{&ww|$uclghcjw<==DS5fuZpn=0
zvBRIgtyH)U*H$W|hc7BB`Rql7t#r*-R66|mi;BW^xT4Z0JuKya;Y+7VK3D1Ft8$;o
z?c~!S9r{Ja_OQAKjAxF^ivwj>k9El=e}{|aQWTfNQG#va!?DfPnDuD<$A0!@;BRFe
zEaB>^+8mCJT^>0g-}LKGJqCUrsXYkELTj$(r(~TcG#>L-tAll$ecrixOt_Og({ip3
zJzK-qqnV*1^%$^!!12~^nJw?h{A>?=m^~ZItmSK#WoZ?7X7#J(7qXhMlJp5?tttbu
znJUbHhgk@uu8YUKy+<>rhh(LVHEp)*rvq@#RvORC75O@O5tOL&DUJu!Cs$me&Z>B|
zYv<6M!_KGrCDrw@s#jNp*6_(=FhD=t(8xeNR~lZCHSJ=5NIiM-slfB8|5+S=pIm-6yDs7S<@_SotcSTkoKCNGDvo%??d0UX@AuwSdOryg-fZKr1)J;t9xiBZGh$yoPlMkmx_{Lp+lCB`@F)9LW6^>EZsbt2B^
zEQs2m`B_T96a&`@RTw>dol1vitp;)D!l!3_#zLSg@m$3~(c*avLiC(w3c_a`jqE$U
znS_3S+$3ib>d|ZJ`zsK4g<^VE%=MbA@*2)3@dP+n&d1#fn4a|+>zsC;|3Hl$sp~3g
zs?7uW)ot6
zf38EvF@F5IKi6U7IA$ujKi7fcC|{L{9GC1#^g_GOIC70+X~#5Z6OfJH$eDutc@lV^PJa*j_{Mw!vS-QPy*G-d;ND|UITd~Ms>~F`
zhpkgntkI07A2WEEfb1FSRDbO|_Vm$z6vR-X;fAB^|x?R
zZ%vA7oiy$0=T)^#(w9l!52X_MIgov^S^f8HTjxdk>bsZUArhKLwqmKFPvB<)KYum@
z@7Ce4BJ9a-?T36B0r^ruzBEHFwRH4gc7fe#x~w*v3|>eJ!4zRn`40_+}e9P(cjmoH=CUuy84#Ca8|{VPrTS3d1u
zy^Mu_slj`+e;uj)Yfbyt9_?SnmHSs(xqsy?_pjp0{VT29zw(y*S1%*Af2nEjE10id
zMZ&+*;C&?r9*s=d?nDHOA|-Ql{GVK4%N=TRQ&FKPmV}gcgEFc(yF^{G;Sze~MbyhC#L*Ufl7xZ_+
zep{gH@rRPEXno_krP@_ov5m#24ip4ESlpsErF_>nv&TId8r
zC(`Ie^6Po>&A*HAe=^6RdI-)u8TMoK;K)24>~#d>YXND=ylUBh23H0d_S3R;R0K%4
zItUK~euDqaKo6vbRe)5^JA)b*lh`NWCc~N=o^4&V)v_vrh`PX+;+Gv1mbkb^;ozFk
zrEp2Oi<>NtMS(Zt*5vnHUgK%TAY?84mGWUkZ^*U{?v1*@*Yua8KN10dh(Y~9qW<7U
z{V4|ZCyDx#4YhuM2&*zDKiumv(n*uaaGdRU{~#$6lN^zx|{X%6WkO~q`UA-RFH2@&;R7+
z5evZFC+~cJ(q(RmuT>2P(i{q|clpZJj>Rj<(Ja})e1)oS$?a~vh9Wi0Ch5m=Mt%-t
zaUUaX@M=U#zGnD$*Fa&~uFNf$j_r~@Ntjo{y%O|FsFzWX^LsCie{&=P{(r7&iz^qKHVs8_sRL^QxVl$1#r=Wb&?jk5P
z{2(8HScpUkkuV!qw3I`LPPw~mSF|bL-%GEb$~OCIY(h){MSFsNVv{goer^g@=9v$#
zZE4ey4^zNOZ-a4b#j6JeT#@v;eJY3{(!)S3!m{Ipv_^M3EJXCS$d+G>@v<;*3H;v;
zjl+o<2hG7vt+vn8E_ha0}eQukzkF)7~$68Cd_qz(?4e&Gq#Ob)WZwUNat
zR3n3UY*`bxGSZZt9T}TA5@!hWPF(!>HsR+}LQ4#;1$U848#;f>@4&{gZB^Z-o*N0*
znR#=Hd7%1wRAlFNN2c0P`huMu4o#u$6I`0zM3D-a%O|+MyKxh=RYj+=cU7HcyS9RV
zextPwWoFh#PQDsB@w^3vDjz>Mk$L<5TI!npgQbkj3$7nH5ieC>=5NGS@O4)*^T!
zTt)v4u14b3ZnJr!9eYXY^gg$(wDm}bLT@{l1YL||TP?XfBwb*4(($2rn{TK#>=E(+
zbc5728_1(mf=)(0NM|JhLdg0eH#Ad!loT`4uqnneqA2tve#ME%@>0+ID^ifGA?e48
z#xQ;P;yXjh9fZ*b2q46RBpAest*klFw5_WL!j=m1^?gDAS#ruu?*ZZ~4~lQn`Fa#&
z9i?lf+^Ui;DmvEQYPp5halXvTXE|qPWay6Pq&4?1!9RvkJ+q^Oj4KWIRrO_mOiF8V
zztE4MG`8;!TWAcs#75vv_8aXeV2kgL&b4=STx1N=7vPjor$jip`RVL*v!gRL-xi5Y
z1C#s(b4+T()`?MzineQY3@sD*1phmMy=(IpeD4~)k^6PbaDxkOVUJ2CPFgFXa=Ap%;iDS9cf%666-_hU0rR`yliqh
zqH_&3ZISb%;aY`k@*qUQLiC5HW_4*dKbf*VtgBr)UeTs=<#;KSMCbBr0&S&*TO^jU0Rt7}u;C>S0~{>M@EmTvFW7?{G&2|q}Z=z-lp&{jd?Dpdb6?$E(v!rfv`;r7;2@kT#tQt8H^`eS9!gMf;x^#LkPhR%+e4x6(OB*Dz|HYTH3%1z;p-U>@(b<
zjsZYdEJ(tFBvN?@qECWtT0$`rIfKQi+2t*X)X)MVw1XljG8c;?dfPOU(X*{I4E4}N
zLh7a}kjk4q*wFFR#;a$|2!1EruOeSC)5LrbTT-5dETC2I#+2O1>Nu`qP}qyZ)*t#g
zhidDmTly+K);R)y!2~I~$XkRzGiRJ(4U6{QN!`GzFixwh!q9;CLTHCD*p4p`k?;@}
zXk|r&rQieiUnO--Q14K(pia
z>GGZ|zrfjQScTh=dQIX8?J%GQ^ZmC(c;mSy^!8{6Wj$}>RN*pfURCne!?7-^l3;Dy
z?wWhloP893MI5mU2(&@}f5V>;026_I6op4eIQkZ+3`zhx{P3VREv+97D!a<>?xg0n
z17ucG7tk7G0RAiqAb?B)<#d@rM_lb1*_aw+aoJ3k4^LAHIVDG=xT9E=)^jOF4Xg;4
z%!3VOak|AkoZ7U*@iFb5S2T{JJHQywOBPliekT}zHsN8DrMG)jRy5Wz1-mDwEPT9o
z7IOM`2WOA&tI9f*H4^p(Z}e|Ux!KZ6UAE1)C*mPdZOk+9W&QYvJr@Dva)hYU6;ol3vLL
z^GdjvU8AP0YKB#``F4apR)A~fkqD1)U0`CmhbBF7p$BvJYr!VXGMjnsKLx8{lV?jF
zGBhtdPr-^bV>J+~EsD`LAL;PqyN8Sla1uP*ZUKM1&)O94^oc#dbV=vFdD>(TU^oDO
zCc>R9rce#yP(Rbq3AWGWhamQzpOEk28lfCGUWB#p1Zi=*(-V8HVC$>ksF>D0|Xrc(S
zo!kxE8}hSOa3Y_uZ6!DW^8{l^SoLIokz?E5HOUJ6nQpW8evE!&Xx>)kzyA4ObP`Hh
zHVp$g7|X(vYbQs;Gzo|%cq$A;gJa%;In^{{TA*%7U*um1t#ME3_Nl$6ikc3ng~mFD
zLc|zlk}Q!jENUP_tM*fJi82X4_U4T$8nwulc(!3=0UJP^cMidYt;jcd%g(ERu<;~q
ztujaFXjjLE^r3Ud5$P#&4^ghHa3x|_^7F>&EomPK;m4J4jVG-FG!26NSS4DZga=~9
zo&^etLzCSRM=x*Jk_%qrpAaU!>W*OS0o;fxZ7tO7AYy1=(F?727win9vvuyvE1d@O
z3hy^es#wAHQ<1E4I#BFRjY8jl4BNNlfwi#XboHX1VSq#pfP2C($OC3)6R3W4J7rXN
zR8wWpW^8L^RBD0-%b;RpEi`HtSrMgliOaSZ@Wl=ri?zMb>-3>MncMUU!
zQW|#h%}hZ^Cp=7Y+C9eJRtXK`Rg`0-*$U3^Hf?RZWn|IKBFqCNy0cFMX0kbsn8^q}
z{PNKhmGN4#he${XD*o*ui;Pa=&n-NX!A{8v)v8^)bwNpp^Vwx`s+Rt3{aKr0PnBxNUCK0F0A}ErH)EW?CRJ_D+a@zcWv)%G}eND%wg^
zq%vk%Z4JvpFS<5s2d%!Ns`Q0s7~W2+pcdt|=UEjI3j;ey^{c!EVo+5Hq8TT?BE>CzIC&pI*U7wx
zRvmu1D7<5f0fCTz_+S`M^uQYe<~!ryJDF?o%S8e2qp*88*lC3G^aO9{XCgnHj5I~Z
zG3tVFg#t^opRrodJ_egYc;fh}jiUvFT|zo#(hTvNKVb_hFu(beO9`xqOWHk0P&4yt
zD1<*>z|R1h6opf{OkQV4^dB%p#fyg%}U~44}!&ds63Z
zvtR?tNIoHrqg76ry1s?0Y
z+7<3B?oG|cMcM(^w0K4syhq!qgPB9^;%4XJ7S
z35yJYG)CDIbj9^?a81zFP9M_(cxr!Xsr_1Q%uBF;>$!xx&Nb}Rg6gY4VmF2;3euOR
zKJ4kDuTQOQO)J#b;3OD`33B1!;fv&HyhW7FMAA&w6~6s_S3HGMIS|+cC&|RYX|YL8
z{cH;Lo2}3o59RtzUE`(11I^WA*Kqi!T}BnGI8r4%4oySIgjt%VWr~VVWwyze(TUO*
zd&?Yu{7KRiOw*Kn&D*iOTv)J6b<*SvJZxHk6pmp8P$2zK?u@x~CDBHCUp;nOXUle%
z6~$8uD=~rG4uD^($1du^D*-Q?HtaG2ZHMl51)sw`aSLjpS>c3WHyfBIpN2khBW%sj
zHl?=Nt|5GlE~+#d1TWEvE$q2Vq|&p~nv$=7OM(+iG~n55-qQ?kR{NGPG}T6;D}xFl
z2m48AJG9rWBpKf0PKQe)T_l^QrX`!$bnQ!BJrrey|E{Vx
z4n-x52x>yR5U=~06ai162!GYD@2f8(z+Gf4i0-8X1=%63EG7t_;etY^hI+n#0$w8I
zE3vI>4@XtRC9j^zz!dBJ%*x1VTuDnF4p*~um7|H`tbPj8#{(g!f#{9*B9hMAtd;pO
zMh1CG)UJbil0evMl9ito1!LLlF6qB8rZlk
z-L3bK)P^A=ekB56w+R8Tu)8&D;35W{GQj&(-NY(JFEfJF>Kblrpm)-Fdvs#vikU?U
z(Z0m#WJKt6V#bf9ce1h9T7k$f=gFW3`rkVvcVw()w63
zxXc*D^Z}^7a8z5o#_@$br8IYzL3DkY?mPL{KmT8F`qw}I%S#vBWcOusI&kvPH4!uo
zhqn~enzXyROdqmhNB9|k$*9uelD|T~g!!=pmhRHRdrOkWL~|f?!yS@Ou81q0ws<)y
zf=v~>>H2u?WM{0fcZ3!vbc`{Sx)Cl3cd^lZZ37v;f;qCUmi7d)lXmV4)-F6|VM9MI
zm3C4vtC2Vfb+OaIQ#^|j-!dUf8b$YPMkfW?v?mMH|1Loj>0#G@0LOLVT}e*__;C2=
z=pjJlDJR7$DoHyD;J`0KQVJ`V#t9MiloKLmrn2wL2F3!BujB?n
zTBO^|b&ykG)WU;*d%{1g=)thfFp1#tn#-(ih;3D@3&0Xt5y+WYCv1kc)TuWkRV0;#
zK6prHi>^4(HNLiHBX@&{rN7QIk)BSya@Ex7D5We2a-Pf$YzC-9hb-9^4OPG!Jz3FR
z1`5{40ddB?67H2qFNa3VwqW=AGW>!x4o@Lrzp%qdI}q-F`J(fDAw9iXu>*oK!)a8i
zdcpRq7V$YL^yEhfyF!MzDc?WqaE0ppoS_W=;^g$^)79eo=H%n)+2Zu%!-tbMAI`30
zW7GYbGA_otV~xqXUq7B+o?Km@U5$^2JexdaG$d$9EUwQ^u1hd2J?Af#x~G!RUORUJ;160oz+x#Yz!ElS9S!r|DJR{U|fay
z*wxXNx0NP6R2iGRwm{wqsfzqUifzg_q0OD55`y)L;K28-ElBF2D|pp7C16?BQ4{(c
zX6aMKG2xCb4U~mu9CX9$I5eN&H{v#3w8NAN1XNdlv0*L=;h-46Z}y6`FY#an2Y0Sv
z@I!px|njKkO2_0IWyszRfVoWf6JYG}lQ?
zvF_2hAov9lc~mtI&}doY)OF!o#_Vgs#NDLh5o+
z(JmzzoQ1~!?U0+Qbe@OlgNpF{uN|1}{s!an;Ovhb)wyop$26|p>v+2|HUT;b`O5`=
zADIkNK>Sd#KS(of!>$4SSg-J*Z*h(JpUi4YJwLeM92frQzVtI!H46EMa^T65+b=az@FO$ysYPlW+!=ALwKXB+6*DkOVn
zW5GK15NcJ74IKESEm5J2l%mgY+wxO?$aDeGzZBNOA(vQV7*q+l5^LuGpHw{a9>md;
z0G~vDS~-HD8%J${og0i=$|8#EE#fV}5CS&-LugHv6feNvqLH!@4Z4|iid%wFB-$zJq)%7zZIl=RLlTTK(4=`Q?s_E
zXv1G$q(6ERm|%^4`BsQxAhWoB>o*8&D5BpFHWR^_gdlhk5RNREp|p}4ggKDVN_vmw
zV{RW$pdZT){5gWX!vy8NEJ;5NZQu)k^(|aEXll}IOGkq>-Vw8Ds51C4aE0b)s3m3VRNh5GdY$QE1HOC`Jat3W6DS%
zR?nUp3kK5$KCB&jB8Gk=
z)DcjsUhK)7PCHC|8s>!(<^_h)e{J9N)RiOnh-6Y^(sH4%Km?;4%fR#?m)YeC?|F53u#s
z=p-&pN7IJzOxG{uDUL%Cf0Nz`e1@>`x;05P1lEq70C*j(ha(&q^@0$H)xCw`M1oA
zWfl`k&d|%Mi@2~%9ywO976!@gf-`yaBsH^7#MSqiHqw}llFXtJk1}_(FmuVQZ8NaN
z2>1Q6l7V`rxtbb&e;BTf2mzM|c?iQc*ib<*7*sd#WG7mD_3S#Dbn7AT+q*(9<_oWW
zqVKoE&B=jIO$>eGDFJe?4)1jF3=JeOie8INK7QE@T`lAg`BfCBCIQxzS3G_e2G)wN
zi|RHj7E#HkO3JFmx`Fo}KD{~lu(&?GI={TRwlHf=c@(oze^ToKOj$~tYcj%{x4&dK
zb&??r2W=bX=dGDUTLN)|^v~3CVN<14G#gBp1Z)$il>>lJyfQiQ@}`r%j}fbhSyFzIB
zzEM(7{2}vAwzefac(GK6Uwt9=kXD{Gd{-c3*-Ii?B~O?;n^2lpy9BxZjCV_25pBFq
zk%0PZ;h2u!fZCQQ{K*uD?nV?CG-|VTh@J)^`G5qPe?Mw1*+t!#SxeSc{p5WGyQ4En
zQQuSUW_tHpA@m&x(0D{(>S);NS5V{BSJn2Y+k_!D)+(W&=nexM%4oHAK$S1Q5YKTE
zEex;3s*@Fu4N$?sn{xw-o?tkk+i;zMhzb1Kw^BC%e!NHXGOc)&Z*q78s>l`ddICk|s$k~UL0)|I6`_SS#eTMVxR`^D6*%0KF{0wL9
z(!-(6D!;oUHGxaL!hBHMg-AmzXb<#@zU*WLRij5C=k}{lgAQc!%
z_ZUN?u#7G+47`KsN_z0;9XE|USZqcoBaU*PPMoQOmE5+i^V^;4hNaHr#^6WM#5pZG
zLOGG1R;_M#d9hM1CKC2WXsALq@i*LEe_UfEp2WdZhXeuIyk%EGqLp!j;K@aTx}dMP
z;GVe^>lJ)3)E%dk6`)^#sE~%KB2rg?;$|K0`SxIVr9&&VUd^E
z-cgxq2X+o|NacUtv!|dB<^%IjPPjjNMc()hsHWbi9MpxvDtka1)DbvZp*L04f5Kb5
z+w@(XZHOE;n%g8pX#Nnr@Bn*(WlP}PrU(&0i4BEx77*#3rjjk9Hl^H%lW1J8d}Yp|
z920)S{)STS+SauM<)-AqZ`j{J%4JrsMiMg7Q}{oWtSTHg9^GUpdJ6vsl7T7hkuhVU
zVAMP`W_P<9cU9>;b>%v?;->9^f4pPg3I7gMWlc&_!=_yOgj?{WARFha5>B10Xz!Uv
za?Lyv;Ss83ov(aX$lQu40PpEH_EuGV;&
z29rwC1?cZUFpWo-?sOJYvDgiY8`(T`_>UVDb%GLKY|Je$#hh
zbfwwJDRIqtTkO_(*@(XpfBK3y0?a_DD+?mt$4M@kSMm)H^X>m|YPzn96)B7CsoDi+
zuqN{!KR)1xm4)eomilfpxOMNDp{s00Sr*GgIvVEc1NKc;(vn|yIsPaDE!Mj{JX5@I
zDTRZq;YwbxfJzb4h@IIJU;7k^fL83WW-kp&`#HSS1hd)XKQoWcfBFtDmpx4y*A)Zl
zFB|1%aGJjhgKe^CGGE`mzjr53goCG8Y2`U$GKqb741U>zUF@Y@^`G
zY9&lozz)!MIN4Qbf4eOts4-E*22t@CITAy!<{;;5NI2<4>A=gRni@V3z7&Q2sEqyM
zs8cn}$dMYc_YDV%{Bm>g!OhQ3pYoD}SWT1;CV8$0JGRQbP@l%F3o~lDuA&r>LduHZ
z2m0-y!WBhWhq^6x^=%wuPnHwk;4&mEU7@p^pQZ}t8_uKIe}WjF(nYD_fZb4G+edIQm}Qv8&b_HacbA7QNQ+aL}XDB6_vZ
zBmx@9O|{DJp2SdEj02-6-4GYT7YnJdF!$N16u!FdT|4PCP{RKTcOmZ#t0o;bZn_p(
z8&mNIQtX)Ve>>`sT=Gg@F3Fb4oitD7GQF%TTyoaBF;fWEm7!C@oh(@FJvwmMD&UIh
zR`{M+C>ea;({{Dm(Rm@Mn;ks<+qs3)`+%;M-^`!s$lV+&q9txTmLIMSGxg1cm?dxg
z?PJNy77f7X502MIe5_`We`jhap4w9+PPOV?xxmDXe^mwcmzf}Amp~oko2--<;QED_
z`|-tj_A!uTqt()Mi_QQegF4}=sttwXLEo^yMmXiT4`mNQ?MW!dg6OA_Bj1K%^N{D4
zR;(hwi&Iw@_`tp#%9hZ91Y*muAEBeMAvU|s2A(OR{bF_t=h5&a8uk~aw~kFjK8S1P
z4}Gide=lD@=BR9dkY2D=s`Qff8&_mW^1&q0AD-K5lB-}DJGHaL#c~!Th!>l6<^2as
zdiXTaF;3tkxfU0d!?alCRPp^4>BGF`-?8d+YmzK!;Xrd*tGP8oIXCDuxv5+#FGuUC
zVu*X_{}+7WJ=!ousOHt0Z&0v-a$OZ%nf=4zI-2qjl31#2*ugKMLa2@
zTor7_D{TY3>U5AMS3gog@K90wHQrSwsn>IhObIPjJw
zf85!x3py1tr(%>)L}T)f8*q){lQP%*hr+<7t;S-8Uc7YS@4gszCuNi4^mtcWb?Sih
z;3pri&lCP(!schOp(_r6?m~;h+t5e_-X*h97eBXvwKwD3NKjDHnbYe@r$iaLn?|_(JAnsn6|<_)F+xmfR5oI
zfRQ#F*;_wo8XkT8im@oAU6j(MOPLtetU!CEn?S{BB^nQ3rP+>lj@#XKOIl}9@hIwm
zR8;1naO|ds@+m)fstNa1-Qxj^(oU%1TTi%GI~X6Bl-%r!HW&BYH(-+lQUhI6&%oHM
zY6#$k5+;E#n7CS)PVM(Q(zND!f6Bc0<`?{iMSr&GsfU2p4SunNvlVRxP7iLzK4*`?
zz0*vX_f_l%5|6duLvgC{a$9(OOak4kw$fcxLtz&;E%59CsI18U=$@1sMrs&PL~Q8e
zCeWHkzW-X#&z)h1&_{0vlIRcWavN@WcW|~hZlKNhMI*1XIPd}jMzL?MU>xG3if_|eDnr#js}U2
zhYIsxf_ZUE{B)kpzWbts12@vhsquCAA+}RmJ9#7gl9oRqKTxE1e|;PVdxgAR8lZ|>
zzIO*5edVoGlRDD+93G(CbV=>j!YC$<*5R4EjWsW%-XTm%V0R8zd;*O3VYMs@p>ave
zWgNIrt7WiJ5p^k9-XvyGz@fk6lC43p7&LXMTHa3PiHF^qb_aK$xNeFiu0Ysjb!#r3
zqS0CGZ0LlOtTtp*f7MT{kh6yi0(1!g>1=^sV~`6Bf*=VC(rNeU(;H*sL*4m<73>oB
z8=SLY6Q=bF5RNs*5b73ZeyVdfhJa$_I=_Gf6gLyE!@%HWd!J9&R`dTB-7G^=AN%b_BL<^BD;k<;{qm57sivDlFi=29!e
z{f0*Ratrsve-he-=nr*7akj)nhqj1nBOD=NA@|kB9$^>U7pt!I!6WBE=slS$**3wa
zg-5h_c;wx1C&kP(kP>Yo60@5rCbr@Ag{b_pix00q4Dt;uaiy184TkpLJf&yKT1CGE
znuCfJu9Uqc3Z}lc7$&)W8ZJ>-FmUFH2+T+wLr8C*e>{sP4wZa>!5Ra`S;?NvGFMGK
z2wz$OZ0Tl$lctlZR4itblxSpzNDt{;AZRtIN~BjpLbSr98>2~2(3TGWS(TP;CiG#6
zh(CKW$^fxv&`NoA0mq+zRE`sc9ZMV;m-ob>JsGJNS?IVoRq)U6ztOaFiPn`}W)nU}e;@eZz>*t|n
zZ?d`_oc%Th5f>d;a7*vQgW|0R_!ZXiDFi*aV7h!ovIa*p<#w4e5PuG<#5RO;aL1v~
z$IH`1x;vE#uc?{_;Vpj0)io`7c~?cSfAs{r1_?f0j7Gay4kFz&)*xWJyypkEDqk^F
zgNouv-I7jTc~QqLjU|-2q|(XyoR41(JJde|@m$6RJ-lUN&M{#k2L~y^-AA-FZ?DLh$klKP?zIMc8hOC%BqKe;s_9
zOH^Iz1U`}ssT@pb@}LRl;Nj68f-44~L%M`_i&F8xcLa$+7`&5Ha7(@skA(lpr$E!z
zq+H{JWO+rWt50K{QE4c8$z77S+{Hos`wnhm(UEr@(ekK5e}ms}(X)27KsDJ^BE7JVKCgeuG|ve~Ay16tv*5v4Sae^?WbEw%iKU)lwg
zVZGLXe}KT>36>5)T9nIT*No(svZwNA2&ZyiNlU{KCD4JTUVOS$Gbf}(k_S>hwRnaP
z&am9lIj6iO6R)Kc?M!;&d6-*5=jXyRK-0TjQKZf8mbD65lQv|V(Xk7$y_V!x*AMxQ
zhDbz+1f~r7T-w`TcJV&>JMiik8CQx`w$d`5Fl@Nk_
zDL8&;kzY+~sxCj%14
zgVYM%_p|B~f4l`~)POI@5Z-}~Q=$*T*Kx3bw9d`N)1qR7
zUT4q70|^UJ?8^?u%o-`c4xLr#PAHHg;wVOsNR!kKe_XgJW7-RiF{YVN_=56XBXVaq
zm=8)Xvii$z>)sL7Lh{p;E3pg2>=-2*=Ifym7XWyRjh2wojiQ1hW&Gg#HR59ge$QM(Hx|{6oY!<Eb&E7kb#ub(NER3-lDz++jj
zg1aFOk{1P8rC8tsIxbC*f$%kRNQ8rdf1ADO1TUlDp%`cF*TeEgfIR>O@2up;MZ%tt
z+#O80h%bf)(muin9b(#4lLj#@>ySODh?!`W4%M(Y`c|y**>Vs9ux!JibyXOTjbJb|
zfWM^ULwGR&OEohT{*cvq7P5~f$-FqI4Ekd=VP?lWe~*GJ7IDgOnV?jFK{L%=f0PNl
z@YS&yh2e}LOs>Gue&I{-M-N9wK+XB(Qd=?7*H*HJH&aIAVT2e5p!66SO*9la_FJys_uEcAwqHu?(KaYkzv
zQH%!KM6`B2){rY713KlxhbdDZf3g)FOtf&<*O{qZIG(8wC&Iyr%7#KZi9`DyjV2mH
zc}Ft%*~Icmxp(}Bmno(w^x0yH!b3x+?4+)$jVGgIIFV84a77)QsBCcE>6^nD^lzG7arxzAfIqJ#9Wg`c^$*45Vxa^Cx+Ml
zGXVo#2J)BOcsCq4UK`H?^fZt+N@J-zL3s<+K!$5&w0FGnHZN*O-oS9D#8TBX3DrRL
zHmliNAGFoLi-9oXW4$!mf4k3GZ$b~Wi9?r`tT8a!XzT(fY+QhKGiyme%)-XA2Bn4I
zTift;Kt+T@NWC2r>f*6EhV+oW4ebv
zb4}BOj{Ir8t;R%F7r(-(WDc}%l
zPYDyiyYsUTZ*Fgub
zjEdNx_DP(WvSrpOyo3$e#h@Ri2CFgjI)Hd#4;}|!1t}0zf6z_D?&4mpsutcwua;l9
zrD1Dn*Mjl}2;A`HbaeFLV_O6+>FdA)IR?@J0#o9(eJ9tZ#P@qE@qJH;@8gxw6Mu{n
z9m0t0h^bWu4Pq+Qfcr}c)Bn6_cK+thz^#e@FZf8#@gsygs5%))owex~k`?Vem|Aky
zq%Ih%MeG|ae`~oQnbiaQy3KrhEjD#=4{g(U6rbW%YSx>G{
z&(9MopL_#ba?(mC2S|Rsd6)h<=>QTDDq#SB3QZn%f43Ki#znM~kItFEIk}B_Ffso*
zlsKZ@vysQ_@0pc=qcmX`m~1+z2w?2SdS}V3K;SB=jeYQ7us!CNPwl;DIIV>gyAZ6*
z^YLUNP%PVR8bW%rYpXiX3aWEfRO=lHXCKOnEqnHb){LR5nU)rONNB5o-KONDhx9S0
zZK!aRe>FNRSDYG$GM(`IoMJcw!Qh58I?7-p;|edW!GS4SKW?+-muaHa2R%ucOCnrG
zDZ3IGEbLde%@pdIV5cfe`05M<5)sF1u?^gYry;+Pr^l*ZO%jVhCOF9r!DLS0U0fb4
z5y8gARXE;dzfTe)iAU?i?}-SNynAu-;%_g4e^opy$b
zVOj_w#v;tg@f=)m!*=eRlfm)%ndo
zLNx8JFktUueyG&1q7g>94AHrcP-+5&hRQ@Jf*17Qz--ji)S%7)h${uP6x_YD)lN0G
z#L%?$ZVB^zY}FsCWp=wOvU)@z^Wd>{4C#&iL+2f!FGO#F2_LT;CK;3MU;;Uze<5tx
zBo9nQZAicc28#-2s8iv?rih(Spo07{M~o9R>H)`_E&3UePMHTh1<6t{FD+-ChuYo4
zwYk;kI@psxWuM`-Pd$PJQ4;S%Rd>$!TSN2;!Br16VbSC6)m{G)S6@8z=Yq!!x{dD+
zOQ7D1!-0cpO*NJ&6VwwApj4F?e~S1zvm)h)<_)FbzYvDJ$!=L~675a{7n7@UIihAd
z(cTJAyn4aYBx{qZT!z$8VJ(zB4ZEq>%dmTtFdyI}d=oT(CInu}gLVkMLsSrErkI^4=t|is!x73@p`__5oXN8BBl-j=$P8oPf4SblNs9}b`bF~1zyA5ZPvJq(+p0}Y&j0n#fB*BRBzK*!12|nzofS+?J`fgboI)UA?5K
zNA<#lYeLz)IF}dze{R|+0Wj7qfJ4J-vqgJKclpJReFn
z6ujatiEy!!Leof737$;ENqZ>gKn{9enws#&B04x2^D^K`6NQO~zu`aZ$knO}Muo69
zpWc45qJ^AilW@+1Y!Z+!LeVy0Sya0fRz1I!SB1m|!1}YSf26HNf<6iN87gy;x_q}bP@;~WyKgJxt4CHb|3
zrHKz(`}%E*KWvC7j|!TAdFMPApQ
zBZw>r%RkYKF*h4rY?gHdQQ0NA#A5fRi%b|>PtY4Xct8QJiTj3sT{!(jy5iwPS65j!
zJyJ)^e|oe=h%u_f!rRk96bhBzaS*Ql(i)dt>EuRwR
zY&Rj%6OB#30dHIq_PGmG8r5w=&1jgEFyjO!2|PoS@+W~kt&JX(B|JAL@ewZp3ojpw
zayCgC4T9%!e33UOV8P)Blcd=pbPZDLflfZre>g+nRT`sCLy!~UB(K(lXagqkt1|QN
zHkhpP+w;(xk|0Fd(ve
zs`HX$bofsD2|8EHA?71gcH^Bf-(>Z#fBx4$Fu=bhHxPo(12II1%E}AfYRZgBU@MgJ
zf7rL0x=o~hbkbN%p`3!FXm&+i!_|stvQ64VG}%M$f|Tp_egrEQWPd`Ka9{vi+pE0`
zhZPFD==3x7h%X#v_T|eiZSvxQ)XgRzl_*1ufBo}+e+0+mx^w*3KmSjNLfp&|wk>O|
zKZ{e!j5E5Q!=nN0Sc-Rd)TB;d9$rAle^V@`%}@jV6E`e0f?104A0d2rrHs9|oNc#t
zl`Y2<3=<08LSt_>3%3x3LWZg)6`Z5hAgw{kf79KT
z*CG%feOCqHMkUcqAz!M%`{cB?97!;GXGVX!mF>%3`A
zXEAJ$P^C6tKE%IW@6t*EITyd8l-R1V>c&m{BsPoHKKcdWPoA_`Gy;uEIn~#Ju&miF
zOI?vw`exU*9`hPqFy0xERl>!HADSI!S*5r56&gpK(gYB%MW{{VK6#Kyf8%Q$F|I04
zjqQT5v}E6JE7KTX2^-gg_DG`oP@S~VV--%R2!=;7q)F`)xf|8%qIyiv;1;?wQ$#49
zC-gIcPX}IXj%W;V8KP2#?EUn(-0v}H=nZ@jky^nFotPu#Zn6T6w}0F&oq3^ze3OH(nzCrfeQhrbwdSrTq4iMsqa*RgMK@6YupJ*uSp@!P1?IH8BVdO4`*wV23?_9XlWoPg|w}YhjOG~
z3WDDF=?d6!A~f68e&|LXszyH_4S&Uc6L9;^e?Z!ap7I|deBzvrw5jtb
zBOJ$W0UDnY_c@J1$i%~>4GO1B`WN{9t!*YUB#s#;7^q{$3j=OF_3)5$z+qpL8a5<7
zBk(C4^Reh(%lxZ)>CsmHm2j-^gF{;6UkDaNCjMlaG^mns>E7pzN%S7;PG~F65V3ALUor7E_;UC?8OU
z|KlJ3`M%EG4G|B+>IMB+(+?{WGXvMwJCeR$1vIfLe|S&uB!REw^;>g0suJE-yB05A
zY_s(1G{&CfTlNV@KaIyjbWUbEB`edfPm%dM6n@KH;40C7{Nuut&tVNukJ5ASK!F$6
zT0$zie@3DUiW@OIbFCi|HY2!Pw_!8}ctuTIOTz72Iz?`)kePgs)&+DXe6haZ4shq|
zR8Tic9-Z9}@9pxULu3lN$zI#Ak2Iv3svcz+At$=0zxp{f|(
z-RT;I_jMLF?^z3-Z}lpMrX_W~+qUs7W?%GNfBz1og=`o}%S6xhZznBW^NMe%6)CtI
zR`?rekcf_0Cj=}XgCf)5hIK3pmjW8L#S^W3t?Qm2J-NF#f@|fh;3Dp^f7yi
zFQ&TSC-xQ4v9q@hSnpBOAsVUUGe(oU
ze^Nf2Y%M7WG~r_y2eLQPA^G5ErhV=o%L)!$$8dI1a0vE4@u!n#w@vY6%nJ6KqT{&R
z_Jx1lrg(_vt#oqI!SeP13Nk8ydc~?
z!thQe+}4y|>Y2n;$h#vyP{#|muewF{1hdTwjI48^SQSkWAJ7e~^h#a4sx-UXP2O@7
z6(e;qVq8nd2yGt0E>_;8%`R`nGsolg@}PaD-U+Se%)a6qexYF|Fm-Q8U*8H(Wl
zUT|h5Xu-Br<4CyOAr#esJf!mJf3gKyx{1v}DV_@P0iaKTq5^Ygk#$^3i61_es;KJ4
zCab^fwvic#qNxzofV`xeEuHFkcUOmuQm*^yM
zl@~B%j;0Y}@|TaO&hFxS87U=x_*iiFY5}&GzXp~ve_o#tB~~V5
zdO9)z^L2|t+QtbcKtX0ECQ(3qbPw4I%<966BXM+!pz_;G*DSLwfnk3vT_>pg_R-;D
zF5(z~1#tGm1?;s`r2`O8PND~fR=6Ofc66BWk82(@DzBN|W>k}8ak
z5t6;8BmYP`DJFmUi1Kz3e{83BK$o|gLEavik6L^4JCa$K)jxf_-gSoo8%P+}9CT#%
z^!LL1W_TZ8c{03%@NmIy>DM?KCUOq{d%>}+ZnEuSrMw;cRJa@|iK7oB#D
z85H0dQzq9z__zY>pbdDK%*Jf`tcM?Jl59Yt2yPq($oh0&7if2CvD~bhSjMlyW);Zl
zP##{e&anuz^3mt*S@zJOJiJ@Q978an5aNG56zuluf^D#kjU&G&%RrRKTEKlO(XrWW
zcOf-g3wb>>=^%Vuf7{534G7SGUf7VsSVL?sC4P8VLhohvc~m+1)5ld*j|=~0a@1;j@eaH(Oy#AGaY8T$Byj*q*G4G|=S@GAw00^+07
zuM&i_b#mQLFBdzzya+g?KIGHRrRz|Eyv;bu#_=SUPPFTtf4L5(QU#UYKDsuKjS~~W
z|2^Q3`hn(P21Ty>>ER062kjFHA^ulT?Bv>$zIlS~Y`f%_>M^;gIuDYZ&~$%Kr%=C;
zVygkAZ>wcvLqkt(2ZoWimE5j_5JNzAdUaFPB)uzW69@Z7_z)Hz(KIGQkI*H4l7Lqt
zyx5ak=w;Dlf15it;RnPr^vUJ9e#k_JMaJKE)*B#wU^V=k?zaV8uF%6+5KOV*Vee`g
z$YmFoj|-??$;z6K5~?bTCvKHJN330U+&oGr7m(Br0`d0`a#XJi`RqCpKSc<9PPi5QC*uWLXwvy)*g7e1-5Z`Qyw@I5PnrB~wH0X(l
zmrU8Gh2?>cG~mcDO?0@4`9Q*$hGN1gkxmxIuPyB=Y1r_VxF>SPKV5C|J;_#9qrrWA
z8Tc3ef5VI^k0S?xcA@1tWeaQ>ogh7t^U|LnIUV@t%iGE_933!V@D#(JOcw>N{(F(BOUG~+b+ir5yD
z`%oh6HT!D;WG}nj<#5}$t#?c72G{`JD0$5ue}V(oM7o-(TlO?#2p11}gMZ9uySiv<
zaz|=XF4;Sfa1wZ1WXrJVfP88L_?3EodnG;LIZ1f<1wGB`(6JJo2IiZzr7csC0=mTC
z`Bws8Rtg-c;T!XWJ*T`PTUrn^`@t0hs~hC+e9*@O;HW?iVAkz1t4rIqcV7h&_A~oy
ze*vsnzlHrZbeFg)#*PbSJ9vIBunP_X`pg2c5kVJ-9a!UmG(GwI&xm|a=S_B1pk0V>U-=76;{;N7^$#=Yzx)2I|VpTybV|
za`3<2Z8ll`q{@gXZ^OKFUHc$fNC%+#d5i&?40b9Wycpn!v>Ifg0Za{hs(uY%;p`ag
zxXcIqhRFTk_$nLi;^eu$9{wt$-4&d8T*9IRdkz(w7hI&sRu38NL*N~wYItC5f509I
z_Lc`vAUJ=DHTedbEnEf>;S(PIPkr6jMRiNZj9_i1AYdxeY@}?Urd{qm`XtgP5k7rt
zoUWSQLLQK*Aulp~1sfkf?g2I=tC#n|`8)`IjSlvFZtm%jeYtDBz%tym_|=DkTQ~U3
zEAfG;A#b|heLz^$%!hX=2XI}ue_zEf33XnkmpP8#8dKAvc53@Ya(9i6Nz_NK+x
zZBg|nhgN2T;72-?Sy${u4CeITY_zztDl#pMP!oZ>cjCjv(LPpeom7S`K
z8o*nfxUec}0rOK7qV;mMf9tCFpo#7L^)^=ZF~ac+Atb%6N_%{I@T$Zc`SY(2Wtwnfr_5e6#Z@2e{^B$U72R=nchJ4
zA{p&`uys)W>!1JCCV-WELr0;)0YXD#ysG|0+k>Y>0ZdXV2#_)mg-kMRDF2%ynNVL^
z-}5DJ`a$_T%{Fva$GgNTE$Eo83{Qv%%ySk=49xqOe@keL&y#GE@X!z$4DE}?=1K51
z?e6XlThTu4j&^hXe*-1nxI_T+2yLEtY!Z~f*1I1kDnV9WWN_N(_$R)IW8E`EKRoZ`oL
z9bt(-g^gKwf3%YJFRSSah5`B{xq%IaGjzlr>h0NB-EW1jI21OK;zQiY>LT9gY{0@h
zw#O4G+(*5^@8loVF8N5m?aE$eb^Fo)&n)?;r|L3;uRROI;tRs;sQ`A{FOhE!?+xC)
zcfcGuk>%beEEevn7U6(XTaljoY8*1Y#^WtiKAz1UNedA>SHgs
zdzaEof80CiZILoki5FnluIw4OO&>MGk@Xp3#aLv7n6dS#;?gy(bWVT!+u(x1bn!7T
zb**=qd_t$m;syK08MZI*{7>G_R``ZQuqT}*mz~R$k+Phum^41a6B+O^Su9}B70W?g
z?aJAzPmkpT`%Kv9WO3nL8a#y5kOFLC-B-JYf6Nsr8y)XF|H0j%*#q~9Ibsa?Q;p4Jv4c4_?fT?);jGQNne3`_#oe%J8+kg2+Tyt$G>?djOzUcO
zUsbck(!qGmz0fct+m?LKye5k;dooCja&U219>muVxz2AA{3MR3Tdu;J^(F#+2`O)9OuHT)DoK6B(8v@*V6lePIb$Uzagtjp~O-%KXuBESh78S7O*?8
z$|d$yo~={xQ?ZgSP16+%CQpc|ksY6ZhUl8;ZR7_}nX;@}(~w&V#FOzD$rp1)=RSEP%CeX5x|5<5j{IaDqAN1uc^gPyNL6tXfA*GFX
zQD?{C@+RGTi`^Y*m4}_P%ju+{{cC(|-ZK*%(=xMvHcFu
z|4-c8?O1Lj>7w`Z6dE*e;NH_JPj^orV07b2SC#F;RN2*)>Gs}00tw|>%uG$KB`r%@
znU#Ijk8uXr^K$(phY=(te@fy{kfO3L?8-$3Bff|rDgFl2;2)W*KfX=_TCcgdRlw~M
zdLS=M6Su?{@RRAJZzA0kYy9WylyKor;)alO!C&BpzmtMLH22+>;01pH9{x@Q-g=EP
z5qh1!_ID!mPwaLR)WDbjmkMQqO+pJ!adP~7Q4oi+>KSgNpc!2RP*`4FkNwpD4pKwCGvEi
zOS`%zS?cL?EiIjLe=s2z51yx4c(tpxl=N1mWYNp9cD4Gpgxa#NHdRTN@)mwUo!nO`
zRgs6eN}NXsL*=*6ImF3S3oJ;znU-V#@RP&_%YI)Bfw7=t#(@Xa;sySGwovMOfHr9
zNS)>94$ep9nAJD=v3X?q(*wp}mXE)0sVflzXTq{`m%&L6eCWMzG9b&4ER$r(tusvC
zurKEJhbuuFo5Ltm&YYkddyV~_NKdPNX)k(y=TI4|y9Oaw
zYkczl`i8puL`x%J!_&-=NwVxUlBKc6Gyv~O*0e2@H%t033Fs?R)2Jqy4W`Csvx#bE
zNgFoXmhlf!%9)T+t)-MtGGz<^n@AmegFtTy08~J$zkf+~Zft7Vq{9gQ<0xa(mVdDHG4t(biovOqL;j@!s&fOJdcgl3t4+;#HW`8l{^4
zdlgDF|97gRPV_#o!=XtM+Q6fhNuWA5`~#$kqfLp`yvxdi2Or^$
zzYacR9m7%n#)?_RekXD=kpq1TeXKqpsR
z3X%UNRza@!K}32HS@pgxPY=~@u;7h9#nxyNh&$9zG~%38l1Il({9|3%_7xemvpU2O|ER$iJ)-z_&^`l
zH_O9V>9uys{wT7uAsd6g4{vUzwF8XcaDN>cdQlETj_o$p-y-u;B#UmFt1ObE^_3@R
z@XEY?@O9;U+rUCzujeLG+bjv+^zG)a?k
zsQay3D>TR%RT}QrrdDcy+p@cj6%sN=W$<@uMLx6Vjnx1NqZ0gAY84L6u76ChBIMI!
z5Hl*Hl2U8bm-kyYe-trla#h|ZZ}`JSpsiII|k`so7YhgMTmZ2ib{z9Kh~#!1HO7UkBC(oKNz91KkGZ<#a`+e78pL<6fZ
zJa_|(3AZd$8BiO;bsYZqWq&yM5IY2)vJwMuc-&g0$G+Jx;|qaD%Oe~kTw84nfJfHf
z%Rf@$&AD$^&*5CCr2vIJ!=EWMXzCrqOKb4h_r9qaobG=p_c^PZ^ZmmHD)}V-1k0#!
zO^)ZoYtam!jphWIAoy(xwej6{m73yckV#X6kZqdHxyB{e!y$hWy?>nIepZ=y%yf9Y
zlW_9s50*Gl`Nu<9*Xn3Jr4#dVk^u(mY+zkt+gb@wT#vj+JSk=lm}wKU3g8
zoE}P8ePCtKYfe=76ZRMIEBhpVB>;cR`hoe0wI|k}IT@s;*F=|<&xCyo|C4Hc{ZZv%
zatbZSXLC~Pq&Ta4%YO;bMn!%g;?;Ol!#L0|H+vO*yk~s&vuDR<1N0^-ubaJ!WPZgH
zGe}ILQGL(*i1PtrO{rJZwou6==CziZsnmZ?pp{xI&8warH>h8VzhEz4y2-xI@OKLQ
zb$*gR^AaPfZlJ?b#wH)Wlm3-Xs=>fnB_~9SZ}JX9m~A}ZkbgC}0pjKkgQfd49>F(b
z(yJrb;)62@Kz7gFHf>iiz7+o^fQnbDdUo0X?8q8s2>4e5z&Pm6w;L|Z_=}Z>_@M))
zhu!}P1EJp=yl9I^$sxRg3
zWLh`Z)fX#US$}sD_R|ho+(9?pLvt4QH(LhlgY{|G<@Xg{CjRxzIv9@J!B+l5^OWx!
zTuR~7zujk%%exUi(pp^`-S+rRB9J$i$R|TSu;%&W$JbpZ_+*05H`zNrPHlddaZcI3
z!IdH81n;PHPur_bQCi}s*6@u8kjIaxojwxsdC={T&O!xQ06DEFp0jhK076tp}Y0i4FN?uXxO)H
z^O@DSSAk~dNi92-6gFKfhLbTi9}@(^Va7I%R{Sh>su10Z0N>`lxK&%m8p{*^eednN~<
zaCcLN(pCXL+gyI8T6TXvlr7AIpYc`K1ALj_An&0%^0~ZZ!EJFWZ>vMqKfi=qUO)?U
zAH0G$$`Kt0te6QoLo`(0!;6oxl#@w08ORZbn}4O8Y%XULFDo@sLkxh^KcLyz7$z_0
z|A#Yje3)70eRagWq!LLP9KAX;Pa-6SxJ?$gwHWK!t&oE^l~d3kz#Crw11Ga_1vC@9
z;Sxfb0dH__iKGmUpCNCI$Tsla#Dg&CyQ}UWdU5Ymg~$X&^E&{6e;?0$JP4%c4&usm
zCx5oX-6U3?c#rhCf}^Z=qBXpL@6uxiufd=dxr*zxDi|oZB@bKvaABJ>f#8FRN%raE_nBaVJspMzJqdcwWGmx~%YRyM
z;^f5Z+oAf5lZLZ+mRjCmyE~j&*tNkGrVarl4J)pd$s!pP$;Kk`zMU+xl^J3E4x>))
zc}o78n0IB{K0_JaA5=A;sO9CcIe)|JANa!U
zadU^INBpM2TZQW79qbAPPwQ~8kZ@weOf3YJV@D391-
zK6fm8=uN6x`?Tgc($;7d=GtXR!VQY|-d20~Ktc
z$&6!!JOjoVGR6-XXDk{e`+r7k6N#IMl5=vup>Fcay0NV%qHwoL{z$Epw%>x^9SEqQ
zEv2gqqP#`&Nf+C?iiM*2Vcg>x=(Pp?zyIz3$|8UN+y6ihz!R__|M|@}mXu9oT(`Mr
zoQD{$@h|@87crn0gs_`zcP26zoqXQJL^bb%+veQi)J;qZbm)hxU}5AfIDoG!H|%LHC&uDhn*hCOKyScPOSUMR)kSMctW<$k^I7iP666
z#@Qrp&S~WGZj3f_fp(%3@YbRpVv$3v4ZMS~3U&=vzK)%EJ%1WrwgpvXkBXgT*W;T8
ze9~Qi&dc2n$Ni7x;rs$_NduGn1LH0LBk+u5q$Vre6>=zpJvTDqWWXqsj51`D+!04U
zJ{S8$`r~pTY^my9X)*(nf@WKCrHWRd3fQ#&_kB=YI&*8$uu*BG7h?zqP
zk`u1PW`~-6dVjsp31_$VDULh)6kT=p*$rQQ2jC179)!XL6pZ-VH7zcQl-0|e>cit#
zb`0{&9#DOaN3X;K1rUK2s9?%}@$Q?A%%k?!wa??Jf$*Vcgs1f~;yFDo;vf!{JyxZP
z3C+q{F23KM4+qxs55a9yw)+=4HMy}4(m(2?fcD`BDSz2Q3cTQ@q~J0Pm!e{0gA}pn
zFq5*Ce}{8PSoOxG0&&cfz1+E0H;VDxsu+r46BrjN6x~)<8kgo;h+PgfiPd*a3$H`L
zJLb6CAum8c!o&H1LwDh=Yh@7BSD^B<|rd#OKvd4M{eJ2>Xj3#%LAT&=H2$5-LVqicIWjQS5sk!
zD*yFd@ey^)x>Na7i-mmNRiE0b+x+l)TC5Yl41e5UOd+^^lYLa|GGzBn_GjRiNq*mC
zSFqi{XJmrmHm(_#WW~Bl-!dk`0^~@A)jgg;!G{ZWreO
z(pb%oV7RV1=+`JXh1z7?{si1VSUGh5u#PPjnLxaVsSM)PapQ4~3gl;_d>H0P`QK#U
zK7VHtKqdivlU)h~!|f7Iqe0lFx>VAheR+46KUA!Rz&_8@JvL7B$h)7zp;QlaplLd7
zrAT&g_{M&PQ$RC91{tN}&5I>3k5A4Pqu6hu^@`iUi&y{`3UuJJfWAZs#N2pK#4xatM#Gvjh5NaN
zmmnbA+ykrHye`GjXgn=Hq@Et0yK2X|m8TQqrMEx7l^iY_AFK4#1IQ3Yuvj#!OL2S~
zPw@|_ieWY~T;rf$@EYHnCV!VBRhp}mbFShhC8k2_e8;uDuj-Vz@p@YaXMgZ+Lw~}H
zdq!R6vM%6frhX>YYlFkgW~I`fWj3kPHTe@J^Y1~GV@-g@va!RgQZF0W*_zhO-$7$b
zUO$J)3xl&~Y+HTj!miY0NBmB#+AtHqeiDao8`o8%#9<17y{kz4W(!sMXb0sUo4$G!
zr!nqugd^WgcnRhG7}Tf=tuc~ejDJ%kgS#Xf7--tewl>8~THsgaj|Pz!@5rA)b8+##
z`|;yzc{jO+WvJ}pT?`a3X?@zs+tJ7=Y&*aK(Zo0f>etiDM6re(*$kl=o;f1wwIL5n
z7%|}SMLb7_W>BwLtTXNmwpGdn9&r@M-@xKBeXUZre8Y2h^2r?itX|}spCpw?GG7l=II|x0ra$%RS07$!fYUmh-Q)o?nYvb;g9ylStiDwBCT+?f
z;Jpamf=Ovw*78tDS|yhJlYf6=!lR*6fCt4v_k%pwRgX`QrvGG2SpUp_WLM%x9Oipg
zuO3ox9%4K(_J`jO$EBlT;dtV7Iy{fnDS;^!)&=Ve_&qKlt%7YlHl7f>k$-aI$1Rii
z!N)9$c%Z_bWz~yAxq(*+ym%M9VN0{>#gSb|ScM#}Rq>?iuefyocz1}h&d)Q-2+Br`df5Kmx__Ydf$9qv#
z3AzWy`jnuT%r8ZX*#3l+b>Jb1^M|8oOkSwXQ}@(%A(tWtPr@;I^)@@M?X~-7WiqJ8
z@Q(OB3w)8$tCLm6)wA*rW@IWOLZjw*%Rd3%s_-k(8$z
zg#oQNM3rb=Y=(Kx{X(3vieCmZV&7L`d+#C01#gKPedm|z--n^U>QS+u%p(Y&;e&v9e))vR^ep{VEz*IM$l0b)K
z3l2;8sTLikkRO`EexpuXXZ-{JJ5`6>^>FWU8_W~lm+&JM>O_mFbHIvi{2J;MCIqpB
z7i~7O@0|V5{LA+a0>LG+@>9h&tIreOzrc^RsISg#4Syg1eTtF)z)U{MIq(+w>p|iu
zFYk`<*q{7T_9E(j0y9t18|7SNn3jpO4AK%QwIANzYT2>DZ7dW4V4^$*kp6gdDfO7C+Nyv3p=LWN6nnCuze?lrc+s4XK$hU~`gA
zN~Kx@!GBNTjzw@F@({J=QgHE^!5t^D^IiUC~{O3vSFDW
zf-N_27=j)43AM&WBv@AJJK5xS)v01zbuK=c!|sC2m;H>&Po#M2vG82U!~^09c=ma2u-=LI&>N_*lp=Po57|eRl1iN(x1k_Rko*&Oq|z@GEHoqt{$Au@&>{IJ
z#-B^FMqso9ZkAMgalLfI@4idk_nNAh2fG_7#{kFjGw!LJ<(*pCHNo-6Hl3z?4a>Eitedi$08QJpOouysw0tJk}=
ztJed5JPabul;lFrQiY`mJZC1)oy6YAnJa=T<7zttri7<)J0rbLPHC@Y=CC4v8n;eT
zXetkgz-ah#U=_7&FC`W049k*${%Cn~-0n&PM?pWvzv6WbsTl+N82
zezS`DUgiuP0S?A^P67q-)X`>Rf(ds#)Rb;K0M}+k8b;XLOb3gccPd##*ndl>*9J?T
znl>A(cMix6Q{Q}p`L?D__+&f#I!iO%9<|25HtYMQ>{HKiCfpOxtZhn+b84YXstNU=
zRLa}fOI=c4$X+1FDR~tb8<`4RV=kull|L*p2{s-80p<`QQ9QUUPEoL5&(-ND!g?px
zh9L77NrJ%`B?*rH2a+h=$A97eip2|LBGxV5iLl-4hWUb@_$#@H%
z*Y~Vh7nDHq5axXIT$e|P@OXI67SK76clJ0qqFkTag3FnP7oC)WQ6U2|@q1wacQmAV;=WhKX%M7>@fb}{T
z0$v%UrqKfrQ>Jg13+{gz60#JHR7@>#2wAqrCh?bb!TlFZz<&`cCWNEMr{~s;_JM(n
z(aWKUn1A`2n19GH>HgFJG2OP50$FpNQ%6=D;hMQ8wsV?ZZUnvhRNVj!4uzd|BJ@Lw
zZGH{ok~N$;gLustQX+DH|0nHrlGyenc}&-X6k}-Ukt=nIFHE2l^h`QT$?zhs2hxD?
z=E*|QE<}DJu_~`zP|%g)A2rXZXrw-6Vx?6Ct+1E{1fti^tPfsiQWT62ez3
z#i)N>CBZPGxA5r8LxQcL3Cua`{{w+bzlEn{9^&?eFg^e2k+qK%@3z*AuBNQyQy6eT
z=Z^&j_kaC`;S$*uK78`k+b`u2PfhXf&TrS^#!&LC>(*BagAxPh_u}6aU{7$1>5up*
z>=VOSS3N!u!-Q4D*EqcC^C@{iv?GRVMz4r2rb^?8n_A9
zRX{&A&2gR0ki&G&gGrHC^w>1w3G!pP_Mq_y(SN{Ng`E-anDdnNzz@|OzBnnQBnLlZ
zFBO1P2J6U$Oqnw!Y`4yMuTR&w{t4{
zU4m_5T>}&M56yTRNF}b)pe+yZ2mr+VN{C$J`T>7r_+tgq=5%V{(q~sbsypvb=@1*a
z|0EJKk%(96pH^r94Msd)$;$pA9rhXDPk;QUc>WT8roj8a%0tqcz2H1x{y`+HL=7&)
zJ}N2Vf$Jyn1G~WlNMYwtJnxVmuf|)UhJ8u#enbN7_!M8N+XDvtGyX~keA{ou4S`V)
z_yc>`;X9YMrknXE9}4LGR+kR`l>k#~9~HJ<&k10-{)9*lSOJV&8Y3s1R@BsS<8U8)}$h`){U-U>Ujb
zHvxCo9QHgj)%&h9oD1&XVZxe6U4JL&+p~BG9rr2{g!7oeU$XxsQp786abY|r3Z(hA
z&0w$ozD*#e`8LcTuKqquAc|)EoMusAhIGbT=-|
z7r1xu3lm35*nTbAxUDZD^sucj8d%(e`nUW%J~a6xpEG3p4K#3yTj7~MeSduc_nGpp
z!ksg5J@Pg`sVNkt0y%hynsWhHq%x5$uUFn?C+~F0#aCVOvI3`>-v`|xWE-XALqV`~
zJT&4&s?1r7`hiz$;P)!nz!ZcexBrwetfBvK_2K<`I|JWydq@oxSOUnOKfU+CGq?Lc
zh4%Il4{kBpB8
zOI)0MQ++Zj__S7-35CyP9xiA?UWR#Y5n|@lLU4?`JJzy#XPGTI1TPu9<_R3a
zkl@F_j^~3o(aI!E--xIxFul5C?2sR-&wR4Q<$ON3mYq8n$S?^xh<|viiVUXho9sQr
zbb)Ezcf3gUo)^h3(A-~t`so8fQ7s1rojcnV0jD-*HnCNpYmO|xE026kTDJ1WS1=|c
zlS`hMeJ2xncL|9mJRg3({DD;KN5W;ThdjH=T1kxIcvrO@goR_LT<+S*t8PcA&q@)m
z8D@a!j4v`I%z!Wxgn#N@9S~-Ukf6)1uO3C^E^}UK`zqhFZpR|PTRB|}Iea9f=lJ36
znghqsw1O}04d6Oeo}Zrk2mbr9%e&^T-`S!gyAa!$8(6>ANyUZ)u8`%~M!6QZ;sVpRacKT5hlsI=ejSygzMsG`FbP~uLq1InIQ2a-+%Mo3N316SjXNj^v$uH)G|Y*UeC*R4@y
zii!#VW5AxPgMU1QH{6YLyf04z=wkY<%;J5>aO-aRz&r&t=gNnbhi(PNfyHb2N1%ME
z)v@6NxN2v=sYFI&VmO*ePmV*n)~Rz&YuqPd8zD`(6QM}>s1jUq&l1+dFgY^f5;m&~
zK@9^}L7hNd5q|RixTUHD8IzEg-+xG>qVG%_O$nXLn}6k@H3|?$>2%}Jd0D6Im*Lz#
z_u+k8@;b|h1;=VNek)5j{m*LwW@K7M2;SlR9#$Q35QIJQ62}#Y9ZZL#fud6536r;v
z-|?*VsO^V)*1#5A&A6}h^F0*cu(Ec4JlDLXyTY{6@Cs)6gd1FJ{Ez$N*Z%>j^H{7D
zgv|*)Re$9nAFRQ-V-?dP@~!|)f^W
znLkvlE!*A0^GcjXmVkB4$cBs{ycJsx&&5ra-G4X^h{sN0e^s&NJV4x=84{IF_)iYo
z3*we!{tK(_A50+@EtK*mS@o!{*>>3zW_Tpv(S2TOxJ&;u3ZC1>CECa&4$h%ER()R8
z+!KA%KIga3l3%_n+qSZ7t~$Z_S-uB~Y@o<)pC#Z-QcQu%VJ82#IqaLK+Ulq|;jkU5
z#eZkdRA%QEqTTyaWB;8h>9C0rf}PO{Y<14=_%sflIUX2>12b~DsIwt8Q>lJPgL-Y#
zbW=
z+g1GIvBtMHJ{YZNNcZ^n&AA;HBwTGy5r3*vhH_?z@iKd`OJ5!FBI8|ESKWhK+GMJW
z;W&Xs4lJPK7c2+{nSdg2OaObRD6(eoYFqIUIexEho3;-|?PVxyooXqH06<>=0SU7h
z_ud}l%_G;K+5^_YX&5xCocV~^4)0W+yD_Y_m;}LDu5QoxfFT&8m0d3QeT4jMh<~Du
z^D4}Lh52!KpCR0N5~zZc2_)v2;eBkIpL6WV-mPO}#H{pK~vxBKc_)
z?N(hAZsh_Sc6xetB7zchY68vpu!LU4r@-u-E+iV^4a{>_at)xmzdkhcD63hxM7k0e
zig7@`XLsfK(7WT-+i^Jgh=FIt3b!1l04is{f0gKI`FYY1l%6|i^_hpOw
zXZYFfPHaAx7&&0Kpc)F#*;gIRKgC0v=N7l^aBAOImZ&NwOd&ikhM^(EIGp8!gV2=RoUS1a?D0vr8)j~xQhPCTUD6~(5cFE0vR}oPV?_>>=FKfsG
zxPyywv4+th)7Y)8)}4Hj?SFjIEQA|ZYs?+Q^-@0kc0OtLhs}&I^J_9i6N;?Z9zGgc
z(fp_t8g0<>Q6W450-HL{PJaflRv
zbG9=I`Cza-<|&RtaFYD0`TO7gyR)#x0|@GfXfMm!HJ?c{6jkR<2Y(8Fq8f-Ij@rbJU#BRF^PXCA7bXoKlk+QVyJ2)B-!N}#V6~;J%peMp$hNk8z
zA@A5~MCyPZhD{MfM1Sd%BO^xjDPS}fi*FP#cU;gxgV>7+5ZL
zYwb3?DuQ83kh|l}01r?*v*BS9jD3PYr|$(gLGqC&YgK&815=U0n2-^J)Wh+u%*Oe*
z%*OEwW`EN#596E|cthb~xI_}F_Q3Hli2P!^M!HTAc4qJ8hB}_^=pUG2`0D^EJDahN
zSl{sV05mg_eb!jf^jCYem#mwXb1ZvfuqzYUWRn^r{_Zp$eIw%fz}(0sOzW#Ka=69=
z_HQs+kTt5l6&8(U6702SMqoua7KGDY^Krjfnt!fJ+2PAafnrS@bl;a9zLn$ya#x9&
zOjA38NZU~?ihm~(GM+Gr7wwbZF`V){;+6YBOnE3IG8NHy&4Jgxq0Y&3>>YzMyet%v
zl?~n?A2TwQ;ll+thcGPsKD2u3C9j%H{k;(QM(mn`9pPAd{y{z}VCg>$13VPdB7Ms4Fe14-#=g)6_}hCM}kqMUyFaKLV4}x
zneZX9Zi@M3&zO7%Kk*EUzAxrOGTZy(_Eg*Qk*FLDXB&x78zmbuTG(_bb6F9QIV|t`
z`xiT02gd}}9&bRj)qX9^B_F&-!BcP{JAVX{h}tE66A5R^Lqz(LE?vO*@#E|KJ)Wjj
z<4a5TGa-~uw8CqzI7v8Q27LV?-dI*~LzdOvEewYMUDvd*VOux7ughNom>0j0KQsL4
zmtLQC@;t4;4?`S`msWK-;19;*Wf*0#53Gf=7k%e*&pfPX!~
z58hdw{Z^RDwKIC%3||42kwJzZ+Yko@R$)ZC;|*6AI6J2gDufCftTuhQ)ea9He?3mT
z6ar~lI?!v%%236c6R&b`s^u1X02W~#H@7S4IH;|Vi-%%V?mru`eqs<3#^19jI;~@A
zRZ%skIJK;Ucu-D3L%UYRhk1)C?teGR1dNYcAl8p%i@oz}eKu_|%$#^WCELtnUH?SEv+4a@zUl20z5FZB7K2pG9OA8&0TT>MDv
z{9cR9(Q4o_nMp#cuD{dfDQ1KV9_q@xb#h`ta(`%U$rC0skU5L*@pl*uIDgK*4#kYa
zd-xfKVYmf7x-|lafs490J=PZzo|8;d$7!{yh)opN3ZaSSLlcbw93y74?&H^U#rjqC
zV8-Fk@H4C)bnI})6^fD$Wph!O|Md#~qRH&rN{nSj-l>GXwT3ecLMr)8@rlGGs`2XM
z585`nZJe;679)k>+M0G_Qf{LBFyCaivx4Ozc$rS_%hT3uEs)HdzJ;gml%BTbTr)Do
zN|?BW;Bh4!