From 670dfed4c598aae02033efd9a7cf9892c8f9e0d1 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
Feat: Add ANSI color support |U, |I, |i, |s, |S for
underline reset, italic/reset and strikethrough/reset (0xDEADFED5)
Feat: Add Trait.traithandler back-reference so custom Traits from the Traits
+contrib can find and reference other Traits. (Griatch)
Fix: Better visual display of partial multimatch search results (InspectorCaracal)
Fix: Issue where rpsystem contrib search would do a global instead diff --git a/docs/latest/_modules/evennia/contrib/rpg/traits/tests.html b/docs/latest/_modules/evennia/contrib/rpg/traits/tests.html index 45bd5411e2..d61e5f86ae 100644 --- a/docs/latest/_modules/evennia/contrib/rpg/traits/tests.html +++ b/docs/latest/_modules/evennia/contrib/rpg/traits/tests.html @@ -101,10 +101,9 @@ from copy import copy from anything import Something -from mock import MagicMock, patch - from evennia.objects.objects import DefaultCharacter from evennia.utils.test_resources import BaseEvenniaTestCase, EvenniaTest +from mock import MagicMock, patch from . import traits @@ -246,7 +245,17 @@ del trait.value self.assertEqual( self.obj.attributes.get("traits", category="traits")["test1"]["value"], None - ) + ) + +
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 '}¶
aliases = ['@swap', '@typeclasses', '@parent', '@update', '@type']¶aliases = ['@typeclasses', '@parent', '@swap', '@update', '@type']¶
search_index_entry = {'aliases': '@swap @typeclasses @parent @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap typeclasses parent update type', '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': '@typeclasses @parent @swap @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses parent swap update type', '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': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶search_index_entry = {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶
search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
search_index_entry = {'aliases': '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 '}¶
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 '}¶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': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\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 "}¶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 "}¶
Test the batch processor.
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpfzlz0eh2/7a7479955fbda8774819dac8b021ec30ab6d13ed/evennia/contrib/tutorials/red_button/red_button.py'>¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
search_index_entry = {'aliases': 'co conn con', 'category': 'general', 'key': 'connect', 'no_prefix': ' co conn con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
search_index_entry = {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback callbacks calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
aliases = ['manage bugs', 'manage players', 'manage ideas']¶aliases = ['manage bugs', 'manage ideas', 'manage players']¶
search_index_entry = {'aliases': 'manage bugs manage players manage ideas', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage players manage ideas', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}¶search_index_entry = {'aliases': 'manage bugs manage ideas manage players', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage ideas manage players', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}¶
search_index_entry = {'aliases': 'quit abort chicken out q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit abort chicken out q', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'quit abort q chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit abort q chicken out', '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': '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': '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': 'ex unfocus examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus examine e', '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': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus e examine', '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': 'inventory i inv give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory i inv give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inv i give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv i give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
aliases = ['achieves', 'achievement', 'achieve']¶aliases = ['achievement', 'achieve', 'achieves']¶
search_index_entry = {'aliases': 'achieves achievement achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieves achievement achieve', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}¶search_index_entry = {'aliases': 'achievement achieve achieves', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieve achieves', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\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 '}¶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': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
Test that updating a trait property actually updates value in db
Test traits related to each other via Trait.get_trait()
+evennia.contrib.rpg.traits.traits.Trait(trait_data)[source]¶evennia.contrib.rpg.traits.traits.Trait(trait_data, handler=None)[source]¶
Bases: object
Represents an object or Character trait. This simple base is just storing anything in it’s ‘value’ property, so it’s pretty much just a @@ -740,18 +740,22 @@ stored.
__init__(trait_data)[source]¶__init__(trait_data, handler=None)[source]¶
This both initializes and validates the Trait on creation. It must raise exception if validation fails. The TraitHandler will call this when the trait is furst added, to make sure it validates before storing.
trait_data (any) – Any pickle-able values to store with this trait. +
trait_data (any) – Any pickle-able values to store with this trait. This must contain any cls.default_keys that do not have a default value in cls.data_default_values. Any extra kwargs will be made available as extra properties on the Trait, assuming the class -variable allow_extra_properties is set.
+variable allow_extra_properties is set.handler (TraitHandler) – The handler that this Trait is connected to. +This is for referencing other traits.
TraitException – If input-validation failed.
@@ -788,6 +792,13 @@ initialization of this trait.Display name for the trait.
get_trait(trait_key)[source]¶Get another Trait from the handler. Not used by default, but can be used +for custom traits that are affected by other traits on the same handler.
+key¶evennia.contrib.rpg.traits.traits.StaticTrait(trait_data)[source]¶evennia.contrib.rpg.traits.traits.StaticTrait(trait_data, handler=None)[source]¶
Bases: evennia.contrib.rpg.traits.traits.Trait
Static Trait. This is a single value with a modifier, multiplier, and no concept of a ‘current’ value or min/max etc.
@@ -846,7 +857,7 @@ multiplier, and no concept of a ‘current’ value or min/max etc.evennia.contrib.rpg.traits.traits.CounterTrait(trait_data)[source]¶evennia.contrib.rpg.traits.traits.CounterTrait(trait_data, handler=None)[source]¶
Bases: evennia.contrib.rpg.traits.traits.Trait
Counter Trait.
This includes modifications and min/max limits as well as the notion of a @@ -999,7 +1010,7 @@ describe the interval.
evennia.contrib.rpg.traits.traits.GaugeTrait(trait_data)[source]¶evennia.contrib.rpg.traits.traits.GaugeTrait(trait_data, handler=None)[source]¶
Bases: evennia.contrib.rpg.traits.traits.CounterTrait
Gauge Trait.
This emulates a gauge-meter that empties from a (base+mod) * mult value.
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html index 5749a8d5e1..269a797481 100644 --- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html +++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html @@ -480,7 +480,7 @@ turn of combat, performing everyone’s actions in random order.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 '}¶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': 'boost foil', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' boost foil', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}¶search_index_entry = {'aliases': 'foil boost', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' foil boost', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\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 '}¶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 '}¶
aliases = ['smash', 'smash lid', 'break lid']¶
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 '}¶
aliases = ['examine', 'l', 'listen', 'feel', 'get', 'ex']¶
search_index_entry = {'aliases': 'examine l listen feel get ex', 'category': 'general', 'key': 'look', 'no_prefix': ' examine l listen feel get 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 "}¶
search_index_entry = {'aliases': 'move shiftroot push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move shiftroot push 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 move shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull move shiftroot push', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
aliases = ['push button', 'button', 'press button']¶aliases = ['button', 'press button', 'push button']¶
search_index_entry = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry = {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button press button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶
aliases = ['chop', 'parry', 'stab', 'kill', 'slash', 'thrust', 'hit', 'fight', 'defend', 'pierce', 'bash']¶aliases = ['hit', 'pierce', 'defend', 'fight', 'stab', 'parry', 'bash', 'thrust', 'kill', 'chop', 'slash']¶
search_index_entry = {'aliases': 'chop parry stab kill slash thrust hit fight defend pierce bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' chop parry stab kill slash thrust hit fight defend pierce bash', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry = {'aliases': 'hit pierce defend fight stab parry bash thrust kill chop slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' hit pierce defend fight stab parry bash thrust kill chop slash', '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': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
aliases = ['search', 'fiddle', 'feel around', 'feel', 'l']¶aliases = ['l', 'search', 'feel around', 'fiddle', 'feel']¶
search_index_entry = {'aliases': 'search fiddle feel around feel l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search fiddle feel around feel l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'l search feel around fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l search feel around fiddle feel', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
directory = '/tmp/tmpl2s7pzm6/d769a90b62b10700b9f6bac162e64baac89d1c62/evennia'¶directory = '/tmp/tmpfzlz0eh2/7a7479955fbda8774819dac8b021ec30ab6d13ed/evennia'¶
directory = '/tmp/tmpl2s7pzm6/d769a90b62b10700b9f6bac162e64baac89d1c62/evennia/game_template'¶directory = '/tmp/tmpfzlz0eh2/7a7479955fbda8774819dac8b021ec30ab6d13ed/evennia/game_template'¶
aliases = [':f', ':!', ':S', ':q', ':dw', ':=', ':fi', ':w', ':dd', ':', ':i', ':A', ':UU', ':s', ':fd', ':p', ':j', ':I', ':y', ':r', ':uu', ':h', ':u', '::', ':DD', ':echo', ':>', ':wq', ':::', ':<', ':q!', ':x']¶aliases = [':fd', ':<', ':>', ':I', ':S', ':h', ':x', ':=', ':DD', ':s', ':y', ':q!', ':i', ':A', ':::', ':uu', ':', ':q', ':j', ':!', ':wq', ':r', ':f', ':dw', ':dd', ':fi', '::', ':echo', ':u', ':w', ':UU', ':p']¶
search_index_entry = {'aliases': ':f :! :S :q :dw := :fi :w :dd : :i :A :UU :s :fd :p :j :I :y :r :uu :h :u :: :DD :echo :> :wq ::: :< :q! :x', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :f :! :S :q :dw := :fi :w :dd : :i :A :UU :s :fd :p :j :I :y :r :uu :h :u :: :DD :echo :> :wq ::: :< :q! :x', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':fd :< :> :I :S :h :x := :DD :s :y :q! :i :A ::: :uu : :q :j :! :wq :r :f :dw :dd :fi :: :echo :u :w :UU :p', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :fd :< :> :I :S :h :x := :DD :s :y :q! :i :A ::: :uu : :q :j :! :wq :r :f :dw :dd :fi :: :echo :u :w :UU :p', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['__nomatch_command', 'no', 'y', 'n', 'yes', 'a', 'abort']¶
search_index_entry = {'aliases': '__nomatch_command no y n yes a abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' __nomatch_command no y n yes a abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['quit', 'abort', 'previous', 'q', 'p', 'end', 'a', 't', 'e', 'top', 'n', 'next']¶aliases = ['top', 'q', 'previous', 'n', 'e', 'next', 't', 'end', 'p', 'quit', 'a', 'abort']¶
search_index_entry = {'aliases': 'quit abort previous q p end a t e top n next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' quit abort previous q p end a t e top n next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'top q previous n e next t end p quit a abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' top q previous n e next t end p quit a abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
asg_HyTmJgYtmy=x%O(#PO8UJl=5LGy z@NyG;iQ#_$33PG@j^&Ey=b~P;Mi20p&66S7!IDidmDS4YfxrO9honez=V31;tk<%n z2>ZTZN7QbTNAg?GPQP3C67nLV*KBuxb z#qxRKy_)Et*k$XlIl0eBo;oVJ6w*=6<&anSJAHp!R@=9N#9W3(9AV(TMQC4|wOFfM zkb@6WR(Q;0wIy{e9+R{;@cZ&UW$DJ}sQWY?b{cz$Lcow0D`OJ;vZYKWf?d?UYA(tI z#+TB&mCy42{%l};h?4CpvRmb4`L*30l=6U)^qOhR! |tIWDg-N!wqfs _T%Sx7@5>&`U(%#gF^ z)9iS(&t-kbeyDKyZdH-GY^$~NM3@@bQU3>l;YbI+wRK)@w{()|zIm$S3n4lT!@1Ms z+gvO(NK(BipIlSHNqh&%oH5B|_AM(8$8@rGug2`dw`{uMjoYr N#&BU!t;eYIt6U zh>?ALh^!Qx5bJ{y(#GbXe9+Pyl&~M2FV1-Ao`SI+zPn(&hwd{N>)|^N&g)?~W;UjF zx2oyf*KN6F9>zoVSxA;rvcop79qWIB>AEe~UsEtV^MSTI?n{k(aPSk^^TW3VTx(hJ z+4o!&- T( ;hsYT`8n`OTgJsdSd?c&8Wc?MN zkFFQ3MvRN(i?%vg77o$-z)Od;zCx3|XlpHa7H+Na;YNP^d?AVkp3W(E%VrCE9r7^4 z9maLP1Q#-_#K_Yzl69cs|BinFEPo!;I(TLOf5^63L(-e EMa&RnmD1Ka;dCrg*@;o?BS}Ch6VtELaa@{dL8C zzyK8-l_}O4sb@ilVmf>D%e>tdK5t8Tfo*p*%j?zC11+-HGtUFNdtQG%l~uZ0^ZkUq z5vy`H2Tsaw^R7IN(D*>!(ScM`!W!{Ba22_q4QNiqNJ@%%QjCyYJyQwxTjucrVt4pg zIVt9VyU+4`792LW-BejRBU}S5^DKDn@4r8 vA zicVygrL$u`lB)Kx0O@}TyGdvRm}b>Vys)!3XjQg5erT*--95u~vsF^0v`4Mia}Ycv zHC48nsr`8<>t e4ub^9S@k#4CiAY&I9ppZQW$|v-E#}dD76LHy0M|7It*d zMylp{? c6SZx#fU-N$e?|;mJiuY8+rW(y97{<;rhG7 $)d%OXl?Pf#ANfc 7R?JrdD0Ew3sm+RA zJ4<1hdG&_YqPyp2o(Ru3PHc<$+O?KWa`9T;-Arq7!hV0rih$v z$aej0nY!uE9ecxI6n;$#pmiXpJ-f m!jn7Z6 ;WkPGczJ30OX zrfH8EdD@lPq;6H!!$SdlDmgT^()-H(QDs7Ki|2|dd712Xd?m}g?PBBJgOpu&q0_g# z{Cf-QYP+1yh )1m&v`(k1_eZADtJNhrGL>FK##KkA)Q_v?fjl3X zQa^tkqf$R(_SGc6KQhIBS#6(RS}kGObK5uJFW71hv|0V|;%(+gqZe*5NBX>UdpT0* z^$Kd+QK|IfQM3RfwSE$6J(A-}ub)>B$5p0&p$b(;rO_Xur^}8@r$4Q-=GY4P=?{=~ zN2k>(WZ(AXtDaEkDQg~9%trc4&s=mW9YKFbtXJ#wIMsS}oNB#(*|CdWsUKf>0HfFH zrx%~|>Ge8}$&6mNUyfL}KOV_gORwFZUU l< aft)C|Uc5AMemUQWH!RsEE0x9;~CUQWeVt4)7) z#3}e1)hmuxzaLl0_Gp#+X_c18T=srmCDrj3y byQKb$&c9b$&W7 zb$&iBb$(gBsyA>p?08iA @n?7S|K(dVROL9fxI1l5k4l?YN2Sf{qtfQbqtfQ5 zqtfOmHn)#ti{g0pCyr-x;&^r@j%Qoqc=jZYXG7w6b|a2wE8_U}A&zqsLcf0laco*0 z$29Or_Z^OL)8R;W9FB6k;ds{ck7_~xs8;ijYAOGy*71*O5&x)G@Q-TwzF)gPhQS$E z=8vn_)zK((T!Y19-9k9p{ez?3JUHH+gCpHGINm*jW8E+~mfZreRd5UqmDngahPFv; z6C6WxBsK|-q6HFr1j&(P(UE_&Gh%ySzNY1g+!@VXQ$M3sYw%0bZB|&NF@ziAguj_v zdw_|c0jMWu?8lkVS7*7z#1H^Y{nFKaM)L0EYg4m38(CRxm*zQGgbooIxQi%ww6$jr zlB~$Hf-Ih1_zrHG)w?`-J|x$Q#_sE3Vt1eA{4w1nskS7|l0{2IS*3rZa#)6*gJ;+7 zcBCPxc-4K;NWuH4WsyJgCU5Du(INJ(gzk?ve2d1brh`;?a**W9(vYNDKO89WYFhk~ zJo}v%jsDr}#iG_yy4Ct2DK-RF*6XLTS~knzjgVDYtm@2e0Ax=tf%+aB_=QFiD#@~q z(~wIP`h%n&t V5!pUqrg%lG9T_`yAB@>mT%a7v{*$tQUe+)@BsDBjt#+i^W_2yzL0>lGfRr{7q#=jpJygLwU<0`P!ls6_ zekh;Bni(vxABKMwwh2qx!irJy0T`EAsuL()TZmm?pH0L*aJPQtIRYBcgyH*+clIX< z8{O>37c!LCk12fMupb|raf0{iG09u9d<>@zO!njSZteG@scq+k=3==a&C>OYQY;@A z?>XR}3_)YVeYpZgYjaT5q&X0qIDxvFsG87^TskC74!2YUep$vw|nN!Y%iq4UN`6yB}R6!d^YNK@d0jvq}S2tRnVFH6Xg zqsd$~ojtFc6>nUYBlB&Nr(hT5s=Qy-?Ona5nv<$th$rko(-ej(d0J&*W7|nIQ|9{9 zh=PtUO`(6lgG o0+TJ3XTgb9M>KQO z(BUpJ@#)Z)oAmS)3r=_>k~PU5Esv&8hhAcmqk=Cm|L6%8n|nwUMY>GNFE^p-Ihv$u zU N?qw1t`Kdp#2$U9gcInd57XM=*cq0a4-a427jsXx4>U=>@7Iv@1y1)bIYJh zD!hNdSX+T#Vw` q^k ~^e4zi*2*Ec6(a9`LvbxZkR~ z%0Cam1Ic$jh5=|WkMzJ`ztR6Lil%z@oYeH#-k_lqn@JSjlbb2%L9>u41mQE0eOW?g zBa^v8?wL;}nKJE}Lgw2_Pr(kG{!C#A8sC3UCI}hhPa+8)=TD&tAIpZZ_>E`7F+In$ z6M;{bOZG|2%M&Pqhqn_rCJk{X@XX#G1&ngTF&9*KkutN_5ZA>bn-Q@O<# =mb9ZT|sPE=+f3Yn|yLl-h#*@tJ!jAbI9Z?8KMK5X7Hkz~T| z%~Yl-n>drXf)1`tWC@z~?Ze@Fd~F|&klE!_p706gWTx _awbS!5r=#Ttl< zG;0>BJ_35F%A?>fTXj^bB`Z$Hw0wE)s18$_JG#Zna=@D3bnFADzi0v5Yc0@&jomZw zSq|hOJ(dGS$Q%6Yxg4m#d*g<#pG{@)UO$^i5U{W{ks)Z=X(C7X3e5~eAuE40`_N5U zIhn}k+h$FK4_i5zNHSsNWGd5?m6M5FL2DZOaQLoi?86bVrZJT#d`)9AQ}~+3M5^#L zjc}sSHI0247Ho5-uW9VfHDSyY%;`5Bn* I6l8w*O0tEAD3osaKzi30|*YEbwzL=itpA&(D7Ct9% z1T5cAKo1^|OyHO_7@5H1+aOJV_OuV^g-kI$JG>yc(1o)=aPRf9Fx-Fej(Gxp$Wfdy z_*siwhdQC<4kHMk@A~4;*oH6AdN12 ~GUrWlS5#11nP8wfskEev0b2t=N+01?QrT*chin5&DYJAiJV zHbF3tX%oI4?gNLfjC+6LVQEf^bd{G$x>|3$p``P+u|(sI-#qUKHce!Ij$LL?i(O_< z1M1I4h_w@khx5e~?@qn>^({KMdch$>7_@t&Gy}fxuxSn|zqV>mCO%s0@_$J#Y3#ND zU!EoP+it2ePa)_rp^d|8JFC*a($v2dZNdDNL=V4Qo*VcU&3AtTC-YvppH>Xvg3FBa z=aPcDT;`}Wi{=SC>a|3(KSG|j)z`x>(dZkP=5O=IM2nTMG1a1_?5cZ1Z02Tv2)s<& z&vr1Es3argc`Jz?eu+wAV4A;@jENSjBx9;YD+!(5LGL(o4N*`}`UU2Bx>*%{k;(_N zF#!I1OR8tr6wH4IxPQ>lJ&lsWI;T={*bC-&rM#VJ%g+%}FvH2^`;YH0KVPoSuP@GS zFIHC<*O%{aZr*?T=#w2Y@_%@Lb9;F9^#fUdrBn9x*V |BH=VOf?Gf1|7O!F7j8p+b zz&TmHhl6vH!Xf=t$SM6j_?Is?2P!j%FE0l#E5}hzaC}=6>`GQy>K?p=Q;Ik&SvbcW z3l&cT(V_*^#JOO95!FyaLBYp> C#a&1hu-R0x}gEbS;LdD0%cJc!0xpXnQO*RW=o`Swij*Tgn%q9)n zf_Wp3yQ#JOGW(Vl^QWVQ?4*7Oxr?(G{lVfnj3XZ0hJ&DFfswqORV3!2iHpoHq;YRzVkqbKB@1;+|L2>n*B3XpXY8JVt (8)|A;+BX+hrKl2vRRLZV|{K9 zPi8n=O4aTCefDiO{Bt^pOV+eZ%~`vLp!3)65yKL-TSGEy?H=JTn?$qMf)T^aW%J@& z*34OdEG4}8OQa0GL}66%XDx>^^kQi;d+C$GXD)c}NI|M3=jdL`G*fZ;0k?7QVI59- zvB3$4IjfI^H-Gh!!I!8$D*mk1M}}T%d?s@&J2aD-7R%w;8v_~qAW1WGizD_$=B%#+ z%=zo=kYI^=JLZ_R?hfIXs=q^?W$W;eZP8qRpS>;*2@aM_GuP?svfR#DpC!Ec>#_{K zL_JpVXRX6B^kQi;dnuQ}XD)c+xXqk}Z-6;}0UQ!6Q3%Hzvlhf5{8F9CkZ0M>WXQH? zuFqc0h6D#orkU$>w+lP_q*RM6%nscp>#w9p>t*91-4|X-*5no>4BH{H5H)1G1AB>o zPJ`-lK ^Aenr3wT1bR*C}b8h5*E54k8@wkxu@l}k?6LL$U>k2LSZS{f!2i$ z!R>BzgTvWwXRDoBnm~NoecdN*-gudR-kb1-lPne^AYiA3c02b@^gMLnx_Tf<>NYDL zKqxnwj)EqFdX%#+=s6vFy)WqSi|UboJ(5c}p7$&BbZ3xCIGyPvX`2U9G}+p<{q4`Y zVaucJcFVWMBl!jr9;rB#&~RFsJ`1ZK9U4vDfLU7F12tK(spn?gW@(y}r=;>}=lZ}N zNhbyVRArm2c)z<;$m}I=$Tfk)?-7lObT@dM?L$d97mb#d=kPH**(P6UDP(7V_;T=@ zjoN*LPYUNz@cI)td;{gYudMdWu^hXxL;Ie5+m{B<5b4@Idp=kQ=|6T1(V78WC~NZf zp_~IbHK-@5`>@g=YzVHJ5|$=b%b@{xjvaXzmy#F;?ah0kVMu>Wabm>vf` _roQ@M_6kJb~|*?8W7NLm?QxJG(M_JyDS7uPI~rr3$Zx zDNpW5eh{W*DvC<9WK~g_maZ%++mhAgGoE)|uF~}Qhshp^?_ilEaW0Tme34`JERt{+ z%^I0!os* 9iz&mL=<*M6-0g zkf>&@7Vd=yC8XD+iiN}_W0=4D)CT+PT!(tn7V>&(x~fRMD~p==CjAu3D))MUE0}`z zb45Y&H@LYzdzy{VanIoEQ&KrDzs|tqzNgja?Q*55$6vC! z8gXH{$qKpT9EkL=l!q^!GWp`A6PnfK%BDbnfmH0N7f-{>q)0Xk*6<$x1=3L_UpytR z+TD&USRQ-)<=aY$>u_zQM0)t5B9kv(RM<+_az&-bU%seFT!$-vDnru4QXal^%H&Ix zPQEJlh1|_P4N{>`61IoczmmLgTuu&@T?5uNoBSOvnrl&94o3+FkPpYURAV-vaUc8H zmw`XXb+Cl1%5r-+Hg-ehfPC|>KMff8d8FnbBrB!4TAq@1p3rzKTdfY(Z4P;t>M`Ns z^FqtHD)eFv-+*R+fr>O>zyilxzjd;HAj`8o@?rL3EQ^+}MV6&y;DyyM*I!AxU?mw6 zELv4YWD8Z85f3v%NL^P?S@VFlR1e8Y8*AEZSI-CFT&y&{FH-Vt_9ED!E~hviP@i4# z4s}t*%eGlUa}K+l>Q_|Pr?N_~39aF?$6$nhxS^4TdZ{#jye1pk#gJ XJS$!({r70F_R%2Zq{e(~FICz)e#q}#xoh*JI(%B6?2-*xHCdCBmm$vzC}?-j zFTnmn#XPWI-ka)#pL&FymIKEU>y~Vm>Hzg>@`zx6f6@chCANJVI2z$XVdD`YH1XiD zo_rtHY4eC#HQ2A!*i( o!-nsKW&mT3-#nR_5BqHyFxKPE9QDd(yW5>Njw1#mh)k^0_JCZ!8)g$=RZ(m zN2;m}nrbtFfN3@tXv) ZeHTT<{Nop!@(239-W1Ic$GTbeX@Kx8m@fATG?nD$)3 zB>ODl?n@iIPp}W6I^a0~;T| 6C}eyucygH2kR}u8C|1 zDJ1Kppu>qIT{Yz{TL(4!VLWA?<9!mKsh8t{EP@{^IHk5J*@4i7sg_H+49;!_beI@E zpvPq4`DFw=C>quRN_ >qL5}hdb8E20in`?x$XIvtnK@$?p z(A<;;P2rqIHf3#VGVPQGZ3eRG8#!~3zf1z})9LR)AKsYHK=vZ}yZ1)%9Nc>hD(9jP zUX_`H_^@?qjy0Oe^iu{8GmyPNof@uxeTSYtnu8chG`w+>CHV_54>o%a$UaAfIxo|# z*nAHs^)@6gH&NZBe@@GF6rV;zKa`5P&ynoOHvN}mS7mwp>W9-G5DCpA8?ofjXYezE zpMTZ^w;O+05%#RzxFJsiAWsG4sUC8zq@x3~4{T4 y(mz_PdvXVDrPmOr3;UMb!BFz2KieRG4uJewK>lon{3QVL7XkT;9+E%)>4PYO z@;5}aa9Poisz_i2Oy~H&C%)rot=xNmjiZ+JZ%F}h{n3Z13;REl0@CG2eY$`-Ca;+f z3kdd=^plirl6j>7hP$Ny8BnVA1L*zA5337(2|pp8ul{TRe)gU*cVRD+XUmM42RjXb zJQa|qR>;=@kgo;gYb)f>0gyinNJI53$Wy#2^OO{Eo;;Ur6T^c^Y23Z=8n;=0d|zcr z^*iw@6JdZK$y20+jxco8nT?4)zmLBAcM<*%`Z$!2-kH~h{a8L)GLHv)9RT@SKpHZy zTsPj8p$q$I-B>CDBwXc%hXFsq|9YTDQo%Y}+^yVrwIe#QPr|JWt8Zg=RoRs5GWR0t z17C?>W>8op<{J5fD?(SoCE_lBcCs)Q30{v|k-xWDh3A32kd^S)(uWqkCcDPF <#~+MQp01sB;{bc%drcZ>0}Cx;O{nS1IJ+xBYJ|G(O{h?gPpKeun?e zK)%blrxqaErTKtBFxsD)Ab3CL2gCz+-J=OKr9;L|8P`oxq)C;=Y!|7?9!U)Ay B$)TKv8|Ze}my75iaV((GFaM>^pG$6N}zLw>zVT;CnRa7*UESrL(ZS+(Anh!Ld#Q zGF!t(Cn^<7QZZhN(58ZahS~};O)W8vbnLC@lo^YP3Fvsor7UP`(3Wi-!{lUB^%I<7 zg6jf`bQgY+4D#Li`#;!u#1;zo$$Fo7of+b5RKtR_go2wkOHJ)qxRM;rkR8ldsQQN7 zwVMqTsc|-Sek^CY&yg(d1jaR9E{e&w1pl@*6sBFOZ@E-#oAg jvOJnK4AHVx0E@qVgV8`5pp9>%oShqFAb=v_pkHuszkg za51l^LExQGUkZ5T){;R6(6*M!JtlOTbe9va 2)C$nGf !d7z`_wyK~d z1j}W9%tq-8;T2JTuZVj^;HA|gX9FF?q2p^>m$q@$7CuUtL_aWh mGf|YsZ!)sey_vGUgFw&b~>{{{aK>|-!#vEInhLV9Ee4@>o_5;(cKIS z5xvWk^;d1Y3=CWX|F=Wq@HeJv!*Izo>Nl~BgwOGGR`1~8hOepA16fSUH=e}99G|Fz z1!h=yd^PI^S>RfC#mZMBjd*BT6Ze|pn4P|wnm8TK80M|GI`w_TPk8y37+C$4A{W Ab2KRMgI-1TH>_bZl7t#UXUt(e#lHKZ3EJ=(3{>RLKiLBPDw5Y zNgvprbbM&uWLv5Y8cO#;*GS#4fjl}z=%nR?be0mphioWvOEX1EF)a<7Vypv-!a(9P zPDIvMYUW>)oFp}gKbACx@#)DAnvy#TqYe;2hzE% O4~}gQ6*JWbgYBbas#d9grwJ%EAC%_e+Z*| z>P-ciRvI44^6Qk8R^)!8A6{u}-Uv3(Xf}kkz}w_+w4;D6zI!^?ZmY1!XrwQ}DWXo1 zaI*8$+3B{WGd0&1iAe*U{3UaYD$Ul3R*RB ^R0%s-Nk&sqG?yhfmp-J-J^CVMmrHaVKrRs(1^pxA?F7z9tj;f7WdgEj$_a; z!%;zAZlL+E -iaHiAj gj1rmwC<$|UkhDjC z8rO)#`cQmdmD@Ng>Wq%)Y(q^` dX5E2kW{DCH#0jqMtaW9LaV!H*la#2YCAWuHp?P&iQ9_3!hpJ zz6gwKRyFl7E`AM|v~m~R5vs%uchs_f(uzZ+a`VN90h<#3Q(IB=T)Ft5pwj`>T~4+& z%e|0T86>Z`Gs|vk%s?jgrRxLR3&L|~dZ_|`Ej20jxyYIro_5mD1!ZqmR>39WE; RH|AkaFtP10_y392V z_#lLG2!rkT@(>XZVStuaL|6(wa{skNJ&dJ}+>SC?v+Wjk=(EPYBW+NBXe@k=ZqYlM z;KSW#Eq%f7U_#L (+(y8a4qqo90V!k%jXfa6A zG(Zb3K>tScuLJsyPVU!#v~7GK>#uOO8dl-9q}q@$LNg4g!F>NU65e>O3B4WKL0Qk5 zFjctBhF6uWad2$%vLIO7c5VHDnzN5Q4 ulN%JU?Q-OJa^~_N8iGfK?y*I z9}e`oq4lFiWz+2bzSG=vfXqm01KMB=z@H@n1n81LI$fsG5m&o^CN`!TSzI>j%7>#V zg`Da}q`0G47RGZaS`CZ{SImPAWpTR2JgnL@ Lmf$sJ$_=oJgA4! BnRtp<8S{+1 z*?>oU=>TxTDuYRXn(E>D;4a) IWvyP0~OHA zeqpX`=&q&jEm#@yrVGGxr~B5!U=FFETIE$(S;U7SgTocuvU-kt!MK>f>jZi)0!VsA z-+k;q{$SP;HhRP p?Pjd^gF5G zdMl!r{txaN-AQHLtU^WT7kLDjZQH={)mT{0^wq-xaou@Em&_~TUS^HzrmPrN-ekK8 z`WOLjm`5akJp6Tmx$z#F48(;V%-O94o40pa%nRVNw;CpSw(8P_=H>U GV5`>*Nv46u?|Oyk>@>exacwcFU1( zXht-2^ge>nw4sIRe#h`{mbfTmhww}?$*ZFeZI1nanlyB3jK}0?DT3*KSs6wmx}a=K zf mT)P6u$?V9 zgYyi-SXg*vkz+gW6-jdZ8SfIBqZ9O-Li469{`rsprt@IZu$dsp!EhQ@eS0|?rj9@~ z!h>mlAnG0S25ch73DW{~L;5`XN@$IHj(5+^165RaM$R|ZArvCUC=(@7C&Qu!GPG(x zM^`8l@soGXsG ssM5wl&CWvl_7#KBYInhoQCeH)p}f>-FfadpL#K)nY(EuAn$dw` ze{dE0X4pX{kF15ArmGY60s};H0Nj>7A&;1ywWs>Q?UYvCNlleTo2jjpR;d{pERBkP zfwfSpSztx%q-$#p?1RZwuXnWptA|stw _e3M?VYW51$5Lnx6X=<|kj{9R zsC!?shMiFw#;GXBh?5kK5!X$nz360r(9Iys14XK{O9N(iJ&c&i2tNFB(d4D}X0(Gy zNC_(b?H~(`PVLSuJQczY>I&7$w%PIB&O7puJZ6?oazN{ecHW1Jc({m#!$wquGb!C& zV&rb@q^rpYj6qiih`0^er6it~t$Uj>TFtsO)ehCQDyu4GmhV<%JB2jsv9c c&Q3 z`7sEqyCSZ#RS~%Uw{GOpFsW7W0J`pjbS28KwP=$3>x2{ gmlcL8RB<;z!p?se)k8P5?B$}w0jPqW)|L12!EcyPY;@u zq_!Ph6A>3 `13x`zvf_bMSyQjrfHIIzNaJXg z6Dx=w8bC>3!D~%PcqU?hE#b0^T|ygjbGtR9F?U;i5YcUM%Qd8_O<*`3PCGMmaO9Gm zi|4j*NMoyj14bv(S=t$`yJY_UO2U#rLsI?4YMV}~;2HnyZcrN;C#HcS<{LX%C}#Zv zNhgx_@-jQ`V@PUKgU;jl_;Xs^_404Ht9NSP!QZ%Q^Pr5Dr7rP*Wbt*I+p~BuHJcV` z3&>!OXOF(4Vyl%}3xM^c+N>(F8NVu^$Aj=O3*Si^q3f?=xx1}NMcYqUWbmZX%ATPs zu8)Ijgsx`#kQTsE`wK(uS88KcfN9Y+T(_=ZrxsLCJ&ElYq9}B}H1%Om7kyo7?J8QK zzIi9XNKB9m2M1q&AW!WqqHHD-CtY3P+u!&3voDneflY9tM4a6go8;8bq|mV0@{RFW zZrIe-PD(seT|V^ 6q|qI@WSpL(s6b<-w!{v5+fj3>7R z;J5OrkGk-Rz{{i!yAMIzq5C%HbGT=2#LYJ=tPt#S1@q+7&}VK3uKu%0sa?|6gs;&B zl}3%=6*{qnJ$s3idUje ?2`3C))dx|Jxw ztK{)`X{3*TWc^$>WE+~UL#Z45cBbglLm6juo=i(&XN@(enppt8Jd{yZN8C$JkAEAe z!+#n~f!jigF&Ny6?|dETY^$_JMY*3XvRcX!z^`BgY8|42PX_C`T^+lgt=ccbLxAu! zXOnEU7*ysHR2TxVMPs&(ROUV^fHC`h5@8_!h1?l`@_b<5)-;tE2GiQ#wE}C*r<&uX zr5lUe_%9y$ff{{;gtsu8$G&s`+)P^!rc+pf>w~*+^Q0|s`Ig<%58=>?eh`k>h!Hz? zRtP!T<0c#8OFWYM09OvV2Iyj cVyNG;8d8eJZtC{uZq! z@Ipp^yHW5N?fA*6C_7|~*&;11CJ3MLf )B~jcpG{R>USR zpUJ=!>;3e~bkn$kmOLD;CUKgfmE@#)_R`0H0ntqZ(HrkYM7_6OEB(`vTK3`Fkw&zb z4ik4^D-f*NCB>$-H(5gltvD~1y;mf>44Uw_CB&3*Q#Pfa4mv?@JnYZiR1;k7#2eDY zNp+Vs6;1nq!f%uB)ObglsPnYd0D%VSS_knn3C@TmytY$RWJi+j^@AEVZVP+sJtj4O zVRR9{76Gu^gaBCB?V8na5ra+{;EAk$Vils79--6f25xMichq}3bYd2hnNbYUzJ%$d zMd)>6_Ln>FXlt&u0+C X#|~K9OAGHUNgNW*k d@GZ^sRSv`9CJ z?I5SbsDuaih<_N-y fF-gdkTJ_r*bMEc(_lt_DoIKUeejmg z4qb7et9|gzL~aKWOMks*)OlL<%4BP+law+bbn|3x +bq^Rj5f%p3L(K*KLcWB(KqCKP*&xCh~$C%xxM=jqgn9T4m?oJOUrR&2j& z6`qqqPkw~3FJy=t^Zm1b9#^Q&&lz^%PtMM7KV7eGZqGiRU#!m0K72U)^~1$YXl(jl zbH+tmcZ@N4`}yPf)!FsU#r5=fbZ3+2j7A6Q6N{URv+MKU-hX`O6$!_va-<>;e=#0I zs=$)=tm%yLG&OHJz4;t4QyXZwst%U-9${61&T7hgHU{+1D>DLr+<%XHA26=Me9Y=7 z%iB_u?yHPRURfaTg=9s3Bl#}oo6!1BQ3}C&MR4Hz)&?Z`&=owa91}2ZYpDrC4!!ib z Bn+DQCGY-1pfgYMq@EdXKKH7dtc>>C-*f5uba8L~3H+#t1m3Xj%gFDwSc_LF2 z(Teg$^^80d6|X>l@1>Oy;cf5Xt4$~WjK{VfLiEtc{?<7~+{wkggZq&7YlM1YNf7H( z|Lvj-Ew!?cU)2>B1E=M$R$3St^vqY*;Zf<0#vrVjS`}jlw kUCNl-gaC7TEJqitq6iO* zHcJ20JXD1AX3C}&GH*ns3&eoE%`;PB#0BJj)IaVL`v9y*?7#Ie(q)nExM`-6=wdyf zu|e<)BHdBd%tNDfo>AA8YZ-H>1rzHQGF22a8=ua4(}?i=uM>Dmf@(y?#M&nTX>BaM zxiB#NXU2nng~y4R0;`yVj2WZZnJ1)Qw|2_JR1`ZKuD1sfF^Nvr3_l?vl88@T&P&>* zc!RUh_`ex)TNc*yFhfugp8quiv)x~BTppbLF{4`7?T47!wR;t>EkYBZm*{@k-~*GP z6A(XS><^t8w{h2ieymscFtoVF{LnBFoJPz^L&W}n48E$yZLp)IHZ%lYaNDg$wR^U3 z%(F-ch#ev56S+XdY|52r1(XSBW6~Lv<{RgRx4U%;n?%or4Ql2d_0M-}=-DbHd+KAw zI(8pwS&R)F_@ph8p|q5u>F_lgLy7(ZA%z!qF|UhA_wy-Ab&P1AJof(!3YPKmvTC z?$gMB;SF6|Y76Y#VANt3QCx2k&k_0%*a2`O3ggrJiW;F;h)Sn_ONvcdgX!;WR^#&q zj(M4+k5&Ft5xqfAG)da~YZeVUg=mMErNOm8mg1G*FW}^^1Ip;zJD)XD%IJJlTrXL( z{##O{xpB`%4a8br)y)hkb-WJ}i7p-*nxSZa2y6c~*&h5xkp5jWi%#{%l%h3%0FwR~ zNMM51=H*) aAZdu(61GKUhx$XA->NML;;RpodaQt{3J=LMiD3mXDcvJb`{J zJMia7j?FC}VYh}|)-@{ELk$GZ_!q7!XbHHb9gIzp+3LGQG8W=CdN2(NV{E($Sin(# zvV4-v<&P7T`?4hcG`4{+{N?9(yFpVOCp$VCtniMQNkf^zh0#6OONUuZ4x9Zxgh4gO zxKL4nhy64f#f|WGNd+^=IOZ!2{JlKU&nI~0Fo2We+0dBO6$XrAv5vulMoLht=5>f# zwIko<3x-A7k9wf>38M1>l5ZszX+Nfaf`-km=D_4wmZvlk(eghVV}_IwPppAGGZqY{ z4SZOuDPzSO0-HAWPJ9rGS5DQ@g39JpcX?TE@s2}YKH)uD(LI($ioso-tWJ#};Il}C zjaXRzz9n?UVbQrOX+gkORuVdH#nMw&7PI+U)lDG3a`y<_S+N6mhe|YNc+`S_O^8Wq zu{xmDMkD`$IYqsbLkAqn<0UKi3_z=d4ghBW>@JsX+^ 8p7ig)6 z!Z+}(KdPgletMv7LRQBaoLyw^ALFw-O&O H3RIrcw?9XdNfUQG+X+@*+aA;Gv zJ7yN63e!Q717`e0dr1~PWgs-E@E8%4!IP<2(SA6|<1;jrRXrL9OrvnTp+e{A42@-h zvlScb2XkbWw>m;?M75L}0J{?1$wyPn`lFE;rJG&y1l!L1DGTnWhg6Qv>{KRglvFOQ ztT-nV?L5f0W!l2^F&aL9ouYtA{!()HRHVWe3%anvXrp!JI#$Pqg2N_SjXU2+@-?gG zK2keWqnEhS9hM!#GhM%u=P(XQtn-fG(}#^;APVQ>f;}U1Fmu+dM#TKlm(Vh15D%?q z2xIN>bi8P^m;W$hV+YcuhcAIDg?)|qGE=d+-00jlPb6<{1x7x9`z?UjlC0+ZHxDov zC~0)W`DVTjR7ptnOTwQ%oSUiC&MUldndH^JPg}gM>BQO8DWD(g5Af$m4tKgc0G*~i z1P?d@x>;A*&bV&KeR-$EJ~YyNwbWy{CIb#c@Zmq*P)#C9Ns@OdU88$Us>=49jKXM< zf5W_3W-+1Y0= YoU?sO)iipM^ZD3X ~H; zFtAp9lb3f%z6we{S+c8ItQ&au;nS~YA67T#*YB@xZw$;zQy#>ul~j5FU6vB-nvC$~ z?JpTmow^X3qyIJYbJk3vEP>cThNt|wu&z={nvJGQ0=D+l$^yVAUP(9ca;B5Ivl^<2 zURd3mb!otVuI6`^Ew~*A4(6$d9phT~GP@Yu8U*(>sl~nd60L8F45e<=ZwFZ*OYKZs zwH}6%=w;PPtfS91MPhs*hWqk5%sw>IxSjKuWVk3D*Ak>wZwXW*b|ze++DaHiBLdsw zpr&C6zE)CA{4w)wvN0t*c(GK6Uqd1Gv|pCge4o;PXW6SmG)kT^cQ&EauXYJ?xh1)e z8|sQ^({&02l$)%3Orq#JP}>lNKj`An-_ZmUYfZB8(NiPTJ!yjm*&0K3QTKJykWE=V z^SC~H(CMV8?>Tql$?$9-bZvGiJR&f4)a+|XsA1~MYCF`e{Sa$ol~C`P_yLY(lv+EY z%GO_hiQ|Bq5{6e|*~y5<2B_fR%()T8K+vDiZc0-_!~{MM?PiXEaf1-H2Kh6glVfHF z!i`1PQsgg `KAln*-DdwMg~LwgE)W%d4<5s z3jIiJI}F&OS5z~ZqaP?&(kVb*CV2Sjp)9`!q~lohQ|}U?i-q{_EvcTnUTsiOy!ed> z|G_<2@90&b>ZfEkrK}I+Zs@01xt ~3K z)u%}RCW}Ssr!3Fo3~ln4ZG#8Q?kaL0pr;Yx3%r8%9?bT`Grlm8V;=uzQ%C8pr{tRv zLA`jY&(SaBE zSQ)cxm}dpHcT}cq!SX5&soW0^4-|C4d|>|38TZHGnEqvAMZHNms0#U2c8@lwC$O|a zzm{bKuY>R6w^gzw-LO&LCTT*m7OL|A3#LUw;7G3s;X%nx91CXw5#K8+nIdXZ%8odT z##QPna~9>8@UQHzFJ;>_wk0TkJ0%zXmHqXkTqjjJk&ua=!~ecyWp25HZ6`y~bNJtr z42=6vj2RP!XBK>8cHdUGt4imosqNT`opu27mVHP3+f$VdDM$sIa?LYt!IPY9t?%4e zbuyy8V;<2B^N56pua;Gox-PZa6_Wto(chXItQPvewcES0smfv+c`yEdKgBOk;(C{? zCl?SQe8c{FQnJ^$Tqb&~#45xszTu@Y%;QjEgV{8dAEnWPGW{`NWtK?HT^sXfof-7L z=lHD!VYhwiEG2k-5jGz|EZ)*V4DDg@qyku*c%``7q9u_}K|YH>1aD8mmM6xc^L(tM zPNZ`+#!EMtl# z%=h%sc$}fFDK{rVC#CfeT-?YlbefX=Pa~qs~z?S0Ax|Z