Skip to content
This repository has been archived by the owner on Feb 8, 2018. It is now read-only.

Commit

Permalink
Store logo on form post
Browse files Browse the repository at this point in the history
  • Loading branch information
chadwhitacre committed Oct 4, 2017
1 parent c969019 commit cda6668
Show file tree
Hide file tree
Showing 10 changed files with 1,258 additions and 163 deletions.
85 changes: 85 additions & 0 deletions gratipay/testing/formdata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""Encode multipart form data to upload files via POST."""

# (c) Ben Hoyt, used under MIT:
# http://code.activestate.com/recipes/578668-encode-multipart-form-data-for-uploading-files-via/

from __future__ import print_function

import mimetypes
import random
import string

_BOUNDARY_CHARS = string.digits + string.ascii_letters

def encode_multipart(fields, files, boundary=None):
r"""Encode dict of form fields and dict of files as multipart/form-data.
Return tuple of (body_string, headers_dict). Each value in files is a dict
with required keys 'filename' and 'content', and optional 'mimetype' (if
not specified, tries to guess mime type or uses 'application/octet-stream').
>>> body, headers = encode_multipart({'FIELD': 'VALUE'},
... {'FILE': {'filename': 'F.TXT', 'content': 'CONTENT'}},
... boundary='BOUNDARY')
>>> print('\n'.join(repr(l) for l in body.split('\r\n')))
'--BOUNDARY'
'Content-Disposition: form-data; name="FIELD"'
''
'VALUE'
'--BOUNDARY'
'Content-Disposition: form-data; name="FILE"; filename="F.TXT"'
'Content-Type: text/plain'
''
'CONTENT'
'--BOUNDARY--'
''
>>> print(sorted(headers.items()))
[('Content-Length', '193'), ('Content-Type', 'multipart/form-data; boundary=BOUNDARY')]
>>> len(body)
193
"""
def escape_quote(s):
return s.replace('"', '\\"')

if boundary is None:
boundary = ''.join(random.choice(_BOUNDARY_CHARS) for i in range(30))
lines = []

for name, value in fields.items():
lines.extend((
'--{0}'.format(boundary),
'Content-Disposition: form-data; name="{0}"'.format(escape_quote(name)),
'',
str(value),
))

for name, value in files.items():
filename = value['filename']
if 'mimetype' in value:
mimetype = value['mimetype']
else:
mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
lines.extend((
'--{0}'.format(boundary),
'Content-Disposition: form-data; name="{0}"; filename="{1}"'.format(
escape_quote(name), escape_quote(filename)),
'Content-Type: {0}'.format(mimetype),
'',
value['content'],
))

lines.extend((
'--{0}--'.format(boundary),
'',
))
body = '\r\n'.join(lines)

headers = {
'Content-Type': 'multipart/form-data; boundary={0}'.format(boundary),
'Content-Length': str(len(body)),
}

return (body, headers)

if __name__ == '__main__':
import doctest
doctest.testmod()
4 changes: 2 additions & 2 deletions gratipay/utils/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals

import zipfile
from io import StringIO
from io import BytesIO

import requests
from aspen import Response
Expand All @@ -17,7 +17,7 @@ def imgize(image, image_type):
)

if crops.status_code == 200:
zf = zipfile.ZipFile(StringIO(crops.content))
zf = zipfile.ZipFile(BytesIO(crops.content))
large = zf.open('160').read()
small = zf.open('48').read()
return large, small
Expand Down
366 changes: 366 additions & 0 deletions tests/py/fixtures/Parse.yml

Large diffs are not rendered by default.

145 changes: 118 additions & 27 deletions tests/py/fixtures/PartialPost.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,97 @@
interactions:
- request:
body: !!python/unicode <transaction><custom_fields><pfos_uuid>2e269c13c13b4b2dbbf8cd6176ef1f1a</pfos_uuid></custom_fields><amount
body: !!binary |
iVBORw0KGgoAAAANSUhEUgAAAKAAAADACAMAAAC05ZhFAAAAXVBMVEX///9mMwBrOgpxQROskHXw
6+a6o42Qa0eKYjzz7+zs5uDm3tZ9USbd0sf49vTNva2EWzPRwrPFsp/UxrizmoGXc1F4Sh7JtqXB
rJiig2WdfFzYzL+miWzh1s2AVSxfGhzbAAADrUlEQVR42uzZyZKrMAwFUF0bMDOEMQzp///Mt8mr
7ko6OEEyzcJnTbHAsmSuyfM8z/M8z/M8z/M8z/M8zzuDMkmzNKHzyapoigeNO6Vzs0ZtSmdQtkGN
F5TpCvpTWRfDQpkopL8RRjXeY8aSDlcZfEDNBR1q/MKnzEKHuebYI77QIaoBe9UFOZcZcEwJOVV2
Cjy6IYeKHHxxSK5EEKFbciLpISUgB4oBd+dc5ouCpCEjWQ2E6eKM2+Mn1ZKcAC6MJKWDGxeScYUj
qiAJFZzRGfEtCu4MKXGlGi7VxBXDrfWUDeanijgucE5zyjDU+M15yrDHESLaq8UhVEg75ThGf7IR
/KylPVKFo+S0x4TjNPS5EFtO8AlXcLg/vIYKVsO8BlOtNh8xQTAZBZsv+SGs1uwehzQ1XpiX/zlx
LD6SNbbNKX1rNH5hMvrW5thkZI/RanwoiBhPuofcacamUHIKq4UeGXvZT4ITOcGmKz0z9s5Wy22T
64566R9K4FmmsOEmd9BP6Vdjjrv+xROdVORV7txwtyiY565J6IVU6uB62TE4+SuTSHXpjHYLhHp1
jS2uUpRVqMloV3+JuVAJKmc5TyIUVzoLagvWWdr9JkHDagbu2wwCoaNWT3uFMi9OYBGysnj+Nr7B
YmZFPfz+sMCmchT1iGVuOmUsML8RjrCK6XM3WKWMgcm+ryxzWGWMpWDnPTPsCsFUS4cOboMWxhdk
lmGm8IZC9OqrYxQgrwZHvGdhFuCzVPbuYfjHvRkkIQhDMXR+C2IFWkRBYaT3P6YLD4ChaefrOwAb
a2GSF8euwx30JtmnwQ7gPsCNyiwQfJTvMNjXDO1vt9BzVitCPIYBqCP4DefE7HMrVr4PHcMByvr5
EorZeH1un6WE7TztUQ5IFgBWllDQIdkMwpMkFLxyiQCm5TwnZDMBoqf0zQ5JWDEWhlAwoBFFctXW
CESVU9cybXofvqE9SeLv0wtGTAoB8DvCzYJxyq28BeAAMhIpKyD2kuSUNvmlrSHhAIqEhMYdvyf8
LCCxiLNwPa5UPYpYH7Y+Kr126d4MEIdsRlDGUubR/RNzoHREd2s/DlkF5lbOfrP1KDBTSX/wbATF
1H9rYOp3WNVbwPo9av0mun6XX/0aQv+eRP8iR/+mSf8qTP+uTv8yUf+2U/86Vv++WP9C+wc27u92
7pgGABgGYFiP3eMPtzQayQbimf9uLwH3n4XAVBG4PgJbSuCbCYw9gfOosEYV3q3GXAYAAAAAwEUL
D85BUC0Io4AAAAAASUVORK5CYII=
headers: {}
method: POST
uri: http://gip.rocks/v1
response:
body:
string: !!binary |
UEsDBBQAAAAIAAmdREvNlysD5wcAAOIHAAADAAAAMTYwAeIHHfiJUE5HDQoaCgAAAA1JSERSAAAA
oAAAAKAIAwAAALwRlx8AAAMAUExURf///2YzAGs6CnFBE6yQdfDr5rqjjZBrR4piPPPv7Ozm4Obe
1n1RJt3Sx/j29M29rYRbM9HCs8Wyn9TGuLOagZdzUXhKHsm2pcGsmKKDZZ18XNjMv6aJbOHWzYBV
LB8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDEx
MTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0RE
REVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldX
V1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpq
amtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19
fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQ
kJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOj
o6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2
tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJ
ycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc
3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v
7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///1T7HuEAAASd
SURBVHic7VxdY4IwDLSA4ieCOp2o+/8/c6JuIkKTSynmofeM3Q3SNL1cOxoFBAQEBAQEBAQEBChB
Npsv5rNPs2jBYj05TvexeSCKl+l5sp1/mtYN2TbJTQeidLf6LLvFbtpF7klyMv4Qu/Gk89U1kB6y
4emtUya7+3ssB/7Whx+E3v01noaj972E6VWYFsPQW+9F9CrkA3zoBRR7bzh6TuPZLnLiZ0y88clv
JQu+V0z95cVJD/SuiLd+6M2++uF3ReKD30o+ed/h4TMXrrPjFftFz/w2vdK7Iu43JfY0PeqI+pwq
Sf/8rjj0xm/nhZ8xfa3N3574maifOFz74nedKX3M5VO/+eUVe/eN1Tym/4wDcmeC5K7IEWdHfn4S
TB1rJ36Fd34mdgnDsd8AvCN3INhfgWXDRMxvOwg/E4lrrz4KfA6+hPx8LcHvkBU2c59LyCuWIoLH
wfgZI9mLjgfkJ3qF5yEJCorXMSMC9+U5OebWB/dpkhxTeqwfmCC5CEfnRzGXbTqFzPIhuWVbsuaA
l2RqkSvrS+im9em0Xo5uiaSagvyIMjpqxMy45Q3tXh/JSvuQ4HJiX4Wjd7X0TZV7D3t73sJW5Jn9
v/1u+UmDYVtms4ru2DSxb+Ta46X+0pshcMfCOpsvCEH7pOsoMQ//8+Cr4wnr6o5IXpngBVa4TJKy
3G06Zd65bdgcIFhYCTqIuNYvA8jX9iztsNu2DgzkanuPS87PPvn4O1B7kokdCBa2gfkljXUYEzkQ
tC9Q7CAk5EoHgnahli12EbW0r0nCTw9EbeQrzfBTNVFqSXeJ5DaCOzBRKcCV0RNEcHOn8YUiWAr5
UVIPNz+cKIJSyYyUepjjFCRBmWRGN1uYifBADmSmAn5k5HTWcU1w2g54vzJjSFHMDMvqe8F6D7Fn
uoG5lLBUrRjMNaxuENO5wuscYmFo3478gfkGma2vHT3SPzgBaNgxyJjFNwBWIk4AGvYsLpgE9+z6
jdsOZw5IryQPcPUUXgAa9krCyKgP8OSKjOtE467FZDXzBGvasbVk9qaE31/ihCG/38wuNIEOJz0m
0M9lr5+Ivk+GIddHaoC9BGJCiQhRCunnsnd1BTCoWVoNtNBQ7LwKTGNj3wBAhgKgWQLEjWnXWx+A
DAWAOwAzAkSdazw2DrDTKaCBzU9HGIL9ZkAftCus7zi2jgIaCnI+P9yM0qqZg35haJuD2rXawhDt
h0MqP5ZoTNv3WYEjgO1E2O/RzBEz1PIKej9wy1sjScCGdVSRgi09r3II7ClFu50C01Ze+zUagAI9
itNxb+CZJzLYc4133CWehX9PKm6pEhhuBa6PPzkEN72KjDMC38xdDrng0SHS5SXOo0oOYcocdcic
RyLv1oktc9QhNaUL3G/xWOD6F/c1JP7BKR4Ycv+gegemfg+rehewfh+1fie6fi+/+tMQ+s+T6D+R
o/9Mk/5TYfrP1ek/maj/bKf+07H6zxeP1J/QHuk/437dsSW6bwkYqb9noYLymyoqKL/ro4Ly21Iq
KL9vpoLyG3tu0H3n0R26b436g+Z7t16g9uaygICAgICAgICAgACt+AWqMEFQqFUGgwAAAABJRU5E
rkJgglBLAwQUAAAACAAJnURLLXLWey4EAAApBAAAAgAAADQ4ASkE1vuJUE5HDQoaCgAAAA1JSERS
AAAAMAAAADAIAwAAAGDcCbUAAAMAUExURf///2YzAGs6CnFBE6yQdfDr5rqjjZBrR4piPPPv7Ozm
4Obe1n1RJt3Sx/j29M29rYRbM9HCs8Wyn9TGuLOagZdzUXhKHsm2pcGsmKKDZZ18XNjMv6aJbOHW
zYBVLB8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAw
MDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkND
Q0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZW
VldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlp
aWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8
fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+P
j5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKi
oqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1
tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jI
yMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb
29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u
7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///1T7HuEA
AADkSURBVHic7ZXbEoIwDEQTtSKodRQc8TL+/2eKoKUN27S8s0+yOWs7BRaiRU5Vmc827GTSdMtC
Om4l3mmt8CXgtUUw3qmeyTMfEV8pAbQro/EoofN8lfw9EZgsMU72490gqqOJ0C++v25g4LT729Vw
fXC7bnAg4zRecwOcGTBwdM45Pt/djrZ40B444L82AW8jgydHBjE/fJKStpxYcBZqgKF7CgItSuB/
gUtwxFIDonLeIiDf6ElFkRTrAqWp8rD+tADi/dbO4okuM/nYrrT6HuoiVOpTJPAigffa/OAVLO1F
GfoARN0GIrRn8iEAAAAASUVORK5CYIJQSwECFAMUAAAACAAJnURLzZcrA+cHAADiBwAAAwAAAAAA
AAAAAAAAgAEAAAAAMTYwUEsBAhQDFAAAAAgACZ1ESy1y1nsuBAAAKQQAAAIAAAAAAAAAAAAAAIAB
CAgAADQ4UEsFBgAAAAACAAIAYQAAAFYMAAAAAA==
headers:
content-type: [application/zip]
transfer-encoding: [chunked]
via: [1.1 vegur]
status: {code: 200, message: OK}
- request:
body: !!python/unicode <transaction><custom_fields><pfos_uuid>a7ea5afa58ff4f5591cdcc4e393332a8</pfos_uuid></custom_fields><amount
type="integer">1000</amount><type>sale</type><options><submit_for_settlement
type="boolean">true</submit_for_settlement></options><payment_method_nonce>fake-valid-nonce</payment_method_nonce></transaction>
headers: {}
Expand All @@ -9,36 +100,36 @@ interactions:
response:
body:
string: !!binary |
H4sIAG0jtVkAA+RYS2/jNhC+768IfGckOWliB4qCPlCgBdpDd9MCvQSUOLK4kUgtH469v75DvSxF
VOJLH0CBHKKZj8PhcB4fHT8cqvJiD0pzKe5X0WW4ugCRScbF7n71+OlHslk9JB9io6jQNDOISj5c
XMScJaFQKk1fvsQBfjiZNtRYnWibVtwYYE+5VE8ajCmhAmHioAM4rDnWkGhaQhw0/zpZZpXCvY+E
a0nQBUgeP/4QB3OxA9NKWmGSKAzDyzCMg+7bqSpQWUGFITTLnJCgf3p7vKm24mZzyLMqO6IzPlRz
CpsSj+5C8PJ+ZZSFVdDuQrUBdRZUKoZIjyJTQDFQhJoLF4X7FcNPwytYJeswuiXhlkThpyi6u/rm
Ltz8ibEYFjTrbc3OX7/F9acFXcS1kXgC99Fc6msPUZhzpQ0RtAKPsqTLukxWNRVHjwYqykuP/AVS
zY3PVl1I4ZPn9DALajA+VZzyssRc/odPqI0CwJxgTIHWvhAcDAjmbmIRUsqMltz4zCvYYSH64iSx
xsq2SrbXUXgbB2NR7zbmqToun6pVuxWElnVB12ehrt5DCYuXwrP5hY3uCI+WW8F8xTJodJfsVCl6
nCgxnqNG5TNSU2U4huPUll6t8Bmn1hRS8a/vmx+ZTanJCi+m4HX9v0zJNxLkP5OL49vp+iPJOZRM
9+fJpSbW4rRYw/pmm0VX+Jdep2uWpvkmYzfR7Q3kUR5RrL0BO2pMI3Mx3WsCSklFMOK1FBq8gWpw
o0BO0ckvOP7eBPQmpjnwCvRTa+VNTBOU/X6+/1zooDscNi/0iJrP0NYMzi89T5O4VjLD3TAOfa3R
Bt5Y+u325++/+wOj+RZoamXqiiMJ4+VzRz06g/WQfFujZg/Mu7pBNKFljDtPMPhz2Oyse8kzd0E5
XjyuwExMQc0jYh2vwF1a8rCAMvRAWubjVcEBqrrnBqmUJVCxSnJaase7BkDPRfAUJKOKdZlu5DP4
KjrlIrkOo/Vm41q3GHel6yTabKI46D66wkOTpGF5v3ONVXH67htPzVV7lZUUpkiidRzMhDPsEahC
mrMOJ+BG2u3b8QDi2lbDXB8/ntjBSXryspBlE2x/M+IV3QGxqkwKY2p9FwRUY8PXl6miXLiy6fL9
ErtwUNOjmwNPFWCusqdS7mSwx/Nf1mL3AGLPlRQOcK+pYKk8II0e7HedRkFNsXf8Kl36tf+3mgJo
aQr0GCmyeBbyRcTBSNaCGKTcnPTtZ6eyCi8Oc3BnS8cHR6jXmmGsOKKLk/MEHck6f+lRyXKE6AVd
+LS22FhxMIrnE2YinTZqmROnpSKDxG03l/ZxksxmDYE/bX2StSAr+BcLXR2hGCPPsRHPSsoVKIhK
Es2eFwpn0HddfVo43TOIFBzzTB0ndGIYxQ0C0FB3I67akLajoqrPpPIDfrDQPa9ObGX84moQy4+m
NkYaSfPOFRLeHD4WdP8ycO6NiI+W2JwgoTVHN+by9pDB/JR/88HPeXj++2EYJF2CtN2+pH4+aVOd
KV4v8s2RfujODZkmNfIbyQhSOuIi6u3jEyS6pYwXiy6/2seNPILTzUOWGddNqXp10FqRfYte6LRL
zz3sjXPfpkaRiLofDPBcC9U76Nuph293AXOreOd7N6ZzgKUB67aVL6S9zZkWw5Bapdu3AAODL96e
QU5V/rsZPST8208xs99IzoTDwQUAp47yu+EeVZipyFd9Bm2Wed4JeCMLZ3cnr62Bt95Y7RSn7DOO
abfeh+1GK+ECyaptH3GOTrSd+Ml14jhYAk3p3igoU1Y4ZnyLoPdtNRzxPVsDkTQFkgiCpehyFND1
XE6jO2k0yYe/AAAA//8DACZqXAG+EwAA
H4sIACM51VkAA+RYS2/jNhC+768wfGckOc7GDhQFBYo+DruH7qaHXgJKHFlcS6TKh2P313coybIU
UUl66APozZr5OBwO5/HR8cOxKhcHUJpLcb+MrsLlAkQmGRe7++Xj1x/IZvmQfIiNokLTzCAq+bBY
xJwlxZ5F++twEwf44WTaUGN1om1acWOAPeVSPWkwpoQKhImDDuCw5lRDomkJcdD8dLLMKoV7nwjX
kqALkDx++T4OpmIHppW0wiRRGIZXYRgH3bdTVaCyggpDaJY5IUH/9Pb0sdqKj5tjnlXZCZ3xoZpT
2JR4dAvBy/ulURaWQbsL1QbUu6BSMUR6FJkCioEi1CxcFO6XDD8Nr2CZrMLolkQhCddfo+3dOryL
tr9hLPoFzXpbs7+2/rKgi7g2Ek/gPppLfekhCnOutCGCVuBRlnRel8mqpuLk0UBFeemRP0OqufHZ
qgspfPKcHidBDYanilNelpjL//AJtVEAmBOMKdDaF4KjAcHcTcxCSpnRkhufeQU7LERfnCTWWNlW
yXYdhbdxMBSd3cY8Vaf5U7Vqt4LQsi7o6l2o67dQwuKl8Gx6YYM7wqPlVjBfsfQa3SU7VYqeRkqM
56BR+YzUVBmO4bi0pRcrfMapNYVU/I+3zQ/MptRkhRdT8Lr+X6bkKwnyn8nF4e10/ZHkHEqmz+fJ
pSbW4rSgt0BvaE5vNnm+zm9utlHGsmwN19vr6+sVxcF4wQ4a08BcTA+agFJSEYx4LYUGb6Aa3CCQ
Y3TyCcffq4CziXEOvAD93Fp5FdME5XCY7j8VOugOh80zPaHmG7Q1g/NLT9MkrpXMcDeMw7nWaANv
LP306ZcfP28xmq+BxlbGrjiSMFw+ddSjM1gPyXc1ag7AvKsbRBNaxrjzBIM/hU3OepA8cxeU48Xj
CszEFNQ0ItbxCtylJQ8zKEOPpGU+XhUcoarP3CCVsgQqlklOS+14Vw84cxE8BcmoYl2mG7kHX0Wn
XCTrMFptNq51i2FXWifRZhPFQffRFR6aJA3L+5VrirnSf58bT81Ve5WVFKZIolUcTIQT7AmoQpqz
CkfgRtrt2/EA4tpWw1wfv1zYwUV68bKQZRNsfzPiFd0BsapMCmNqfRcEVGPD11epoly4suny/Qq7
cFDTk5sDTxVgrrKnUu5kcMDzX9Vi9wDiwJUUDnCvqWCpPCKN7u13nUZBTbF3fJYu/drfraYAWpoC
PUaKLPZCPos4GMhaEIOUm4u+/exUVuHFYQ7ubOn44AD1UtOPFUd0cXJeoANZ5y89KVkOEGdBFz6t
LTZWHIxif8GMpONGLXPitFRkkLjtptJznCSzWUPgL1tfZC3ICv67ha6OUIyR59iIJyXlChREJYlm
+5nC6fVdVx8XTvcMIgXHPFOnEZ3oR3GDADTU3YirNqTtqKjqd1L5Ht9b6J5XF7YyfHE1iPlHUxsj
jaR55woJbw4fC/r8MnDuDYiPlticIKE1Rzem8vaQwfSUf/PB3/Pw/PfD0Eu6BGm7fUn9fNKmOlO8
nuWbA33fnRsyTWrkN5IRpHTERdTbx0dIdEsZLxZdfrGPG3kEp5uHLDOum1L16qC1Is8teqbTzj33
sDdOfRsbRSLq/jDAc81Ub69vpx6+3QVMreKdH9yYzgHmBqzbVj6T9jYnWgxDapVu3wIMDL54zwxy
rPLfzeAh4d9+jJn8R/JOOBxdAHDqKL8b7lGFmYp81WfQZpnnnYA3MnN2d/LaGnjtjdVOccq+4Zh2
633YbrQSLpCs2vYR5+hE24mfXCeOgznQmO4NgjJmhUPGNwt621bDEd+y1RNJUyCJIFiKLkcBXc/l
OLqjRpN8+BMAAP//AwDJUZaZvhMAAA==
headers:
cache-control: ['max-age=0, private, must-revalidate']
content-encoding: [gzip]
content-type: [application/xml; charset=utf-8]
etag: [W/"efe3f30c0cc6215b25d82b785c61ce29"]
etag: [W/"78b025bfea76cef17e6bb082f740ff42"]
strict-transport-security: [max-age=31536000; includeSubDomains]
transfer-encoding: [chunked]
vary: [Accept-Encoding]
Expand Down
Loading

0 comments on commit cda6668

Please sign in to comment.