From 8981bc3c18cf1d4ac78f9bed367d38b54fdb81b7 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 10 Apr 2017 11:04:14 +0200 Subject: [PATCH] new module pos_margin --- pos_margin/README.rst | 79 ++++++++++++++++++ pos_margin/__init__.py | 2 + pos_margin/__manifest__.py | 22 +++++ pos_margin/i18n/es.po | 50 +++++++++++ pos_margin/i18n/fr.po | 49 +++++++++++ pos_margin/i18n/it.po | 47 +++++++++++ pos_margin/i18n/nl_NL.po | 48 +++++++++++ pos_margin/i18n/pos_margin.pot | 41 +++++++++ pos_margin/models/__init__.py | 3 + pos_margin/models/pos_order.py | 25 ++++++ pos_margin/models/pos_order_line.py | 33 ++++++++ .../static/description/pos_order_form.png | Bin 0 -> 28285 bytes pos_margin/views/view_pos_order.xml | 25 ++++++ 13 files changed, 424 insertions(+) create mode 100644 pos_margin/README.rst create mode 100644 pos_margin/__init__.py create mode 100644 pos_margin/__manifest__.py create mode 100644 pos_margin/i18n/es.po create mode 100644 pos_margin/i18n/fr.po create mode 100644 pos_margin/i18n/it.po create mode 100644 pos_margin/i18n/nl_NL.po create mode 100644 pos_margin/i18n/pos_margin.pot create mode 100644 pos_margin/models/__init__.py create mode 100644 pos_margin/models/pos_order.py create mode 100644 pos_margin/models/pos_order_line.py create mode 100644 pos_margin/static/description/pos_order_form.png create mode 100644 pos_margin/views/view_pos_order.xml diff --git a/pos_margin/README.rst b/pos_margin/README.rst new file mode 100644 index 00000000..4554966c --- /dev/null +++ b/pos_margin/README.rst @@ -0,0 +1,79 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=================== +Margin on PoS order +=================== + +This module extends the functionality of point of sale to support margin on +pos orders. + +This gives the profitability by calculating the difference between the Unit +Price and Cost Price. + + +Usage +===== + +To use this module, you need to: + +#. Go to 'Point Of Sale' / 'Daily Operations' / 'Orders' +#. Open an order + +.. figure:: ./pos_margin/static/description/pos_order_form.png + :width: 800px + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/184/8.0 + + +Technical information +===================== + +This module is highly inspired from the module 'Sale Order Margin', by Odoo SA. + +Known issues / Roadmap +====================== + +* include extra reporting, using the new margin field. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Sylvain LE GAL (https://twitter.com/legalsylvain) + +Funders +------- + +The development of this module has been financially supported by: + +* GRAP, Groupement Régional Alimentaire de Proximité (www.grap.coop) + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. + diff --git a/pos_margin/__init__.py b/pos_margin/__init__.py new file mode 100644 index 00000000..402ac47e --- /dev/null +++ b/pos_margin/__init__.py @@ -0,0 +1,2 @@ +# -#- coding: utf-8 -#- +from . import models diff --git a/pos_margin/__manifest__.py b/pos_margin/__manifest__.py new file mode 100644 index 00000000..7569aaa5 --- /dev/null +++ b/pos_margin/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'POS Margin', + 'version': '10.0.1.0.0', + 'category': 'Point Of Sale', + 'sequence': 1, + 'author': "GRAP," + "Odoo Community Association (OCA)", + 'summary': 'Margin on PoS Order', + 'license': 'AGPL-3', + 'depends': [ + 'point_of_sale', + ], + 'data': [ + 'views/view_pos_order.xml', + ], + 'installable': True, +} diff --git a/pos_margin/i18n/es.po b/pos_margin/i18n/es.po new file mode 100644 index 00000000..8ab92724 --- /dev/null +++ b/pos_margin/i18n/es.po @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# OCA Transbot , 2017 +# enjolras , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-01 02:01+0000\n" +"PO-Revision-Date: 2018-03-01 02:01+0000\n" +"Last-Translator: enjolras , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Precio de coste" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" +"Indica el beneficio calculando la diferencia entre el precio unitario y el " +"precio de coste." + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "Líneas del punto de venta" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Margen" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Pedidos del TPV" diff --git a/pos_margin/i18n/fr.po b/pos_margin/i18n/fr.po new file mode 100644 index 00000000..b982c082 --- /dev/null +++ b/pos_margin/i18n/fr.po @@ -0,0 +1,49 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-25 02:39+0000\n" +"PO-Revision-Date: 2017-04-25 02:39+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Prix de revient" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" +"Il donne la rentabilité en calculant la différence entre le prix unitaire et " +"le prix de revient." + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "Lignes de Points de Vente" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "" diff --git a/pos_margin/i18n/it.po b/pos_margin/i18n/it.po new file mode 100644 index 00000000..69a4ed67 --- /dev/null +++ b/pos_margin/i18n/it.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# Francesco Fresta , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-01 02:01+0000\n" +"PO-Revision-Date: 2018-03-01 02:01+0000\n" +"Last-Translator: Francesco Fresta , 2018\n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Margine" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Punto di riordino" diff --git a/pos_margin/i18n/nl_NL.po b/pos_margin/i18n/nl_NL.po new file mode 100644 index 00000000..6d8cd895 --- /dev/null +++ b/pos_margin/i18n/nl_NL.po @@ -0,0 +1,48 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-30 02:44+0000\n" +"PO-Revision-Date: 2017-05-30 02:44+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Kostprijs" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Kassaorders" diff --git a/pos_margin/i18n/pos_margin.pot b/pos_margin/i18n/pos_margin.pot new file mode 100644 index 00000000..b91d0ddb --- /dev/null +++ b/pos_margin/i18n/pos_margin.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "It gives profitability by calculating the difference between the Unit Price and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "" + diff --git a/pos_margin/models/__init__.py b/pos_margin/models/__init__.py new file mode 100644 index 00000000..83e74821 --- /dev/null +++ b/pos_margin/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import pos_order +from . import pos_order_line diff --git a/pos_margin/models/pos_order.py b/pos_margin/models/pos_order.py new file mode 100644 index 00000000..824da0b2 --- /dev/null +++ b/pos_margin/models/pos_order.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +import openerp.addons.decimal_precision as dp + + +class PosOrder(models.Model): + _inherit = 'pos.order' + + # Columns Section + margin = fields.Float( + 'Margin', compute='_compute_margin', store=True, + digits=dp.get_precision('Product Price'), + help="It gives profitability by calculating the difference between" + " the Unit Price and the cost price.") + + # Compute Section + @api.multi + @api.depends('lines.margin') + def _compute_margin(self): + for order in self: + order.margin = sum(order.mapped('lines.margin')) diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py new file mode 100644 index 00000000..ac18dece --- /dev/null +++ b/pos_margin/models/pos_order_line.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +import openerp.addons.decimal_precision as dp + + +class PosOrderLine(models.Model): + _inherit = 'pos.order.line' + + # Columns Section + margin = fields.Float( + 'Margin', compute='_compute_multi_margin', store=True, + multi='multi_margin', digits=dp.get_precision('Product Price')) + + purchase_price = fields.Float( + 'Cost Price', compute='_compute_multi_margin', store=True, + multi='multi_margin', digits=dp.get_precision('Product Price')) + + # Compute Section + @api.multi + @api.depends('product_id', 'qty', 'price_subtotal') + def _compute_multi_margin(self): + for line in self: + if not line.product_id: + line.purchase_price = 0 + line.margin = 0 + else: + line.purchase_price = line.product_id.standard_price + line.margin = line.price_subtotal - ( + line.product_id.standard_price * line.qty) diff --git a/pos_margin/static/description/pos_order_form.png b/pos_margin/static/description/pos_order_form.png new file mode 100644 index 0000000000000000000000000000000000000000..392b816a6e3800f6ab2e4f18e3e619f0d4380519 GIT binary patch literal 28285 zcmcG#1yEek^DYR%LXZjW5Ih8z;1UuvSbzix?!leGhXfB6+#x}OyUXA@xa;5q*FlGw zCHd8V_wCl(s@?am*HyP}-8<)WpE=h3ov&~B2UU5zXOz!SP*Cs`6=XC}P|%*DprGbH z#e94dCe26mctdx6tN8Khqxe2G4|{yZc2dxFMM1&u`Fo)zvg1=dzNB!I)p65wv~&ZS zxLBZAIXK!|aJrhgSXel?esOd=K?6&opu9j)l#%}EnQ^${=k{^C?Hbt-mnz4CNKsE2 zkKe0Mj8@rDG{wIBk@0o|uj&cO07K>bPXd%{0Uwxf5*UclIm5&~1E0P3s+8_Yr|qCZ z_xc@c_JUI}_(ObY+_dGNu~bdI4^}$nJP`DYd$X<|=zNNv&(?P9NXvzNP7bV3ns)Av z{f^pBP$-`h{1w#W!^0Jq=YXtnKj`XwV|4J|^pnm&T1fA`_r(~J9xTHj^ z<*@;isQV4F4o3eA20qLuI{e{U8cl<*BzzJ(yHQCo+ZZH&ot1%0)pu3c)juXV_{;}4 zUa)oa`EX)VL2N~&5z?2m7m|RteQ6)jh3u(Xluz^o4-`Jl@ zQnwfxAC}fp|91Pv8J_3K?|)C=!QmBRrIn=ab2Pjl&9X5yrKqOH+6ENYY83{QZp?{M z+uQBtI9(HD7_z6v(=uvF2{5?mHNL((%DZ%%oYGXR_I6G>G4ABYxtU*C*d`>nz1q7W zK?l+gYbS2@51j_HlV?+-28^BY;$#_g#!5sC(p5*FZSi~TZ!d3tl0oA4p?{9?I7lZA+6(91T=c&_shKJg7EKK9_U}&_o3B4c>)*IdcWoVcs)G# z;lo}h`AoXH*BJk+^)BGg&Ee&i?Crr%S4#X*l>LhhHDPw3gRt6Ttv?NTisDH^xo2X! z!|T19DZsU-w|d2cOtKs3*6_GJ z|C6D%`*cRgP`@Y*DtS*WFITn+W07iAxrgH1S6JTHwEh{|gq@K|*|Nu2K6t_$lDMHg z^etFmw(ryO7X!oZU*u$3*ry^BuQs(cVuppBhU+iXH5)^=Z!r>D;N*}q^XM@%xJ3o= zoiKbuVTZ>0E;V(XeU`Ut}1h*cXE1K+47#%37k zv=vumQN~lq>#w0jH8sL@y8g0~DBh&|PYDY$n3=jtWe0|5n<~`PU!be>(hW_!5fUeo zU1vKdc-s(^LC&wJYyAv=E3Ik!&YnSmHY*zYl$xvC-H!8OmUL4fpU-p4Nn?a7+RmV3 zh>tzjQjK{Kh1{FpecjV8+9N^UA>)JJW^bZ!5;&l2G%3?F9zph7LTljaHP~|Yv)G8) zbp834IMpM1Qt<{%?Gy1;Z=~PssA_k-R0MPAvVFnSX9Uere?=>8vi+LUQh7lDh7!Js zmm9q;6xwm%rTCEx6swY)DYM?EZpL7}uctDE6pazY#41breV1_i+c%5CTC<$EzXe2zq@r zc{ixiVa!}7M0{M{E}Zf!>3n5oesYudwMdrDGwt)``NIz99}-Dq4b(W)@~iLQ9y1=) zl0Pkl#w4p!x?;FX?_F8Axbj$1lwV^+lk?fh`Ob*Fykz0^*QXRzV#0pc$KUg@FPiU~ zguD9-Js%(6&6v)WWDBPVggoc;O?jqXF4ST4OL!0Nn)~|e0$zv7k2@pT%37cKuwz*| zVoLgyf;b6r0w#h+EW1{-&Ij;_s*$!I_3A^IL+$d?@HmC=ufS{FpS*(JHxQH*1$qe_ z^&in`S`Qg7oB4%BhP~js<#m~iOz=DWDQGTQwhOKDhrd5q-<&_s=C|9piU6yX)n!fu z4WjggJyn(?!Zbsd1LOEaolLsA;jv}HO0(Q|ak`7U ze9KFay-LNt=Blk}c--UqJAluTvhTT<=jYT)CLtoUdip(Kt>a(bzHg0R#oj+%DzV3< zaHI#9I={ZAPvVdYdhN(oJI!abx`VPaS04I;J(0ElzI6 zqgx{rJs3wzy4_MO5`(cy*9+3ozfK0IYDM!J7s$LBEcIM@v(+mi@lor(62EH0kuh`j z+_7N9A3k(oLY2{fu~#3lS3m2KgloA)!spS+Ppp5#VacSlftKiy6y1OsIv3$HQWII` z_VsmEZGT^Uyk$3ePN~cNfm6WqSn(95S8P(%kAIj%8GqDbWn@T2wL@9XGTzHU1yMQA z@!>G1c@hsh_QSzX$c%Z@0t&ez$e%XXPVThncX?^29Sth6gE!^^b$t0N&dNPw^GmiP|E_aj-O!ss*fXvqpd;IBPmY(}|w0`OcY z@>#OM*5-V{Yhk`DR!uU%7G=w$FDHa?CIu$rn^_+o>Qq@j-xi+SjZZdi7EZylTPQ`gor{0YGpj`pM9Y43R}smY#?+%- z^szV37N@jBIR-z$Hh&$U5@1`KqbCP{X-PY3ZETIJEpp^#>;4XQ5lY9GH?=MWPPzFS z0^~{(2QJT)v&=jF%!!7{S_6RVdRxrw83@6H8 z4Lnf~)+oL<+0G<8*ii9hq?FlKRrp1dy}CCp=K6B3puu>S%g0N0vOb<9(PO#jL_IGf z&CH}S^5WvvD{CG~R4IRM`U~>(t1bkTtShfZXcU4n#7>q5A$}f`+vRO zIw|jo!bl$pYN+!e#wD2l#;O)YhQ;4*^Gtsb9i*)+2lwYzi9hr5Bj=FA)o$b%Fc?@w zW05OU7{@bqIa+!4P!G;f874F93~g!7a496iZ5yN@dH2qLtvH}<&F_5J_9e#`N^0`Q z_Bb;8JS+C%GpFMg`uy8}>fy{~wo&eEC{ib~HsuR62iZ0$&XpcLCcU1vUHa;GK5*1` z)`Hm#b@^zo{`dtzPjqTXa~=xHp+Cb zS-lh4fH!D1xt?8P+>)s{ICv*NJJArAw~Yb;*K2(( z(gag#jMar?3&k;&WS^r2&vT~c35n#JDU*+}j{#U_^%M|`zRzq;2Q!)zZna@A=@|*C zzD{Iseqe4thzniTkz<$&F)mt`_JYxSO!x4M7u~9B`+Py=cHrf+LFkqG_^@4AMKY{T zFCN8W;wJB5_$B%{F&AR6W~G*%rL0&8e|D=~h(@#azuRPqss>!I_?4(2`K z`G*bHQs;br$L=M_7hL?s_k|K@+a*W+OWEL<{pa?;MJJQ80(j%m>)KXQ4LyT_{?K%g z10N*``BN0UH-QRPcS}&j?A3cKN&6H@)3@EA%rB2}Q@nmXB`>t4N;k!`vpq&NDj*<` zaX(ywm)j3N2?1x=e!1D7+QVaX0ZpCWrgk)EBj+wd2;TJzz;_&XDJfOq+TB4D+(N$o z<-dNd_sHWB$wBOH4wr+K+ih;X426ZHW@lR8z(Hg7H((>dLF6)&(m!4-$D~UvTgcb_ zSh+hHoV~>3-Lo8`25$atf%jKfDG?_@1b9;*x>HB~^ zi#d1!4rv_x(($F*n0Il|aRF(lNL%nesX?J%)3X1-y=pDhvZ2!Ky-`;P1@^D|{SW1` zQnb}&zQR`=R)baYx=a0X<}&Q|WF|pj^pLC*i|rvV@us1OPU?4ydBMsnLh+uWQsKR-Xp6%rO!8-HgXyEH}vTt?NO zkoXU9b!qwEhEM-rKrXQdGgZ@YeGLl;Oa7ICC$DjJ-=vQx{$@>FmHq*t;fI>w@Xd4Q zzOkK$d}|r~3SSu+2PH`xd`D9i1nSTcS1TsJ`q`lP<-DgHvysKv5xd#hn3Z!!%4i%O zzXFe8I$=bZ!tS3(jMq=sTh7Vb4?ZZMDD&o76vU@G z$buyp7--gWy@y>R(;E^^Tc|XB2^Fj4^tZ7FvSGLpfH@BjR9TrVmdSPYr^jZ&!l)Og z!5lPnROF>CIJ)q+k~3Ul4uoNL;+l2;4>TAa`?(lcVR~EeZeGHlM>bZ}hR-WEF8pa7 z#CG>XCu+tSMda|atpitINLu2F>rZhfL5>0-sYty1ME{fa{nwG1&1h=A_#(403oaeu zbHrn7tqaPkEe>-cTg{@~?fKx{fWkd1plS52q|~5)02YSQ&j(RN1)l$a<^}OVy|9499Y{N&~xNaU0aEF{GhvDJ7y8NL8^}yjM<9|4&Wkx z?*x{C*11_n)#+%ZyE^D%A2xj&aZa=0aVvUKh11T_mB+DpF>oMX`z zcTXg$u%<@G22CM%nawp;N)nJRDe1O>5df#XDuX*B(s)w_+q${+VsPxotHo<`X^%K# zq-694@pib(Kef|@ncl?ZN2)#54|J!ydu>KW?D_)vT%>?e*$;t|$8FLbi5@v!>9-*~ zE4t~0c*r-GshyS5n?L^_@o9>5DZ32P*G@!D(kOu2UpO`7?X#h_l#NgxFMZrlt+M=% z<6h$U!Mp`8bD1af{+f;BbF3<+8s?~a#ZxKByO(yE^UDkj4bAviPYdSFA@gU4I*=#O zcX@@(vCq@{A{+R>9o!TP@!GCx>Cb+Yi>_H;tV(VAi(nz&uZ&xj{&y1q{BYHlT8ge~RaxRdF+QMTj_PYq?$JKJM=FQbqjw z@rf>zS@Z$bKgk`iQ|X#Rrn0)LgCstZM+;2l~ z{{Us}HdvK!s)~3UE;2-2(oU}0>AL5T?-2WAMfWiRSu{R?jNco;+hF*pcuEG{^x3^T zXrn?(!EADKsWhE_;xy_leov%6SP;RA zDkHP?-A(unPv6ezojCig*fU}MA7il+Q8`eK z?pPSKwSOo#vpdYmqvvmA5<*J1uWP1fvFepZ2>WyNfDL zx;3tW{?`-MIUvE53@k2O85JGx%kB0PztA}?x}9r3EdFKRG_ZI3yP?f%XCx3!oA&s7 z1gp;tMg79q`Rjs?R0pK>do_2)d>=A+GgMhktf@7Z zxi0lU=Dmyozej`ntb;D(eP{sU#vKu4PJOgSDu@x) zA6=E$9a2q!C>fn6**7+C3)e5|SEc0V8PHJ6{vzj2gK;^e?>dS?+Q{UsH95CFMp)|5 zq&98W#(Y#t$Ym~?}Bt@GXRe6 zYlTB;cDC@&h!-pi&*U>2mn9pYztAa-0#Wi(pe-4KshGDyF0$9TK{wy;!jQ>fJi=xT zt_%zziq}ToNsFg#p8lryRA3|=_Z@9hC~pD;~BW(v%5G9Ull)ctn#@YnB1daRopn_}`l~oR; zleLC5=j3P~2LoOUtJiRH+N5B3()P2VFA$K1j_pu9Tzp2!5N^#F6=u62rAIYv!E1sZ zDfiA;BA$8NhzfUP(lzu(1zUBzCZC{W?TyS<+8?KYwfS?7F?$!2Vcnrg4k|e%4r^VJ zX;R|KuH%A5912S`W2T2&ugGeO&fT2mYD{oGfF%^|oeL?L@-{p#A?^rWsZwpnyfr$mucSa`1j=M^8BafjVRMbFV;Pkl_vl-ozD)y(Xz%oq!Z4M^;6C!?d&B64tQt#Id-tL62G)TBZG_Ob&3!6) z2h|ligpqhEoCc+<3wPP?x;IwZ6M&ZB{Tl|#ZsEozgl9Nsv%-Ba*Tnt7u_uzx)vnOK zQt7uN`je?|{=5Y1`XyOi#Qj;9QYk7FLr&yc6I$KCbH{Efr^f)a$NjZ^RB2;Dz+dgF zYJTyb4h}|%X4^6W&%`#@a{18q;!m19L)v5!CiLgOC0tTgjy+vKmVIvwB5aHbXv>}^ z%F7QC4P2kwGiP?hb>_wDr8Li|BBohyh1s$cY+kYhH~NRx&i3XxBq7utx~)OF;Nz%4 z=P*W4(Qsc6>NCQ4$>`wtxT;_skHJBDB})DzRSTz9Y@bei59)Km#I)|#e6>Bk3wth( z9Cp$O?1+ncsG8D7&3E+RqJei;o9=8q+)=pdh;avOFfypLKhgXF z_H$($yZ?DkSsp)mxZl3}>?p132{~H%IU{w^rE&O}`D9nVvTAg|06m0!j;f?n$-2?g@bdBPH*Uzf};tW6_Uc%j1p) z97Y64?4VX-`6p))K-X^jwG;d_hO#{atXTc&#%ABa8FT5R9HSBmv2J;GL^_z|nh|I$v_FLCarEe@Bvm87vqgm39U#Cdvs+a;YukWfkeY6v zF$?;EJFQOy{LJU`$R?svbe}6@s6tA~8UfN=1ioluGZ2AIWTzEQ<&|-6EtDeRX|B&^#=c8s`c~)SqDRd8;3rW0>2X+j}uO-Db~8_S*W7S zH7yf>ZXjTFr(-Jocz2MGVYiMITBI_IqeYVXF0`z=a~MSfn=>C z;JhjCwkF{3Wj*IJqrMJX`$PFMKYSi$gtOPX{}g9MK5s5_%dP&)Zz^d&-zxaYul^YJ zlERi48nSV;pNske{=-c!xBs_zOtSp&f9TIJf#n}Pn*84ZnIGnZr7m*>{;{bOB>!7k z)t86w1&b>xcC(RiR>|y`ySqDEgMy{EIy&TXxv@ScZON6D>^7EvTM|okjQ zxH-aMrP-jNYejY0L1=e0laY_Fx+daZXH6F4puP<~k^Ws$vU%Kc(!PVyY_Q^Yy>jE* z{tw27g(5ktff@?WBIFzrg|91BP=Q~Eff8F%IL^^jlC=25Ii(OIFH>deq zcBCaJs;+wSF+^#nw#RgHOAe;3vU`dhJcH^SiuIjWDe;VeBF?I`^|EY_h%wl;)ZLo* ztPK8KJs6r>;xP>R26}8J76U8&dbPUfvLQdSg!FW|=jx*vLiz3Aax=WO_g6X4lD}>4 zJ*<0R)x#C$L*g(5H;l$Mo`u4o zuVMje429b0AJj7YJJ${L7V2*e?T99MfFA1(&aqONGO8NG(zfJ66O}DZ-T;#A!b%Cj z%!%ujjC^tJrc8r=yGYfi6sC`pdq8EUFDr{bH7x8YF6ko!@5#ZMN>hWs{(FRBvL(~X z>J#6-I%E1QZSGjt9L4rZ=Xs)@@W!QSHA}3BWK2e_LgbATakIG6?fx+o=~7UBYL@^cqpSI8u$@{a4iukPf^E@nt8>O6CPOHm+BIG!cUj^8+XCI zk>=c?a~zg4$1eK*XgfFb%2^Uw0>gOrRXbhX*Z=@7X15Q^sj;O%sNhGJVlF&aPl>Ga zHakw??-!R|eQfYgPxoBeWX=$zU@;vBt)nzd8e+(h}G$CD{x^&9+yc%BhVqh_+^FVrkcuR|AOpSoA*&U09Wl0w+&8c_dd3 z*4i_w^0HnvLj0@hXnboI3nr*R+}Yi$u9eoz>2&FkKlfcl68=AqTE5>bNsXOlIzS8O zesb^;L4L-#{8j`uWeLV)x2xsq{<&RW=9FK#&yf1n}i=G|$ zZi)RY-KLmUr~nqgHL4HQjEzc^>8f(e~N(U zSIz9hoL0feEU8vNG%}S4_EklV=ANHc@748d{G9!^MCz-8IDS7&wgc#2Gy>t+4E_WOlM7Jc{ zdG>VD#pUK#5mk{H6_!swunP8t91xw^7ileWiE|%$gn_>=mQTM#8k^9|C=pXtwoMRF)XEoY-e`p^abVgat@J{fMX7H*>*`=usCBn8QQ#CIQj z63R|Ur1v+K(|H4{QZ0uX+WUWL&Q+PbeU`ffsPXLa$T(^lYRYRaOSr`%|4nTck8 z+?Vw_@g$nQ7@aY7YYE(TB*=`m$~OsbOMNeG9mK7Y9y#7l(4(_B`hm_7z-&ex50n}l zT1jN`#BsjPg5=>+5xnX8J%|f^zztm-fI1uF%v5crW}0+Ax%4{pvg}{f%Qic{*l_Zq z7yMd!OEqvQJDv(;oj&x8O7;-AT@!;^t!)A(`EkPLr)8!HH7Y#r?BW-BsOn^O!5Zs#OC9uSz2U0+Z*?P(L^Jr@Nj0f?eGmN#s#`UpT+s ztZ7CEUz@!}eqjg*3z8O((;1!ZW+lIT(b0A}cqn_#(~;Bx7{T~hE2vRYv6-DE`p25_ z=xpz@7;uuozY>+PM0znE;~*h7ZTD}E|IX`7t!j0jsVUNW1c|6!}6rXT|6mT@Uvf(joed|$Md+FwH%rH zcnQR?*44D8j>KcTFIymfq#x@L5)d@atc*h^erGU4)BunPUP=`m4o*1*OdMWI6gtCD zvUldjFX)VWZ1~qJ&Ng5^Rr94PmkFo-sU6h zzDq?GwD5<>VC+gNJBO?ETerI)rmWD4U`9lZZ9AIDdJtAjWaXN)#zE2c<2jp7-I`{z zfWHR>X6eJC(o%Tq^*Ct>mB$qVLx&!pYmH? zY@;PKo27eI3_u2|;uU#9r5~IHxtH8cl)SIP3moRMZ@-yM%SyeyB#F%KVr2M3c>6*# zU3{T%)%BTLN^0d@?i+HGBjKEViNfC}w~TVpM`Hut03+Y#)RB{!DZhP2x7l~LU5t>F z5qiq)X{$p{!0!Fd=HcCR=azK+xKUPL@ULqnpV~r|?x$d(j0+>r-@$!Uvj=Ax#f*n6 z8m#UlE4-xvda5qF^~XKB}BS7;q;aYEJ=*)x}S8STIxfpIoTJS*9nS46mVDho<&cuT{MZ*GiJYw65?5+ zrHn4)%dQK?x3Q(6UaiXbgyDhPi3*Ovxfb;q);fdZl)QAC-oP<5Xk4HLd8_;R`K>`f zp5z~f&)#A9I+x=+`WaV}I2;6))u$Zwy2}*G8BI)iF%aH4XIpVENx6Q|(+=IekzUoy z94kCZ+ci`(*lesgzTukPJ;{N8q=9u-8Sh5#>>up^w!J-hyS}gH{NwZ z$4ZY)c*5rcF6<|IY2py5os7tYl= z-5o@xEj;{Z6DD>B;K)1HLViALCaH%dEswI#5WzLE*l=8L@fyvsn_1sW(FiG<+dc64 zeCb3AzK3?;{Q*&>9-h>x}~F|#m7X|jb@S^kC|Ng7>|aEFa@jTgYuS}yMqd` z7V^g+H~bid5~cliCta265%52XTawrbt}@poG2{PN*zvQnUi-1EHCXI;x~Z^a<|ix8 zcLi1rZm$0{`d@=~54Xx6em6I4vzb1Q&A2)K~MU%K?QyGBZblfHbwbtD%y^2uUI=0f>X&pj;SPtpMWEkpyOe)nlG z!0|aiSFq;HbA)yz1)E>@%0%Qy!qhL(k%vVrePVcs8_Mcdt9CGOH+Pfb$}muFy!Ulx=rPE|2rJj>~7;TI1F&; zEG}VBsn#!YYrJsRu{PxQqXC#k!7oZ{=A^_}|4VIrxFtqNsDV+zF~W?>b+`SUdLo%^ zh5zLNRp6ke?1Y$W>M94%t)P?UXLLW!(oBONR}<|mrY4yNC1c0uM zj4%t2Ju&bZw;h)$5Rd&f*q#+W1>6Xy>Q14(U(njxvYQj8%{o_NDe(3J4(We~2Y|!K zT-Fn{&0a1T1@V_lHFe|KIn*!r{|4O>>9zBWU*`i;Q_ay&q<6&6C`lybPVe?vE8R_9 z@7~VNJTdeMYwlz}C?s-hRqhHAmQzbrjU(vjtj8X!J~Joj#itAJi~1@~#LCmzoNa&A z4oOvv_ci5tvN{Ct@^Lr*d3>@M*z>hXd03_Q8$f%{a#aVM{A^bjSAvk@w1?Q`Uav`C zU9`vV#|%{rnmVqZ1wqqUK}UaYM9Pf~w(JRMd^+Fr_)VhOid9JG_xOz0DdDOVLqtT? z*woR6hd$7qs1auB>ziM;#C|obJj_dw`lYr96kJ7>q2qkF1$09$(V;%T;U%4oqx$IV z;wx;;0nq^N9?8>BTsXH6CkOj$KzQ84R)OcH|L7HY=eQ>$tI&NXp{%k#btB}%{&p!; z>9%hqgGMy;qf&%m^(AwQqxR16in8pLn})LX>hf`M;3J_wo~)ZdHGka*sJ1(9p$5|Q zzZ2i7U)+3anngG}<{S0!$xwO1kAmO+8Jd0haJ_tFN!=At-|`{6^7{P2ez?H;xT}h8 zgnPEF?~NH7_jWr(9khvb{gG;Bl)L}dXrF8QCwDM*RHn^uvn@*}pOcn@$D=oyJPOAd z!|1!OJ=j}c9IrmKH8sG5YLqD+r*37(V9J>YJuzKC^G~WdPvCpurP_l7{tQ*q`3S zAkai#3xCi)%h6%F59>;%JyVQ-lrZiM)BE<%OQc#($`;i~-fWP|^&3&w z>1q^K`LBr1j_k$s8bEBPpyo!w$tkGsDAG(fJO||rvu?ROjMnDUYMR3~Lx@A7$=^$r zM8rk8>bi})Ej2*%m6`C5)U-P^KSvi@9DTND2M&mi_ep+fxbpAU6Ra!=0u=x3|A{)! z6PJ>%#C?qg$rO%lqB6J~8etx7ONM=76PNhoVpS8>gZKW|!2+RVX>+rOP%o1Srns1q z*~HS)O00}6>qYqG303g5CxPRrZ=lPG#bP&A@dLMk)X-`) z;;OndFE0(16)WccwCTObF_x3Y#^t&z=_U$>gscG_Xv~|Nqn`a z!0Y-J(a1*R)xX!X7o7K!-4Z1*{P#m~QAfSiHel)L+81^Q_A}lzt<>DuZGeJWAVR|jyvZqeu?X1cc>`|jcs}}t zs%JUs!C7S4xXR>p)2;caVNM^Ur^cVf?CR5NFdr7VnMRem%#1Wvd%_KSySG^+MR&D` z#Qe>=|NCpltv~I37(2qWqYoHO4`SnEm*kx}vTDZN{Q*KQsV(5Jk!>O`k$f*7&#O=e zUkuzNOLsqcz=V$SsFdvSzpy9^8b-sRuwY-8CvH2#`-&}&wKH;?KNeo zwZbpQV{A6fsl(w^@vvZ#D+ogcHMULoT&^OaHX=;dmh|{Zi;L@XPV0SY5QG~_v?jmp~Vg9oo^JLwO z=uIV<#+zr zm|{3GFU_9xP)J0&)u8f>J1$aJ=SHr%npC)~H{|KVusJoCQ8s@6EH>r$Ibt&xitbqH zElItw!M4g}tu+3DeY*AvxS?d7A#Zg21UF>_vsIO~FYgze&xevl8-v*gY5{9!(5g_) zKT+EGacg9k{&xts^G$c9N1yB@FhLRojVN=<43CyR(^L;eKdwKnM));S^kQM56(Rgk zs1nqcekLEa7H;xT)x3PjeixvT95Y?Nn^c!>wj^Nb;9){l6DHejN6yKchffsq4Q{{j$#leT9|K9)cDY`OF1OZLIEvEIr&G%6Owuoj+()#oJ>_NyxFr zehK>qlw3m#==s`{+M(T)y{V2y6}S_fROPySb$=}SmmeBQ)kqcoMK-l6K7>f_*Px`4 zPnd}M+D8Q1L5NeE_52C%eoHVKX8|!tc&lxNEuXH8aenI;KzENAu`6|Qb^^(ZilfP) zeH9tLXRk7FF>UNUmp)6`2#GZney^xb@Vs}5rpe7WKav-h#<;*dJ08dqZE2;C%c4!v zFA+c=OHiaGim+=Qo<3SkrnW^A^w|5x7Xx=H2U5SU-xz)`hWDs=egjeQqPPx9zOO%G zw0uK6nlo}(@vX<`(rSFh(r#}oh=7jgA#l?!BWoDZBkb)I_x%~GzxSz=1L!!0ZwmNO zlHkh|nk<19ewJ8$@te*&(%3D7;A9o(b(^_KzVW!$9dQM+5)T%;BlkQUrBFa3=}?_M zL%3&jvgW!tPKaS71wr5hl;O=w$F{O|x*U9Uzy6?QEPFrX5~;UTYN_SVXUY9o^*e!n zbBGz@ewDR4a-uvLv-yTpq1pTJD#vc?Ftf-yXFqUgJmSjW47Yc&L25RNs>pj+*X8<} zfp=(r{`fIgzzy4f=G7*WMf$_Oq;BhNH#&XaIi`hwg!(2jNf^iUSw_&B`k zy^0|1yIxt7*D_Oy4B~Gt17wtMD#;f1cwY!LW|!J0Rb8wg?vL*#RE8K_un#(#O8qUK zpl#%I=*r5@DB`Mz<9ar7TaHO;ow$E>e?FCUEDPw?Eq?#%vm1&YAx@m zlx}V;UEaRk^U2!K@H1NTO))BwKi^F{xJh}f*6KV9LSj=`lg_TVLnql6!%8+@%9kvs zY+~}P=gTT9^L=Gbw2tua>~>~3ya!g-^eBCV@FVSaDyT7)4OSERx*5C`#Knm;8r0sy;P`(1cXEBKh1buM5$Q z;9<+b_WwnP(yFl+K5gxV_-@Q}OtF2#P079IGwqTI=`|{G6?TwJ6-*L}k>@vAvBhmp zL(FQARZ2ywm z15NBfeHVU~R9$1v$i39Y;j@WtD(>Uubu3rR6F<+5F?9x*pNqX0qBKI+T#v~)8Ap&8 zOaA(@TLO6v9?eMw|Fqdj|2V!%w*N?F4w85Gz?M?x7q*|r+77%$Hl^=@F!UC)bVlk~ z%e}tJw7)L*3mETA9&5Z(#lC$TK9Rrl`$2@so@mLxWf6s)LB}E@( zt?k>sbX(HAzr;Fmf@h{eir#m+`GRWpWaX6pkm(0`r$!M#kf!DyZ9`U1LV(IR>{bG*_9QaOEPE;Y^g-V?_wp) zLlqRz8&B(0H6Ca@yZ=@6v2X{!={9Ww=2~iJpap46{by0yt2*D>mAe$=H5~Z|j2Hop zSM0R-Y=9B$4=cB%XIqJ|Zs6qx=eD%jCb91c8bVSsNq8yLKjpZ z1-(V{Q;R!0A68cBa}5u8w8T@0`CyEUfuSi@JN|J)h* z2&o?d{C;P_gDxwsZMgSP#!w2#A1!f2lsWo48-nkS8W9@<(7jwExbjMcucKwSqkmDh zibTiWHF$i?pI@@yBOod`;8A_0@>LM0^;@X^ZLp*`v@D)ZwS~3#Aqs&wthn^?(~dO* zcEUrkVXQWyjA;*W8|Qz0Z3SCD z$!}gWI)H|zUkX+Ds@<6x?jnzc7#NKiH>IsRaKf;LIcV+c+{6!UZ@;v_I!|tEBCZ|I zlFok$$UT2-6H4RL$C-eFqW{+%3JTYgCx35bsDEc;Kt#abhYr}JhBi4Bm0pxLijEna zi~CWZ0A3w((m_dnsf=zBzR>H_ARN&&vX{Utg@uX|5NubxBEPhLG88xAfig=pCjD2- zDf$0Qwd|X}zpXL6_e`1wj#)csX& z59227YYygq>9{Cpwiv`dXkkt-#C`B*J}@-fj{k1;KCOLk=uNWd6hDZiB=1)iSKVt_ z68kj7LRv)Gd;d2QRrqz&l8l@*&di|&WoEmHDG#fHb!0gw03Ql_k!F$= z(JaSb#f3{~9sJteC6R~2i`9;q5k5c>EGfin6A0PvibP24 zj%sI%kr_F<{4zzq;PI zUb8Z{KgPsyKVCl9g(aU<{FXO)eWQW#xyIL#Iuo<<^__BeX7*=qL6!RNq4g2fE0aaz z`mk_v&0c}LId<(;eq+MKE%C(wdwa_cHzBGAT4iRYf1bQGqZO9V<2=Op!k&LYAh^bw zQgi{jvI9uN$F(X=h;aiH=6QA*KD>IJ=+qWZ~ zTlvi#6)R-%bU?<* ziBGM!&#=UX`N06nC94f)elL$!%+}cE*(22@;t(ROr9D~mndKehOZco;21B5f_&Kf)#uA{17hGc2W1U+&YtNVR_2tkE!b&68q&Z6pQ5`H&mzN0zKZ^7;znG{i z`B|evIlx`sK7CG&hCfLSLtN0A;={KD%xHuyI2CCcEB*;V2}!im1`8uqaq^yK(Ic8i z-yQjYYWr|DjTtgx&!a=Cr!~mjzWXHF@*+wFA+J!f^NAA_k_Zg@SUwcu;%`>-F7GPu z_VR@!oFeOr@3KEe?z(J2hq4Vy^??`+H4D;+4e(w5D8tLkgg%5B9aIoaDZ8mde_y;j zc@dz*D0RWVv4s4 z8t2OZ>5r2(%;5B(8OKlKXOoWQdvMmj;)9A@=iw0a?D*zoG*%dSHKLV!gLZ~FuU{;D zz2cw?>KHD=5*mDl$#eq494*qLCUOrgw%xuu_)0?CZ9rfvd#^`JV6+~*7C z^ui^t)-@WI)`Qxj-jCjxOIz6~`EwJaC<8INA~P}selIiH;BTW-g?U9!QkpIL%CV{8{Ar1FM@+_YTw^kPK!C7e^&!7 z(oqiO?Znjz69NZB`&X}(NfXw(xE5yCYQp*_KarSkV=o1L7ej1tn{8OqJ5RK%AEMvT z+jxJYMVRE%j8PB$gH((uF;i)Naq&n=n`?=SG-MA`^>SLy-h^S=M)IqBsFf8-O^#+J z9-7#Vqs$qWic4fWxAQR}c@)FOh(Xplt^x9q%4>EEIdhT-3dKhN^qlK^wWC#6DsB%} z3N@IIgQZ|%>za8K;mp zYj8&8-_WCjXt?&_S(L(QuuQUXUJGR2&H@`%WzDBdqBAPHQfMkVij$10xxs_kBT&+_ z#$NN#YL6f53I2UL;^n9yWJPqXoVST1Faw!X5PMXw821%a^l+DYX~f>XUkjrl@uW71 z>3OnUxQ%cYS{`=nhptvk{ks#0Lx+*|<}U@7J4`2ob*kt+heTY_x0YtCGRTE1=MGfA9?kfXg)o&Z+11t=2_PAyz>?^$zB}%^AHIWDmF1Ai+ z>JFG#*d1h`t6S{xR7822-w(ZU&8EGlQo9SbhbaT3JU5$r`1=`ck(hyTA(I&`9hiS5 zuA&5N6oG%$D!ot%45|*oY=7@}pTuXMGSulY_NkQUc#~%%o@45j|vs+*r-JoJ!|0iFtE+idbe8#Lq+L^Da-1c+p=b);<>|0dNeD{BM0sY#H4#gGk0 z*%K8=DeW@@3#4n>&=%*wwGr8{4?`J-+vb1Oa_TUjOYEAa(z5tQeQ1tit=sja(O}bJ z$y88^fA(~27|z*#=vy5kzcHY)U${ge$~sl{wkc&WKUKD8oVdFi&N^u^*o(L2z4!_^ z10OWJT<9l~H(^bzbw!72;f}9g%jzUgT{kD$T`;H^>${kxxf1U9^q}|<{(e(#f*o-) zq+i=V;F_Uojd0=+q{UVR@>oVvy2=$ipzS^_=ZYY99|1f?Xk)w!ns)RE<^ri;W{pDI> zWVd#$3Keo|w~qb@35;juzH70CX}T?FFh>W! zvCaJG8x5c)p~%<3$HWA=I&7g3tZpMNMbh(%1i9;Z-$=Pc2@WKW*KI3FIhQ?aPpIw_ zlAw`9nvu@DNjSi9JETyxtbp>+(Zb9znq78r0d8L16=k+C!-u-@k9>B8s@d@eYRPcXoD?( zmhk436WG)YBNGIb&_RW2U|;2WW$rDJ6Gck{-RiU%591um0Z4J2aXa970cxtdosd}* zwbhZ>b-FHIW;v~!zGxE||H({?l+LaMwp1i~OKI+x%~dnH4o`tzFEk2I_2B-qKyEvD%kPuZ0PGBdPVg>OM%PPQNLd2;p93SFrV z{ZT%gU%ur*y*4ekLR05~oR4bwv&iz$IGYAU}CHB8@O|1wa-({c^RRdI1 z8e2!I7|M)~(VX3AayYZTv8b2r1G7DTQ6XS0qt(#>dHS5j?QvR;-i@(r^rs%mTIv{F_pD@%|dtU`lKwNcfr!MGGa(Jkdtp6C={*~GBOd+l^G)1#K*hdIK91Ep_!c@l!!P)^Idbb9mV610mPA#~Km7`UdYVpynO5X){o?z;L?G;M)5s6#(?C7VNyzbya(MsMmVjHgpf?qX>JsxUz*g$T9rv$5zEHX=5e4)19(b!qfxb%%qn1K)xF~HG#?I z;|*B*&&8a4&*8e*87~cg-+Sm?_2Xt24FLjNVnhP^BL+tcoWS>jW{ldH z4^s2=MggA%L5^UHjhcByvw5(lPW3U;mAYa(*wa1?szwn5=LH#kI+&Z{1nG53HV1ywKA}fzgc};@B-e6PB(zA0jh=%_)OqR6 z-qT+4^Nt=X+<$i_IhyC#k(h101C-H5TpvVeNXohL`X#-yaKl!R6L{ z##mzP>bSP*%aL}hQi`z%(r}^Y#b)q(oWnO}o8;#uX@^=$M99}7QHVw@B`D8?a;GR* ziiIUg=V$3RwNDE(&2#k|PR&9Jkb`%E4$1Goy|dG%rSL-f?z3&cw6^5&VY(5|b2P9L z3`iIh)VDYBtCG#dzl`i`0|64RP$+{1PL=9tW#MGuKaBO$2Xfl||0}4YrU%r?=1mM- zy93j0d%2tk{NnEnQNM{Zb$npik5m}O63TMlPi@b@o>T_=sLZ*U{@H8#zlC48b4nZ! z8E2AP<#y-^oq=cFZ^%($)@S#_QzZ}Sgu9Es^Nh$4zE!mm-00et#yRS}DLJ#-#qFd5 zm%C41cg6kgnwXpU20J#RG%%`KnyZ7B@pZO$xcy|LWDTON$DK(@nTH1SyeO?tTB-!R z^kALjp7!}n{FeTv@2|k%ic`b*;JvBIx(q(<$!N!zt*@nU< zK5(+3(kFBI+S#$v^_4?VC2qQJ$~OE!&_U8~#^xpfQaz>wC;Ry9sy0r$?;OHkU9{-* zMsr-?%~}^N^PHO=^bpidCFIC?q-K&RKlpYMlz}lq+u?LXR_JJYx0x%{dod72KF#NnxU5 z+V0guvjM1!)1X>;UYo%BW$kjEXh6cqF@14Q_E~Td=kKl>M~aUlN<@Vq0fk|7>4E*# zcdjh&z+Hzsr^erm2{dB5p5F5irJiw1TJPMd&BFtM5ya2~q*Cg|K!Z1GxqhIwOWCK5 zvS<5VB#lNdudbHRY_Z6Wl5gB%vk{@H#wz)`Vg>hs5{XbFjQo^!nqZJF3}aylwR&(V z8*9BDdAP89lg1N&CBdnZo&@S@Y}MqyZPQ{)qadUTe~hL9Gk;sYNNRs#!&-B&AChcL z^*rCNT~OkpC&H8E>eNi~qsh?W`Zs@j%S&Aq5Ue`LLC!;QACcj4q5?)s0sI;M38Q?V z{>gRLqszynytQ8*C;A`eX7M{Ghxr?hzAHQ37MFy5OeM$buwXpX+WPtt<{=k8DJEG{_|TLavR3B`-CwlMRBQ@C4IMe_cx11biSW!t)?P4Y zbNek|_)6Q$0=8u&_(F{z1l?)7XBw+0eLH;3tmg4UHjp+bR3vhTF6T^P^^&#qV+ z|J!z5JW+u2iB8D?9%UOI4pRa0_>uR%ol=F!H+=@g)e& zHc9NG^B?~$w5=0<;yrsScm*$O|E@A^%kT}ldMf?0{r;&%!M?bD@%|4H`TrC)|NmP} zS`zWZvvI>gj=8Urtx@&c%N>77)oCROYq1><3;gE(h=#v3uAtl6)PGsze~Ib^G!lolq{-K*jFXtw@ZW2Jew+ba+4Tz|Eftr@`k~>q;$DoFo?a z9yP-YZXl`OTh^A@4o{zftJg2eYx!Jh^L~XOuwQ%rmg|Gm)SSt;THtGVTd(i2i(oEx z;z@sIm0nV-EQJlP@UIl?k8Qp*qUKpFi~v(pdcJHKLAx7q!;5LW8KBLL*vQgtdvxRV zf|=@8XmwCs#>woSm&GPA5~!GN<|_S_N4(wx7Oc{D{04gX{43!X!vJ&`6y9u0J-skQ zhFv6^aS#AMoYNu|n#4_b3vodW021L}}-oh0Y}t6D#Wxh!|Mg)3M*3|ifV zcA0kS*C)f_GZ8RHE>b;Sl!peGo;(DDmu>D_?FcbjoG&p_379D?+0yXmGj{#vOCYu6T( z3Qr#1LKIR4>G?&n3|fWZ2*%Bk{bUcD|HBVD%Mw0BFaNH#Y_3k%7Oo8ru|UO%w3VzS z--!1sM2JwNv6gzGiPzXxWR-i0z~oW%20e|Ana#o98_Lm;KJRC31^r&t#n<>^O-_?y zLC_wn`7QF&c;h;&Bg{46lQghSHm9@--kR{3ep94M(8zV1kM|mcCqDQbTz(e5?SJmx z9kvt<-#OlIs2HNv1_9w*dmMa29S&GkoLHzY_&_=8+;KqQNJf$bRQycRRX>rj0`dM1 zllJoH)`5QSyQzl>IMpENP7;%(;Wu&LsVjkNr2-%lAC#Aj4%U*XKekcemJ3i~zI^?u zobu&cb;Te1$yi%73dVQI8Cdo{y;|OVHG)&aq_*gqP9OUvN4&>N;tVxLSjVx&^ zH=Ke8HoqEtr0_E&Y6;qB_oZL6|7e)RPBdd)cGUW97ANR)ahB`w-l7m`E{5O$U79SR zq{u+r@#3*rSL5i9s2M&`jGiOd9B>uAD%_x)9Tlh#zk+e;4y>o6~03{wrvbkJlbKw}jN^Xifi?>My z_c9MVNx~-;XwMh!GTw^Wd*~pP5~jQ=p{-PTo$n@yO*ei2FVDIW)t@}=QCf~j{0|B; z(8@7Gd6|@LWYBsdsKZ1yt17aEMuMiCGeaf8eVX>Uamk*)vT-2a=}{ZBg7(tLrfY$B_?*=m_Z_$?Aa zV(Vnllo7Vqa;4SVxQ_jG1P%`QV!cdxtzVWb()oYR;{U6*{?!x5?JXQHaG-DiuYPv) zZ}r$d$aRqS6V#3`yh_k1g>0%l+RhBA0;ks{k*>=AxLa{s$80Cv4tvY%ZfeXjU`(+8 zKD4@{@;*`uE@;#ksAGGEMJ-px9c)dw1}yn%Qv2C_!2ZVHYE^`| z@9a1u4o2aZF+&3*5hi`|tm93@vKnMU%@5?8eEA*ZLc!k_UlQ?o%Rt4NN_Ke27kZ zg&EW&f1l{1Ke=qs^`cb>a_uaxA!^wGO((8g`?7nx!20cXeec&LK`eBz8gXapY25wG z!E}lmFgW;ux~oealv}_B7ccmrPY+Rjf0b&8|I0NMRkunyu`|V^e)*L8Wz_+3q5x$i zH}A8a#1r%o?B%Bk(usJ98rzyv!<0CPNl|T#05J3xE^NDKksxOO>(2GZwLd^r8pTL;4(p9 zeyIC!2eH|)d+Na_WV>*!Y#2aqA!qZZvI~}{LGDF=pKz4sJG4@zZR?4-<0=~u$GC|y z1w$F;10%}Cuq0md?rGhbZIcL73Kl#UQ{R7L?7A*RFU7FMeB&n}Uw-4>Ry8Il}m zyKdaLFRo%g#nsg#w#bk1kiNQBazkW`IJGIM_NY+4<+O5~d&s7qYR9a$(UVZijeFC* zPpA%e<~XCO#1!o5jPzvB;KIp8T88BZl7yb6$isG9Lg@Y~1O3!(gK1w`29~Zl-aJ12 zp0&={G<2=c+x$q!U2qd>)?Uvts!Sc;AT<3sR@lY!#3zeKvr7^c%Z@w-SCG$|@VUXH_-2W&AuIV%@InWirvtq7-WYSe>Jl-^(zc}ouMSU%ie!sR*~jBnC3#g!XGZ5D zU`3j7I7oZ@$ya??@hYX$?ye@EguCjWy#?931V2~GF31aQ%<;jLzJKcsH|=buPTHo* zdNCy%Sc9RaBEt<%h zov1i<+^XUpE4hV`t%7N^u-wS40LqzWR#)MncYW!360(`H*`bN0G+I6wqF zgP;YH18gnIB)B)QKSE;K|LkWhBXnvq2ACnTK3|Sz8-_AcsQjCUgLKtm_R6|hmCjp})LIy+MC7G$ZN7hY|I(|? zl+DMbj3{hRY$8&t(rGItrcJ)YwI{`0FRmy8>&x|d62eZ>1h7`@QvLOnL-WEbNb^oc zmwolOwm;%fu)k_02Cr%*Tw%kv2^5=Ok&fx85H;1>KL$931hUo-xJbwSG-E%3g*2e9 z;AJB_bo78LQM}&t&Eb6vBArt%CBW=^QKYsY$fdGn5N~<+r%(BotBvG#@oKMi`@mV@ zUwg}bp}WOf|F=8Mq$P2Xx!j{1gB&L%**J0L*)Oz6Xo>$*_iN|Xvfv9?Hgw_R_!}<% z{=3@|tB4&|u*p7szhK?}36jw{d4#Ugz#Dt*bnLa|c4wYBDj8otwrMlRcsV2sF&l}~ zP6C7lOP)5Gh<{ZI9lp(Od@&D3O-4HMN#hJrzge~sCLkH6x#nH1tKy%}8c`NduiJmZ z8_W9!H(HACB5Ls#uK`-PbH{kWXr?3bHH1G9Mr@Fg`?iQ1t3{eXli;;ELh6^}_yziU zrWID1xhg0Tvz7x5J5=$w`juZ@No>Zw=@V4@?^?B(j{3>)*J^+Ww*HcmsK;ZY>(UQ6|gKz^elw`+Z znhZ`64a^v%(E3OZOvk<*viFe8lTx_Jdu{71wb6{X3H!DGJjAq^@ysy=+UfG;Jq?)A zShXm7v#vl#GX%LV(9apY1MGL1S?&e58)rWp(Vk;Zq4hyn_?_$Z#||;&j5@JyD3rJs z_q!Lj`x(1wHUhDt$lJcUb6<0Q8w=JtgM$mq0p+xa@OVNm7h3{03W?4wLB`B{# z53NadDVE*+;Sg%W-UU()mDKak3VlbFJ6vdBGkzKOZK=JK(pKv3`mRPaP~+lqHQRnA zi&jb-R$FV8fcnxzuVgD$;Y==NL&P9Z_+)-95!jn^nL^{wmZpRR7wkN77P!&h+6dRI!ZUcksoTRy%;Uc1)^fkl z$67gx%8nnr)mVcB+>ohH9=degvO&^)-tes~0+0KOUQtD6ZR^#Ts#i88i}m>D2UnKA#p0LtGsxoXeDiHzh$wXatg^0aUF%N7wTX zH|2e$s}TSIx#HO)OqNOQnx{$!2;FC|_p)Baq*sTul8KZxgC^hIC564I?X|sK>{|5R z%y#uo-79#VWx(!NE8~cDQ`KsZQS*D#s)|jDV^gz=drAz0dGc<{#;EG{Nrq6k$yUzx zbU^n;Lwxt{U+iZ3v)R|i_jcY?)GfVPQQe&uOQEbSW$x`Dx6;VwJ6UWY=(GWxzdah= zXPgEX=)-;}`^bAaF54-!I@B!HQ-?Yz(X{b_vUIsZoEJ#T5A`M93kS!19s24kYKI15 zOfo;(xsBu=WatB!FAMCYGD(SvCo=oW*Y}0X+r7^Y)MMwAMjR+?+mnJgs1E}irKe^w zr{GOWmnd>huElW8ggNkw1d8w646$i&y=iZ!h{leG7IE32omd22%pf)6Cylo~zZ(n$zjdfkFLB0 zrX4$C5bzUzagb3hqb<*FW|-RliV9q~aF?wkIKKE0e;zsh-jTek`c!rCTvC-`&i+*` Mb^ZH + + + + + + pos.order + + + + + + + + + + + + + +