Is it time to kill support for very old servers?
pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.
One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.
Thoughts?
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Fri, Oct 7, 2016 at 4:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.
+1 for doing it, and also picking a version that's "easily explainable". If
we can say "now we support back to 8.0" that's a lot better than saying 8.1
or 7.4.
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.
Which is a pretty strong argument in itself.
One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.Thoughts?
I agree we want the new libpq to be able to deal with that one from old
versions, because 9.6 isn't really old yet. We *should* probably change it
in head for the future anyway, but that means we have to keep it around in
libpq for quite a long while anyway.
Unless the special purpose code becomes long and complicated, I think
that's the best way to do it.
--
Magnus Hagander
Me: http://www.hagander.net/
Work: http://www.redpill-linpro.com/
On Fri, Oct 7, 2016 at 10:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.
It's been a long time since I've seen any 7.x versions in the wild,
and the pg_dump stuff is a nuisance to maintain. +1 for dropping
support for anything pre-7.4. Anybody who is upgrading from 7.3 to 10
isn't likely to want to do it in one swing anyway. In the real world,
few upgrades span 14 major versions.
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.One small problem with cutting libpq's V2 support is that the server's
report_fork_failure_to_client() function still sends a V2-style message.
We could change that in HEAD, certainly, but we don't really want modern
libpq unable to parse such a message from an older server. Possibly we
could handle that specific case with a little special-purpose code and
still be able to take out most of fe-protocol2.c.
I definitely think we can't remove client support for anything that
modern servers still send, even if we change 10devel so that it no
longer does so. I think we have to at least wait until all versions
that might send a message are EOL before removing client-side support
for it -- and maybe a bit longer than that.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.
I might be expected to be the holdout here but it seems sensible to
me. Removing code in pg_dump to deal with lacking schemas and
pg_depend seems like a major simplification.
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.
If it's testing we're concerned about IIRC the current servers can be
arm-twisted into speaking V2 protocol. So it should be possible to
test both modern servers and modern pg_dump using V2 protocol with a
simple tweak.
Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script. For
another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.
--
greg
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Greg Stark <stark@mit.edu> writes:
On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.
Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script.
Yeah, but surely pre-7.4 servers are no longer of much interest for that;
or if you want historical results you should also use a matching libpq.
For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.
The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Greg Stark <stark@mit.edu> writes:
On Fri, Oct 7, 2016 at 3:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
In the same line, maybe we should kill libpq's support for V2 protocol
(which would make the cutoff 7.4). And maybe the server's support too,
though that wouldn't save very much code. The argument for cutting this
isn't so much that we would remove lots of code as that we're removing
code that never gets tested, at least not by us.Somehow removing the whole protocol support seems a bit different to
me than removing pg_dump logic. For one it's nice to be able to run a
modern psql against old servers so you can run a benchmark script.Yeah, but surely pre-7.4 servers are no longer of much interest for that;
or if you want historical results you should also use a matching libpq.For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.
I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Robert Haas <robertmhaas@gmail.com> writes:
On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Greg Stark <stark@mit.edu> writes:
For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.
The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.
I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.
When I wrote the above I was thinking of an essentially user-facing
libpq feature, similar to the one JDBC has, to force use of V2 protocol.
But actually, for testing purposes, I don't think that's what we want.
Any such feature would fail to exercise libpq's logic for falling back
from V3 to V2 when it connects to an old server, which is surely something
we'd like to test without actually having a pre-7.4 server at hand.
So what I'm thinking is it'd be sufficient to do something like
this in pqcomm.h:
+#ifndef FORCE_OLD_PROTOCOL
#define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0)
+#else /* make like a pre-7.4 server for testing purposes */
+#define PG_PROTOCOL_LATEST PG_PROTOCOL(2,0)
+#endif
which would cause the server to reject 3.0 requests just as if it were
ancient. Then we could test with that #define, maybe have a buildfarm
critter doing it. (This might break pqmq.c though, so we might need
to work slightly harder than this.)
Also, I realized while perusing this that the server still has support
for protocol 1.0 (!). That's *definitely* dead code. There's not much
of it, but still, I'd rather rip it out than continue to pretend it's
supported.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
This thread gets me thinking about the definition of "support." While
support in practice seems to primarily relate to fixes/updates to the
supported version itself it could just as well apply to interoperability
support by newer versions.
Given that the standard PostgreSQL upgrade process involves upgrading
clients first and using pg_dump from the newer version, it is reasonable to
assume that the clients/utilities for a given version would support
interacting with any prior version that was not EOL at the time the new
major version is released.
In other words, 9.6 was released last month, the same month that 9.1 was
EOL, so 9.6 clients should work with 9.1 through 9.6 servers but from my
perspective there is no need to *guarantee* that 10 would do so. The
standard caveats apply. A new version *might* work for an unsupported older
version but no assurance is offered.
This is effectively a 5-year upgrade "grace period" *after* the EOL date of
a given version which seems plenty generous.
Defining the term of backward compatibility support might be useful in the
future when these types of questions arise.
Cheers,
Steve
On Fri, Oct 7, 2016 at 9:06 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Show quoted text
Robert Haas <robertmhaas@gmail.com> writes:
On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Greg Stark <stark@mit.edu> writes:
For another there may be binary-only applications or drivers out there
that are using V2 for whatever reason.The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.When I wrote the above I was thinking of an essentially user-facing
libpq feature, similar to the one JDBC has, to force use of V2 protocol.
But actually, for testing purposes, I don't think that's what we want.
Any such feature would fail to exercise libpq's logic for falling back
from V3 to V2 when it connects to an old server, which is surely something
we'd like to test without actually having a pre-7.4 server at hand.So what I'm thinking is it'd be sufficient to do something like
this in pqcomm.h:+#ifndef FORCE_OLD_PROTOCOL #define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0) +#else /* make like a pre-7.4 server for testing purposes */ +#define PG_PROTOCOL_LATEST PG_PROTOCOL(2,0) +#endifwhich would cause the server to reject 3.0 requests just as if it were
ancient. Then we could test with that #define, maybe have a buildfarm
critter doing it. (This might break pqmq.c though, so we might need
to work slightly harder than this.)Also, I realized while perusing this that the server still has support
for protocol 1.0 (!). That's *definitely* dead code. There's not much
of it, but still, I'd rather rip it out than continue to pretend it's
supported.regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 10/7/16 1:08 PM, Steve Crawford wrote:
This is effectively a 5-year upgrade "grace period" *after* the EOL date
of a given version which seems plenty generous.
IMHO we need to be careful here. It's not at all unusual to see servers
running versions that are *far* older than that. It's certainly
understandable that we're not actively supporting those versions any
more, but we also don't want people to effectively be stranded on them
because they can't even get the data out and back into a newer version.
So I think pg_dump at least should try to support as far back as we can
without jumping to lots of hoops in code. I think moving the limit to
8.0 is fine, but I'm not so comfortable with making that limit 9.1.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532) mobile: 512-569-9461
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 10 October 2016 at 10:45, Jim Nasby <Jim.Nasby@bluetreble.com> wrote:
On 10/7/16 1:08 PM, Steve Crawford wrote:
This is effectively a 5-year upgrade "grace period" *after* the EOL date
of a given version which seems plenty generous.IMHO we need to be careful here. It's not at all unusual to see servers
running versions that are *far* older than that. It's certainly
understandable that we're not actively supporting those versions any more,
but we also don't want people to effectively be stranded on them because
they can't even get the data out and back into a newer version. So I think
pg_dump at least should try to support as far back as we can without jumping
to lots of hoops in code. I think moving the limit to 8.0 is fine, but I'm
not so comfortable with making that limit 9.1.
The oldest I deal with is 8.2, and that's enough of an aberration that
expecting them to go via 9.6 isn't wholly unreasonable. I agree 9.0 is
way too far.
--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Robert Haas <robertmhaas@gmail.com> writes:
On Fri, Oct 7, 2016 at 11:34 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
The problem with letting it just sit there is that we're not, in fact,
testing it. If we take the above argument seriously then we should
provide some way to configure libpq to prefer V2 and run regression
tests in that mode. Otherwise, if/when we break it, we'll never know it
till we get field reports.
I agree with that. I think it would be fine to keep V2 support if
somebody wants to do the work to let us have adequate test coverage,
but if nobody volunteers I think we might as well rip it out. I don't
particularly enjoy committing things only to be told that they've
broken something I can't test without unreasonable effort.
I experimented with this and found out that a majority of the regression
tests fall over, because the error messages come out formatted differently
when using V2. You don't get separate DETAIL or HINT fields, nor cursor
positions, etc. So there's boatloads of silly diffs like this:
***************
*** 69,75 ****
INSERT INTO testschema.atable VALUES(3); -- ok
INSERT INTO testschema.atable VALUES(1); -- fail (checks index)
ERROR: duplicate key value violates unique constraint "anindex"
- DETAIL: Key (column1)=(1) already exists.
SELECT COUNT(*) FROM testschema.atable; -- checks heap
count
-------
--- 69,74 ----
Some of the tests have harder-to-ignore failures because protocol V2
had no way to recover from a failure during COPY IN, short of aborting
the connection:
--- 34,42 ----
-- missing data: should fail
COPY x from stdin;
ERROR: invalid input syntax for integer: ""
! FATAL: terminating connection because protocol synchronization was lost
COPY x from stdin;
! server closed the connection unexpectedly
! This probably means the server terminated abnormally
! before or while processing the request.
! connection to server was lost
At this point I'm feeling pretty discouraged about testability of V2.
I can't see us maintaining a variant regression test suite that would
accommodate these issues. So the easy idea of "build with some extra
#define and then run the usual regression tests" is out.
Now, we hardly need the entire regression suite to provide adequate
coverage of V2 protocol. You could imagine a small dedicated test
that just checks basic commands, errors, notices, COPY. The problem
is that we'd need infrastructure in either the backend or libpq to
dynamically force use of V2 for that test, and that's work that I for
one don't really care to put in.
Not sure where to go from here, but the idea of dropping V2 support
is seeming attractive again. Or we could just continue the policy
of benign neglect.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 10/11/2016 08:23 PM, Tom Lane wrote:
Not sure where to go from here, but the idea of dropping V2 support
is seeming attractive again. Or we could just continue the policy
of benign neglect.
Let's drop it.
- Heikki
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
I wrote:
pg_dump alleges support for dumping from servers back to 7.0. Would v10
be a good time to remove some of that code? It's getting harder and
harder to even compile those ancient branches, let alone get people to
test against them (cf. 4806f26f9). My initial thought is to cut support
for pre-7.3 or maybe pre-7.4 servers, as that would allow removal of
support for cases where the server lacks schemas or pg_depend, each of
which requires a fair deal of klugery in pg_dump.
Per subsequent discussion, we should use a round number as the version
cutoff, so attached is a patch that removes pg_dump/pg_dumpall support
for dumping from servers before 8.0. This eliminates circa 1500 lines
of code, or about 4% of the existing code in src/bin/pg_dump/. So it's
not a huge savings, but it eliminates a lot of hard-to-test cases.
I (think I) did not do anything that would damage pg_restore's ability to
read dump archives produced by pre-8.0 versions. I'm pretty hesitant to
remove that code since (a) there's not all that much of it, and (b) it's
easy to imagine scenarios where an old backup dump is all someone's got.
However, that's another set of cases that's darn hard to test, so it's
somewhat questionable whether we may have broken it already.
Comments, objections?
regards, tom lane
Attachments:
pg_dump-drop-old-server-support.patch.gzapplication/x-gzip; name=pg_dump-drop-old-server-support.patch.gzDownload
��=�Wpg_dump-drop-old-server-support.patch �<kw�6���_�jO������&{[It���I���{t(��P�JP��n��� |H���������@`0����x�
�{'d�����������|:;�?��qE�b�mO�q<�?0�.��U+�v�:��X�T��j����l��M�P�1�I��,7��������,wns��!�:a�x��Gq��N�_����c��L�g3?��>0�p��B��D�|9f������Q��J�0��� ���lf��-��i� !�&f�Nh0X�%\������R��9���b>�����O��������:���������{��".��
�.V)�Fs�������tjz��o��H^����uMt�������N�+?`��3�����@ns��l8���s��O�e�`��k�C���7�������;�����nX���%u���g�b��Mw�:c������U�� k:�#Rbq�^�fh,������YI�=O���x���U}����7�c'����q��~�C��\W����4>_��r)��c�]�V�W$����h��XOG�L�����$���H`k��Q+���������B~���m.N���^L}��|����A�G��&T![8��<?d#���3��@��qd
N"�$���<����fR�Ix K���9����� �S X�-nC��NXN.'z�@�f����13@t�a��J������_������qVnj�Gqz�`�. �{��Z/{7:���m��!��|���@K���e!���2��2�����0��W�~���3�i�����p����:aj�����^ d�������J�Ml��x��+���U��s����'�>w�����~�����S7�����]Ip�o.�rR�%�}�:���
:���y�����()�@�
:��#�A% �v��n�\i���DG�������i�Xb�����&�'�L&���a^��kr�"RaA1�D��%T�B���cbi����
�N�yf���Z����}~)�.����n��b�������i}���f`M�-3���n������n��Rm�j�v;P����uU��A����e���d'�7�M�4�6�F�U�5?C��yXT?���������SR �b$���[��Bs���<n�W���0�`��q"�g-NG�uv?�E�����X��� *�e��h�>�B�|%��?7I�|��nl����U,�������b�Fo�5�|��w
�!����B���u:�"��4q�n�K��A?P^?�y�Dk����!YG�{����@�������I�;�O��"5-���t a6$|��p������#���slX�k�p��j�xC��/p�'��s$
0�M�`�C�+BkL����X""Ngd�����:�fhM�����|�l��t�ej]�H�9�X�� I1�� ����l�N�������C:��P��oK��V1����G�c:�d�^;���h�w��>0e�99��U���0����i��7�� ��v�k��?��S0O |�����`H.����[sD�@N�|�� ���[3� �������(�� ��z8�����<rq�x�)=B"Q�����Z�����`~l�dR�(������o�9����t�A�j�����M��[3��8�7�� y
n� IH�,��n�j�Yd�������)����5�R�<h~h�����R��w������k����)�@]_<��`�;��;{e�_���C18�Er)�t)�!�� F �V�����y��Q�c��o��*��&u�*�x\�abu=�Hi�J�
Y�>?��?�(���2��p�'i5�ap�V���(�PG=�R�=�������$�N_��t��Q
��<q����r�3�izK�����Oa����y��3��'x���E����_��8 ��Z2�B�*K8�{�d�������a�o_�o�[1�y�����u��/[�����#�����z�a���H�M�6�X�m�v�=X��gF�{E`�
Hq�)�=p������*�M�m��@�U"��K��/�f��Zrp�/��]p��}���E�[p���}��#���7�~�l��9T\���a�F�*3$�'�g�&���y��X
5�r���:�fx�R��Z�*�.��5 |��lo��30��s3�<�����`e���,�<g-��}y�2��x_�I%��L��������j=����'~8#w��0����B�u�SO���s*y�F���#���
�GO�p{a^���@@s��WnQ�S����������������]��;��vo���b�������G��<T��!�r9&I�z���W��^It�)�`���T�K����0=��Hm��y%���=Gt�f�ZT&&R+��An|������r�P��#'�8�����(���T
8B�������h���:� o2m8� 0W��B�1'����
��|�u3 �I:
B&a����@0���
���2=4�hbs���%CSm^$L8��v��cs=���B�p0� ���9�c�������aT
�/�LWh6f�zq��Pw�X��`N� T��&��c����7�<�G�D97"H��]�������
s���,���h�(M�W�@��@��0�gb��{@(��cp-a���T������F����B;
��$�_.#���Mx&��X�o
[m}d���cI `���L\��cxJe����0�c� a�Nl�������� �P�i�.3-�3�z-q�>�������-���)�[%Z��S�7HtB��?� �Ux8�
���I�,���\��A�r|�w�5��gw N1���8�;�����?��w�����t������[���D���X1��p��f8��{��,T�Mbu����B����2�a3�S��A8����i�a�zi�����(E�����B7�x��3����j.�"l��8���9*)�R��V3�����a�
��?0��#�p������Z�Xm_9B&��)��N�XE{i�D� n�y�u�B7
�\� Q��-l�����>�^R��V�h�Z�'�����-���~��,���GG��]�}3hS��u��6}��|�\�\�s�s�i��_���w��T�_����WT?p���������s@y
�b���,>C} >�*�#ib6�%�s�@��C� }���u�������>����{O��,�=�>&)�<��QV�ZCyY����c�������Jg�t���d@��7g��pu����rYW������}�XQ�V�����^���*/���G��7��"@�H��}CY��K�Q�t.�3J���&i�����B�������9g<Y��j���u�E�lC�d2� �m��N�H���e�\o�GdFFK�
)�Sx�Fz��I���L<dC!�Y��.��(|�r�:��FL�"�������X|����4p�'�'�F��t���`K����]\�YMq�/{��J��.�[ |����i��@2�m���|��i_]���oo�;w��m*����-�����4�V^R#f���pNa�O;=<���m ���P�U]�����]��������2��Q�^��^�m��)3������(P��LA�1���,&��]���+�Z��-���
�~���R������(�-!F��������v���*�7����v��?���+�?�K��X�C8��<��w"g$� ���M�����]��F�\�J�5� *���9��n���2���
������)��-O��E�,cLTlVn�KSn&����|~9#v����8�iN<��K\|��$Q���%��W����~�8["�+�`n�m����w��*0eeKT���KmLb�"o*{�j�?�.R��%���Q)h{��;��VT��85�j�O���y���-�����^�T>�p�v�8� ��{�o�%��b!�h���2=�h�p�c��`�6u= 9������= ��i�x��5�5<"Gu�~����Y��L�+.�Yi$�fq�p(G+��=��f�jD7'*@��J�*��%V��8��:�����^
�1PIy�x�0_�� ����/�YN�����$��jg�t�6��7�9J��l��J��XU\�0������������Q218���D�r�%����,S���#X�5��D��;���\bv�bE�����o��*��2x~�F�egT=�%��4�=6��G���!�8���"�5�4OS�M/��Fvm�����^Y!ce+��#����r�����-���Z��H}�9�����k���3�3���w��j��F����F��u��e��(����J��Q-����-�'�%T��)��!l�9^P���)<�s�����,f�k���[X3;+��bub����Ij�5V����?�&�~�?�8�yt�gM������O�����j���%�yx1�������{�����Z��;�k�;2������.��rq���,\��?�K�P8\x�NA���n A'R���a�X
��|P��,����X��rs��1��|+_,�����^��2�K�W�X��E<