From e5077443f7e08021ad23b937e2e98bcf13dcdf12 Mon Sep 17 00:00:00 2001 From: Camilo Sarmiento Date: Thu, 24 Sep 2020 18:34:59 -0500 Subject: [PATCH] add translation and report sale for channels --- __init__.py | 5 + locate/es.po | 639 ++++++++++++++++++++++ sale.py | 115 +++- sale.xml | 19 + sale_channels.ods | Bin 0 -> 16144 bytes view/sale_for_channel_start_view_form.xml | 17 + 6 files changed, 792 insertions(+), 3 deletions(-) create mode 100644 locate/es.po create mode 100644 sale_channels.ods create mode 100644 view/sale_for_channel_start_view_form.xml diff --git a/__init__.py b/__init__.py index 16869c3..22d638e 100644 --- a/__init__.py +++ b/__init__.py @@ -12,9 +12,14 @@ def register(): web_channel.SaleWebChannel, mercado_libre.MercadoLibre, sale.Sale, + sale.SaleForChannelStart, party.Party, product.Template, module='sale_web_channel', type_='model') Pool.register( sale.SaleUploadInvoice, + sale.SaleForChannel, module='sale_web_channel', type_='wizard') + Pool.register( + sale.SaleForChannelReport, + module='sale_web_channel', type_='report') diff --git a/locate/es.po b/locate/es.po new file mode 100644 index 0000000..c827b93 --- /dev/null +++ b/locate/es.po @@ -0,0 +1,639 @@ +# +msgid "" +msgstr "Content-Type: text/plain; charset=utf-8\n" + +msgctxt "error:sale.web_channel.mercado_libre:" +msgid "Product Not Found" +msgstr "" + +msgctxt "field:party.party,id_reference:" +msgid "ID Reference Api" +msgstr "" + +msgctxt "field:product.template,id_reference:" +msgid "ID Reference Api" +msgstr "" + +msgctxt "field:sale.sale,channel:" +msgid "channel" +msgstr "Canal" + +msgctxt "field:sale.sale,document_invoice:" +msgid "Document Invoice" +msgstr "" + +msgctxt "field:sale.sale,id_reference:" +msgid "Id Reference Api" +msgstr "" + +msgctxt "field:sale.sale,is_paymented:" +msgid "Is Paymented" +msgstr "" + +msgctxt "field:sale.sale,pack_id:" +msgid "Pack ID" +msgstr "" + +msgctxt "field:sale.sale,products_string:" +msgid "Products String" +msgstr "" + +msgctxt "field:sale.sale,tracking_number:" +msgid "Tracking Number" +msgstr "" + +msgctxt "field:sale.sale,uploaded_invoice:" +msgid "uploaded Invoice" +msgstr "" + +msgctxt "field:sale.web_channel,access_token:" +msgid "Access Token" +msgstr "" + +msgctxt "field:sale.web_channel,app_id:" +msgid "Application ID" +msgstr "" + +msgctxt "field:sale.web_channel,authorization_code:" +msgid "Authorization Code" +msgstr "" + +msgctxt "field:sale.web_channel,bonus_product:" +msgid "Bonus Product" +msgstr "" + +msgctxt "field:sale.web_channel,channel_name:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale.web_channel,create_date:" +msgid "Create Date" +msgstr "Fecha de Creación" + +msgctxt "field:sale.web_channel,create_uid:" +msgid "Create User" +msgstr "Usuario de creción" + +msgctxt "field:sale.web_channel,creation_time:" +msgid "Creation Time" +msgstr "" + +msgctxt "field:sale.web_channel,freight_product:" +msgid "Freight Product" +msgstr "" + +msgctxt "field:sale.web_channel,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale.web_channel,invoice_type:" +msgid "Type Invoice" +msgstr "Tipo de Factura" + +msgctxt "field:sale.web_channel,rec_name:" +msgid "Record Name" +msgstr "Nombre del registro" + +msgctxt "field:sale.web_channel,redirect_uri:" +msgid "Redirect URI" +msgstr "" + +msgctxt "field:sale.web_channel,refresh_token:" +msgid "Refresh Token" +msgstr "" + +msgctxt "field:sale.web_channel,report:" +msgid "Report" +msgstr "Reporte" + +msgctxt "field:sale.web_channel,secret_key:" +msgid "Secret Key" +msgstr "" + +msgctxt "field:sale.web_channel,state:" +msgid "State" +msgstr "Estado" + +msgctxt "field:sale.web_channel,status_token:" +msgid "Status Token" +msgstr "" + +msgctxt "field:sale.web_channel,write_date:" +msgid "Write Date" +msgstr "Modificado por Usuario" + +msgctxt "field:sale.web_channel,write_uid:" +msgid "Write User" +msgstr "Usuario modificación" + +msgctxt "field:sale.web_channel.mercado_libre,access_token:" +msgid "Access Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,app_id:" +msgid "Application ID" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,authorization_code:" +msgid "Authorization Code" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,bonus_product:" +msgid "Bonus Product" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,channel_name:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale.web_channel.mercado_libre,create_date:" +msgid "Create Date" +msgstr "Fecha de Creación" + +msgctxt "field:sale.web_channel.mercado_libre,create_uid:" +msgid "Create User" +msgstr "Usuario de creción" + +msgctxt "field:sale.web_channel.mercado_libre,creation_time:" +msgid "Creation Time" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,freight_product:" +msgid "Freight Product" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale.web_channel.mercado_libre,invoice_type:" +msgid "Type Invoice" +msgstr "Tipo de Factura" + +msgctxt "field:sale.web_channel.mercado_libre,rec_name:" +msgid "Record Name" +msgstr "Nombre del registro" + +msgctxt "field:sale.web_channel.mercado_libre,redirect_uri:" +msgid "Redirect URI" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,refresh_token:" +msgid "Refresh Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,report:" +msgid "Report" +msgstr "Reporte" + +msgctxt "field:sale.web_channel.mercado_libre,secret_key:" +msgid "Secret Key" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,state:" +msgid "State" +msgstr "Estado" + +msgctxt "field:sale.web_channel.mercado_libre,status_token:" +msgid "Status Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,write_date:" +msgid "Write Date" +msgstr "Modificado por Usuario" + +msgctxt "field:sale.web_channel.mercado_libre,write_uid:" +msgid "Write User" +msgstr "Usuario modificación" + +msgctxt "field:sale_web_channel.sale_for_channel.start,channels:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale_web_channel.sale_for_channel.start,end_date:" +msgid "End Date" +msgstr "Fin" + +msgctxt "field:sale_web_channel.sale_for_channel.start,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale_web_channel.sale_for_channel.start,include_canceled:" +msgid "Include Canceled" +msgstr "Incluir Canceladas" + +msgctxt "field:sale_web_channel.sale_for_channel.start,shop:" +msgid "Shop" +msgstr "Tienda" + +msgctxt "field:sale_web_channel.sale_for_channel.start,start_date:" +msgid "Start Date" +msgstr "Inicio" + +msgctxt "model:ir.action,name:act_sale_upload_invoice" +msgid "Sale Upload Invoice" +msgstr "" + +msgctxt "model:ir.action,name:act_sale_web_channel" +msgid "Channels" +msgstr "Canales" + +msgctxt "model:ir.action,name:sale_for_channel_report" +msgid "Sale For Channel" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.action,name:wizard_sale_for_channel" +msgid "Sale For Channel Report" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.ui.menu,name:menu_sale_for_channel" +msgid "Sale For Channel Report" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.ui.menu,name:menu_web_channel" +msgid "Channels" +msgstr "Canales" + +msgctxt "model:sale.web_channel,name:" +msgid "Web Channel" +msgstr "" + +msgctxt "model:sale.web_channel.mercado_libre,name:" +msgid "MercadoLibre" +msgstr "" + +msgctxt "model:sale_web_channel.sale_for_channel.start,name:" +msgid "Sale For Channel Start" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "$" +msgstr "$" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "%" +msgstr "%" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "(" +msgstr "(" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid ")" +msgstr ")" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "," +msgstr "," + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "-" +msgstr "-" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "/" +msgstr "/" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "/for" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "00/00/0000" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "00:00:00" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "???" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CAJA" +msgstr "CAJA" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CANAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CANALES:" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CLIENTE" +msgstr "CLIENTE" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "DESDE" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "HASTA" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "HORA" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "IMPUESTO" +msgstr "IMPUESTO" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "NUMERO" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "No" +msgstr "No" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "Página" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "REPORTE DE" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "SUBTOTAL (BASE)" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "SUCURSAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "TOTAL" +msgstr "TOTAL" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "TRYTON ERP" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "VENDEDOR" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "VENTA POR CANAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "channels" +msgstr "Canales" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "company" +msgstr "empresa" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "end_date" +msgstr "Fecha Final" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "for each='sale in records'" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.channel" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.create_date - datetime.timedelta(hours=5)" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.number" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.party.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.sale_device and sale.sale_device.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.salesman and sale.salesman.party.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.sequence" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.shop and sale.shop.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.tax_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.total_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.untaxed_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "shop" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "start_date" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "tax_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "total_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "untaxed_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "€" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "IFood" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Melhous" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Mercado Libre" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Rappi" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Computador" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Exportacion" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Factura por Contingencia DIAN" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Factura por Contingencia Facturador" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Manual" +msgstr "Manual" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Nota Crédito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Nota Débito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "POS" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Venta Electronica" +msgstr "" + +msgctxt "selection:sale.web_channel,state:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel,state:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "selection:sale.web_channel,state:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "selection:sale.web_channel,status_token:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel,status_token:" +msgid "Expired" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "IFood" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Melhous" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Mercado Libre" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Rappi" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Computador" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Exportacion" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Factura por Contingencia DIAN" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Factura por Contingencia Facturador" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Manual" +msgstr "Manual" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Nota Crédito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Nota Débito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "POS" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Venta Electronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "selection:sale.web_channel.mercado_libre,status_token:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel.mercado_libre,status_token:" +msgid "Expired" +msgstr "" + +msgctxt "view:sale.web_channel:" +msgid "Active" +msgstr "Activo" + +msgctxt "view:sale.web_channel:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "view:sale.web_channel:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "wizard_button:sale_web_channel.sale_for_channel,start,end:" +msgid "Cancel" +msgstr "Cancelar" + +msgctxt "wizard_button:sale_web_channel.sale_for_channel,start,print_:" +msgid "Print" +msgstr "Imprimir" diff --git a/sale.py b/sale.py index 4ac35f8..30bde8e 100644 --- a/sale.py +++ b/sale.py @@ -1,9 +1,12 @@ -from trytond.model import fields +from trytond.model import fields, ModelView from trytond.pool import PoolMeta, Pool from trytond.transaction import Transaction -from trytond.wizard import ( - Wizard, StateTransition) +from trytond.wizard import (Wizard, StateView, Button, StateReport, + StateTransition) +from trytond.report import Report +from trytond.transaction import Transaction +from trytond.pyson import Eval __all__ = ['Sale'] @@ -70,6 +73,112 @@ class SaleUploadInvoice(Wizard): return 'end' +class SaleForChannelStart(ModelView): + 'Sale For Channel Start' + __name__ = 'sale_web_channel.sale_for_channel.start' + company = fields.Many2One('company.company', 'Company', required=True) + shop = fields.Many2One('sale.shop', 'Shop', required=True, domain=[ + ('company', '=', Eval('company')) + ]) + channels = fields.Many2Many('sale.web_channel', None, None, 'Channel') + start_date = fields.Date('Start Date', required=True) + end_date = fields.Date('End Date', required=True) + include_canceled = fields.Boolean('Include Canceled') + + @staticmethod + def default_company(): + return Transaction().context.get('company') + + +class SaleForChannel(Wizard): + 'Sale For Channel' + __name__ = 'sale_web_channel.sale_for_channel' + start = StateView('sale_web_channel.sale_for_channel.start', + 'sale_web_channel.sale_for_channel_start_view_form', [ + Button('Cancel', 'end', 'tryton-cancel'), + Button('Print', 'print_', 'tryton-ok', default=True), + ]) + print_ = StateReport('sale_web_channel.sale_for_channel_report') + + def do_print_(self, action): + report_context = { + 'company': self.start.company.id, + 'company_name': self.start.company.rec_name, + 'shop': self.start.shop.id, + 'shop_name': self.start.shop.name, + 'channel': [], + 'start_date': self.start.start_date, + 'end_date': self.start.end_date, + 'include_canceled': self.start.include_canceled, + } + report_context['channels'] = [{'id': c.id, 'name': c.rec_name} for c in self.start.channels] + return action, report_context + + def transition_print_(self): + return 'end' + + +class SaleForChannelReport(Report): + 'Sale For Channel Report' + __name__ = 'sale_web_channel.sale_for_channel_report' + + @classmethod + def get_context(cls, records, data): + report_context = super(SaleForChannelReport, cls).get_context(records, data) + pool = Pool() + Sale = pool.get('sale.sale') + channel_ids = [c['id'] for c in data['channels']] + channel_names = [c['name'] for c in data['channels']] + shop_id = data['shop'] + shop_name = data['shop_name'] + company_name = data['company_name'] + + dom_sales = [ + ('shop', '=', shop_id), + ('sale_date', '>=', data['start_date']), + ('sale_date', '<=', data['end_date']), + ] + states_sale = ['processing', 'done'] + if data['include_canceled']: + states_sale.append('cancel') + dom_sales.append(('state', 'in', states_sale)) + + if channel_ids: + dom_sales.append( + ('channel', 'in', channel_ids) + ) + + sales = Sale.search(dom_sales, order=[('sale_date', 'DESC')]) + + untaxed_amount_ = [] + tax_amount_ = [] + total_amount_ = [] + total_amount_ = [] + sequence = 0 + + for sale in sales: + sequence += 1 + setattr(sale, 'sequence', sequence) + + if not hasattr(sale, 'sale_device'): + setattr(sale, 'sale_device', None) + + untaxed_amount_.append(sale.untaxed_amount) + tax_amount_.append(sale.tax_amount) + total_amount_.append(sale.total_amount) + + report_context['records'] = sales + report_context['total_amount'] = sum(total_amount_) + report_context['tax_amount'] = sum(tax_amount_) + report_context['untaxed_amount'] = sum(untaxed_amount_) + report_context['start_date'] = data['start_date'] + report_context['end_date'] = data['end_date'] + report_context['shop'] = shop_name + report_context['channels'] = ', '.join(channel_names) + report_context['company'] = company_name + return report_context + + # class Invoice(metaclass=PoolMeta): # __name__ = 'account.invoice' # salesman = fields.Many2One('company.employee', 'Salesman', diff --git a/sale.xml b/sale.xml index c2a2d3c..8a56988 100644 --- a/sale.xml +++ b/sale.xml @@ -38,5 +38,24 @@ this repository contains the full copyright notices and license terms. --> sale_pos_form + + Sale For Channel + + sale_web_channel.sale_for_channel_report + sale_web_channel/sale_channels.ods + + + sale_web_channel.sale_for_channel.start + form + sale_for_channel_start_view_form + + + Sale For Channel Report + sale_web_channel.sale_for_channel + + + + diff --git a/sale_channels.ods b/sale_channels.ods new file mode 100644 index 0000000000000000000000000000000000000000..da6abc9a788998cbfd7e5d6fadebd86289f2115f GIT binary patch literal 16144 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

