From ead744a112ef7fb47a2a264d69d17f70010fb840 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 3 Oct 2018 17:37:42 -0300 Subject: [PATCH] [FIX] Removing useless code for NFCe, adjusting xml template for NFCe --- pytrustnfe/nfe/__init__.py | 59 +-------- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 4 + setup.py | 2 +- tests/test_add_qr_code.py | 34 ----- tests/xml_com_qrcode.xml | 189 --------------------------- tests/xml_sem_qrcode.xml | 190 ---------------------------- 6 files changed, 9 insertions(+), 469 deletions(-) delete mode 100644 tests/test_add_qr_code.py delete mode 100644 tests/xml_com_qrcode.xml delete mode 100644 tests/xml_sem_qrcode.xml diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 9a0d068..0718821 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -4,13 +4,11 @@ import os -import hashlib -import binascii from lxml import etree from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe -from pytrustnfe.Servidores import localizar_url, localizar_qrcode +from pytrustnfe.Servidores import localizar_url from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key # Zeep @@ -38,54 +36,6 @@ def _generate_nfe_id(**kwargs): item['infNFe']['ide']['cDV'] = chave_nfe[len(chave_nfe) - 1:] -def _add_qrCode(xml, **kwargs): - xml = etree.fromstring(xml) - inf_nfe = kwargs['NFes'][0]['infNFe'] - nfe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") - infnfesupl = etree.Element('infNFeSupl') - qrcode = etree.Element('qrCode') - chave_nfe = inf_nfe['Id'][3:] - dh_emissao = binascii.hexlify(inf_nfe['ide']['dhEmi'].encode()).decode() - versao = '100' - ambiente = kwargs['ambiente'] - valor_total = inf_nfe['total']['vNF'] - dest_cpf = 'Inexistente' - dest = nfe.find(".//{http://www.portalfiscal.inf.br/nfe}dest") - - if inf_nfe.get('dest', False): - if inf_nfe['dest'].get('CPF', False): - dest_cpf = inf_nfe['dest']['CPF'] - dest = etree.Element('dest') - cpf = etree.Element('CPF') - cpf.text = dest_cpf - dest.append(cpf) - - icms_total = inf_nfe['total']['vICMS'] - dig_val = binascii.hexlify(xml.find( - ".//{http://www.w3.org/2000/09/xmldsig#}DigestValue").text.encode()).decode() - cid_token = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['cid_token'] - csc = kwargs['NFes'][0]['infNFe']['codigo_seguranca']['csc'] - - c_hash_QR_code = "chNFe={0}&nVersao={1}&tpAmb={2}&cDest={3}&dhEmi={4}&vNF\ -={5}&vICMS={6}&digVal={7}&cIdToken={8}{9}".\ - format(chave_nfe, versao, ambiente, dest_cpf, dh_emissao, - valor_total, icms_total, dig_val, cid_token, csc) - c_hash_QR_code = hashlib.sha1(c_hash_QR_code.encode()).hexdigest() - - QR_code_url = "?chNFe={0}&nVersao={1}&tpAmb={2}&{3}dhEmi={4}&vNF={5}&vICMS\ -={6}&digVal={7}&cIdToken={8}&cHashQRCode={9}".\ - format(chave_nfe, versao, ambiente, - 'cDest={}&'.format(dest_cpf) if dest_cpf != 'Inexistente' - else '', dh_emissao, valor_total, icms_total, dig_val, - cid_token, c_hash_QR_code) - qr_code_server = localizar_qrcode(kwargs['estado'], ambiente) - qrcode_text = qr_code_server + QR_code_url - qrcode.text = etree.CDATA(qrcode_text) - infnfesupl.append(qrcode) - nfe.insert(1, infnfesupl) - return etree.tostring(xml, encoding=str) - - def _render(certificado, method, sign, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') xmlElem_send = render_xml(path, '%s.xml' % method, True, **kwargs) @@ -107,9 +57,6 @@ def _render(certificado, method, sign, **kwargs): xml_send = signer.assina_xml( xmlElem_send, kwargs['manifesto']['identificador']) - if modelo == '65': - xml_send = _add_qrCode(xml_send, **kwargs) - else: xml_send = etree.tostring(xmlElem_send, encoding=str) return xml_send @@ -129,7 +76,9 @@ def _send(certificado, method, **kwargs): session.verify = False transport = Transport(session=session) - xml = etree.fromstring(xml_send) + parser = etree.XMLParser(strip_cdata=False) + xml = etree.fromstring(xml_send, parser=parser) + client = Client(base_url, transport=transport) port = next(iter(client.wsdl.port_types)) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index 1a616a0..e7d21d6 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -872,6 +872,10 @@ {% endif %} + + {{ NFe.infNFe.qrCode }} + {{ NFe.infNFe.urlChave }} + {% endfor %} diff --git a/setup.py b/setup.py index d596afb..cf468c1 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.11" +VERSION = "1.0.12" setup( diff --git a/tests/test_add_qr_code.py b/tests/test_add_qr_code.py deleted file mode 100644 index 77a24f4..0000000 --- a/tests/test_add_qr_code.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8-*- -# © 2016 Alessandro Fernandes Martini -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import unittest -# from lxml import etree -from pytrustnfe.nfe import _add_qrCode - - -class TestAddQRCode(unittest.TestCase): - def setUp(self): - self.xml_sem_qrcode = open('tests/xml_sem_qrcode.xml', 'r') - self.xml_com_qrcode = open('tests/xml_com_qrcode.xml', 'r') - dhEmi = '2016-11-09T16:03:25-00:00' - chave_nfe = 'NFe35161121332917000163650010000000011448875034' - ambiente = 2 - valor_total = '324.00' - icms_total = '61.56' - cid_token = '000001' - csc = '123456789' - estado = '35' - total = {'vNF': valor_total, 'vICMS': icms_total} - infnfe = {'ide': {'dhEmi': dhEmi}, 'Id': chave_nfe, 'total': total, - 'codigo_seguranca': {'cid_token': cid_token, 'csc': csc}} - infnfe = {'infNFe': infnfe} - self.kwargs = {} - self.kwargs['ambiente'] = ambiente - self.kwargs['estado'] = estado - self.kwargs['NFes'] = [infnfe] - - def test_add_qrCode(self): - xml_init = self.xml_sem_qrcode.read() - xml_end = _add_qrCode(xml_init, **self.kwargs) - self.assertEqual(xml_end, self.xml_com_qrcode.read()) diff --git a/tests/xml_com_qrcode.xml b/tests/xml_com_qrcode.xml deleted file mode 100644 index 22cf1ef..0000000 --- a/tests/xml_com_qrcode.xml +++ /dev/null @@ -1,189 +0,0 @@ - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - - \ No newline at end of file diff --git a/tests/xml_sem_qrcode.xml b/tests/xml_sem_qrcode.xml deleted file mode 100644 index 3352a22..0000000 --- a/tests/xml_sem_qrcode.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - 103 - 1 - - - - 35 - 44887503 - Venda POS - 0 - 65 - 1 - 1 - 2016-11-09T16:03:58-00:00 - 1 - 1 - 3550308 - 4 - 1 - 4 - 2 - 1 - 1 - 1 - 0 - Odoo Brasil 10 - - - 21332917000163 - LEL AMBIENTAL LTDA - EPP - Zell Ambiental - - Rua Padre João - 444 - Penha de França - 3550308 - São Paulo - SP - 03637000 - 1058 - Brasil - 3425323750 - - 244694180116 - 3 - - - - MISC - - NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL - 28431000 - 2806300 - 5101 - Unit(s - 18.0 - 18.00 - 324.00 - - Unit(s - 18.0 - 18.00 - 1 - - - 0.00 - - - 0 - 00 - 3 - 324.00 - 19.00 - 61.56 - - - - - 01 - 324.00 - 0.00 - 2.11 - - - - - 01 - 324.00 - 0.00 - 9.72 - - - - - - - 324.00 - 61.56 - 0.00 - 0.00 - 0.00 - 324.00 - 0.00 - 0.00 - 0.00 - 0.00 - 0.00 - 2.11 - 9.72 - 0.00 - 324.00 - 0.00 - - - - 9 - - - 01 - 324.00 - - - - - - - - - - - - - ffJZ+04jmHN3uLx08huykyBs2r4= - - - u42y8bBqNM336yc7r0+5YWiePmCerKu3cFcp2J+lmQzIK6snba7txyeBtwVos8jQxrYLsnfWtKb5P6FxmhDeqAB41o2aoSIcnxc0yxdFn2ZDTquwU+AurH6E4hGclz8D/5qapv2+g3y+VpXMZFNNCqZSm2vJpvXBmPEY/7oO2cPB13N7WDhDRmI9H4kRDsPuxeeJetr2Bf1ThGJ0EUA4DXC7My0kl/Bw0rYwoPDhoqhxinr9Wocw1UyQ1vprLF0JVHXOtSq39Uqfqmj5QUDwUvvh4YL9bFZ8lvZZ0CZDmILaFGvr1XH3CwJ2Ws3RLlb12Arj5OT4vS8ZKhJtr/dpfA== - - - MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 -MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj -cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD -VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw -OTIzNTk1OVowgekxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1AtQnJhc2lsMQsw -CQYDVQQIEwJTUDESMBAGA1UEBxQJU2FvIFBhdWxvMTYwNAYDVQQLFC1TZWNyZXRh -cmlhIGRhIFJlY2VpdGEgRmVkZXJhbCBkbyBCcmFzaWwgLSBSRkIxFjAUBgNVBAsU -DVJGQiBlLUNOUEogQTExJDAiBgNVBAsUG0F1dGVudGljYWRvIHBvciBBUiBTdW5z -aGluZTEuMCwGA1UEAxMlTEVaIEFNQklFTlRBTCBMVERBIEVQUDoyMTMzMjkxNzAw -MDE2MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEG6j0uXIvvHlMz -0IGzuY/vuFQncIoSE+cBUk0uq6J3dtmGAg4oaVWCHUfHbX9s2Ag1jIG+PFAo2dlt -sbLSEji74XhD+IpM/9aHm3ke8kb05ay+bYRuUjTNSwUbslT1+amAmIu7m1yPBi6u -v3+/Lj2I0g7VeBBAjv/TiBG0VRCURXvKrwWrv2Lpybo/yDnENGtRqQHihqeYFKin -nDzBsMbv4ripbi3XiAgcy/bF6NFgVMqxrNnGvSiSUhDRkmceVFIysRXUMke02Qo1 -Q5Ik1j1goUIHP44QOruXCMiT0yOK8u0qNAXR0yzSaWcBR2aJCeWgFg7sNbB50Qcx -c+2GKUECAwEAAaOCA1EwggNNMIG2BgNVHREEga4wgaugPQYFYEwBAwSgNAQyMTYw -NjE5ODYzNDEzNzgyODg2NTAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMzczU1NQU1Cg -IgYFYEwBAwKgGQQXTEVPTkFSRE8gREUgTElNQSBTQU5UT1OgGQYFYEwBAwOgEAQO -MjEzMzI5MTcwMDAxNjOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRJ3YWduZXJA -emVsbC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBQukerWbeWyWYLcOIUp -djQWVjzQPjAOBgNVHQ8BAf8EBAMCBeAwfwYDVR0gBHgwdjB0BgZgTAECAQwwajBo -BggrBgEFBQcCARZcaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9y -ZXBvc2l0b3Jpby9kcGMvQUNfQ2VydGlzaWduX1JGQi9EUENfQUNfQ2VydGlzaWdu -X1JGQi5wZGYwggEWBgNVHR8EggENMIIBCTBXoFWgU4ZRaHR0cDovL2ljcC1icmFz -aWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25S -RkJHNC9MYXRlc3RDUkwuY3JsMFagVKBShlBodHRwOi8vaWNwLWJyYXNpbC5vdXRy -YWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDQ2VydGlzaWduUkZCRzQvTGF0 -ZXN0Q1JMLmNybDBWoFSgUoZQaHR0cDovL3JlcG9zaXRvcmlvLmljcGJyYXNpbC5n -b3YuYnIvbGNyL0NlcnRpc2lnbi9BQ0NlcnRpc2lnblJGQkc0L0xhdGVzdENSTC5j -cmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMIGbBggrBgEFBQcBAQSB -jjCBizBfBggrBgEFBQcwAoZTaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv -bS5ici9yZXBvc2l0b3Jpby9jZXJ0aWZpY2Fkb3MvQUNfQ2VydGlzaWduX1JGQl9H -NC5wN2MwKAYIKwYBBQUHMAGGHGh0dHA6Ly9vY3NwLmNlcnRpc2lnbi5jb20uYnIw -DQYJKoZIhvcNAQELBQADggIBAFIUBrNIyC4kBap/7hCW63tQhA/WNnWDNYpKM5wN -zwApVV2bqFMJURzO/7AUrHu7uZS1p/Ubo+w2dFjmnmj5DniQkY85Sd6HNa1fukJY -PK13wcUMVHMjeevIAcxnYraNdN4BIz1Svl6A8leGFgIEuDUll7Td+R7+aA8N5JYQ -dFFIe2VxvJNbWP/WA49oI8U2wkoPTfOZtfrgKf2msHm3FnTfnmyOPhIf8L31iFt6 -MbKuFjOGIaWu+Z/gRDqj/EbFcEMUrDbeIYqz2724ZGBOJrkjHO7DBqXXoN9pzCTO -RB5+gILMEnMS7zFsCuLOtLVohxgYUzg8p4Fy3nsHEzb/7IDVOnKLfjh/c5GSTvOa -JT6qznYV2yav7NyuUSNUv+5bCIBNk45+qrQ8DwpsLBsFa+RLfCwvYVK95ad/xVgJ -QosPJuzW3t0fU/FWbc00sZWV6lgBPyWhdF8EodaRIWC+EOC2wJbODyw+vdX8pUxT -TUJKV2iAP8206gR2h07o2CZgXckJGJQ5MnBUbS78AaITXZ5JlPaS7ZdU9zWY3kD+ -j5YERs0+UweijKi5eHZioGRZRDZ2uksh1wrgeLFLWuiSNaPFYVVrQ/ZGo+E5uVNl -8FuoR6P9TZjx1/A4XjqLQ9yPoPWgIWe14Vh/76dVcgz3ElWMbmPCDoc/wX+FoHX1 -Fbux - - - - - -