Adding signatures & signature checking for client scripts

This commit is contained in:
Adolfo Gómez García 2017-03-08 15:23:37 +01:00
parent 88fb4ce1b7
commit 0b928476d1
27 changed files with 92 additions and 11 deletions

View File

@ -1 +1 @@
2.1.0
2.5.0

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2014 Virtual Cable S.L.
# Copyright (c) 2014-2017 Virtual Cable S.L.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
@ -46,6 +46,8 @@ import webbrowser
from UDSWindow import Ui_MainWindow
OLD_METHOD_VERSION = '2.1.0'
class RetryException(Exception):
pass
@ -57,6 +59,7 @@ class UDSClient(QtGui.QMainWindow):
animTimer = None
anim = 0
animInverted = False
serverVersion = 'X.Y.Z' # Will be overwriten on getVersion
def __init__(self):
QtGui.QMainWindow.__init__(self)
@ -146,6 +149,8 @@ class UDSClient(QtGui.QMainWindow):
webbrowser.open(data['result']['downloadUrl'])
self.closeWindow()
return
self.serverVersion = data['result']['requiredVersion']
self.getTransportData()
except RetryException as e:
@ -172,7 +177,19 @@ class UDSClient(QtGui.QMainWindow):
try:
self.processError(data)
params = None
if self.serverVersion <= OLD_METHOD_VERSION:
script = data['result'].decode('base64').decode('bz2')
else:
res = data['result']
# We have three elements on result:
# * Script
# * Signature
# * Script data
# We test that the Script has correct signature, and them execute it with the parameters
script, signature, params = res['script'].decode('base64').decode('bz2'), res['signature'], res['params'].decode('base64').decode('bz2')
self.stopAnim()
@ -182,7 +199,7 @@ class UDSClient(QtGui.QMainWindow):
QtCore.QTimer.singleShot(3000, self.endScript)
self.hide()
six.exec_(script, globals(), {'parent': self})
six.exec_(script, globals(), {'parent': self, 'params': params})
except RetryException as e:
self.ui.info.setText(six.text_type(e) + ', retrying access...')

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2014 Virtual Cable S.L.
# Copyright (c) 2014-2017 Virtual Cable S.L.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
@ -34,11 +34,11 @@ from __future__ import unicode_literals
# On centos, old six release does not includes byte2int, nor six.PY2
import six
VERSION = '2.1.0'
VERSION = '2.5.0'
__title__ = 'udclient'
__version__ = VERSION
__build__ = 0x010750
__build__ = 0x010760
__author__ = 'Adolfo Gómez'
__license__ = "BSD 3-clause"
__copyright__ = "Copyright 2014-2015 VirtualCable S.L.U."
__copyright__ = "Copyright 2014-2017 VirtualCable S.L.U."

View File