@W zCVsdfKZne}75?WpG!2c#iz;|@S}zSPnBgYAl~M=^_#yBp1P$y~dai31nv*-O;B(yB5Do4xu{9

YvBpE)i8fJc#d|u*QobU?mVGxdC8ethRfsC-Ptv~ppQG$>GB zJ~{(S!VA0JsboRm0NR^$bc6}0^Coz&P6!lqKOBA(gN`s1G=rxqKKRV+^3;G%c_z~S z0i!lV13{l^GDZW6Olnn3*Z{v&30Y__(g`dp=gicq0klul1$0dD<`Dj=5J64t8p#8i zhWTsIDH_^u00`afKDK}_&1)k|vA*ouxx6I;t}e6>R{&xJH%n<+lqxzV7*Y)OZm8*> z)!cQM?NHP*rUG#@vysZ3JShV>wQ|cywycN_(cg?@m-rPHd5UT#F<)9fk9U7ghG_y( z`ljt?4I2!WBpnIi5FObjy9Gj*c$6qJM)NEl9G5BC6IPx#nO-G?k77swGUE zDh3W9jD&@YnB-DVs3(qm&H-l=1`Dj^^s^gPjM0f#Uv?<$z^!jSf{ zOB8>5%-Z0*HWlU0LnH3E2=e_1ix{(I)V2&pIptTIB915@H4%dp!^r8Zy*YNax161H z%p+U@>osRmdy_)JnT9exKB`_)+fjNZof~=5IvI&=$IzaB-h{De!tzNm5D!3I9-3X_ zo0Bg`C(dyf2ZkJAel1<%K6wC{DP81S8#9i`3Eh>~O~;@cH$AZi1q0Y#Ay!{_J~2%{3r&l-Szo<+X3Vez7G+HcO)v#L^vP=f*0%y{relV zo?IMyFl=S*TUb8M%{TrEn3}BbwE3{di4lHsZOQdel7oXWlVW%&*tt5}Wg_L46t8V{ zjl+BfP8WVq^oj&qp~3962T0L$pjWk`HQUf&OCF@_S%OHhQ+&bEfzd`nVIxp_wiQ9x z(ekC{3=G5~Z-YDHE{%xaanNjs2+N%oQnvfo$x;d*{=Bjm+6a-aTf>*fZ37w{oGOwEYtPv_=s?8`?zdHzna*Y3I6zT&4J#znMBbGaD*Fk z#JiuL{;6StH*AIv>oGnKvz7wZ!tLs5P_TrVIy|blGv`OWCfX0BD{E>BO z=rTUp2JB0~%Zs zxYZHX8nit$iM}6sv}zE2*US5O%T82Inx}E?Nzrf1$3k|_1w;B#yMp{lP=iRNvrSOh zo7AIy`CwBQfO$(n`V#VN`=JLsL7BJ>OW+ah^Jp7Tl^uyFv`s;LGcA&xD5}7d8b1cS z8RZ;igAwDqNZ(NKX`EYgFeDalOZ{i4N1OEmGOSkRG&`}l)JFYvz&$;wSY05=gpnOB z6#?;t6C}ZeBnMer%zOS;EW)(V)yRnKR8v$Z~eN{Zj1zWpnoN3#D%4WN(Hoi{!PF8J7N{a>#wAQ75Qnz zrA6rem!S5_)hUUSvgo8o@xMtWKCcZ~t}Ofrj*$Jsi?F?>uOsGD?W6D7wLLL-0Tqhz zg7e1N%}PqQs(D0O2@(p>dOnKvUV@5mKdz(peR@;meVW;9s1n7vQBZJXXkluX(+9j5 z2pbAuFupKMG{ry~jH2`o68%~FlbdX#;#&ww8xeJwzGyr(9-r!=d?Bi3!}n}1u(_*f z37jS2kUZ}ZB@Tt{!!yGD8><7SX1qpcXTN5<3(iYv&AsD5CxH<>@(Mxv zlrgo(bPo{d;pQVYi-<1~G+)GrcF|ybPxgf}2jTM$ii=aQOV`3nHDMUur)x|j7DZ{e zi|#%{Cdwx-t9_S!+p#Gx(&Nw6@s|E00ljvWDCrS2S)XsTj^BXrXIFof+Tw@bUR+{f|Ki^{yWj5>Uz>lWHvZ0pU3qdgwtPa)!#z<8iBu}`~!FOzq$KAyXgNnpnqnr{&N@q z6Q|{GaQ@6>{b!tCT-M)m^*1>G$!z^+q+i_D-$M85#lO1i|HpLwPv8HU#`$Z%@VA(~ zg8lEr^2&Vu!@++i}d+dtv{Er|4K{$7QNR@_ixJKU-kaH z + +

+