Concurrent psql patch
Fixed the major omissions that made it incomplete.
- Added sgml documentation and \? usage
- Added basic mvcc regression tests using new functionality
- Fixed cursor-mode (FETCH_COUNT) functionality
- Removed \cwait in favour of psql variable ASYNC_DELAY
I'm still not sure it's quite polished enough to commit but if there's any
feedback I'll be happy to fix up anything that's not acceptable.
Also, if anyone has any better ideas for names than \cswitch and \cnowait
now's the time. I had intended them only as placeholders because I couldn't
think of anything better but it doesn't sound like anyone else has any better
ideas either. If not then we're going to be stuck with them. More or less,
it's explicitly described as an "experimental" feature in the docs so I
suppose we could always change them later.
Attachments:
On May 11, 2007, at 10:55 AM, Gregory Stark wrote:
Also, if anyone has any better ideas for names than \cswitch and
\cnowait
now's the time. I had intended them only as placeholders because I
couldn't
think of anything better but it doesn't sound like anyone else has
any better
ideas either. If not then we're going to be stuck with them. More
or less,
it's explicitly described as an "experimental" feature in the docs
so I
suppose we could always change them later.
I don't see how we could make the names shorter without moving away
from a backslash command (which I'm guessing would be painful).
Assuming we're stuck with a backslash command \cs[witch] and \cn
[owait] seem to be about as good as we could get.
--
Jim Nasby jim@nasby.net
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
"Jim Nasby" <decibel@decibel.org> writes:
I don't see how we could make the names shorter without moving away from a
backslash command (which I'm guessing would be painful).Assuming we're stuck with a backslash command \cs[witch] and \cn
[owait] seem to be about as good as we could get.
I don't have \cs or \cn set up as abbreviations.
I was originally thinking \c1, \c2, ... for \cswitch and \c& for \cnowait. I'm
not sure if going for cryptic short commands is better or worse here.
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
On Sun, May 13, 2007 at 02:39:45PM +0100, Gregory Stark wrote:
"Jim Nasby" <decibel@decibel.org> writes:
I don't see how we could make the names shorter without moving
away from a backslash command (which I'm guessing would be
painful).Assuming we're stuck with a backslash command \cs[witch] and \cn
[owait] seem to be about as good as we could get.I don't have \cs or \cn set up as abbreviations.
I was originally thinking \c1, \c2, ... for \cswitch and \c& for
\cnowait. I'm not sure if going for cryptic short commands is better
or worse here.
+1 for \c1, \c2, etc.
What's the reasoning behind \c&? Does it "send things into the
background" the way & does in the shell?
Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
phone: +1 415 235 3778 AIM: dfetter666
Skype: davidfetter
Remember to vote!
Consider donating to PostgreSQL: http://www.postgresql.org/about/donate
"David Fetter" <david@fetter.org> writes:
I was originally thinking \c1, \c2, ... for \cswitch and \c& for
\cnowait. I'm not sure if going for cryptic short commands is better
or worse here.+1 for \c1, \c2, etc.
What's the reasoning behind \c&? Does it "send things into the
background" the way & does in the shell?
Sort of. It sends the *subsequent* command to the background... And unlike the
shell you can't usefully do anything more in the current session while the
command is in the background, you have to manually switch sessions before
issuing subsequent commands.
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
On Sun, May 13, 2007 at 02:39:45PM +0100, Gregory Stark wrote:
"Jim Nasby" <decibel@decibel.org> writes:
I don't see how we could make the names shorter without moving away from a
backslash command (which I'm guessing would be painful).Assuming we're stuck with a backslash command \cs[witch] and \cn
[owait] seem to be about as good as we could get.I don't have \cs or \cn set up as abbreviations.
I was originally thinking \c1, \c2, ... for \cswitch and \c& for \cnowait. I'm
not sure if going for cryptic short commands is better or worse here.
Would \c# limit us to 9 concurrent connections? Might want
\cs[witch] [session]
which would switch to the specified session. If none specified, it would
switch back to whatever session was previously active.
\c& sounds fine (as do \c1...\c9). \g& would probably be helpful as well
(send query buffer to server in nowait mode).
--
Jim Nasby decibel@decibel.org
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
"Jim C. Nasby" <decibel@decibel.org> writes:
On Sun, May 13, 2007 at 02:39:45PM +0100, Gregory Stark wrote:
I was originally thinking \c1, \c2, ... for \cswitch and \c& for \cnowait. I'm
not sure if going for cryptic short commands is better or worse here.\c& sounds fine (as do \c1...\c9). \g& would probably be helpful as well
(send query buffer to server in nowait mode).
Er, I just realized I typed the wrong thing there. It can't be \c& since I do
assign a meaning to that "make a new connection to the same place as this
one".
I meant \&
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Gregory Stark <stark@enterprisedb.com> writes:
"David Fetter" <david@fetter.org> writes:
What's the reasoning behind \c&? Does it "send things into the
background" the way & does in the shell?
Sort of. It sends the *subsequent* command to the background...
That sounds just bizarre. Existing backslash commands that do something
to a SQL command are typed *after* the command they affect (\g for
instance). I don't think you should randomly change that.
regards, tom lane
"Tom Lane" <tgl@sss.pgh.pa.us> writes:
Gregory Stark <stark@enterprisedb.com> writes:
"David Fetter" <david@fetter.org> writes:
What's the reasoning behind \c&? Does it "send things into the
background" the way & does in the shell?Sort of. It sends the *subsequent* command to the background...
That sounds just bizarre. Existing backslash commands that do something
to a SQL command are typed *after* the command they affect (\g for
instance). I don't think you should randomly change that.
So would you prefer \g& as Jim Nasby suggested? I hadn't even considered that
previously since I'm not accustomed to using \g but it does seem kind of
pretty. I normally use ; but I suppose there's nothing wrong with just
declaring that asynchronous commands must be issued using \g& rather than use
the semicolon to fire them off.
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Gregory Stark <stark@enterprisedb.com> writes:
So would you prefer \g& as Jim Nasby suggested? I hadn't even considered that
previously since I'm not accustomed to using \g but it does seem kind of
pretty. I normally use ; but I suppose there's nothing wrong with just
declaring that asynchronous commands must be issued using \g& rather than use
the semicolon to fire them off.
It makes sense to me... but what is the state of the session afterward?
Should this be combined with switching to another connection?
regards, tom lane
"Tom Lane" <tgl@sss.pgh.pa.us> writes:
Gregory Stark <stark@enterprisedb.com> writes:
So would you prefer \g& as Jim Nasby suggested? I hadn't even considered that
previously since I'm not accustomed to using \g but it does seem kind of
pretty. I normally use ; but I suppose there's nothing wrong with just
declaring that asynchronous commands must be issued using \g& rather than use
the semicolon to fire them off.It makes sense to me... but what is the state of the session afterward?
Should this be combined with switching to another connection?
It's an interesting idea since you'll inevitably have to switch connections.
If you issue a second query it'll forces the session to wait for the results.
(It doesn't seem like there's any point in keeping a queue of pending queries
per session.)
However we do still need a command to switch back anyways so there doesn't
seem to be any advantage in combining the two.
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
"Jim C. Nasby" <decibel@decibel.org> writes:
Would \c# limit us to 9 concurrent connections? Might want
\cs[witch] [session]
Hm, we kind of have a choice with \c#. Either we treat it as part of the
command in which case the way to connect to an integer-named database is to
include a space. We could even have it magically connect to a database if the
connection isn't already active.
But these kinds of inconsistent behaviours can be traps for users. It means
"\c1" and "\c 1" do different things even though "\cpostgres" and \c postgres"
do the same thing. And it means "\c1" might connect to a database named "1"
today but switch sessions tomorrow.
Or we treat it as the first argument in which case even "\c 9" switches to
session 9. I would prefer to do that but I fear there may be people with
databases named "9".
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Gregory Stark <stark@enterprisedb.com> writes:
But these kinds of inconsistent behaviours can be traps for users. It means
"\c1" and "\c 1" do different things even though "\cpostgres" and \c postgres"
do the same thing. And it means "\c1" might connect to a database named "1"
today but switch sessions tomorrow.
The real problem here is trying to overload an existing command name
with too many different meanings. You need to pick some other name
besides \c.
If you were willing to think of it as "switch session" instead of "connect",
then \S is available ...
regards, tom lane
On Mon, May 14, 2007 at 12:51:39PM +0100, Gregory Stark wrote:
"Tom Lane" <tgl@sss.pgh.pa.us> writes:
Gregory Stark <stark@enterprisedb.com> writes:
So would you prefer \g& as Jim Nasby suggested? I hadn't even considered that
previously since I'm not accustomed to using \g but it does seem kind of
pretty. I normally use ; but I suppose there's nothing wrong with just
declaring that asynchronous commands must be issued using \g& rather than use
the semicolon to fire them off.It makes sense to me... but what is the state of the session afterward?
Should this be combined with switching to another connection?It's an interesting idea since you'll inevitably have to switch connections.
If you issue a second query it'll forces the session to wait for the results.
(It doesn't seem like there's any point in keeping a queue of pending queries
per session.)However we do still need a command to switch back anyways so there doesn't
seem to be any advantage in combining the two.
I'd thought about this, and the question I came up with was: what
connection should we switch to? First thought was to switch back to
whatever connection we'd been using before this one, but then you'd
quickly have 2 connections tied up... then what?
If someone could come up with a logical session to connect to
automatically that'd be great. In the meantime, what about allowing \g&
accept a connection number to switch to?
Also, I'd really love it if we could also do ';&'... I didn't mention it
before because I'm assuming it's essentially not possible, but I'd like
to be wrong...
--
Jim Nasby decibel@decibel.org
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
On Mon, May 14, 2007 at 11:03:52AM -0400, Tom Lane wrote:
Gregory Stark <stark@enterprisedb.com> writes:
But these kinds of inconsistent behaviours can be traps for users. It means
"\c1" and "\c 1" do different things even though "\cpostgres" and \c postgres"
do the same thing. And it means "\c1" might connect to a database named "1"
today but switch sessions tomorrow.The real problem here is trying to overload an existing command name
with too many different meanings. You need to pick some other name
besides \c.If you were willing to think of it as "switch session" instead of "connect",
then \S is available ...
Since this command will be getting used very frequently by anyone using
concurrent connections interactively, it'd be nice if it was lower-case.
It looks like that limits us to j, k, m, n, v, and y. In unix this idea
is about jobs, what about using \j?
--
Jim Nasby decibel@decibel.org
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
"Jim C. Nasby" <decibel@decibel.org> writes:
Since this command will be getting used very frequently by anyone using
concurrent connections interactively, it'd be nice if it was lower-case.
It looks like that limits us to j, k, m, n, v, and y. In unix this idea
is about jobs, what about using \j?
Well currently it's not really terribly interesting to use interactively since
you could always just start a second shell and run a second instance of psql.
I really only have regression tests in mind for it. That's why I don't find it
a problem at all to only extend \g and not semicolon handling.
That said, I think a next step for this for interactive use would be to handle
C-z to "background" the currently running query. So perhaps it does make sense
to keep use cases like that when deciding on command names now.
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
On Mon, May 14, 2007 at 06:26:42PM +0100, Gregory Stark wrote:
"Jim C. Nasby" <decibel@decibel.org> writes:
Since this command will be getting used very frequently by anyone using
concurrent connections interactively, it'd be nice if it was lower-case.
It looks like that limits us to j, k, m, n, v, and y. In unix this idea
is about jobs, what about using \j?Well currently it's not really terribly interesting to use interactively since
you could always just start a second shell and run a second instance of psql.
I really only have regression tests in mind for it. That's why I don't find it
a problem at all to only extend \g and not semicolon handling.That said, I think a next step for this for interactive use would be to handle
C-z to "background" the currently running query. So perhaps it does make sense
to keep use cases like that when deciding on command names now.
Yeah, I think having the ability to open up another connection within
psql will turn out to be very useful from an interactive standpoint; \c&
(or whatever command we use to duplicate the current connection) is
going to be a lot easier to enter than actually starting up a new psql
in many production environments.
--
Jim Nasby decibel@decibel.org
EnterpriseDB http://enterprisedb.com 512.569.9461 (cell)
On Mon, May 14, 2007 at 11:55:07AM -0500, Jim C. Nasby wrote:
On Mon, May 14, 2007 at 11:03:52AM -0400, Tom Lane wrote:
Gregory Stark <stark@enterprisedb.com> writes:
But these kinds of inconsistent behaviours can be traps for users. It means
"\c1" and "\c 1" do different things even though "\cpostgres" and \c postgres"
do the same thing. And it means "\c1" might connect to a database named "1"
today but switch sessions tomorrow.The real problem here is trying to overload an existing command name
with too many different meanings. You need to pick some other name
besides \c.If you were willing to think of it as "switch session" instead of "connect",
then \S is available ...Since this command will be getting used very frequently by anyone using
concurrent connections interactively, it'd be nice if it was lower-case.
It looks like that limits us to j, k, m, n, v, and y. In unix this idea
is about jobs, what about using \j?
I suppose there is some reason the bash/csh job control characters:
%-
%+
%1
won't work?
-dg
--
David Gould daveg@sonic.net
If simplicity worked, the world would be overrun with insects.
So based on the feedback and suggestions here this is the interface I suggest:
\connect& - to open a new connection keeping the existing one
\g& - to submit a command asynchronously (like & in the shell)
\S [Sess#] - to _S_witch to a different _S_ession
- if no connection # specified list available _S_essions
\D - _D_isconnect from current session (like ^D in the shell)
This leaves no way to submit an asynchronous command without using \g but I'm
really not too concerned with that. I don't want to start messing with psql's
semicolon parsing behaviour and I'm mainly only concerned with this for
regression tests.
Another thought I had for the future is a \C command to simulate C-c and send
a query cancel. That would let us have regression tests that query
cancellation worked. The tests would presumably have to be written using
pg_sleep() to ensure they ran for long enough but even then there would be no
way to control exactly when the interrupt arrived.
Attached is an updated patch.
I also found and fixed some missing ResetCancelConn()s. I think I got them all
and the behaviour seems correct in practice when cancelling various
combinations of synchronous queries, asynchronous queries, and backslash
commands. The one thing I wonder about is that I'm a bit concerned I may have
introduced an assumption about how many resultsets arrive from a single query.
I'll be offline for a few days but I'll be back Monday.
Attachments:
Your patch has been added to the PostgreSQL unapplied patches list at:
http://momjian.postgresql.org/cgi-bin/pgpatches
It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.
---------------------------------------------------------------------------
Gregory Stark wrote:
So based on the feedback and suggestions here this is the interface I suggest:
\connect& - to open a new connection keeping the existing one
\g& - to submit a command asynchronously (like & in the shell)
\S [Sess#] - to _S_witch to a different _S_ession
- if no connection # specified list available _S_essions
\D - _D_isconnect from current session (like ^D in the shell)This leaves no way to submit an asynchronous command without using \g but I'm
really not too concerned with that. I don't want to start messing with psql's
semicolon parsing behaviour and I'm mainly only concerned with this for
regression tests.Another thought I had for the future is a \C command to simulate C-c and send
a query cancel. That would let us have regression tests that query
cancellation worked. The tests would presumably have to be written using
pg_sleep() to ensure they ran for long enough but even then there would be no
way to control exactly when the interrupt arrived.Attached is an updated patch.
I also found and fixed some missing ResetCancelConn()s. I think I got them all
and the behaviour seems correct in practice when cancelling various
combinations of synchronous queries, asynchronous queries, and backslash
commands. The one thing I wonder about is that I'm a bit concerned I may have
introduced an assumption about how many resultsets arrive from a single query.I'll be offline for a few days but I'll be back Monday.
[ Attachment, skipping... ]
--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://www.enterprisedb.com
+ If your life is a hard drive, Christ can be your backup. +
Hi Greg,
I looked at the patch briefly. I couldn't spot any issues and it looks good
to me. I've just couple of comments here.
The mvcc regression test files are missing in the patch.
--- 1179,1189 ----
dbname, user, password);
/* We can immediately discard the password -- no longer needed */
! if (password)
! {
! memset(password, '\0', strlen(password));
free(password);
+ }
Any reason why we do this ? "password" is anyways freed. I think you
might have left it behind after some debugging exercise.
--- 25,37 ----
#include "mb/pg_wchar.h"
#include "mbprint.h"
+ #if 0
+ #include "libpq-int.h" /* For PG_ASYNC */
+ #endif
+
This looks redundant..
Apart from that I really like consistent coding style. For example, to me,
"for (i = 0; i < 10; i++)" looks much better than "for (i=0;i<10; i++)"
This is not comment on your patch and neither I am saying
we should follow a specific coding style (though I wish we could have done
so) because we have already so many different styles. So its best to
stick to the coding style already followed in that particular file. But few
simple rules like having a single space around operators like '<', '+', '='
etc really makes the code more readable. Other examples are using
parenthesis in a right manner to improve code readability.
flag = (pointer == NULL); is more readable than
flag = pointer == NULL;
Thanks,
Pavan
--
Pavan Deolasee
EnterpriseDB http://www.enterprisedb.com
Pavan Deolasee wrote:
--- 1179,1189 ---- dbname, user, password);/* We can immediately discard the password -- no longer needed */
! if (password)
! {
! memset(password, '\0', strlen(password));
free(password);
+ }Any reason why we do this ? "password" is anyways freed. I think you
might have left it behind after some debugging exercise.
I believe it's for security reasons. If that memory page is for example
swapped to disk after freeing the field, the password would be written
to the swapfile. Someone who steals your laptop would be able to recover
it from there. Clearing passwords from memory when they're no longer
needed is a good practice.
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
Gregory Stark wrote:
Attached is an updated patch.
This patch appears to add a nonexistent test to the regression schedules.
cheers
andrew
"Andrew Dunstan" <andrew@dunslane.net> writes:
Gregory Stark wrote:
Attached is an updated patch.
This patch appears to add a nonexistent test to the regression schedules.
I must have forgotten to cvs add it. Sorry.
Also, I forgot to mention previously there is an unrelated trivial hunk in
here. I noticed we free the password early, presumably for security reasons,
but don't actually overwrite the memory at that point. I added a memset in
there, otherwise the free seems kind of pointless. I normally don't bother
with "security" features like that since they don't really add any security
but as long as it's there it may as well do something vaguely useful.
Attachments:
concurrent-psql-v9.patch.gzapplication/octet-streamDownload
�I�QFconcurrent-psql-v9.patch �<kS�����_1��d�'�}� ��N���ZR.Y���%Gg7��v��H#Y6&�&go�T�4��������g��{����0�������,����C�<;��?��O�l��|�mM�)�
#3�H�^�]]��o.��o�����rl��g���9���+t|�5����3��X�b�����>666�j������h�X�����uvX�Jb�Z��������l��wD@�C���Fo{���v�>�����}��~m32�f�l9��/�����um�������� #'���g����wf�/�G�cx�`zt����t�n-�������>��Y��6(������|��7�.g�k��a��rQ>��|<��F�Gg�!
�}x|��������������n:!u�'{�gp�0r�Cf2��3Ip������!SL`�8b�N4�����!�
�����L��{�h�&�I���g�9���m��*kxx�t�����'�5a���!g� ��f�Ss
b
��"Sx8h�n-1���b+O����gyI}��l���� 1�����sG1s<���
��n&N��P�����t���;< �F��b��a���90�>p"���<�U"F!��- DLlG�Q���3���B��, B��c��D��5hC�K�TdF,�q�9���K;��3�?�s��Of����S�4���dy_3��� �q|�S]��T _���������&��p��3�=�j��pOq8�,:�W�G��\F��H.�S �)/�>���9�p��20- fV5)�����B�X�*���$7[���l5��(��E��
�X����?`t�
L���
�S�3��x��T�>i�� ��}���!�?���o�I�@���������� �<%�F~ 5*y�)����I@���� ;��K���<�{4�6��d�y�*>M����M]�f|�f���[�.R
f0�������S�G���x-������(���7��;���jB�`K}f�C���\��cr��x8u��<�Kpo
;f�������q0��4g�
���t�R��i4I4��-�� �?�:vb�G�(gp�t� ��#q�%�������J����n�h�p'��A�Y�{?��0�d� %#�I���?s+&::2� �1xZn�V���.@b 8;�l�:�� ��yC�5���k�����!�b�1p4x�b�&�*\�S�^�M/���b���h��@��:��\���<kA�����L�c7�
�[%�:�3 ����e� �����g������u|� �f�������0�)v�f(t�T@��B���������dpz���=�;���|��]��:�G��������U������@e\�������*�D�=�s)R���v�h�{�T��:����lw���j�����W=�� �WP�,� y�����!�Q��*��)h-�-x�*
i�f0m�.\��~&d�)�����hM�@�3B@����XaLM���'�����~�FRE4*)eOzH��s�G�������#��k���zN��<�����"�5@v ��������+TQ%�$�s���@�H$
"��Ly��h�80gL��{a��{�2a�����*q�2C�2������^��*�P���r_YDP_l�/�� �c%iy�+�� -�B���X��r�"��'k'�Hs�|���k��OH�l���*AJI<�a4l��
%��i$,n^�����&�m�T�t\���waL>�=Gi�����u��V�pph����D�Yn6
�`9��L��*�w G� ���� ��'k�������oS�]������s�P�����(3�<������X,N��v� ��.KqG�S���A����k6��9 E��`j>Y�����$���`��8�&Q�9# ���z~�n�w�rc,}�nE3���Q�T�� � �~�T����`�i�����<\T���1*�)�G6�+7A��7��������5�a������r9;v�j��������f����R�*���gpo�oW���p��=N�B�K�BA�������&8��N���#0�l��g� �����`C�
D�E?�)�O����o�>�^�������}mQ\P�@�eQ�� ����Z���DT( +�3��g��N��fw.�A��/
t�alwS�^��Md�o��F��z%�����g9�+��p���n�?/��KC@ s�*&c�P�=��
]�+a��o��uZKl��gATf�#��*�D��L��X9�r��Z��Hvv"KH�-K(���)+*H� ���B]@���P���P���*(
�l�����5������|]E@ �0e�,j�����r����I�R '�C0o����SIE��M[�l�:���@��tp`�&��qF�e�I���&{�� ������"l�]l)=�������?6 #T��ZL���IIS���0�����m��a8�w�
�T�M����$y���k$��H�����.���������FbS�H��k��m��� �L�2�i�3P)3�� 3�@��ll�llJ��!����@���@��+���$��������������x�~�LX^2�@���J\�����\%4$��PL*e S#�S�C� "�5�b#dk����sZ�.��0|*�_ �v�;�u����-��-c���-��;�Z"?��4�|��
F��>%$Q��� ����������u�:<"�|�����Th��3���I>�F�����NQ�9l�;o��\^\����_^�����)�F4�B��|��C��D��QeP)����A�Q��H����vg����=��)��=FA,�@��"F���t^�S�N�Pk�Ip���T+1 ���_�2�����m>�]�-I����Z&�l�n��`[�M� ��ga?�G�����V�Y�]���n��xM�p��17Ca&y��b8���z)� Ga�o�b��� [J`I���~�x���h6�s�^����3�^���F2�vZk
��d�n�Q��;�����mL�a�r���M�2YBl �]!O�c�(��x#~�T "� +m.�O��R�>x��Z�����f�D����f@I<K}�K�c�;3 }W>�8�<=�xUV�!�^������H�E�h�m�����w�)8�X���? Y�
�R8+�����X;�KY�&�6A��Z�&�"�+T�c6�&�8!�}�
�2'{���Lw{G���<��l�6/�_�]�_���� �I�%��}�jQaA���`��H�w�6x?E1�x���E�}��'���#�:�O����%�j{�al�l���`��JPPx��}C?�k�����A����%��a.�`f����4Z>���*�{�{��J����������SZ��p+$�n��5�K��DZR����Z�_�
�w���������_Bvu���zy}���<16�F�v�PJ��9�JS?����Q�M x~������G�������:�[]Lq�un�� U;]��mj,���%��O��zFc�i��$
�6D����=��<�����Q[��"��[�� ��W��H�4e�c��[x��+�`�!�������4��F���%M ?c�Z���
����-do�
�m�wt
Ap�k/UR`�~��^�t������:n�� @e�g�C�����������\�����HyEl��a�.�)An~����!{wv����6(�U"�W��)p���o�u`e�r]�uN�d��N���X�= ��f/�P�[����
�oo��=�j�4m�����.E,���GR�����s%oFz@���_���B<}"F6 ��{���6Ek�������@1;���v���S�J���o31������/�l5�r�9���e�%���7��"��&����j��^C�������Zv�c���q����.r9;]wQ0������(�/��>�x~�1d� i1X�������4�k����Y*X+��Q��`\g�
�!���o�8���>����@�9��_���@an��z��J��P\�98� q������R����=�_�����P�E_1;��5�D�k��%k������������kkf���5e�J_3;'1-rV��� #��S7���<"�b���!�������6���f�2��"��8b���(S�
q�e:��5��st����Z5M��ih�2�)ZS�T��t!g����iM>Whe�����L����g���t��DM��Av���C�r!R������M����>v�c���+XA%{�t\#]'�(U"lc��.��5?�k�kGr��5�S �_F�*}���Z?�U�(sJD���F2���c����7�m ���{��k��+/W�+��X�.��R5����3���>��������W731��*-50�*Y��#8�I����g��L��Y.�a <���!D�p��S�������5����s���E������G
�K��=�BdV���W)Ai����d���?_��%�p_��W__���G����B�'=-�Xe���� ���]��j�Y���yt�V}y��!���#S�8Ce�� n�.� �Z
��XD��A��������t��H.�bcg�%!�[(�&M��=�t�Ek4 �#���v���i��/VQ����1���0m�{N�2JP�*Pw�&������~�e����`�_}��/d5vk��}q}D�����.�t�u�������~Z.~uvss���������:�")F���� P�\;"�}Q�_;LZ_����5HE+�����3���lh�eg^���#����q�r>�`�x������i����/o�g'��)h����iX�d���N�_e�V��2�@�VY,�d3�^���x����u�d��b��_|�� �@���������")��1G��F��"�*�t����s56T\�,.�K<� ���*��/.�������%s0�_.������e��\�.�suy-��c�%s��.[�g@������pr8���K6Rq���;�C'zH[<���yU9��%�v��e����� SO,�?�r�dy�����*�
�f�i����Ud'�@Y7�*0��`�=������g�q���l��kES��,��E������w���W����U�v�%��t�7x[�x&o:�{��^[��� f�M'5U���������N����%A�W�V�Wv��2��>s���;�bN� �zEM��1^� # ��S�M�n2�K������M��U����G�9���[�&�"��k,��w`^����5����I�� N�K�h��G�W�E�"�i7;F������:i��7��Z��$�-e%����[/�O�\(2�������7-(T��57��Mw�&��d���n�7u�����B�FuvE|:����=��"�QR��T����=���|A��*��N��K��]���(M�m�M��
+M�����Y\�7�r�;/��A�J^���N��~������p���E��'��Pw@U��M��s�,�5%�Un,�\���K��V:m�X����
�_x-���?������]+�)����Q^j���i�_�t�)�J�;��m���bM��R~��M�RM�{�5��6�?��4�Z]P�oU;����nk�O�7`�k[{2B�
���n�X���z%�j���}-������D����E�?�`�1��0�$F�=V6@D��n�J��jh�D�_�Yq���m���FI��g����:A8�q��1w����Q`z�IB���C������>]���F����F�$v,�8{u~Q�'�[�����g"ws}��\�ys|q:H���*��
+)Z���E:��n�at��� ���>�SH(c�HE���
�,��.v7u�����M�(i�%�-D#9~���g���|���I���@�mt;���x��cO@a`m��q.�v�et�;9=
:�=P� }Rx��dE��-�G��z������_m#�������aN;�'����2@0���&��[�6F�Z6 ;;�o�TU����<2wsr[�ZU�����T�\
����o��A��3���Ax"a#�Ud��#4�>�R������B�P"����� ���=y�"h��|���uZ��H+��s���
�Y3�����fz)No��?��/i�ys�������`?�����)����$� �9���a�v�v���N�����0�a���G}T����8%��[��-����/,���=���jB���u����������qFLBY��'���]!�jv'b�y��/!(Q*j[� � )YKV�Q��������]?`�������+r�+F?"8x�����Gi_n�^
�mLA�*�:�n5-3�g����[�U���(�@L� y����=�d�w2���<�����:��v�kl�Li�r�Yh����w
�����J
�����19���U`����I�$�C�&��)�:�RD@g�Ah�5%�6����rjh��� �a�*o�>;9:z���?���o��k'��WQ�Bd+���_�}\L��aB���`�k�����q���H7;��A�d�E���q����Q�����AA'�)��n&Rj-X��:N��2G��%���������M���a3�����:��<$3/����DkD&�W��=1EW3��`����v'E:�n9���H�W/�Ap���AC���u��[������M�
d$��w �W�KX1v�&B6o('9:������a6��S&T=�W?��h���e������;��-Kcx!}F��RD���U8�\H���gQ'b�L���d���m��Z��A�^{7j<�Lm���E�p�����d���2��b���=��$�����4���)���<�c&B��y�\5dWb�Z�\���y����L -�@���$��a@$����0�������[Wr�f��+#"3OTxU�Q�rn[��Y�l�$���]�W� ��d ����N���@
5`�x�j7NM���@`9�� ���,�!��F�<����Qi������h�14�*�k��=�,g�4��j�������MM-d�T���M��.�s��3Xy���Zz�Z�5�*��s\{�52�N����7��t��0�j�t�|�8��2���5����m��$������i��g|�z�\v�N��W�#h��4~8-���6K4�v�n8�G@���0��(��������d��v��--��03��@����R��N�s��}6e������y):
���)0jp`���������$x���Y������I�'^C$[�D�|bl����w�d����'�������?k����'g#dH�Q��cW�,;b�N
|������d��sgqW67�Wwc��|��|r&�MV�1��-{)�pc�'�TF�6*u�s�J�%7^��D2)�{f���(Ba�������%X����*�&g�����J>L"!��y, ���%��
�k`�����C�����b1����&O�-]���f�G��.�����.��O���lSa�A��>a���� QE� � !;��FY:Ul���D<*o�$�������~�������)�v k��h �h{�D��yY| 8_b�!u�'{���$�~�'Q�}16������lWQ[$�.=��L�X�lc����T��Yv%��LfK����eY>���W�3K����%pg��v���sjfT�+"A�BE��k`tb����I\w�.L���;k#fRy7p���#��#-�5���4K"&1u�(�����.3� sN��!y��Y��A��&��`*!H2�0�
����Y|�69������$�un�eA3�(]����Pl'�s��D1�<ij������y�Xv�X��m��Sy�����s��E#���e���X� m&�E�Q����47����B;���x
��1e����A���X���_���$*�a���a)������)��3M)����.��~�����'���?�G7�9_��������'.�Iw�yNV���� Jn�)��<I��y��y��k5�)6�s�$��\�����iV��Ai��cvmF���� ��T��#[����4*�|�����]���D=���
�L�8.z���P��GLP?��(�.x�w�w�zP�� ��
� �B���@�i Bl�,1�K������+Zh��.���+�J���b�9Hg�������q�b<�����e�n��1HyY�w&�$����K^�T2�9�)oN���c%r�37�M���y���.���,e#��7������w�w6���� ��hH��6P6�z��E�\�]���;��F���$<(��( �mw���0��M�X�%�^����*U���zU�����}��w�vYj<Op
./��_�V���6���2
�:WN_��*��H������c#��(�etS���1 ��
�A�X�������4�p��49�8:���\��@��`C�N���g{���~����P��8��Z_LL��������'j��1y���k���P����Kw}��Qo�.��oe�����+�X�
����{;����m�e��
Ar���y�F��l���.��N5{U�o�Py�����R�N�~��pK�M� �t��r�T�
W��
Vtx�w���|?���W����(���)[�2�Zl�2�^�o���%\�"%��9��7 �M�A6��������q�v�Y�g��=c[C�s�\E�����mO�y����u�-j��<0",�~���+�g��)�{$���L���^� g��vYC��(rY�}T��*O�jj�l�7�yZT��W���}_Mg�/���M@���_�����xO�n��v"w)������Z�D�U�@�S����o
9��j!�������<� ��7��N������3�:�bwq����l�:��� ��67���6���iG�:�����"�r��_f������KT��
�� �kahv�fA[.Vx"(�����=q_�������m��8�&
�u���
�8#j�/���9����9`$�1[��:���D��O����������u� �Q�L��:�jE?�?��r��r����<���.w�������Oi���M����v�9����� �]��L��������c!��_�NXfSz��f:�6�����
6�<Y���E�o�j5��R6�����P�r����Y[�0�}|��wtB��8S��-��>W�����ng1!��������L|.
lW�e��QX'�>d+{F���������Md��*5��J�B�b���@��UH�}�t�&� �cO�.#��Q����\�t:��z�����y��W�^��L#�����+cY��������Fs��E_�]�+9�7u�O6����O�>�|T��8��#CA�QBHt9�Q�;��K
nac������ 6���z�>��=A8"g��N�w�:��GW�
�r�Y�k����������������i��Jb ����W��w� T��U�R4�s~�� 0�P8���G�8R�e��K��3'.~L�A(����c��J(p��u��a
��~���(u%��w1Zx�u&��P����������4�Y���_�m%�2�
�>������c�������_���Q�� : o����]I�NC�q|9E��_un�ogQ��^(��I�;I�y�cm��m4�c�89�3\6O��"n�fyV���^��J�����r��
oa$�5y��� ������c$�Z[�����@i�kl�=��jFSN�4��g2o��C���w��T�7�I��s����W��D�D$������`g:�Q�F}�I��3�����
h�A]��m�C���[:�
��d{���CR$�f��5�������J+�����>�n�7P�����r����L���[��x� uf�@{������@���A3��������M� �� ��;-L����
���D)�o����/o�+x!L�^��/��+�f��|�A<�I���cx|o����J[0"d�j�p�K���������!���@���u�D������K���S��Z���=�u\�vI����}�y��D��0m&��"���A[��W�l��[����0q^�z�U+����v�����=�(+Z$>�Io��_������mUK��:������j����^�Y��G�{�v��h�>�!�
�%��n�rn������n�A�=�e8�������t\S�U��
����2�b1�k!���nW��L?,�n@�t��B|�� �k����[��g���p��;�7�7M��\��y�����X\���������f�����-�Iv���:�SP�oh��V���0�q�+��,�(R#��
j������b�Q���NDA�h�ig]"����A�V-?��$C8���.67���t����"�
���R������r�\m%��\3'�:��8�)������ ��f�]@�FT���]��N�^�Q�V�����S3� ��?���Fa���Q�un��z�����;�M��R�j� ��v�ie�01�K��R�����b[;���.a�Mo��c������0�01*������OY�� �\�b�u\ `�"��fk
�6Y�m�D}���y��%���;�$�G�������7�Cr�n���-�:���sx�w��|S���w*e�q[N������S������V�4���TW�Y�Q}����S(�`������"T7���I�����B/��;a��i�+A�Z���#�K"1F��0E�x�����x9J�S��$R3}&xdLPq���G�����f���k�[����2SME����YN�#����L�I�z��-��'��(�����LH�X,E(�m�Oz~r�i�ND�4N"���P��z�ja�(�BLy��1�S���9'q����2�J�e�E ,U*�g�P-D�lmy��v2b0�~���up��
� J&|�#�?,|/�;������g ��?�B�
��E��(?���&���
�k^�T�+�y���4%�T�c@���H��AA�(�a1Whf���{������=������J3�V�#���]���������l�]��*�������"�%�F �c��(��ABf�Pz��J��WL�N����)A8E�n�P���U��{���
�;�"��o+(y���cv�qj8��,&(�.� ��Q��,�}2�%CC��ae
�n|?<���<�s/�*`W����;��.��S�U�*
#�N�����������^K��g[�j�����Ol0� cl>���>Ht��'