@ -32,6 +32,12 @@
'''
from __future__ import unicode_literals
# For signature checking
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64decode
import tempfile
import string
import random
@ -42,15 +48,32 @@ import six
import sys
import time
from log import logger
_unlinkFiles = []
_tasksToWait = []
_execBeforeExit = []
sys_fs_enc = sys.getfilesystemencoding() or 'mbcs'
# Public key for scripts
PUBLIC_KEY = '''-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuNURlGjBpqbglkTTg2lh
dU5qPbg9Q+RofoDDucGfrbY0pjB9ULgWXUetUWDZhFG241tNeKw+aYFTEorK5P+g
ud7h9KfyJ6huhzln9eyDu3k+kjKUIB1PLtA3lZLZnBx7nmrHRody1u5lRaLVplsb
FmcnptwYD+3jtJ2eK9ih935DYAkYS4vJFi2FO+npUQdYBZHPG/KwXLjP4oGOuZp0
pCTLiCXWGjqh2GWsTECby2upGS/ZNZ1r4Ymp4V2A6DZnN0C0xenHIY34FWYahbXF
ZGdr4DFBPdYde5Rb5aVKJQc/pWK0CV7LK6Krx0/PFc7OGg7ItdEuC7GSfPNV/ANt
5BEQNF5w2nUUsyN8ziOrNih+z6fWQujAAUZfpCCeV9ekbwXGhbRtdNkbAryE5vH6
eCE0iZ+cFsk72VScwLRiOhGNelMQ7mIMotNck3a0P15eaGJVE2JV0M/ag/Cnk0Lp
wI1uJQRAVqz9ZAwvF2SxM45vnrBn6TqqxbKnHCeiwstLDYG4fIhBwFxP3iMH9EqV
2+QXqdJW/wLenFjmXfxrjTRr+z9aYMIdtIkSpADIlbaJyTtuQpEdWnrlDS2b1IGd
Okbm65EebVzOxfje+8dRq9Uqwip8f/qmzFsIIsx3wPSvkKawFwb0G5h2HX5oJrk0
nVgtClKcDDlSaBsO875WDR0CAwEAAQ==
-----END PUBLIC KEY-----'''
def saveTempFile(content, filename=None):
if filename is None:
filename = b''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(16))
@ -160,3 +183,18 @@ def addExecBeforeExit(fnc):
def execBeforeExit():
for fnc in _execBeforeExit:
fnc.__call__()
def verifySignature(script, signature):
'''
Verifies with a public key from whom the data came that it was indeed
signed by their private key
param: public_key_loc Path to public key
param: signature String signature to be verified
return: Boolean. True if the signature is valid; False otherwise.
'''
rsakey = RSA.importKey(PUBLIC_KEY)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA256.new(script) # Script is "binary string" here
if signer.verify(digest, b64decode(signature)):
return True
return False

View File

@ -138,11 +138,15 @@ class Client(Handler):
userService.setConnectionSource(srcIp, hostname) # Store where we are accessing from so we can notify Service
transportScript = transportInstance.getUDSTransportScript(userService, transport, ip, self._request.os, self._request.user, password, self._request)
transportScript, signature, params = transportInstance.getUDSTransportScript(userService, transport, ip, self._request.os, self._request.user, password, self._request)
logger.debug('Script:\n{}'.format(transportScript))
return Client.result(result=transportScript.encode('bz2').encode('base64'))
return Client.result(result={
'script': transportScript.encode('bz2').encode('base64'),
'signature': signature,
'params': params.encode('bz2').encode('base64'),
})
except ServiceNotReadyError as e:
# Refresh ticket and make this retrayable
TicketStore.revalidate(ticket, 20) # Retry will be in at most 5 seconds

View File

@ -0,0 +1 @@
tsRHebbCGfsC5uVtO/Mrv02Nu4szCYyUWAcI10mc6hIOplKJS0oZrRF5/PzE8v6bNpJ6r7l+XmeIvSGEVQTvNVQBND4HmO+dgFRpP1B2pD+nGA6uoiKHTfXaQpNXlEwhLgh1+N8vxfRw1LPmWpAaWs44cRdnzwBQWTFsSp/E4CGjhrn/Dsmk5PHTqjGta8SogRPMkQB+mLXp1rmRZJc+nfAkwnSoESnzhtsZ7wAC5vsNrakNLtlHNUibaKAiSfKF1eQsVyJ6y1CHB8cD0hI5E3dY/MAX9jfuFLvdJnFbSzwSWHK4KsxHxBDOCI/QpID7kYhT6SZ/SfmC9O5E2t4W5ibBPC6pdFn/zRZpkz7rMvu9+skW08F4n4aTR7UFErTBTeez3QUEgHc23UIOEh1svAV98xXlEqmO3CczksZIZGHDtcEWMlLAO5/cBYn2y82C7TO797U45ahm2M1QKeeJELg8K+mbkR2Zc7IK/lRTODbM5hNL5QgRehUeMXF0/L+315IGgu79wHEb2ERXRVWJA1ySRwobYv4a//dMe6fv0h5CDv91MufWQJqgrpCx2WEHTsQPEO4cqh9gSOdN/Nb/TnKrlPNwpv0V3LIoTlBefF3x8VPeCEScc4MjJgMYecefHBqmWr+2+RROQSc1Na+JaoLrLHZfViXzelYcJSIpp2Y=

View File

@ -0,0 +1 @@
R/MBVUl+xVOD8jZgN5SZV4JeFtH42ZW5JRi812ho2d1uZ+5khA8r4cdeTDc5nhZu6+obrpZiaG7oAprpZvI7H/uuBH4v5rpm/CVPKVhN/dDxRsCkdlNwJ1/v6yEaTYig11LliHR8IoY2bdaXiScmMBBZc/inMHftTGvhRwetxEOSn/sKt8S72fCUWlXCtqMoIququ8fM0cXYKeYaUKIg2GPvjbvkKikQskDtDNVO0uhJuOTtaGpPJf1s9ZuOT3fPbmadvtRBGW2ZD6iKryROfiGMGi9UoqAhACAxWNFlq4uJ8lOZ5Hbhtcgl1y2oIyj8LvTtasTCZXYVQt0thM/q1vlNqtjKt3bf6FMXkF3KVTQEuG0UDtF9p9krPMHS/vQjrp1kLKbxYVeV/tttQrcnCqfMi0t8gRPzFz6llHLrjPt5XupsdsWijAGzBDGudijrQdFr9n8KDF1S56HZnUGOvECe9VliqUsJvsxMPulkh8Y3zVcKAz8II7HJfGcTn9Dt/dcUSxujnnK1Ik6MOmznUhcbXiuV+aTlxdvuffgIL7t4LtaLepv5LraNt22dKVxBXdjQKAaTVm8oON39dyJzMN6pnwGabb8dS841hYvY3u+PXgHqkW3T5VVFLPXaxejTEuxTFj442ntEMlJsjf9CxSgmd7squGvK4cWT1Aw94qI=

View File

@ -0,0 +1 @@
fDEmcLHGQu2ny9nqi5k5FuAzqrIoqJwgDFW/Q/YMPT/pFZ9ph3xHDKo6B9RGCyAhwBifg0w3/1085LqCFm88hVOl4mdk+rnF4BW/tbSvlLl2DaQ6qQxuyF36qCW4vqnl5BS4sqYKFrs0hp00FYU+nfYnbefPzq6MhCD8AHT+DP4sGZSjF6Is04RsrtBZOf6ZjWMJ+IOy4/1eGMYl5TRz136y6SpOh8OoVsdsxHuYwHvwdTNz6E+2Ct+yg8sBb/wGCSLxYyThE+tFYZLX0o87hv1BE7nIC2I03QvU63YJEguj2SKnix+azyzA4GfJPjpjmt/u7e4PO6/wdEeToq1ZU/2HPoghBBNQUtCwt79GfX58nITBNlxue2UnzQllRKQUd6LLsw1HOgeyb99JoLFbKN+uD9wQ4cWRFRbaUJLXkmIOxjgHe1Cx80dl2EJHEINNLxgUbE54NrtZYjPAMgU5x3q32Wc2YISVm1h9d4uRFhf3WQqqJRxZ6IluGfLEFBvGJJS77fvJtmRWT5/wKvfmwlq4iRaJtUZ7h6t4pSBquObOw55iDYSL00kc912/jzikAOrOf5OqOzU5+lq+In5IJqQUcbcmaIFrjg1tFCU8A5txi4sbnfzHwLjjVg8C8DNuTb44PDIRlrwP9vL2OqdPV9ZxApf/UqXiL8YyqluyV4E=

View File

@ -0,0 +1 @@
qVZa74Dzxofof/9WcomtCXvGZLw/zm4o+4Mv9Yg4pYyACGh9VPS0jCLENEyM85RJ3J8CdraTOGTSo+i9dhNLtKeshI3W0xSgNxf4WlxtRY4ZyIZH+xgWt0/hIoM/vtDIcOpW8XtfDJBCQ/B8vuB10H84STl411Gk4ny3eS0KYFsD2dlouMgPArk0FpbOFBgzhZpKZp0ustzUPh+Hxli4S3N5i6ipphajLz/oDnCJ5fFaZ7jH84J7tlUgv5gwbfLc81c/XPehglYzjn0gHXXOZYmnu76w1m+GP7pklAVPwGBJW1NYfQqekKSZDvSPHAH76tNAugEoFFyQ2bg4dRwyFz7MyidmN6QnqBEjEUo3dGo60ZX3LnbIlnG0ri7MAp/nvclI18yBIsibBEi7290nwcg0SmQMU/41Ck/EsplaCJf197Rtks42VWiy1rK9Ij93umroMJRUSOwma2OJ2UBBujq5B6ucgKD68sf7xoHxHzKe7iB8FfCjApfyv7KUrNnfl7w0xPinKJgNonKzTM9Ifr8ZIUwl7jkMxnMr5wyNmqyPSUyfwbD52E4I+8McuAuJn5CZRIggQnfJnSwfqyd41btTuOUles6LvctXYjTq41VNzp6BUQI6Um+cMOeLDejstL2/wudJuUP/j+7pxgW/lG7kpRJV6MdwYPZr7JMbBEk=

View File

@ -0,0 +1 @@
lOSb5Krs5w+PMH2ftvqsWjtnLw/jtk1qCLeQHI07C/OYtMzlqARN8oFe1uTxrfqBuRGIT4aDf3O3MliVRgdQOm+2AnWtjF95Za8ctJj5SOZUl6ZI7iM5JZ9npTYmWAZFNseiH9/Zi9LcPiX6M8AZcGu9XyNWz2qpMJmWFykfCEwZ1WBhtYmc1sueTtoy3hwDgXQ/65CyzXqVnadJXba4iArAB+ZRcUcgXOLDFunUL2SacaWW3mGA4UfeIavlhW8ZscmvT0PTeswDGq4NjWVd9nFV0gawuQcTBDLC3Rtl+8taqDcDnsBP641A/4RsN9TKILlk1RryL1Yc7LxvqCNjOziRC3LuF+pAZw9nuNBi1wDHkdwjNS3q8D6al+QDP9ke5h87m9TUrUSJG1VuNmQkrHEPVJScWWaj5YEuivVy8uzXP/7Fthkox9vGANlvlLmzh5BWdp76rB9dt4XaQcPJ1zWbndckg0Uwn4Rk3asVyT9EoLl+vuIs0dINKeRKDEfBew672rj+eXf1ozimh7wuEvhSZD5KtRrDdEpX8ZYB9NURQOwHkxWpuZ93wjNPIxS7FM6o4dRGqWYauYFY5MyUllX0KsxsPe/QameB8lhZVedWhiLROgQruNLY7V6kYp17/7dG8HKMhNLIFDnZL/bIWV3IBgASHSDoiKJ5Vp77GIQ=

View File

@ -0,0 +1 @@
PoQV/R+u0zQ13yKshCbDSCb9UWmOz0KkfYbgcGQfeLC9Qhg2tH5+xMOSVMJZY/fI3cjlcUVJivpxmijhAqsBcYhRKYL8zO12R8q8iGnl0PYIheEAhQk7U7dilJPoAieBKffPHdrpXeUDs4zU3ltdkcI5OFOF1gLEtc4MCyRnUgG37Qqf82OE9gj5tXKHkZOwA0HgbGhiCCKJZIdXcwZOUhtrn+mRwBVxLh2brxjAcpEDMrXdyiIiJqt9rQpis3I6Lp0HW70yzWyy1YI6slAIDkPFabTxsaTeZVxpjVoXUQ5JOfyDSkH9CUwkwlyt9gS2fo909SBmfAlrlAyYQrmXqlQf6SomFhCHpuemTVgH/fN+PPv1aECBZS/RH1G4qRSpxpWLa6ZG9SInlPyNd7yWBnmKgMircmszh4IxA5j0SoshDnjd1GQm9XkrpuqQDu9XiL5p5KEn/EyLFZx3yRq6yCorWoSwbMhR0PNy4h3Q2xtImk6fxYuHpZmoKsrhWoUV+X7ezsfDuXHFu3N60bKV/N0LxTjIpoKACbWbmiwJHi+wt1/fsZuqhfvyB3/V9DjcgYcOdPeA/9OKW/npSxbS5wliQ2y4rs2eCKB96RLWJp0MRt1m2r5kQXjaewNvLW0YyoPY6wfaXpOGXGWVUyNLydF4KCbErNlAlT2N+jdirwY=

View File

@ -0,0 +1 @@
KpbZ9kO5s28fPQxeAkPRKY/dJrw9g/RlkunlCUn3j3MjqDlrm1WqsiDw3WbmyvRUTuVHj+gzqkUgmNc/TWkWs2fQIKW0RQ4id8HT8n6MH8rzp8DPBXdWUzW5VgOlbLi5t8+MSLr2Ccp+GrtH/cw9RRMtls3jeISvRbpC4Y1DIpdQl2AZx1Pm2yCvb9SWq8Hcapt1pbfxcAAvDyQtlcOZHF+okKixYLifqbjSjbdwMkwPnBW+ZDKWoEUJSSy3cr7eIbd0pWOg0PkvvsrO7B9GdxNBEDIOBfi6wIUWDCg8d03swDl0kWGstI+tQSRtkC6LnABkOAW1YAFgHVCkxQMaFAukT+Jo3zuRYlm0qUvsL/GbIgtHzrRzGDpwyAAH7SI+pVdNQwlQP1wSQtQ6h4Fv8HrIMagO2h8D2k+kJ9MiBInzG1wcTYXbOqFT8M+n7hFi2XZUVaeNeIjF3GQh2JCrF+AZhDHinDbEYk4dUgtRr7VwfwKWenW4jyevmYg6RF4/8UPzd5noGQtNHop1M2DMbYxv2alCoevVQyDDmmaouDJ1K46iKOzAEll6wU/8KUC3EpcDVNiDBI+JACYZOcLpXH0HVXIpm7OVOyAX8380CvWMu8pt07so4gohyW+n2bLZiMXx1PS6muhx2a1NZ6S8W2cQ9lcGTkrujk6MKxV9GBc=

View File

@ -0,0 +1 @@
BYgATicnP1y+WshtNUsk4+Y8TBlBeOJtB8xjSkO8F2tAj579BAoyqqrtn5K88SBN7aD0+0nGymRwus2/+zyXeOz3fTF15RHUJzwBb6RZTYR4ng+Mf1nZuke4t8l2GxbBpKriOSgPLMcSx6cO4LAxMnc+9tn6YiNMpyhQa7e1wv/7kEEMM39O0DeC9/qvm7ZCVpHikLbpLtZznf1Et5xwSNdmikPeUY+xn3d0uJrkipkt+QW70nqx/miWP0MQrsNOtVcijQgSFBVt+k1R9YKczsqpKVOjc3B131OtebxUAPaod+mkkalU1Lc7ITXpO+/CjspfrJtHF5j1WuByM6mxXk3QeOgUDZ6m9qso/DKpx9CwHx1ShQBuOfqj5ADOlzv+VcigaqWjIW/qKMkkhD7C14pJv8KdpUxx02xaggaQcdNZZNKZs3YOgmpGWMkqKPBYTo5QMFO4Lg59vVnv3BZRGxMWhkAxM5zNhzVh2xRoEZJPNSilENuZgJLNZRpwFuxLDQ5NHoxXUcDZDUlHe+K7TwgKCZ2NrrGuAShOPiGc9M8Du4zMDJ9+A1/809BN2ZZ1A4VDrF2osiaFejIu03jEJMaA3afo1UGvuLQO61GSkzoqG/fEmZxS68meEXyDONiW5Y6/wawwFkyjG1mAdF/3D8yMHE0X6KQNsRbTja4WhBQ=

View File

@ -0,0 +1 @@
I9wIw2jnOvdKH8kJVE4ikNKl9mzH2pJpefunD9JGl6Be8kqQODlaC6KOAqLlk0hpMHgYS9/f+OdWNgeQVAwcTNZ3IPl6FmbbVbwhoosa7a9t/I2Ho0jcwY8HUEqu8HS5XWzWl6Qxa1sUJeUa7SXh2/CpoIGWVkaZur1fpC4d3SmylbuQ+kkJKtMNmDn0gypIQ7RtgWq6Lf23jfHD95UYpga/fgT/oG2dB696NHUQrRsLwYxFcFIjWf9nS1JlJ5E1fkIjdQ2v3R5w+CfkazFl4l+ShGTG6b7+iIIiv5z1xMbQ5MkWHGCbqlMUq8HPalIeaTcl8BkUqr5j7T7tV9ovTe7lBVz4NuXcbfvXZWMOW/73N+K64MRcxbSyqb7fLC8sfMbHy6RrBoUltXltAIuDpetIhzf5w/dVliGiL9j0DH/152k6l48GUfUI9jkxeywgze9fZCBg/2jF5/lsQ0xWpWjDNKXHRwBxqyjatRSoyL4WWQ2cCd0P+oQoIL2y4cb+zDNu1ilIn1Yf8XVJ5pkDhhDmH0wlXJOpUp+qIck9w2VeOW8DAR5wyagpGwa0IaZ+lH6XPSkMC3FDDVg9W0GeGk1KZPt4d0/a2aOBFZQyr2wU9E/PF+winkvacxZJDN6YlKcwfFZGtEXI6efmupZNSEA2oylEQ20Fopwd0ZgxVR0=

View File

@ -0,0 +1 @@
TT9DCCNC4wuxcJ6q1KoQuw/1t6fRBZ+aYfi3kEiekyK2hVeG0ZI72q+eadEwIRb93W80KcGr+ta8T+ReP5+vYHoGN7oAjuW+YNQceWwMmhK+gyf1PN4VS+8fHzLY+WUFa8rFihDdqmORjR66zCWjM/VrObzciOZsyR3NSKznOyWUxetAVFz3PyXnYJgBjcGitvMB0PMIR8LmzCHrbD2kvBgV5WsY8+NrzS0bge84s9HcRMYJCeM1g8W9wazAQLSneGk0+jg8Qptm3zz1sw7YMGLMbEe2TbmmL+9Ybk7wH7Y4lH/eP/yO+rstEt+tsV96HVWYw/Hr0IUdsqbpxuxVZFc77qCk8BrkiPZiCATeelQBWm8a+70DQfygYJpZOJTrUFD5NTr7Zoi940FesPIH9jfAVxmULwsDndg7rLy+9Z9cCFWBzXutE7DHc80/Ul7XhkwIVy22jKwyNoXaf3NX9yWsjLCrWoJqpQn1Pc5L0dgHIFykPlt3m9yoIEsWJbYeU/U7W/1h63hVeuayiwu5IW4FjFn9c4rRsyLREtCUToKCiRUuoLHIkOIl/8Qfzy9eyb3fJJ6W1MqHFE4/NY4Iu2OUenfBANPaoI384dGJwz6CoPdfRhpWxxC7kaY7T/aug8+7Ha63FbG2IPaF/poyEfY3AXHB4jaFVpToIpVNQZ4=

View File

@ -0,0 +1 @@
RFy+Z2wPewrDO1EnLQcJ3JwDPBvLaXsjFGxFr4KMrqVuSH/DemDgiXzqFJmzb/tBzs/tjF6/ZqfEWh8bvRD8Z9+fKBB/6ga/GR8+NSBO+ujptjG3ytXEjHcdKf12RXbE2rnFrZYuXzaf8B3zTix22dkbZ8yiJq5yUDbCmyNeKfxZqzi4qTR5Hv0E+G+j1399rvd2s9isTQwrw7DDqKgmrgCQ0fymAolgT7VGSy7BmW1AR1uPFYY1l80eL2U8jIsLwhOsWhC6WzMlb8XOLoVhdO96odCG16z3d2sMiGJt+HPWec6RSMz+GDthxRcHl+ZS39fIOwXJgrd4Sv2XS4GRtZDyuSCXa8MLUX1NRxnfSdKiiv4UzjgBZoWFtIjWyjLAB1hfhaBO9HWEuJIZ2hrzb55KpzoIo1p+YoFIOpet9iJYEHv02P6rUabQdkiQhty0a9y6qeImEDHp3IH/e5AcksnphKrdR5Lb7zO2mEosbNh5RAYjhnDwCMZIYYP0ka/49SspFXSDtbJXNk/0xooJ3sd4u72EeQUVwg4hQmmq8zvagYIkLqaezFYRhQamIxK8AQUiZwXC4Eq4unV8Clw8qkjFCT9TRCrPAvMgH1Z9iTM47widtmUful9i3PN+a/vm34YLuCMFBYIhLEXi8ecjahrnYjrA3Yv7vZJhkTi6NHk=

View File

@ -0,0 +1 @@
RCYiCSIBFhbMgBl0/EIU+2P/zQIuoUlZCXb1gBt2oyy6tZ5DG2G6ZlT+ldPY/5rP0GoPM7BGqoBGVf2djT+isZ+5f3Gaq6YO8I5Bb9wVT6QkDJbXihZgK56H+zLwsDW032rPzPH8XXrTOrUS/TqktGquNTh46XUAlZ3lCBUZmEap+MNa3WYCqE2jfLLeYO0nYmrzTpst9mx2K2ZloqOH3oMdH7MnflmnCQLcMsDxOkBtZ5zr/NtgOW/JxS+0I4dDzJdcp9utye9cEA8jrMqNcEB3WN9NeGYXjT+5mVeRtiPn58hd4pO0MQb1FM06UKgwjQ3nU0p5yizzhCHdLjbKrd7REaUUbV3xnES0Q0SMTMSF51SsLb8yCN2sM6oQ4AJYvUL8E07ZhWyz+kv+xbdDN/3mC4lxUq1PzNaUUBnWReaH2ZEqfY6myEfn0C0gW/LEiLCD7PnG4lV2G9tCPWXvGGn601+ntQs2U6irbtJslSldd+1ZqcHyUmIAh9ChBr6Ro6hRz5Khl8WPq8ZyBMMapjdEEN+/gLa94AVhB/aCypmjTNcQzQsBlmHy0EyemoDb42kp8HRJl2jLdCUZxayZcV/KjrgLMuIEHQHDcaIa8UMzb6HK4U5KdHRNZK/E4SM276r8cmUl4zrlZ38kNkbsetQLcgKx3PGxjp9yGtUcioQ=

View File

@ -0,0 +1 @@
OXKEbc6+poPTlIVhceM9tzzQu5PhTPLyC/5xEnUGdGbUHlzO7LcnijVKL8FY3BhWBKrDdXRusYF4TGIQpb5ki1/F7y4A1X5aMSVDBJshrDs3WkeFgsn5VE5Dz3Ys6q23YwH0mlSNJeYLzOR9/7i+1i7H8tQ1vr6XFk9d+VzMeRpEYd7Fn1aIA70mycPlrarzyFYj4fjazUzb2PB/IzGh9ontzKaW6F0eRJ71+weTX6n+JwcgYZ+SMcH0iM4RYesGM8KVxYh0tP/y8FbfKQW2LBS1hV1dt1KWzneGelgk4XdfqfeeHuy55bdNeRfbQaOhZV8E/7oH12/Y5C5mxVWONithKXPm9unVOqv43VRUs5U9NUn8JX4s7awmqXFDJzmn5O1U1zL2CyLKISC2VdpiAjpTHN3MaJYwsvlmc+p6OgPmgHP07Zfl/sp4K6BCzz+OhbqCoIMMxjPDWB2XTxsgI/BWDiT2bfxERqYXr77RQzIbf9i+PJ1AoNe8NvA++Uv5HceoeXQg/otwIXmrqn+dwyp3Xz1IiX35Ul68RtYz+b1HdPrASbEpx9TiBlpmx33LC5R4wqptNs2CBOfpOuFiG512DTpJQ952eY94KL2vjvT43DwzSHo+N1OdAgxqXwywuNUutUdgSGlQdlBs2cyi3OaYO2TavMW7b7Lcct+KuhI=

View File

@ -0,0 +1 @@
UH5wmMzr/5Tt4lfbp9uvqqJQMWagMq61zaVwfQOm6CV/wCraMIao3+y2POAUcHauw/1ceok+8rL9lz5ACVQMjsDcGgu/s0IINQmQpk/Or5tpJ2V0Uusn4eDvOlyYG/KABEycH/ZeG9LoUk40HLg8RFUCZzSPMJA26ALdAzqNDaEhU8hckKpdSEM1GihFL/os32TvmutvTzAMIFQdTwohrSLf3QN2UWI7xNwr5iNgik8iyiaYtw5XiOckq/Fq16rX12uGYW1VYVVNnL5Q+Utfu6B62F2EzyD8qKIpsbHR7WObqFp0A7ABcxnIEjHLmmongnMeg9LNJQCmc+nGPVjIMiUYjLVAkEAK8NrbpZH4ICn0A9GvuEivziqASFflzDi+uGJepXtM7Ix3ffOukm5LDP3A7jANRCT+k5XE4ihirBGVgLpLVY5TFKaEWHiwxHpRvD03SoRjqGm2nmjn3LtkYdXR1qGq55u/LoLcbC+YMjnXsgMb/0GO7dwEcsaiI/zKzQuEkv9htAeOR9MaNcejqY/euEzi+0Wv2XnctNZUvk+diu5dwsLk3zweqBobVP75PFf8knqSialdQ1xYRICRVcbpOP/wW6sK/xWQzjfGVflUNEzebabvFgYiY84i2mAk6gTifmngp+YUV8z/OsS+sdKrRYAFcnywex22OW+d2tM=

View File

@ -0,0 +1 @@
K53OnKFW+I5lm3IOTndAkWRf/6tMuT4FGw2A+9IorgVQdTKthO37MTfofYdDbKAyEjWN7SaSDt8EXe3sr0s8vTia4RmrLm2gYeHAIA4eUd2zqkwSD3dmELEDWopYZdpeiIYEvv7sPFJpYaztwu14w5f9HBwF8EzPNq13ds1ZefUqq9MBeu6vAQHWBHyPjHepQ1BhkI9k3gdZaCqRj0vT8a+wIgEjV0jjBZSvA5p5XBK1XDgjlFCn1ImsT17QdQQoZcX5vAWKh7Qar6DxKuEVFCw4Ncejnb9YeqgtMG7sVeLIUtI2xDf0idpZ+ppRWxbke5aI5zgK9P4mx1SSYhzLscfD1HUPcgEipheOGmO5eRDGC+Z2JCUzfKezqW/6IGvAZLNuHaF3gG1Q1DQ7D/QuWdO3p8IA/+9e2QJIDHgYcmN3Q3r5nXipqa3Hf7Mv19BtW9G75cGO6ZwkBC0THg6Yk8rhzpwvH9cXpZmi7GdhF6SYS1JILaHp9bcDxJb2pPRNRhUl9WcKsHRbTohPU3kbRt2gGWS1VSldkgdcU3pi7SSVRMu4wUlcgESJ9fE27A7URoEzC3t5Gf7L376QNarJTl5hP+Xr6AYn5Deeeeb1YuEWaJm0hL6pVVCmFBh7mDwgs7bm6wo4qjWat8U0JvuBWnGkqw/ogvgaeHwt3z43/Cs=

View File

@ -0,0 +1 @@
CpTiYaxvzwUaRifDHRIZmXt2QqJnOVwPu317MCMDtL3S1yuwtcAbzRQnra118WGU0RGLnsYV8rMQp9Gr8qTLy17+RHg8RaMdIOvSX42ACtfuAQteT+Oa8tYIbNm9kNxGT8ZCzvxseEE+LKhLKMFxIWZTbQ1cOYPjVSgv5jXn1wJLJ4ieokUt9ik0TVrRbsm/nAp4sirdhmihGDDJoG3yTDYYqkyLbxSk3gSCEV6FBqFASZDgS57G05lNy0A5KBsCulwyLfepJT81vWQ3+j5hm62pzzS4fEWzoQV432lIDnB4XkRY06brjWGGAbw6Z8z+bkQ48uL3upmxhYYb9di238q2UWp4V4aEmAYjO3xEDTbx7wqlyCwBCiPEEkeGNXryWM5t4h6AwHhidT5H1sGStMEPIiA6DD0lxAQGh76O+RYQ3/MNDFc36t87IOSpPsIcF4OzCpelybWhcXP/lZfq6jumjHLlFqDnD8mrM7K1zMJU5lqcpjQLxYyeR7YN8vxzeP1ulGNY/T4DdJW6akDkal528MEAfRN3BHqwjLRCNFe4YlES5e6G99LjpN2Gz1Ps4v0qS0QHXGTRWGKHM4SgYWsRQTigOd/wJjNy4o0Y/tWH5FwJpAsg4GuMlLb5iWjTkiMcb7ne/8qdWUxkCcon1DUKIPtrS+Ysr7YGxT/bUuk=

View File

@ -0,0 +1 @@
RvUnaV1eJSTiLYd9jLweZMY8rxOEdswTRLI6kyo2kJ/2F9Y2LwfY6KqBSK5FVid3Ia5pJmUUWEei4GXsoolvon2yBT0kNrloQDKVFUWceuKHQPsxxdJtr0EkZK2pfiy1Vg+GiBv6DhIIqpmEt/Iol7OUYJliMvE0CdIcOljFG18YJvOeoe8lymWYspdrM3H49md+XrhJh9rKsUCiixgoTDldmZcgGa2CMdKISzBbc2AdWxc0Iy4/E7bc0+Fjzfci6IAAJ+fYo+15ghENwl0MP8YPLhJpTz2IEuv4JzhBRiY47dGpeNWZG6mc0F8fAoG1vFh5vcfu5jg9nUokwZaXDX1VLD7BF8QlpBPoYkHw5D1hXSNxsxxWicVbaHLoPrbtVyxG83MDszZEc40JXAjBfLZMi+UsUWDbhMFtywF0OLCLKokhPa1fJvKumMQcX1sBSCCAPSLCxhY/hh9mN1NnndOm+8bqXNkJg1AEoy9pIST2XMfNxc6914EE2DOOSoqWzdTrynEzEYu56GzrA4Wa0H6zaxS2XHaDJmkQHCg6CjndbJRbQbpRhaqcaRzCwM2kzurevi6VmaySkHqu3EE124ubdns3lcudZKg/C4s1/sjbR+fNRt+EhppG+DzHk3JS3xyo/R8JsRBtnFySag65tIHaVoxygKL7SjnUuHIVHhM=

View File

@ -0,0 +1 @@
G+JHL1/elgDaceaxCY+bK8rd+YowcrU0UNertNwSsDrZVr52/X5BKmbXX2mlOe5wqvj7j6juVT1ZR5vZLV6JXXZRNUgaaYmd5Uo8iGYpMmIPxxrVphZwpbMtUeeVL0XYbTGvDDMz+fEA/4JeZ1SzvkmFqjQOvuzIolXzKUKs4CQh5E/ZAolzAZRs84lgMXRvPpGzzNkHXg69sbBZHgLxHvMlRpBYcf+64mZ8rhVVVGRStIZju2A0j3yqCmVHQX7Yr7hQmUGOtfprH46a1caZmsw4atC04EHuY09x6nkZndCfroHeBmtseECmvh/GWw84jgkyUMpmB8snWKzzGIyQLhGkUfuttPxMFXr+HIM3Oe6gLq1AwYILAqXdJSo+QSzb8Qr03BA/hhZtwBPki1Cq8RDGZSN/a7fLcINaZCYANKvBGgv7uPrXWv0QdOFlYte4EpGF6ahzs6RNC++eNe7707heKnlm2WUcBZ257TsjbxMl8vEcYDdOSP8bdnO9EADTaTnWntfh7OpFyFlEGh/5Zg8p+Mr/froUKZOgU4wbcsVtPXfwQ0JpVVnpPfU4KcFgEmFOYSdD3mcGgvRBiBwp72uquLq5E5xHAU92Zzf2nNjeS5dbhubCsex+g2rOzVw9OUEnFS1mvcPv1uh0ek3/vMT7rkAjOjX6NBvYtxtT9V0=

View File

@ -0,0 +1 @@
aMp4MhyO5CgI/FHwIXuIdm3FiEtlTE9lOvPvyigpjT0NhyzU6GsJvMVJX860WxUYodhNzpsUZHehvOYpxkTyaxF8n8uEi3LCf3DQoPFSQv4sf8zBXaJkF/bo/DsdNOb1Zufd9PvaE8mSns7V7OMeua55imqkMukWueOCyJnQBfOTg8ZoRu5vG26F1eWZZRycesXWr9bpMMWS2A5swOlY9cAhdk2B0IOnP2mf2SOI0ex4nsVK2trfDBeXgqQcm9dFg+lo88Bg1OD5rfJFYna5uZm265Whw9ZkuVarTvMnNtaDH2qpSvjqhdmtZFr9WoEFoMU45nV3cr2H/uXJFzf5HmKv4E4jxQ86GbYiLmhD4WOjvfxECRCivgG1VV3FfOpF2TYyOcmiSTWNFOZICM9lxSs0Sn2Mbjc3AUIRH4HwViPHyehOQjpSwRsVd+uysiKoMEQA10dLXOMjX/MA0vG1feUmgWTpVdtEevn98gYWNUK2sJTwekB4ovwG1lADoWrP7oXmq4KqoCzcgJacorAw/S7SUfavluqyfD0gf2b/GSAh29QJUNa02qlGxO85JsPx94o0jmXRlp8dEduVxtea+rW3AAJln7irrVj3TD8BFt3LUsszVcwref95+qMqfJtdq3DZ7eJ62D1Cm5AxFHSwPOjz4imWQsrnJodgipY4my4=

View File

@ -0,0 +1 @@
t9FzKW38+0tICrM6HRul6X80PWMuq/nZQRCJlww2scUBG28/VlJZcdWacCC5WOUn36wAUqFtjse/tTx52tBHKvLEINZIjVaWwgUkt316al4LsNGzfK1xptXKk8nX1JHg9dFAbvUUjaS1tgJtkW/F4wGT6m4a7h2aburLj5PN9f20uwen8QlyM4e9ZgiCAXYxHPaglmd7VCxii24K6+DZh8AzSc8J1txuau+cRpaY0qV9fgJJajSuWdy9JRJ8op4okaQQ9BQ8mgoo36CWHDQp9/GfUwMfFGuo1J3PfmdLyBPoy5QBwWQrTJco5CCh1vK92q3e0pxtHvInmUyyDfk2tmgjpNah1f6P3LFCF8oJHh2nkJT9zxisQg+6QvaofQdd9ap7qNDdqMzQIwSqqVydLpjCg7Z298owv+cFBeVfKtpYAqLpS8lch7CYXkXpUBxoqYrSVnSWUxKq7gluRuI4n5/w73xDc6o4G69KeuH9RcSrqNByim80drM9IEARMXWbiTKkEvgqKBpAZnK7YPx1abrPdH9SDovgj+jO11K5D41yE/D+BZYXGHFQbSVr3T7vY586MP5KinW+TO27mZpp+uU6ikD9ulieE7zIqz8X7VBwmaRGJL5rLV8QvsEKKkChilvvDZN+khDzxm0NIhYe2Hu9Y7mMvmk16Yi2etGw95M=

View File

@ -0,0 +1 @@
s4a00oXZoCxYyhyJ+DmgCxqhpjH7apx5jRFed/sgWdjYyNNK7kpGI7KDilP0QLyS9N2JpdklA2m2hKCUcQ9bEsjorSFA35cZPreGwM+USOj+iO+eOBOYd3q5jU2eFcF/pjd8NBbENQG3rZLo0AQ3A3JhlBfEffdrXAyYvHcaEtYd6mOSPmE9nHly5eGa8Zfg94QLEXXjLffkkWABAqHpdsZW9yrG6MPfmQk5NOqXQIeSEKIPHAkTpO/2EjdARJB78oSfgGf1Ypo69QFYTBlNRbErSzLSL6lopWPmLE7GKF/nt67/jWAPd79cFAkIrqjeHuA/8yeIemUtSEi8Or3AuilKRv7R9VrOWgnqT38LrVPIFi6QrXO6CAnPiL2X947U1OfXpHh92TTaqxMaW4uxb/gMIGo1kheZ2Ury3u7sXehpyehNM3qdLfr3gf7cVEmIyeOeXS/fdA6rJhYTfZlIeOhsYx9joQyiW+ntpI8sDe5kcgsJBprFLMHIRhhoHTHSo8KlRnM4xoAzg4aOrcb4CZx9TEwgFWW8f2G7anT25LNbs7T7QrU6DeEy2Az9QllznszDTSH0cddH1Z4ewdGvOzdfom/YZPGqV02/pI+dO0knzXaK5IpvVCyi4ZIrMAJV6bD7FoYXM6QEgC9TmJq+/fhob+6+l92m5no/WP7Dvfg=

View File

@ -0,0 +1 @@
Hn5x2fpMnfqp9yzuZ2toqe2dprthtxyGTLA6/iCZr3A+t7Nb/D2SWSYkPBDU4yxYU3j/E34UTl60Yen00dmky5rGH/FPlTD4VzbRJasCE3vpqhcAj7I7zmmmZRwVQ7DI8U7pSOMsMJJuZ44cb0V4KAeEpaXrQw7TeMsjMbjkUkQqromZS59OBJGTjrPV/v5i9nfAageL9hyheXjOt+seULPhPfA/KTqLV1fuDhsWaLMjC/LXDor4qWJP6THbcdOqkIegkAEo8D2pyYa5eLhfqPuxicpU9wejm4BmdTzXIBrIxxFImy124oUDbUx6Q/WLKxsvClUQUmYNC3A6DLgEfvpeYCj7U4914jy3q0rXuY3avWt6BsgMMBIB55hKgLM6eoGe+md1F0pr6ofna/1JsObWwf0MBV/hbWwiUr2iDTl+c15VzmOSqa6liSGjBH/0wKGBVnNN/OZBPwEd8QqslfzdK1Db/1thA32f/jQhejYlUG0mT1/pKynHGWf8CJG9tTc+NmlL58kV9w0e5LiLMVPHeHYoXYIrpfCTkJye+dYM/ZozIzy/yaB1N763/sn7eyGgm9Hf0ClJEnc0CJb0PVvibUY7jGEIAWu48A4BNeTjlpV+DTqY7eZ8oxhpODUA9V7bX7vldmzACO/wgd63fVN564sUoqew18GOHOA3Q+A=