Some performance degradation in REL_16 vs REL_15
Greetengs!
Found that simple test pgbench -c20 -T20 -j8 gives approximately
for REL_15_STABLE at 5143f76: 336+-1 TPS
and
for REL_16_STABLE at 4ac7635f: 324+-1 TPS
The performance drop is approximately 3,5% while the corrected standard deviation is only 0.3%.
See the raw_data.txt attached.
How do you think, is there any cause for concern here?
And is it worth spending time bisecting for the commit where this degradation may have occurred?
Would be glad for any comments and concerns.
With the best regards,
--
Anton A. Melnikov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
On Thu, 12 Oct 2023 at 21:01, Anton A. Melnikov
<a.melnikov@postgrespro.ru> wrote:
Greetengs!
Found that simple test pgbench -c20 -T20 -j8 gives approximately
for REL_15_STABLE at 5143f76: 336+-1 TPS
and
for REL_16_STABLE at 4ac7635f: 324+-1 TPSAnd is it worth spending time bisecting for the commit where this degradation may have occurred?
It would be interesting to know what's to blame here and if you can
attribute it to a certain commit.
David
On Thu, Oct 12, 2023 at 09:20:36PM +1300, David Rowley wrote:
It would be interesting to know what's to blame here and if you can
attribute it to a certain commit.
+1.
--
Michael
Hi,
On 2023-10-12 11:00:22 +0300, Anton A. Melnikov wrote:
Found that simple test pgbench -c20 -T20 -j8 gives approximately
for REL_15_STABLE at 5143f76: 336+-1 TPS
and
for REL_16_STABLE at 4ac7635f: 324+-1 TPSThe performance drop is approximately 3,5% while the corrected standard deviation is only 0.3%.
See the raw_data.txt attached.
Could you provide a bit more details about how you ran the benchmark? The
reason I am asking is that ~330 TPS is pretty slow for -c20. Even on spinning
rust and using the default settings, I get considerably higher results.
Oh - I do get results closer to yours if I use pgbench scale 1, causing a lot
of row level contention. What scale did you use?
Greetings,
Andres Freund
On 13.10.2023 05:05, Andres Freund wrote:
Could you provide a bit more details about how you ran the benchmark? The
reason I am asking is that ~330 TPS is pretty slow for -c20. Even on spinning
rust and using the default settings, I get considerably higher results.Oh - I do get results closer to yours if I use pgbench scale 1, causing a lot
of row level contention. What scale did you use?
I use default scale of 1.
And run the command sequence:
$pgbench -i bench
$sleep 1
$pgbench -c20 -T10 -j8
in a loop to get similar initial conditions for every "pgbench -c20 -T10 -j8" run.
Thanks for your interest!
With the best wishes,
--
Anton A. Melnikov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
I wrote a script and test on branch REL_[10-16]_STABLE, and do see performance drop in REL_13_STABLE, which is about 1~2%.
scale round 10 11 12 13 14 15 16
1 1 7922.2 8018.3 8102.8 7838.3 7829.2 7870.0 7846.1
2 7922.4 7923.5 8090.3 7887.7 7912.4 7815.2 7865.6
3 7937.6 7964.9 8012.8 7918.5 7879.4 7786.4 7981.1
4 8000.4 7959.5 8141.1 7886.3 7840.9 7863.5 8022.4
5 7921.8 7945.5 8005.2 7993.7 7957.0 7803.8 7899.8
6 7893.8 7895.1 8017.2 7879.8 7880.9 7911.4 7909.2
7 7879.3 7853.5 8071.7 7956.2 7876.7 7863.3 7986.3
8 7980.5 7964.1 8119.2 8015.2 7877.6 7784.9 7923.6
9 8083.9 7946.4 7960.3 7913.9 7924.6 7867.7 7928.6
10 7971.2 7991.8 7999.5 7812.4 7824.3 7831.0 7953.4
AVG 7951.3 7946.3 8052.0 7910.2 7880.3 7839.7 7931.6
MED 7930.0 7952.9 8044.5 7900.8 7878.5 7847.1 7926.1
10 1 41221.5 41394.8 40926.8 40566.6 41661.3 40511.9 40961.8
2 40974.0 40697.9 40842.4 40269.2 41127.7 40795.5 40814.9
3 41453.5 41426.4 41066.2 40890.9 41018.6 40897.3 40891.7
4 41691.9 40294.9 41189.8 40873.8 41539.7 40943.2 40643.8
5 40843.4 40855.5 41243.8 40351.3 40863.2 40839.6 40795.5
6 40969.3 40897.9 41380.8 40734.7 41269.3 41301.0 41061.0
7 40981.1 41119.5 41158.0 40834.6 40967.1 40790.6 41061.6
8 41006.4 41205.9 40740.3 40978.7 40742.4 40951.6 41242.1
9 41089.9 41129.7 40648.3 40622.1 40782.0 40460.5 40877.9
10 41280.3 41462.7 41316.4 40728.0 40983.9 40747.0 40964.6
AVG 41151.1 41048.5 41051.3 40685.0 41095.5 40823.8 40931.5
MED 41048.2 41124.6 41112.1 40731.3 41001.3 40817.6 40926.7
100 1 43429.0 43190.2 44099.3 43941.5 43883.3 44215.0 44604.9
2 43281.7 43795.2 44963.6 44331.5 43559.7 43571.5 43403.9
3 43749.0 43614.1 44616.7 43759.5 43617.8 43530.3 43362.4
4 43362.0 43197.3 44296.7 43692.4 42020.5 43607.3 43081.8
5 43373.4 43288.0 44240.9 43795.0 43630.6 43576.7 43512.0
6 43637.0 43385.2 45130.1 43792.5 43635.4 43905.2 43371.2
7 43621.2 43474.2 43735.0 43592.2 43889.7 43947.7 43369.8
8 43351.0 43937.5 44285.6 43877.2 43771.1 43879.1 43680.4
9 43481.3 43700.5 44119.9 43786.9 43440.8 44083.1 43563.2
10 43238.7 43559.5 44310.8 43406.0 44306.6 43376.3 43242.7
AVG 43452.4 43514.2 44379.9 43797.5 43575.6 43769.2 43519.2
MED 43401.2 43516.8 44291.2 43789.7 43633.0 43743.2 43387.5
The script looks like:
initdb data >/dev/null 2>&1 #initdb on every round
pg_ctl -D data -l logfile start >/dev/null 2>&1 #start without changing any setting
pgbench -i postgres $scale >/dev/null 2>&1
sleep 1 >/dev/null 2>&1
pgbench -c20 -T10 -j8
And here is the pg_config output:
...
CONFIGURE = '--enable-debug' '--prefix=/home/postgres/base' '--enable-depend' 'PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig::/usr/lib/pkgconfig'
CC = gcc
CPPFLAGS = -D_GNU_SOURCE
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2
CFLAGS_SL = -fPIC
LDFLAGS = -Wl,--as-needed -Wl,-rpath,'/home/postgres/base/lib',--enable-new-dtags
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgcommon -lpgport -lz -lreadline -lpthread -lrt -ldl -lm
VERSION = PostgreSQL 16.0
—-
Yuhang Qiu
Hi,
On 2023-10-16 11:04:25 +0300, Anton A. Melnikov wrote:
On 13.10.2023 05:05, Andres Freund wrote:
Could you provide a bit more details about how you ran the benchmark? The
reason I am asking is that ~330 TPS is pretty slow for -c20. Even on spinning
rust and using the default settings, I get considerably higher results.Oh - I do get results closer to yours if I use pgbench scale 1, causing a lot
of row level contention. What scale did you use?I use default scale of 1.
That means you're largely going to be bottlenecked due to row level
contention. For read/write pgbench you normally want to use a scale that's
bigger than the client count, best by at least 2x.
Have you built postgres with assertions enabled or such?
What is the server configuration for both versions?
And run the command sequence:
$pgbench -i bench
$sleep 1
$pgbench -c20 -T10 -j8
I assume you also specify the database name here, given you specified it for
pgbench -i?
As you're not doing a new initdb here, the state of the cluster will
substantially depend on what has run before. This can matter substantially
because a cluster with prior substantial write activity will already have
initialized WAL files and can reuse them cheaply, whereas one without that
activity needs to initialize new files. Although that matters a bit less with
scale 1, because there's just not a whole lot of writes.
At the very least you should trigger a checkpoint before or after pgbench
-i. The performance between having a checkpoint during the pgbench run or not
is substantially different, and if you're not triggering one explicitly, it'll
be up to random chance whether it happens during the run or not. It's less
important if you run pgbench for an extended time, but if you do it just for
10s...
E.g. on my workstation, if there's no checkpoint, I get around 633 TPS across
repeated runs, but if there's a checkpoint between pgbench -i and the pgbench
run, it's around 615 TPS.
Greetings,
Andres Freund
=?utf-8?B?6YKx5a6H6Iiq?= <iamqyh@gmail.com> writes:
I wrote a script and test on branch REL_[10-16]_STABLE, and do see performance drop in REL_13_STABLE, which is about 1~2%.
I'm really skeptical that we should pay much attention to these numbers.
You've made several of the mistakes that we typically tell people not to
make when using pgbench:
* scale <= number of sessions means you're measuring a lot of
row-update contention
* once you crank up the scale enough to avoid that problem, running
with the default shared_buffers seems like a pretty poor choice
* 10-second runtime is probably an order of magnitude too small
to get useful, reliable numbers
On top of all that, discrepancies on the order of a percent or two
commonly arise from hard-to-control-for effects like the cache
alignment of hot spots in different parts of the code. That means
that you can see changes of that size from nothing more than
day-to-day changes in completely unrelated parts of the code.
I'd get excited about say a 10% performance drop, because that's
probably more than noise; but I'm not convinced that any of the
differences you show here are more than noise.
regards, tom lane
Hi, Andres!
Thanks for your patience and advice.
On 18.10.2023 07:10, Andres Freund wrote:
On 13.10.2023 05:05, Andres Freund wrote:
Could you provide a bit more details about how you ran the benchmark? The
reason I am asking is that ~330 TPS is pretty slow for -c20. Even on spinning
rust and using the default settings, I get considerably higher results.Oh - I do get results closer to yours if I use pgbench scale 1, causing a lot
of row level contention. What scale did you use?
I use default scale of 1.
That means you're largely going to be bottlenecked due to row level
contention. For read/write pgbench you normally want to use a scale that's
bigger than the client count, best by at least 2x.
I performed differential measurements with -s21 to obtain scale > number
in accordance with:
On 18.10.2023 07:14, Tom Lane wrote:
* scale <= number of sessions means you're measuring a lot of
row-update contention
And plan to do the same for -s40.
Have you built postgres with assertions enabled or such?
I ran the debug configuration with --enable-cassert and -O0.
And plan to do the same without asserts and -O2 soon.
What is the server configuration for both versions?
In all measurements i used default postgresql.conf files. Please see the detailed reproduction below.
And run the command sequence:
$pgbench -i bench
$sleep 1
$pgbench -c20 -T10 -j8I assume you also specify the database name here, given you specified it for
pgbench -i?
Sorry, there were a two mistakes in the command sequence that I copied in the previous letter
compared to the real one. I did not completely copy it from the sighting, not from the real script.
In fact i used pgbench -c20 -T20 -j8 bench. -T10 is really unstable and was used only for
preliminary measurements to make them more faster. Please see my first letter in this thread.
Here are the detailed description of the last measurements that were performed on my pc.
With a scale of -s21, the difference between REL_16 and REL_15 is rather small, but it has
a cumulative effect from version to version and reaches a maximum between
REL_10_STABLE and REL_16_STABLE.
The measurement procedure was as follows;
- rebuild from sources and reinstall server with
./configure --enable-debug --enable-cassert --with-perl \
--with-icu --enable-depend --enable-tap-tests
- init the new empty db with initdb -k -D $INSTDIR/data
See postgresql10.conf and postgresql16.conf attached.
- run the series of 100 measurements with the scripts like that for REL_16:
date && rm -f result.txt && for ((i=0; i<100; i++)); do pgbench -U postgres -i -s21 bench> /dev/null 2>&1;
psql -U postgres -d bench -c "checkpoint"; RES=$(pgbench -U postgres -c20 -T20 -j8 bench 2>&1 | awk '/tps[[:space:]]/ { print $3 }');
echo $RES >> result.txt; echo Measurement N$i done. TPS=$RES; done; cat result.txt
or
date && rm -f result.txt && for ((i=0; i<100; i++)); do pgbench -U postgres -i -s21 bench> /dev/null 2>&1;
psql -U postgres -d bench -c "checkpoint"; RES=$(pgbench -U postgres -c20 -T20 -j8 bench 2>&1 | awk '/excluding/ { print $3 }');
echo $RES >> result.txt; echo Measurement N$i done. TPS=$RES; done; cat result.txt
for REL_10 respectively.
For REL_16_STABLE at 7cc2f59dd the average TPS was: 2020+-70,
for REL_10_STABLE at c18c12c98 - 2260+-70
The percentage difference was approximately 11%.
Please see the 16vs10.png picture with the graphical representation of the data obtained.
Also there are the raw data in the raw_data_s21.txt.
In some days i hope to perform additional measurements that were mentioned above in this letter.
It would be interesting to establish the reason for this difference. And i would be very grateful
if you could advise me what other settings can be tweaked.
With the best wishes!
--
Anton A. Melnikov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
Attachments:
16vs10.pngimage/png; name=16vs10.pngDownload
�PNG
IHDR j V \�9e pHYs g��R IDATx^��y\���?���o����h�{ ��o��{���)m�s��9�W�Oee�bG�fj.i�Kj�[��/(
��
"��3�?���s?�2����y�^�^s��=��3���\�����������������������F=@DDDDDDDDDDDDDD�eW��M�6�q""""""""""""""2�. `E-��1QKDDDDDDDDDDDDDdeL�Y�DDDDDDDDDDDDDDV�D-��1QKDDDDDDDDDDDDDdeL�Y�DDDDDDDDDDDDDDV�D-��1QKDDDDDDDDDDDDDdeL�Y�DDDDDDDDDDDDDDV�D-��1QKDDDDDDDDDDDDDdeL�Y�DDDDDDDDDDDDDDV�D-��1QKDDDDDDDDDDDDDdeL�Y�DDDDDDDDDDDDDDV�D-���������j*++7o�DAA���QPP���BA�����...���G�&M`kk�~�2���!//O=l2wwwxyy�X�z��7��:�N�S�N�]�vpuuUOWI~~>"""����>}����*)) ���HMME^^���___�l�-[���������[��9Tt.����7FPP�z�B�������~�Z-���������www4o�\:O+������L������I��t���*���������\�v����N�����8w����~�2��{P�^M���p��yxzz�q����J]�~'O�Dzz:������t��
4P/����L�>}W�^Enn.lll����F��Y�fh�������F��"99Y�
�Q�������;wb��I�h4��regg��������Z�Z�:�NNNpuuE��M��qc�^���)))"�������b����U��53�}���Z""""2�?��7nT������u���C��U+��d��e8u��z�d���SO=%b�����O&'�k��e��k�.��?����Ud��]��������}X[JJ
�.]�s����$����:u*:v� 8|�0�.]�ZUs�W�V rss��O?�E�UN��X����7 ���<x0ll�o�!��7�|���������E�������V||<����.�F��C=����g���i����������b��x��'0j�(�t�����h��r�'666���MN��C~~>V�\���������;��
`H���=[�������:���n��e:v�X��E}�U��������Q�������]��9s��x��1�0a�b����UK�.-7�MDDDDTU���������
�w�}+V��^�W/!�^�+V`��]��*�j������t�RQU���p���J�����[o�UnRE)55����a�����V��������6���$,]����rrr��t����8{�,���|���NMp��a������� ����={v���N�;v`���(((PO[DVV�z�-�����$- ���!::Z=l5%%%��o �5�R����y�f����r��z���������Z""""�[[�rA����}�v���`����i��e��E�p��!�T�h�Z|���8{������K/�d���������/�d���':u�������+�r�
t: TZ�hI{���#""0~�x�l��o�������`��MLL��������x|��gx��w�j�Q�u0����G�����=��m��U�VU9I����/�����b������puuEbb"�����$!!�~�-f��!�[�N����~�7n�1t���7Faa!������B @�^��Zk;v���������jW��Q�Fppp���-
���"�����G}����W��1����Z""""������CPPlmm���p��$''#::{�����;w�O�>h���������W�V��{�����|���HHHPOU����$���-�O���]�*VY�/��"���W/���KpppP�2�{��~������G�������������;\�t �!!�����V������~���������� �7�|����^����'�h�"Quy��>|����i����sX�~O:�3�G����#�z=���������8���IIIb��+W�m�6�=Z�
e������|���8x��z�$��-CVV��K[&+F0o�<��u��)�>}!!!b�����_�
���3����Xe��������u������_~��b�����c��"�>}:|����P�^��w��q��0@��t����l�����E����rrr��o���g��ZXxx�h1m*k��&"""����Z""""��
�����
<<<�������c��a�?>�������w���x���]�QDD~��GQiU[�n5��}���k%I��jq��Q7j���M����?S���1|�p>\wvv����4��L�j4���*fM�L^ �j����r�x��F��]����;>��1~��Q�'j����}��G..."���h����-Z�E�:t(�.]*�C�w�6)Q{�|�������p��M��I._��c���x���e�|���
���/�v��i�Dmdd�x��h��k�%iC��W�^F?������nnnR���]�s�������i,""�����4o��f��������| ���������:NDDDDD�bz��������^��*�[�~����>� .4K�����X�v�46~�x��;.���*}�n������rrr��r)K���
�X�&��=�S�L�*���-�������;X�d �}��j'iH������0a�bV��S'�h�B����(**R�0/�����5����b�n��{�Q�����#--M3www�#Bvv���������~�D-�:4l�P����b���N��������V�Z�w���UU���?���X���u��1c+�K��0��K"""��j*'K=z�,I���������o�w��������K��������������[R|?�����g��l��!F��ZU����8qB�!!!��u��AE�����������������'��:�^�����qs����b^������~S7oW'"""����}�^�GQQ���+�/z�^$�]\\0a����c��������?���D����i��U{UsP�u��p��������j�*��� G�E�~��kN��K��&M�(f��5k�H�����%3��}�v�_�^�o��6�7o (((��M����L�0$CBB��wot�������MwAA���Jo�h4���������]��|/^�����C������h���4f.NNN�R�&U��v��1�g�������_������c�*��EFF�x���Ri��������aE-� �o����x����P|��g2dH��J:������5
^z�%�������I{�8qw��Q����?����0�!��o_i?KKT�EGGK-@
���?������<�g��}�%e��{�x����H����c��Y��i�Q�0$�����?��"�[e��9@����=���x���1e��j]��^�*����R\)�d�i���qzz:����u������{�G�"NMM�n�1���i����������""""��������j��+W���#�V�Z)f�O666�9s&�O�^�
�'N ==]�={�4�������$���<|������W��}��E�.]���������s��I����_������O�>����bE����/��G��������s :t�x��w�I 7�F��� t���5��;v�(bk(..����E��� ����{|�Z�l��2YRR�+������K7�(+;��K�.R�h��:����7+��}�" ~~~b��)L����o��FT����W��0Q}���DDDDT��Z-V�Z%��Z=Ui�M����C��F�N�:�����?���`���8y�$n���N�
�e��������#U�Z����q���?eLLf��� &�o���~�������G���t_�.]����Z�z���~�������+lmm��j������8?~%%% ������S=�:�������i��u��2d����������lC�����={0TU^�pA�5j�3f�@@@��r�
��_����� QU����*����{{{���Y�{�-����R�?���%�e�h4prr7(o2������������=����#j�� i�������� ��{wl�� p��L�2�y�9s�rssagg�^�;w�����8r��8�������]�j��JMM��S������K k"""""sb������jENNN�>���]j[��uk���[��|���z������C���������.4Jldee����8y�$6m����_�����];�;V���.��M�0j�(����j�c����$sqq�sggg<��C���`H�V5Q����O=$��������z����u��CF���S���n���a����q��}�&jq��!���������k���q 3f����-Z`��HKK��-���qqq���?q�� 1�����\��|���e�*l{{{�o�������~������?���>�L��[TT�
6`���:t(�Zk����b�ZV�w�2Q����c���VL�e������� &`��!&g�v��!��R�q��a��q�a"""""�`������,��w����+���������[f����7�O�^��X�Xll��������j)))x��w1w�\�$k���
`���(**�)))X�h~���3�
�z�v��=�q�=DR�4.M��������h��������4|��W���F�ooo��z���aaab�. %%��
�#G�������������QQ�zRsX�f
6n�777������ YYY�J�����YZ��]�����)U�����u�:v��7�|�}���f9''���+�l����p�=����gZ��c�D��F������h���h����*%j+RPP��+W����3f�= """���DDDDdq:�w����~�=��Cx��WLjYY���W=D* �! �$c��}����V���hl��YT������o��G}d�J�!C��s��X�~="##����\FF�.]���w��W_E�&M�����X$''��o���YC%��%K�{����R�v��Ippp����<��q���Grr2
�s�N8p ���
�v��z�������ie��
��
D�aDD�x� �*��qhh���T�q�c����...�����z���!//O=%<��x��W��M�T���=�o��kh��>��Sl��;v������Bl��x������$�>�m��5�1�[�n��}; ::h�����<�F��ME�sAAn���K�.�����t8y�$N�:�1c�`����������*b��9�_��%"""�Z����3f�m����J}��gV������}[=���~�<��4��eKt������H$%%���#������R|||0m�4<�����u+���+UE&&&��w���9s��ys�3-C�����B���������o�s��0��|���M��6lX��ott4.\���L���������o�]�_MM�6
AAA�a�pwwGhh("##����/�$������8��a___t��U��q��y�L�<�l�=��s�=�HU�����p�R��&�M���8::*f,��������#�k�.���R����l|���x��1`� �3-#%%E�
���[�G�"Q�����#G�V��g������].\� �^�
6������6���pL�0A=LDDDDd5��5������{�������Y�f���_��MyyyHIIQ�&sRW1�j��(�U�i��FU���3k�����)S��W_a��ARK���\|�����5���;vL��z�2j������}Hk"883g����������U���!C����DGG+f����K<n���N�/����/mrr2����Y�f!""���mG����o��&���c����|\\\���d'''�X����.��:�|
kpvv���#��W_a��IR�X����~@RR����l�nkk���P��A��m���!����l����a��YR+�����y�Q}�D-Y�<���[�c�����;^|�E)a�j�*dgg+�A��N���S�����/U�*+����/��f��%���y�&����Xi~�����8eU�@������ ��ys��ibb"+����[�E�"V~�:�������C�c%www��������4~��U,\�����p��i�\������ t���<�7n,�8`�|&�P^�z��
*e),,�~�+kk)9r$�����M�����bl��Q�������kV���<���u����q��%���srr���>*b�V��*V�oL���5i�Djm����+V(V��8;;K�2PGGG�"177��������^;z���������OJ *yzzJ���9sFjcZS���/^���&<<\<>q�rss QQQ��zzzVx�Ai;���g��NKK��_�%K��\uY]���x��g��~�EEE���r�b �������N������|||0s�L�F��'OV��sU=zTJj���VRv ���E}�����b""""���}������V�3Djj* �������?:v��ZI5���2���������Ym�������Q�FHOO $$$��(&&Fj�������7+V��U�:����>|�bE���?ur�����7V�^���h�ZDFFb��!R�����r��U
Fpp0bbb�v�Z)��g�4h�������O�>�����7��o�a�����T���R���\�>�iiiR��~�-�5Bhh(8 �P����"�<cN�}����k�^�JJJ��h�
������6T��:gJ�����������QUCi��G}$�~����?����������R���2%�ki�"Q����N'�p5'u�����U�d���0[�6??_�-]Z�0p�@l����X����N�`H�?�����T�C��;w.~��w�Y�F�o���>���� �����
QQQ�:x���������o��&M�H��+W��W/iLM���U�VR\[�7o.� p��m��+)))�����6l� ������S���{w�T���sDDDDD���V������D���������������*VPM5k�L�K+�+�\���h�>�.PVv���;wp��q�p�$%%���W�:^^^R\����}/_��U�V����a�e�r��9���qqq�Q�����1i�$���`���9�W-[�����().��s��������W1[{���%nF�oH�s������[Y�g��%"""�ZUZm��� ���?��O�J�V�i������#�|�9s�������%h]�2+**��D���mR�����o�Z��G����`���%$$`���"�����>xwA5������c�X�v���>���A�N�D�r/��C������kW)�d���
BDD�8�����s�N2D����������~�: C���/%pK���I��n��)fk���g����G��A��J?���x��W+���O?!)) �!!���]����{�J��p�#""""*e�[3�����L���!��XRR�%K�UQ����S<>y�$�\�����[�N�-�������k���,��U�D�X ����b�|� [[[>AAA��:t�Ty|���J?SE
��7�H-A��iS�����f�V���$%%!##C=,���uqq�bK�h4x�������][�{��Q^� `�����t�`��,]�T�ckk�GyD���8�;w���%���3gD\z���=z999"�����5��?�.%%%8x����J�����F\\�srrBhh�bQ���Z""""�uaaa���'