From 3f7692d15d4314877f094b2bcaef83261284afb9 Mon Sep 17 00:00:00 2001 From: aandis Date: Sun, 6 Mar 2016 15:26:42 +0530 Subject: [PATCH 01/11] Added character restriction explaination. Closes #3880. --- www/new.spt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/new.spt b/www/new.spt index 8c4e42c726..9d6cc7defd 100644 --- a/www/new.spt +++ b/www/new.spt @@ -1,7 +1,6 @@ from datetime import datetime from aspen import Response -from gratipay.models.community import slugize from gratipay.models.team import Team [---] request.allow('GET') @@ -58,6 +57,7 @@ still_migrating = delta > 0 +

{{ _("Must contain alphabets. Can optionally contain numbers, dashes (-), underscores (_), periods (.), comma (,) and whitespaces.") }}

From 767a6caf6059f6ddf85c678f2469a20a21f43b71 Mon Sep 17 00:00:00 2001 From: aandis Date: Sun, 6 Mar 2016 15:45:54 +0530 Subject: [PATCH 02/11] Added error message for invalid character in team name. --- www/teams/create.json.spt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/www/teams/create.json.spt b/www/teams/create.json.spt index bc289bc953..5a6a510c93 100644 --- a/www/teams/create.json.spt +++ b/www/teams/create.json.spt @@ -4,8 +4,8 @@ from cStringIO import StringIO import requests from aspen import Response -from gratipay.models.community import slugize -from gratipay.models.team import Team +from gratipay.exceptions import InvalidTeamName +from gratipay.models.team import slugize, Team from gratipay.utils.images import ( imgize, ImageTooLarge, @@ -70,6 +70,11 @@ if request.method == 'POST': , field_names[field] )) + try: + fields['slug'] = slugize(fields['name']) + except AssertionError: + raise Response(400, _("Sorry, team name contains invalid characters.")) + try: large, small = imgize(image, image_type) except ImageTooLarge: @@ -79,8 +84,6 @@ if request.method == 'POST': except UnknownImageError: raise Response(500, _("Sorry, there was a problem saving your image. Please try again.")) - fields['slug'] = slugize(fields['name']) - try: team = Team.insert(user.participant, **fields) except IntegrityError: From 34abe3a1eabb6de83bd2c7b4581541acf0ae2bd2 Mon Sep 17 00:00:00 2001 From: aandis Date: Sun, 6 Mar 2016 15:46:43 +0530 Subject: [PATCH 03/11] Added test for invalid character in team names. --- tests/py/test_teams.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/py/test_teams.py b/tests/py/test_teams.py index c06d3b70fd..3562c6f8c7 100644 --- a/tests/py/test_teams.py +++ b/tests/py/test_teams.py @@ -296,6 +296,14 @@ def test_error_message_for_bad_url(self): r = self.post_new(dict(self.valid_data, todo_url='foo'), expected=400) assert "Please enter an http[s]:// URL for the 'To-do URL' field." in r.body + def test_error_message_for_invalid_team_name(self): + self.make_participant('alice', claimed_time='now', email_address='alice@example.com', last_paypal_result='') + data = dict(self.valid_data) + data['name'] = '~Invalid:Name;' + r = self.post_new(data, expected=400) + assert self.db.one("SELECT COUNT(*) FROM teams") == 0 + assert "Sorry, team name contains invalid characters." in r.body + def test_error_message_for_slug_collision(self): self.make_participant('alice', claimed_time='now', email_address='alice@example.com', last_paypal_result='') self.post_new(dict(self.valid_data)) From 47cfd17d2c9c32915991f866f55feaa8f3beb88f Mon Sep 17 00:00:00 2001 From: aandis Date: Tue, 8 Mar 2016 23:26:23 +0530 Subject: [PATCH 04/11] Added slugize to team model. Fixes #3426. --- gratipay/exceptions.py | 1 + gratipay/models/team.py | 18 ++++++++++++++++++ www/teams/create.json.spt | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gratipay/exceptions.py b/gratipay/exceptions.py index ac33104056..87494773f0 100644 --- a/gratipay/exceptions.py +++ b/gratipay/exceptions.py @@ -57,6 +57,7 @@ class NoSelfTipping(Exception): pass class NoTippee(Exception): pass class NoTeam(Exception): pass class BadAmount(Exception): pass +class InvalidTeamName(Exception): pass class FailedToReserveUsername(Exception): pass diff --git a/gratipay/models/team.py b/gratipay/models/team.py index adac4208e8..d149ac6985 100644 --- a/gratipay/models/team.py +++ b/gratipay/models/team.py @@ -1,10 +1,28 @@ """Teams on Gratipay receive payments and distribute payroll. """ +import re import requests from aspen import json, log +from gratipay.exceptions import InvalidTeamName from gratipay.models import add_event from postgres.orm import Model +# Should have at least one alphabet. +TEAM_NAME_PATTERN = re.compile(r'^(?=.*[A-Za-z])([A-Za-z0-9.,-_ ]+)$') + +def slugize(name): + """ Create a slug from a team name. + """ + if TEAM_NAME_PATTERN.match(name) is None: + raise InvalidTeamName + + slug = name.strip() + for c in (',', ' '): + slug = slug.replace(c, '-') # Avoid % encoded characters in slug url. + while '--' in slug: + slug = slug.replace('--', '-') + slug = slug.strip('-') + return slug class Team(Model): """Represent a Gratipay team. diff --git a/www/teams/create.json.spt b/www/teams/create.json.spt index 5a6a510c93..a294633e3b 100644 --- a/www/teams/create.json.spt +++ b/www/teams/create.json.spt @@ -72,7 +72,7 @@ if request.method == 'POST': try: fields['slug'] = slugize(fields['name']) - except AssertionError: + except InvalidTeamName: raise Response(400, _("Sorry, team name contains invalid characters.")) try: From 28ffee10e3f6c3fbeb0be0af358282f54b8bceec Mon Sep 17 00:00:00 2001 From: aandis Date: Wed, 9 Mar 2016 16:38:30 +0530 Subject: [PATCH 05/11] Modified fake_data to use new slugize. --- gratipay/utils/fake_data.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gratipay/utils/fake_data.py b/gratipay/utils/fake_data.py index fac0efcb4b..f789ff49a6 100644 --- a/gratipay/utils/fake_data.py +++ b/gratipay/utils/fake_data.py @@ -10,7 +10,7 @@ from gratipay import wireup, MAX_TIP, MIN_TIP from gratipay.elsewhere import PLATFORMS from gratipay.models.participant import Participant -from gratipay.models.team import Team +from gratipay.models.team import slugize, Team from gratipay.models import community from gratipay.models import check_db @@ -82,8 +82,7 @@ def fake_team(db, teamowner): teamslugname = faker.city() try: - #using community.slugize - teamslug = community.slugize(teamslugname) + teamslug = slugize(teamslugname) homepage = 'http://www.example.org/' + fake_text_id(3) _fake_thing( db , "teams" From 0c0b9b01cae73f73f095a99ec52f74551e89fadc Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Tue, 15 Mar 2016 13:12:03 -0400 Subject: [PATCH 06/11] Alphabets -> Letters --- gratipay/models/team.py | 2 +- www/new.spt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gratipay/models/team.py b/gratipay/models/team.py index d149ac6985..94bb3005e5 100644 --- a/gratipay/models/team.py +++ b/gratipay/models/team.py @@ -7,7 +7,7 @@ from gratipay.models import add_event from postgres.orm import Model -# Should have at least one alphabet. +# Should have at least one letter. TEAM_NAME_PATTERN = re.compile(r'^(?=.*[A-Za-z])([A-Za-z0-9.,-_ ]+)$') def slugize(name): diff --git a/www/new.spt b/www/new.spt index 9d6cc7defd..13a347b897 100644 --- a/www/new.spt +++ b/www/new.spt @@ -57,7 +57,7 @@ still_migrating = delta > 0 -

{{ _("Must contain alphabets. Can optionally contain numbers, dashes (-), underscores (_), periods (.), comma (,) and whitespaces.") }}

+

{{ _("At least one letter A through Z, plus numbers, dashes (-), underscores (_), periods (.), comma (,) and whitespace.") }}

From 283626334f2b464e5472618be3572f3a3fdfea57 Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Tue, 15 Mar 2016 13:13:20 -0400 Subject: [PATCH 07/11] Pep 8-ish whitespace between functions --- gratipay/models/team.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gratipay/models/team.py b/gratipay/models/team.py index 94bb3005e5..b2a181bbfe 100644 --- a/gratipay/models/team.py +++ b/gratipay/models/team.py @@ -7,9 +7,11 @@ from gratipay.models import add_event from postgres.orm import Model + # Should have at least one letter. TEAM_NAME_PATTERN = re.compile(r'^(?=.*[A-Za-z])([A-Za-z0-9.,-_ ]+)$') + def slugize(name): """ Create a slug from a team name. """ @@ -24,6 +26,7 @@ def slugize(name): slug = slug.strip('-') return slug + class Team(Model): """Represent a Gratipay team. """ From c9a905030bae738636edeb1340e35c1f1b7eea87 Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Tue, 15 Mar 2016 13:20:43 -0400 Subject: [PATCH 08/11] Here's a test suite for slugize --- tests/py/test_teams.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/tests/py/test_teams.py b/tests/py/test_teams.py index 3562c6f8c7..44104ee84e 100644 --- a/tests/py/test_teams.py +++ b/tests/py/test_teams.py @@ -8,7 +8,7 @@ from aspen.testing.client import FileUpload from gratipay.testing import Harness -from gratipay.models.team import Team, AlreadyMigrated +from gratipay.models.team import Team, AlreadyMigrated, slugize, InvalidTeamName REVIEW_URL = "https://github.com/gratipay/test-gremlin/issues/9" @@ -486,3 +486,39 @@ def test_update_updates_object_attributes(self): team.update(name='Enterprise', product_or_service='We save galaxies.') assert team.name == 'Enterprise' assert team.product_or_service == 'We save galaxies.' + + + # slugize + + def test_slugize_slugizes(self): + assert slugize('Foo') == 'Foo' + + def test_slugize_requires_a_letter(self): + assert pytest.raises(InvalidTeamName, slugize, '123') + + def test_slugize_accepts_letter_in_middle(self): + assert slugize('1a23') == '1a23' + + def test_slugize_converts_comma_to_dash(self): + assert slugize('foo,bar') == 'foo-bar' + + def test_slugize_converts_space_to_dash(self): + assert slugize('foo bar') == 'foo-bar' + + def test_slugize_allows_underscore(self): + assert slugize('foo_bar') == 'foo_bar' + + def test_slugize_allows_period(self): + assert slugize('foo.bar') == 'foo.bar' + + def test_slugize_trims_whitespace(self): + assert slugize(' Foo Bar ') == 'Foo-Bar' + + def test_slugize_trims_dashes(self): + assert slugize('--Foo Bar--') == 'Foo-Bar' + + def test_slugize_trims_replacement_dashes(self): + assert slugize(',,Foo Bar,,') == 'Foo-Bar' + + def test_slugize_folds_dashes_together(self): + assert slugize('1a----------------23') == '1a-23' From c444fe2541c5b89a7755b917601ec3742c7926c4 Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Tue, 15 Mar 2016 13:40:29 -0400 Subject: [PATCH 09/11] Revise failure message "23456789" technically does not contain invalid characters. ;-) --- www/teams/create.json.spt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/teams/create.json.spt b/www/teams/create.json.spt index a294633e3b..35f83735e9 100644 --- a/www/teams/create.json.spt +++ b/www/teams/create.json.spt @@ -73,7 +73,7 @@ if request.method == 'POST': try: fields['slug'] = slugize(fields['name']) except InvalidTeamName: - raise Response(400, _("Sorry, team name contains invalid characters.")) + raise Response(400, _("Sorry, your team name is invalid.")) try: large, small = imgize(image, image_type) From 4063a7cec696b9cea1c7f0cb34a928a15d395149 Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Tue, 15 Mar 2016 13:52:59 -0400 Subject: [PATCH 10/11] Fix test regressions --- tests/py/test_teams.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/py/test_teams.py b/tests/py/test_teams.py index 44104ee84e..a5749af080 100644 --- a/tests/py/test_teams.py +++ b/tests/py/test_teams.py @@ -302,14 +302,14 @@ def test_error_message_for_invalid_team_name(self): data['name'] = '~Invalid:Name;' r = self.post_new(data, expected=400) assert self.db.one("SELECT COUNT(*) FROM teams") == 0 - assert "Sorry, team name contains invalid characters." in r.body + assert "Sorry, your team name is invalid." in r.body def test_error_message_for_slug_collision(self): self.make_participant('alice', claimed_time='now', email_address='alice@example.com', last_paypal_result='') self.post_new(dict(self.valid_data)) r = self.post_new(dict(self.valid_data), expected=400) assert self.db.one("SELECT COUNT(*) FROM teams") == 1 - assert "Sorry, there is already a team using 'gratiteam'." in r.body + assert "Sorry, there is already a team using 'Gratiteam'." in r.body def test_approved_team_shows_up_on_homepage(self): self.make_team(is_approved=True) From 2196bd6d2a87799d187cc8cb48f0cbcbd000acef Mon Sep 17 00:00:00 2001 From: aandis Date: Wed, 9 Mar 2016 16:24:07 +0530 Subject: [PATCH 11/11] Added tests for new slugize. --- tests/py/fixtures/TestTeams.yml | 679 ++++++++++++++++++++++++++++++-- tests/py/test_teams.py | 9 + 2 files changed, 657 insertions(+), 31 deletions(-) diff --git a/tests/py/fixtures/TestTeams.yml b/tests/py/fixtures/TestTeams.yml index e40f8f8423..5f4ded1923 100644 --- a/tests/py/fixtures/TestTeams.yml +++ b/tests/py/fixtures/TestTeams.yml @@ -155,7 +155,7 @@ interactions: response: body: string: !!binary | - UEsDBBQAAAAIAMmEY0hx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + UEsDBBQAAAAIABBVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN @@ -535,8 +535,8 @@ interactions: WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi - 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIAMmE - Y0h3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABBV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB @@ -592,8 +592,8 @@ interactions: l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 - B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAyYRjSHHt - m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIAMmEY0h3+548iwwAAIYM + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAEFVpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABBVaUh3+548iwwAAIYM AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= headers: content-type: [application/zip] @@ -601,7 +601,7 @@ interactions: via: [1.1 vegur] status: {code: 200, message: OK} - request: - body: "{\n \"body\": \"https://gratipay.com/gratiteam/\\n\\n(This application + body: "{\n \"body\": \"https://gratipay.com/Gratiteam/\\n\\n(This application will remain open for at least a week.)\",\n \"title\": \"Gratiteam\"\n}" headers: {} method: POST @@ -609,7 +609,6 @@ interactions: response: body: {string: !!python/unicode '{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}'} headers: - access-control-allow-credentials: ['true'] access-control-allow-origin: ['*'] access-control-expose-headers: ['ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, @@ -776,7 +775,7 @@ interactions: response: body: string: !!binary | - UEsDBBQAAAAIAMuEY0hx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + UEsDBBQAAAAIABNVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN @@ -1156,8 +1155,8 @@ interactions: WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi - 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIAMuE - Y0h3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABNV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB @@ -1213,8 +1212,8 @@ interactions: l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 - B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAy4RjSHHt - m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIAMuEY0h3+548iwwAAIYM + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAE1VpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABNVaUh3+548iwwAAIYM AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= headers: content-type: [application/zip] @@ -1377,7 +1376,7 @@ interactions: response: body: string: !!binary | - UEsDBBQAAAAIAMyEY0hx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + UEsDBBQAAAAIABRVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN @@ -1757,8 +1756,8 @@ interactions: WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi - 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIAMyE - Y0h3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABRV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB @@ -1814,8 +1813,8 @@ interactions: l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 - B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAzIRjSHHt - m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIAMyEY0h3+548iwwAAIYM + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAFFVpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABRVaUh3+548iwwAAIYM AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= headers: content-type: [application/zip] @@ -1823,7 +1822,627 @@ interactions: via: [1.1 vegur] status: {code: 200, message: OK} - request: - body: "{\n \"body\": \"https://gratipay.com/gratiteam/\\n\\n(This application + body: "{\n \"body\": \"https://gratipay.com/GratiTeam/\\n\\n(This application + will remain open for at least a week.)\",\n \"title\": \"GratiTeam\"\n}" + headers: {} + method: POST + uri: https://api.github.com:443/repos/gratipay/test-gremlin/issues + response: + body: {string: !!python/unicode '{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}'} + headers: + access-control-allow-origin: ['*'] + access-control-expose-headers: ['ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, + X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, + X-Poll-Interval'] + content-length: ['83'] + content-security-policy: [default-src 'none'] + content-type: [application/json; charset=utf-8] + status: [401 Unauthorized] + strict-transport-security: [max-age=31536000; includeSubdomains; preload] + status: {code: 401, message: Unauthorized} +- request: + body: !!binary | + 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 + 07bedrX2phuSN2o6eDvKOhk787vIu9K7NruTuld6InuWbgbcnO316H16y/nWw9s2t4f7zPru9hv2 + 37qjc6f7rsbdjgHVgbZ7yvdaBhUHm4cUhpr+UviraVhxuPm+0v3WEZWR9lH10a4xrbGbD/Qf9D80 + eTg4bjk+OuEw8fjR7kdTj30fv3kS+uTjZNzk2tOUZ9hnOc9pnhe/4HhR9VL0Zf2U4lTntP700Izd + zNNZn9m3r6Jfrc+lv6Z6XTzPPV/7RvZNx4Lhwsii2+Lc28i3a0uZ72jflb8XeX/9g/aHoWXn5bmP + pI+bnw5/Zv1c80X+S++K9cqLr2Ff177lrLKuXviu/P3OD6cf82vx6/j1kg3RjfafZj+fbYZtbkZ6 + kby2rwIIWmF/fwA+1QBA5QIAPZrHkRN38q9fBYG20g4A8OhNwRS9AcxCYui53QOzwjHwJGKC3MIY + YR5iw3C0uF78XoImGZ7sOXkbRTllPlUN8RkNDa0ZXTb9ACMt027mS6wYNi/2Tk4ersPcq7y+fJMC + loIDwlIieaJvxU12VUp8ldKTPiIzIkclr6sQrViu1KM8pbKhxqwurqGiaaBlq+2jE62brndCv86g + 2/CB0YLxpimj2S5zPQs3yyCrOOsMm0LbSrs6+xZ01Q86jTk/cXnpOuv2Zve7PW/cn3kMe3Z71XtX + +BzxTfLz97cJUAsUCCIGfQ1+GdIfWht2JDwywi5SKYotap30Ironpjo2I84/3iRBPJE8cTFpKLlh + b8m+9P3xB6JSSKlJaTkHz6R3Zrw8RJalnh2ZU507cYQ8Tz0/7GhFwXDhxrFdx92Kc040l0yVUpQp + lHucyq5orHx6BlMlUe149sC5C+dHa1ZreS6a1+291Hj5Y71qQ/7VD9fcrt9vtmp52KbeHnOjtuNZ + F0W3XI/jzajejFsFt4v7ivsL7mTdPThw6N6RwSNDGX/FDDvdl7y/NtIzmjymOPb1waOHbeOlE/se + eTzWfSI4STb57unos6bnpS/2vfSc0p8WnaGZ+T77+tXE3MDrm/M33rQttC2ee5u3FPfO/b3BB/Fl + muWVj5Ofuj6f+ZKxEvjV7JvUKv3qt+/PfvSsVa2nb/j91N/k29xE448DbOjtMAH0oTc6c+go9BKW + Q+9enxEPZAK9NT3HRuKIuBa8H4GNMElWTh5AoUupQWVPDKROoTlNe5NugYGRUZ8pkbme5QObJDuJ + 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 + UccrJXgm5ia1Js/vY95vcmBfSmPq4kH+9D0ZpZmPs5izXXIqcl8dkchLyO8vYCmMKBo6Ll1cVkI8 + mV1GWX68QrjyzpmgasqzjeddL2BqG+o8LtNcudWQ0Ch17U1TTUtQm0T7p472rrQe817mW7N9DXf2 + DpgOsg6NDDvcnx1NesD1cHgi97HdpNAz6PnMy/7putn8OdK83QL7YuWS8LurHzSXhz95fP6wkvKN + evXkD661yg22n/nb8WcGOiASVIL7YBONvT90EuqDPsN8sC2cDrfASwgv4oyu9wEMgtHEJGFaMCtY + BWwcthOHxVnhynCLeDX8Ufwbgj7hLBmBLJLsGbk5eQ+FEhppXcohKheqReJ+akbqBhormo+0xXSa + dAv0pxjsGKkY7zFlM5uz0LFMsp5jI7HrcNBzvOXs5zrLnckTwmvPp8MvKyAsyC3ELswmwiMqLqYi + brbLS2KvZKlUp/QrWaKcujxJ4YriB2UFlVTVMXURjXTN19rmOi164vpnDXmNqk1ETZvM9S0eW0Xa + UNo22Luh67XTJc5Nfveqe4/nEW93X0V/yoAnQaUhJqEL4YkR61ExpLkY69hr8bQJpMSHyap7z+yn + OJCQMp/mfHAoQzezPUs+uzlX4/BAnkv+24L9RbTHqoqlTrSd1CztLlc/1VyJPW1+5njVy7Ni5+LP + 911grPW/2H6JeNn3SkcD49XIxsHrImjm867Vpq3lBldHZuf7bqeem73it47f3uwPvvNwQPte3RDT + X9HD90bYRwPHLj1YHOefcHqU9vjCk3uTc0/Xn9O84H4pPqUwrTqjOav9SntO87XqvNIbmQWxRb63 + xLcLS23v4t8rvF/6cG7Z5SP5x45P/p9pPrd+2b0CVqq+6n6d+XZglWO17bvD9+Ufh9eE13rX3ddX + N4p+Sv0c2PTdin+0v5zs9vEBUeoCgH2xuflZCE0qCgHYKNjcXKva3NyoRpONZwD0hO78t7N91tAA + UF79n/5j+S+y5M7QfRndOAAAAZtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEg + eG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJk + ZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt + bnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1s + bnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQ + aXhlbFhEaW1lbnNpb24+Njg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQ + aXhlbFlEaW1lbnNpb24+Mjk8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNj + cmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K1c8BZQAABrFJREFUWAntWHtsU1UY + /7oHuxp1FyOxRsPaGJJh1HWJCZrMtUQTlqjJIsqtRGmnCfIIdvIa/mEI/IEPkC1RWKcJK0TpRniI + JGxEZGwQRtDQTsVWUHvlD1aH2pKAPRPp8Tvn9t7eR8tm4A/AneT2vH7fd77zO4/vO7VRTDCRNAZK + tNJEgTMwQYhpI0wQMkGIiQFTdWKH3DKEkDPQbCuH0tplIJP/7ijlPavBZrPBqr0/GSi5qXdIFP6B + bPQEpA1TGl+FkPMcKKczBoEyQ+1mqggiNLe3gVeYBg7Bdt0sL04IIZBMJoHAKH53gcNxHwhXGZak + f4MkY1uoBLt9cnEsuYB6U0AEAURRBBHzYomQEZDlP3m3YK8Ch3ibDjoFGhcEdHV9cRTSaHuaHaWx + 7NGLsTKLVM0p1vMRO5Smr46GI79r0MTuVbxfav2Mdq6cZcDaahbTvsQlDasUCB3cssKAY2O4A5/Q + WCZrwfZtnG/B2tzLaCT1l4LNnKY+KKElJYt08oRGtr9tkWPjBNoP0oxulNj2hRwnhb7VtWLUbqhh + JRXZklfofpm2tDTTGh054dxEVYV54uqoJD2Wl4U6Opi6klNP6J43Hsz31bxAfXPy2NLSpYZJ6bE1 + 0hIa8D2lyZaVraHDTGuOEJttNo3kCE3sf0vDAY4RCASoW2e77/MzOXsoVe0fk5DBdc9wpWWrDmjC + lI7Qzjn383ZPUGFUVcgIkYJHNPYziSOaEa53B7gOPcmtfac0vanITo1sqes73p6J7dIm5Qt9bcCq + 5IfjFw2EKDuM0PCTU7isW2cPpYT2bXxWmVPzF5qdqv1jE7LRx4VLvR/ThG4rZxJDNBwO077csVEV + stVNaGYrheFDaxQDXO/RFBoUnvMAr3vaTpiQlKpHr8y7lRvbt86jyPq3acYrQrjL5lXxvtbj5wsQ + QmkkvB53xQZtx6iDJfav5nKTPMoYrF2130yI5VIV7bfjQgBc6ZoPTvxwy4K/wQMez0zweh/lffqf + uk1ecOgbsCw6H+EtV4ZOYIyQAZIkvD6wNAShylNA8MLmCS9UubODF0uSLBsFufd7Xp/tcZku5gpo + 3CpDpoOCwLwKSXGc/sflXQ5tjSMQPb4PQvEExONDIEei0D0Q0cOuWrYQUv1SK/SN3gEzm9ZzwaHu + D+FN/FjC8wqHftkGHodCGmuzF/ASgn0aSFACOxiAJXsFz7LZzdDUxIvWnwuMpAqobnwCYGAfuByT + rRhs4WQU7AGIY7A1/fm1RXrH11wgMKsAj/99oJkMJGJR6Al3QKC+lmujdBfMatqJbliXCsQARD4N + 3ZBFUAWuMrrA2EUuIIWOQCKRKPj9uP9FjpWPK6sZTVrDLebaZVlW3KnOBF5MHtLIQG8EPYMncZxz + kMlkIRX5zIwuWjcRch6C0tPg8iyHOE7GUV0DDd750NZ/ElLHNnMll/sPGELl3cFjlkgxnfyVY8vd + szBoEsE+/c6cAZUYzzgMn5g+Bn6/H9r2nuIYQSjl+e7eH4zEI7GhyU5wOp0QHPojpy+fkbRCYKlr + LZw7vAEaHq9VYidcsGTkqzxwjJKJEALyjgEY6v8AgjkDVfn0qLIvympm4DHBM5xLlw+/Ds3d36hV + IPGD0DBzKa8/1OjEVa8AV+NzvN7tXwS98Ut5rHwUFtS+Av39/RBFHNtRngUtvP9ySILg4Z81rNy7 + CRaCEma7qu7W2vOFUV7MDsUxQGS7U0nJ6C7wvrqFV7J2tfUquXoTq3ls+2v8RkYRChgDtHcGaUAX + M7hzrlC9pTkOsTW+FfSdwFxNVh8fUHqWtkC51icFVhqwxuDqAu2sv0fDun1LDDFLefMBxfuY45DU + Uc2FAzxMAy0tVKqv1PSodvpav+Tyqv1mL2MJzJjf7lk3z6KIKZTaFGV6twXuxTRQLxrwBSPVzFna + Pm+GAcd0lnjWYvSpBnDqsozQsCn6ZVhf6z5047lUIFIdHvzUot/mXU8jsai2IJNqOwyE+HLxj6rW + xgo4mCWR9FmI4ztCwPcDwS1or3YaPEo8vAimz20Hqes0dEnTIMkvO4Je4F48u4U9BBuE4P2ivjBF + exXYDe8Toxn8fUQmgYDvH/aWEXVH1YjU1RAry8P8/jHoR1efZu6evaEKeEZVg8Xtqh2COBVcrqlq + tXieiynseFmO54iyiVWPB4gjCiKSy0cuTrDFMHzMOaorLc1jEaEKmC5Vtfn/m18DIX9z1niAeQvx + V/QOGXuO+D9JGq8fAYOv8ZztsRXeEIhrIOSGsP+6G3ENR+a623JDKJwgxLQM/wKlv4aNE1ZNyAAA + AABJRU5ErkJggg== + headers: {} + method: POST + uri: http://gip.rocks/v1 + response: + body: + string: !!binary | + UEsDBBQAAAAIABVVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd + WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj + QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN + ZAW9IQ/ovsEnu35qIW0JQLbHww1A32R/lJrYD5qhbOn/4nD5/u/A0yUxmlbPGWT/klB6zbAuXLOl + 7j0diOFl91I1zllaH10v2P3/i9nGBpdE0vMIi7cvRZRf/4s8vLKlOHJbcK6mjAWpnq5cxqOernpO + 4aZvDDL8P19Iyc03HDu/ApHnUayCknm3E+ewyJspLk1+9e2pmOGktar1/M9xVH5m/Ovd1lorpYFF + 4InaZfTJQ/rpp62G5ivwzrLkioNH6f5/sUJWIt24oS6E367RhEXSamUsPOj3fqaGA/6NPX5z5Lzn + okt7/S8vmCZMLCNiw7MAJRVzlsnHpNNZKUL/9xzww28BXeIzjMD6Z8vLmPid7C75yTa6tWYpCy6u + nd6A+Rp6bXC8/xUqILjG7VBjzT8eHPdPFfk825HntE2viUE6P4icEcIF0zhpZAbhP4mJW41zLKxL + tpsbw+oEBg4W936+GnH+y3uh4jsoOWt4L/0UDQw8/HuN2RcMxUi/y0PDwD4U34aMktf9L6zfQstH + a8xf53fPrDA1idilFQIJS6/UTlsOe3qGoAf9tNDo/fWz0Hr3huUJDN8EOl9SDos6hUKffqCyZF8g + xYDFOxLfMKs+WpDvStCHH8MLj+B7w2w9pP5pNf8HLgpRnwnmoavXBymy4MvQe38Fq5u7RnB/e7nt + +Xuh/ru/DdrQz1Qdf7Haj+568XrYoaFzPxU5Li6F+zowAuzjR8//GYFGrRAaoB+++ogfo+wek31I + 05qijBXvZvavlHLGVHr9MzlniFyD/Td/wO2+n787nbFNOXJ4HNT/6OiKVPoXHPo95gAtAvMnABMb + ScTS43u334+aNzJP7jpnoOO1lCCWYn5M+LrMzUOu8dU7ctez7znEvqdkzVNZeuVuOScWu8ZUtqiw + 5uEK165m879rfbVkr/YNf0a5oy3Z74MFIWMa658bNsX8ePGCGLJ5rrXdEjNHxHTgkJMgQjVYZxrt + J+VBHiD7Kja1jdinvr6izj0yCZ77f/gsi1BqH39seZFscTZB790+JJoTKACXNRtjFDZDGnrLJfiz + jv/6m/QjFkwEFED3CHsLipSLeXAbMeclllGIQkN4iaho+LDF2h67aDhvvLd9g20H3qAVfrO9loLP + +W3ctv1qM1+47m728e9YFYQ2/txgdLjKv/vwXrgMmBH9xCd4LP/WbdPGr1V0f81S7Pg+fBqW8AWx + //t0tQfU9vVpxpLX+AwwsKoX/xQ0bpcK4LdwTjaOI4/1fm7O5WdaVJFGLL+49/8sAGbkcB+wKgr1 + b4MZWE3tRyC2D7qjXEsklv+dmY8E73byFbnyU/7n0xUgdHdF9frTvZx/1VYtc80Flv/iuT+XgUuR + L9B+c7vqLP5aTqX7uX72JtcPHSj6jqIcMGDlLa8P91U4bYSfQokjYVBY6ts0HNA2+2O64G/0jxnw + b/xqRVO6ByS0f13Ao77vhq8/h79lv2i5QKmAWm2hlEt24jiVdLby8ejuJto2lEW8eeAftaYvpe/y + 3hXk3MuuFVPr3em9UDMcv2qDjsgVUVf1F6hNqIRPhW/PhnAQuFGGVWFil9hGgdJJKZzKLzh55S+B + p+A48ILGTEx6la+g2vespsUpSgAyLN1u78p++WJAIu5hrz06MdV390sj2lbAz3c+LSQYnRpb+M9v + 8jutikHsmKCyejCSw+XATFzmWyFVUxsxfbzY1o0poxjUqT93o6B4GkbwY+xvSSZU4n30Q/7v/oi+ + Fkz4ZDmvuwg/nbAD5TfD2MDms2tEkjnc+wjdtisXvmKoGrDDofUAJAADIvUattnvCgCN8BcMtS5+ + SOMsv3TfgiGoFTkYTc6YT4G/7Ll2LJrErnnibasagCQJNtUV84qJsxfjdruN/xis30M2d7UkyQex + 3fSz9no0uLaophGK1rTSybBdhbRFnPoUquJyu/3XbJH0QttL5cK/8ouBltbPzvq9JRAMpZSM8Cbm + 1LRBNShbhCGdEggSClHaBdxUpC0xq/Ycz8Cf1gJrLN1t+Umsju9ztxiqgo9tw59hQrAF0l3aJFga + DlEfasXjd9x5VU+dojRROCXRQs9KlB+tfyvSWbMa6nz2ZrYVdEB15QwMdW3ldAxzbdW19C0t2R13 + 61KIVZCGTjWXy7PHEnGZqGRYGsjkcszgAPm7Pnb7WisV08rGspGN6Cpamung4hrqx+ieChpnMe3V + zCmjWPDCxCFQJZrQv8KfAKb/qCXr45kvdUDjSwFTMpAC1osmVhCtXGC1b3izplo+RnL582//Z2ug + k0NQtiQVUIoHYpN6/rsXZB5pYfb0U1D5YBmGv1gJxTuC7kK7uS9R0M0q4osT0QS5LbCpkBGuiZ9s + GnaJn2wetqoYCKKlkkbxXw6r4VNatBCtyCuivMiyYUuwlew6dC0anrJFaWNPvi1YR++3j35E86/3 + AhIHfPEPEu+j/lM0rwG21x4Dqnhjlh/2cBXOQGWlVB7t/KQzHOuklBMeiUWwhpIJuuieMmo6oF2l + bpY0wOp89SlxS+oddOo1r3vm6aE1odwPbF6s/ftFYGiBDJY9CfNtn1nMpypvKAkr1YuNS0LGzqYG + GZtk4Wf+Zz1gOyEIWbpSSYU0JwplS6wKpJQsdV8iQsCsXLF83ZT7go3gNTOeVDLf9JSJFprvbugp + zex1np5JfkJOTbg1zFWsb7NBxyGztm1mnaX6l2gyZmbVUCqF+mpgI2cmVCBGMuylMDW5rK0aXN/Z + 0tYwXJencUEhH+k1wqX7p+unvvd3ZBHq8woWiGdizTG8h4/u5p6V/evXbYxfXVE0ibbqKN7RbPio + xTSw1xilnL6NRttAKZ3CXFnl7D9QTccoO/xSUFDXOjxTt0Y6fffsS/grUPJXiXdgmWTq6iBMQG1l + 9O4FG543VoogfgxF9eb4QYLw+9oBUr2NQrsuEss2eTUbiKZ6ApmGriZa+HMV8B3AVegI1JGJ0liy + k9ExTpOcQKb5BAQExo5FDqb+cx2alJnMEVWSJkKh9SXqYuKY1qLy4UBoMWHabsX0WqTFvvZ5sJZi + 2IBY4rF4mXDnPD70HxvvhiQi1NiZba9pw2mra3ALq6STV1dZL1M+IKdIXpKlpWMGlNgMUiER+rmy + D90RoMQpXMQr4ijIjkmlVyqnGoAQjD8YJlbry83aS9xAvOwirqADXTtUDfeWgLCbsGuvZk9SmM04 + 60hwgoKMnfkOnboUI14i+uorYccfbsrKGmlXzSgrmDapeB6lCzrHXoR950UCcQuwJGKpt6RfJFVs + ks/jECkwVFSmjNPZonJqUigwEve/LpoRQDKAhA5ZAR3GXi7zZ/4KPXGToYXIYN8/7w4/tUmH9KKB + yWC1+ICw5Dl0YQhnwD/sRYHwRZrh5lAuXTELjKGnh2LQfyswj4tyHaDI7vVa1+fBed/6G+eGPpwk + LORwWvvNfj0WTj7TsxF8/v8c5w3rLXv6ddl0y+PCdUx/QZaNrY11VoeWNEUvwcoet4gXkVdd1muA + MVAswS3skn0t4vRepv9zmjxpOWsJhAh7Iad9vqeA9wy6uqOXccdCd9oo/x76zF7TE+sKfwG/vM5e + vcFAavfw7fE+qF9n8+8zfHIibJ6VldfvltBUz6wqq7MtQcamq6gpbEMNURVPVXljaNes5UYNug0R + EnlWMPKV9UR9omSUrpGAiq6gu/zbje9XNKpIUy6vCSSq9/q6sbz9+cBrfuWqwZQzgagE+b5yEOqe + bOcAxIgWilfzdoeLQZ9gf9G0tYfLTHnqJqsRt5AD0EWo782QWNCxL4UvWqYk9R22n4vXVnBtThgz + Dy9bQN3hHsgsvMb/HmaPbyPt+PccHdevf31MI/w8/AsqcEjfYVJFJBMYcBKigBSlpU/eElXXja30 + cOfzeruAvNijGTQT+ykx6WjEP0/fAMiSIE+RqhPxwFRwPB/SaCLvF4PfzkLa3RWoIFzCN3dR5e02 + 9HwOfK9C1wkZPPz7Jgjw+RkI2Kt5u3GapqxGlOf+lKpFJ650yl3QAl8jLRWG84Chwb0ShvCOREgo + 7A+3Fm2ZjLINWUimXnomlZCiU0NnNWIK5n+yJ+zRVTHHSx4Fn65G2vm5Eer8nt/PFJjZWDAbLX14 + jBk+sQqKOUgwVhZWaebArITIQ/YGDW0SxTSV3yrCpw7PJ12CVYQJTQbMaFIOw0wu0EPpig0PyhOo + UslFvwhMHiPEdCfsGPidfEck9AQEjDr06z9t179+eeeo+Io59EURqmhpilea6cmqHMMTGCWWhTaV + bP2VhhJEM2RdSJ5w0VOTWXQ/haMGqstDCxnbMtfNr61kmkh0dlF59Zj4vQZFVCfoBbwNRCBp9vzc + pCPdEXkG9J7Q/vNx8wzLOcfuoijhuNoiTis8tw0vKqtnN6hkVpW4levSObAOKofQ6VtZja6Snmyz + bWuWSm/nmhHyPSCh+yetsYPZoATQAsQiNQ84YqU+iwdNmUafpn/5SvsvFeG6Y7+SdekjBYwjGTh3 + RVomYMojjmJGM7gRqprRJa/Gzn4FvX8LvLa36+nv3x/+CTcU2nt8+Mjf7u4newPRGr5OV4NQkzUN + k9jC1T5LpESvTp11nDFZOW65c2EFYCP5fvj9ugh5agyo7MfHDrOtQKVuTxxf8ZLHnN+Yu9Xe2b13 + dJmdXeUgEty5P/yIR+J63dmp9fyivPerI2BSRtwR2+ngTDU/lLnlHxW2CdZTZUDfrCS//ZSHyhYx + XL6TeY7pHIRS1VTzkkyiPNlmsNZIPOjYx1wQgXCDVH9nQIgNojjB5Ux/azQqMxlyFmvVa+rUTppL + mOBCuz5FDxUNJ5QN8nY69hv0trKlNpUmYsnxiZ4lezhLej8W8Hh1sb9N19udfffkOj+7TarupvB4 + Sl3linNiw5kNCWV6NNca/AhiXagxDzM8nyAvy3bYiG/jfzaJlzTVoPJbeiJchQQoFvtt0ndZPu4W + lfWz1YUwQ6LbRt5VtiOZ5fDkjBIgebzu7PHfP1iMRZx1dRs6C2yzGor9HfWXRH47gANTP8yBV05V + y/rcO//UB4GTRq8hfiKHI+lkRDeh2Ywn34bbyHfv5E/gFoJmur/wnD9vZ7nB+XzeQoLEXHBg/O/n + klKaaJ44orRqmJ0KcY3aFO2d1cBCZ39MMfkdLBEg0aajisUjS+tKNUTkviC78J3bq4efOQPyB/UR + wcJFiuUzzexv0Oh1+nYO395+3dsL4+F6RGhCc+a7ybBvUpN0H3sh4QKoLwBDPLyvYBGDpaqGRnWD + vE5+pFxNrDFYK3k61i3fSBOvqZvjyUqOSjpTQaXNoVytU+Q9urAeBuof6Lrlq+dETCg3wK6adQJz + 5cr2cdOnrZnO4pVLz3D3aXs22tDe1L93//GBxaJVVsvepq3gxgG6GMXV58JggDm0jzZSPnZmPXUy + /GasKZbk/VoAtSLjFtxFRE/mti36SIHlSprzNfH7YobfgPoSAWM43ncQggofDRW3VKCF6ADmvraZ + GCLw37QhI01MNDuDTHLwLKVp54w2o9B6B+oJ5hR+m+6Sr0yvTuMi3ZmxaNq5tCIKQpe4lNjQMYlB + hbKwJzOOPWr+IwBug/f33Hpqjs/R+Cu9w7+p71nourrbt1OLacM7G/8sdb1a2jYZkfS0EqZiRRBT + D7cuBSUCaQVeDinjKWH7xdNwUhktBjbCdOYAlDAas/QuBenjUNlx4AtmrUrLlFduqpp2HBZt13Lg + nrXw+lsoajCWWlKvQIOfPbO6bB79pGb7CFI/c/+/rO5qOkEDgcerX0P7t3T+WRl6THRN/OUTQsPf + xTDwConDNLv/AmWEjPAHpS1dZzHzGGiOMK5OsyO8ZnZrTF5ImytFRpS0NqSb5NkMbUwMD32ifcmS + Win+yIaPE46HSYX5QwkHqdKmsbl+goqskFy7w7SzoCiUrf1M9/+EHYEEXrmNmSSxFozPnLNs23Vx + 0RmJrAByjGQL1U48T0aEo5egMKh5l0GHp8k+qkPt9Y4SXNFkD+gvH410RgbxYQrrXKKBv3ryG3P/ + GwFP+VdI/Q8PxwJE9ip7QgOfkDvAIm78nrU2avJQcHHmICOwRewugWKDgQdh57VabkTVcJsYTTvq + o8xTVgvm+YtZVsJ0GC+Dm09bOuq2DaCcpKxkeEqaXotUD5SQCryCWNk0YkrHdMMFcjhYmKf2BCa+ + VRyGelYSlS3ntBTm6/qOwffYakSCb0/202HdyTCZXu2BvQ/17E3cxxYSQFLK8zdb8APN4kXkoONE + CRFzFL1p3mIzHvTATfKq8+iBk5wlsgtfgpfeeOYW/jMOMmQbqxJN9MrvAdPttwDy6H/CTr6XzTvi + wJhIfIMGJNjQROrSPEsK+Ac+gmA7eZDUwH/tAZ/9SugcXgbJJRQ5bmPOWQ1a9tr8dZv0XKlekvkW + J9ay+eeppTnBUzRv3J1FZXXozV4J/75CD01+BeQtbJpdbIhRh6kHx4cKB76OPDnkfK6sqItm22vV + ZuzMWujtCt7/Oya4q2cT3Buchb9Fy6fFNzjR0EBHCUXxd4hd5xGNMFVjF3XrDtUv+N13UqLqhG4B + rxar6UCTkrlqM+2Zz+wVy5NtF9kO45WeREFjnZy0WtevAFXHvXOv6TI5zH/iv3puz3bCjcMqSyd6 + SZJ2VY2psP2pdsRh5FzFTxLfPpNBZ39n6dvRd/69+l9vGdYTHNsDtb0BgggioYhkX8zFyzdLOfn/ + reWc/AUiRZwEqFgf0OMFXkSr9gvfU+4Dm1HHLmPmXebsWq/c+jw5Nibpp1z2aZro6GjYdqT6zZxd + iurOcRuMpj33zTK/ox5FHT6Yc+uFaLj15P845Hp8tCwSaH9btv/9ZlhRld1UMfGUzD23CVRZu0K4 + 2gxeHY717DThyGn2bKCPybUL2RPIKksC3QZO8hs4NWsv69oDsGCqsISxjcDDXoQvxUCyoXwpVnDU + +4y79Z8adFxeOg4zthH6d8x2+Adu8DGZJmxp/yxk5TLnyuPESj5Ljrt+SrnyigVXJGBJhBIkKEux + xtFK+osoll7wFs2YtG0zSE0zWCbYEhJh1pzBrcVgxIxDJpiHb4Ii7zRTzH3Rg8xSXrEoSu2Mm9pz + kUHlCOarHch545Je0sv/iQLsPXfKUy9lrlKe2fedfg+nFzhwIvq6dOgOs/px7k1JuUp6DsPkDWYO + mg09n8zoS0nJj5HFhwtAESSIGF1WByPCVG3w4jh2WzTtMOfVc+cwePpmNv4nn+rb+em5ZjDxmorT + WOl2IuvxJgB/aAtrPk5OE0syE9EpnGAIXqzVlNEwo9GvRYcQXRZfcrh+6Maw5fX5zMmZpFNi2fVT + Zixr7O2zdneczmXqmsEaoyorDZC3bImh8Jpp2nbsuEJjOP4dQ+GEMS9M1IlKIXOG25xjWVMGQ0xx + eDUZtWo7t2/cb9OfOiBBCu0P+8I0Z2KFOvwqFzJx9J17fmSQKreUT1DMgi+H7xbwNhZH/ggNKsMT + 3udydZOgdkmdrJxOZd9FdeACnsNheiDN3N56dfzt5ORwx0ux5Mmh6t9UAARKGUsBp8gIU8jsuVQ/ + quFrwRtQTUU8D+CUivUdLfbPfX9h1mvXcOrNo/l7TbzPRyRf4cxwKTB+m9UMAxyYSfi9xV7fchcn + ccqxzvVyCV382Y9cV449kRcR0AmQeKuG2nmaZCufQul3nVt2HdsMmrIEWLvxnH+4j4d38UvIJ20x + t2eypHBDmo5DYSsWDULV0Gx8xA3+E0uTbaH+b5ecvtgXEbWNY0ZX3uPuz5eb/ca1Ekvc19XRTTM0 + 0xyjj0EvJfN2VIWa6hPqsjz7SiW2KvhMnrQ/GYUurCkNkVxv/1X2G5fg7728NDm/tw7zTtgsNj1F + MPqGMC/Z9owWI+Z/+s838/yLleurKZTdCc9oThUW2i982bQMy4Hn82Gfx+cp/anZRWHctKw30fhg + 8QE9KP0tn1gJyhC3pSKpbWgFxxxH1cz28TT3xmzgm/hkKsXTS6ZRQTr909tdUcQKlKjaomQ1V6Lp + xL21iE9xwQCLQiAVxFBUE6xp070ysAamSivZPp0+Hc8ei+buHKOfPZdpkqSywEmoCOAtVvwA07tM + hK3/NbE4ijfHOP926DqEtMyYMRx4bIBnYP4QKqJM9gdV9VRNXTTfbvKY4t1kxnnpeNgN+saLXGLW + N+X3GYu69qL0WV2vFjEVoJv6DoJsjQ/EHhYbtBcL9A3e160Xbe/Z7BGKRHhaEqKVYy1dq3kQCFXD + B+pnm7SdatNGkVNLg3mVh70nKxFvcy9bxWuKNn7xjtnfTRKt4t01T96CLxU8BcJ3q9nRjQ63sYPG + dKs1d8Y/07YzI1enEZzDgD1ct8hgfcPCw3N88ohgKfQ1car4M3baTeTl4j826jnhNG96BOO9pf2n + FFn60KQ6zErfjWeMfMM5ZDNWJoKAMkkqNLCEdNus5CrXt2/IcSIO951ah2wluUenSUGDn5HLFRPG + Xw31A4UAARyhNfx7TXfB+Ys2KwWIWaNhS5hB016dnRN3QhK0df1+6j+IcBmbcEFQwMbrM/2QU8Dt + 8wmOlUHVw4Nzb49/X1bPHY9e1UjFhcnTgAgYO9ugHTuRm2kZ78JCfosuZp1Zh3ltRuhdMM2C/bvT + VcxARd5LqMFIPZPdIr9xBpkzlEyM2LAAorTxHQaXyDF2HZP66pM3r3XhvfCKA0i0lmzcSZzTMJvm + MO8pVUAtYfEcS8SRs0ZIg6imlU9Ttkdba2YQobLYmOX+ow6MCK9Jho6rGSgxWsu8yTXxmv77kL56 + TPY0jvCkPscfXpMeCFVbGGWwKMuaS+j0eMuU2/8J5+D/FUX0n7UL9Rw/XmfGJB2NeIRnMn2a+XQo + 2hlvmCO/u5aIaiiVYmjrqJhDxQ6ycSS4SRjbVHWNbeAeUgHaUt+zbyxmfTtJtEZcP3hC6ozxZVl/ + HA9XjFwaWDgNlcfYlmZjbywGbdCaN9LpVUQ0+IQYudFhTiEmHV1l7y5yHyYhx7Eycg37DmdP8Rjn + y/UUxBjDHdfc0ueZXjuhvwHegn4MFVXJq5SHt8ZzN8wngiontnJ2NjZXA0uyDaVZSRpwRybDlIqb + /73xQ4k6Ei/AhpzE4F1RT4WPpxQ0ENXMdHlNvKNpjEkTCZzxTF6JGo0L+uFpWA0vET0tFduKX6Be + sFeZ8nbaUixXIlPuOsln6U321djYoQxFssybyb5eil+Osx+3ZNPbPhpIcmvTqdy1elziECJYXQQ9 + BhEGXCbe3lOThv/yYvq/+Bz2e493TyEd5hS5c2QVSkJW25MgoIg58OU+OHIxOLx0lDE5VqBKGYzT + kSl012Tkc1fJIdVIx9NZTt3FmvR+Q+E9E1swT2Uh0h7VSS2Git9wF84W7iiVuizdgE+e5Zs9CTfp + J1HyWNvncEIGIm2Nh4OSwi6kcLkm7DPzdJ98feUSMSp4enAemuA6swbLnNse8OXus4SClYVfcp49 + O82NlkwPL5guurRdcLt17xQteufQa1PYejvNsE5qWVJs70hIqs8Du03Gg7ww4bY8Rfu2pAOkmbNY + BYUodusKZRN5xQQ+Lk5RO3cGmoprGKyNGyVudfTHlRxkvFkmySkS4KZ6yjgJJdlhIxkKIxtzIN+v + 419uMKqvEmocLIBEa2bVmawO5MSnYtyhh+h+7KUe7Ma+XnMPikJOf2+pGBkZO/izHFmSY3OYK/cV + CQYGOixS08y8ZOxo0Tn6HACaLl84O3OwhPIKBqLaqyvW4dpjmVZwvQzOyGx5ZcDkZPZX6j/Ddi2H + H+/ZtPkpNUTSa68lVz7RN8G8cg3qdD7W65T1SHkk7uzCBL2/fR7Tfy/DMSomeHmwHu2yH3mCLM+V + s25kyIALXKS7fpCNDQti/Uacbhx3h6A/KEpq1YnCKoyVS99OVchlUYBt05bQwYUN2Yb0mrrJLhmk + knwbxvQNI71AvCBU5GGcuxcPh3VeqQ3EE6OBS+Y3x9AFQnLSFSoURRZF0kSwnPKWKjjLKxu7O8eJ + bKFGZ3r3Evt1WLr5DH+cRd/sZgPTle1cxLW5laiRhgjhFRbGHaIYmbC/HAffbpDw8wpcnF1HnPqH + V1yYP46tcwgAkhXKcx0Tg+ie6J68UrvasdIVjxxO8C7b1NEykJzDEDBtWMPc5t2T0inBPddKqzeY + O1ap6rCT2c5sVAYCyTW3k1xIK5OwymXUql0rGuyRiJ5oF/kDJxBuX/G3k0jyigqd3IRPw+xHEX3L + wp++gsJ/n9BBBMw2fu/fOLHGbsSDP0ZBuyywoEctv3vsZcAezaCep7e0nKSVslpQNRMuCRpenOrw + 7oMII4hgBfCbWCVEuUbDqshrJW6FqncdGlcqqRj9GXNRMk+kShxvkG3YRs8x2yge4pwSDxPZRo1O + 9W6mzJnV3hdq6u2n8pOn0eQo4civzTurFrjvXsgijsCCWCaKit9fyMlnw47Dce+G9xMpEMphow9C + HiI8tJooyS684mgzUNlA2P414VzXmYJqDF+GrmVaSMtiHK99uvFLEhfrRFtGXScWA9oAyvKTzCCl + /gyYkUA+LRX9gp9DWVE1hsVRump/7QYdzPI8b/SI+XMB7S2FJV8mlRvvk/sqMEd6j14wv878Fxlm + Xvqg7R3ReMWc90JZ3meFSuAaVR5e5ii49e+tEJE44A2Q2vyivRxuQOjYUR6hKuQ0zJmwtSaBllpp + HXPfAlZeGGWiLFi1/ZtM0lUN3kROpzbL7gzeAlSkAkVWZRv3D+4fMOmcIAU9pCZ4XUxsVVVdiTCn + B39zBYzxk2mOBxOJLi3lGjl5sCagRouSAugi6AXhEh5JiKmrY+x5woNbgrANmA7ivXWqk90WBEEM + ehuM0mq34naIgwyZiFXJHZobOHZoye/EBz02eAz92vtSZ508ZSMINcyclRUZmaT0VG0Z/ZXM7BBZ + DSj5S7OTm3DfRvJ8JmksuegXzBTMia0sOxOyPFCWC2FLwLfpyFuuo6+kg++IFbfZElyWZPKi5YbB + f1RtFdEKQb1+9BWk+MUA3tMgF8Bckq1QMR9P0w63BJyjjJjdubylC3zA+R5M9W9X5IK/9MxWesjy + TRqOncby76yT3erSvYnIXTv+8sxHpb4k+QaoIZ0EGnOYNBAu4LnDdIPS3jfILtrXBYPJRHOwcEaR + xDdaB9M4/+kqbgkewqVVFdNWKeMZpaTQpULPSeYF1eU2KIH0nApb1q1uaIUuVcyLWNGOnOQHMuYd + 99QId7VImDKkOZXFbnUALrZWAiVgYtLBitgBURIm2eQUJBDZuOrrVqq/7eJQOfJrHiTCEkbFCpWk + jfEc6sHoGiAT8f7sGEVvvasUhHrgVcBKq1a9hAPbSP31EmfWzKaDaSFtLBvWdEzSEuJIxdsTcGMf + JKVcI1Q/QlBC8pc3Pvs24vjGTlczJW3tQKlrB0+TdE/qdvYEIddLbaEuGhQtuUcJDY2aQ4tZyWdk + +EV4QPdhNQDXB7lz77rxivE8BC9Z7n5QfcRHy7vj/lCBtSbFHsAmGbntgkCyhqXdgZsVwQrkLgLx + crGFywMJFFZAQ37ZVhgInrs7owmwa5SchfJXxVNsEy21rYwxQlhj5JTSGYa5jgoFpNufI2WW+aGt + uLAlYR3lerrH8eQW1cRwHm3iST9qVwmRMGSOVo5UDnSM1LTSCvjWSpS14lARuiA1Qum4NFwydsmu + m5FmHoO04mZsAgeaNrxHM7GskRWvoNotnUhUGg7sdn0dMpZWYTVM5SCrzwVJuO0tSANKmlFaypx6 + GcI18gSWzR0ZevNN+bDUA1sgOq+he71U+b7lwt3indulJEpSPYwr35n9vxHj2n7OM8f27zYMqr9G + DWDt4H+QMRCUh1XFs0yV0bukMGsrJMF6gxsxgCiZtyiDz8EPm5CWVKZz0CjLSktpEXoNGLx6jxmN + EXyDhKE67NV7dv3OmqFKOu28JSAyphHDtqx/wEMRhaGxb0xTy/YkRnDpIdPR5eC1wQfoi2hZo5vI + uQg7WdDX0qwZ5OT0ceWt82aX+c1P14JrbYHpw7xFK3RH3nNboTU15jSkGipNyeED2Pz1YyY0tHIG + Ok07Suzvg/Z8rNSnU+OwN3wKZAKxqQDbRbfguYwKz3A9wUShHbb+ALP3DqNuhcmm7C2AWcrB8UB5 + o2iIujRZkiRx7cbmoN5J7/EbO76Q4YjZUybQIJGRhE4vVHH1WnhteWNC6gWs2GCkA4v1Ovx5KDC+ + /uFFZA8huc1AX5WiRAYOGRFMhbhUl92+Du/JVXVX+BIEBWFQ401lGQFK3tsy9Te2F+I3NmMtsYTR + F2iXUBlXNmu+AjehFL5Ucp+vgb6x4Xo55JFxdAdIS2rVZjBGetlQJcoGZYZ61HBCdbi1jc2hcUlC + kqBGVy0w4Q5WLpwijHXULP5T3VxBGwO9VdGYvhPUGqI0DZtsUJYrtXbrFpOu1bptfQRyOH0U/L/B + TcoxU5UJvW0eLDUOCzSOEo1JTG9qKskimbWJ3sFJaISisAMX1iQY+AOSmpAEpqw54Rwie4tSbTtz + Tbb5jfG0bWtvT+iVSwFsg/QyxtvsYzAt1r8vTavQIb0SAHmlBBybnQw5fbHSVLZBnrax4GaOnRsN + Uh+yxygdu/Hz6ic4SbFFo38Lo1z4ved9f3HHOByviFauoZHkwW9AgbXgO2pCQYQ+klx0n7jVh+zz + lAlFN0pBGoMtzyRji0QNXIBcSr0ZRyi0i/UTLSagE3hVAASOA6EvuK0YdCbK0CMSZ3W8VDQvsvaK + CzUQA9+0UIhDE1AJ9xj7B3F09Uli8f/A656tmCuoY6aqS1jDl7pFHaHKMKC30UAWtzR3UCOJHws2 + jPFuTgKLPEt2vIFqvzrivKil4OUT4mEKV8h1RdrpEqeU0tLp2cgrqzEPHkPiXMZb8ReQBuFE3rVg + 1CBJDUk4XzNHparG96WJ9pp7uo8O/cdmeyzaWIH/jcsj4d2xBZygWogq57FATmc5fBvuWRdTiBUw + XTjg6XOj9w9GO4dNECy6QcmlG3qKNCs8uT4S2KqndYEag42FPDshYFPcOHoMYbNpLAPdhGQwZgfx + HElpN7uhTlmKYxc2nvbqxBq/2cZcqpa8rx5mCOqEv/dV4Z+t2fI58Yqhq5oA3+VW8YAnMf5bCfx9 + iSI5hwA5aFy/htaOdQNGMY6+KS2tqnJW9lRmWSqiFg2LbPCatCGZX9gjQ1PTBCrV52qgNYiWgIqq + arM5znxHPTREWUSN6NKIKafqszdYaWEdPkjztS3Is8iH/VI1fE6t8ZNwb0dZrn7nfyoNDzMmehOK + UFULY07sIFY8rp69nqSeZjmblSO106lYYlfHMmdymXDoVamPzqO4RdIqxG6q9yYWS7aQXwZb1rvI + DF02vKjkPKQ+V7Gb00i8e9EPtq7Nd2v6CeiB1GaXI3eweePxKf133ne3IQWk77kxg90I5Juc/P1+ + uVs8DspXw/iBGQJAQNKLvA93eRmY9JwpfYnKFdacrTnETdPDiW1bUWsnT+LejlqDfFsiwTCYATAk + AQ+DtzEDLbb/a0Sv0LjZBAdmJGJCmKnvkcRZTCuWjldwqLV4KZvalLmlchJOX18ZjWuaK2YAyJUv + YR+CwwXxruN0TjNtRnDnKzcQUmK8lcHyGJnOnoXiHMMxX28Rwa4dShNJGm4bGMGw1kumqlNSUm91 + 49sVJYNf2EU07pdbuDt6FXVNJXvCnfJbDSCB0IETVVyC07c5IV5x9RMpFJF53dzasMjxmFKGE6US + aIXcNgwePeSPodq5zKmQuNSsWA0sCGlQd9hOF7TbnvPwov6BBOCQBAOYIi88ScBv2JSzTUk22Qtc + v4x+XOyuNa9WOG8KShx39OBCkUiRI4VJe7a0OcmhDb4wPXEQI+sKN7oQG9tBtS9ZdH3E/SSwYUvA + VHWrllQwOdzMdzT2okebWISs9oNEbQZMrlCjIXLsK44xVt1l+ionZV+nb3jaFWn22u10B9qIo+SW + Skjn4dVhbpnBTgf2Yu4j9ItlCqyWqPCZHjIoptYiOSHqszgVhSsoCAwXEQS6iqTQpUXna3U76ZLO + uA+mLV/7xG+G7In6kS4V08N3p+k/uzziymLFkUWRDz9Rku7YFgjRKrlFGyBU4PBEqvfB686M4krs + IVSyi5LBSsCKaodTqAbQtOwamzioWkJcqUlEuqlp2atlk3bpMBvH4Ci2bFNpbCvpYioRyvY0Q/cJ + mhfUJpw1myMycXVPlc4y+YdTbzXl8sODBUqdA1YpTjDMDVTPONSN9fx7B+2c8pF2kQNWKLL/RsV/ + hKZEGvWJnGMunsnrDGjxwwWlhuqgfGRPrIf2jTyF0j1Rbf0pcd+vP0ebClL6CUVk7w0RCmCD/pL0 + 3oS4yX5208y1mro2QZG2DF8V1PGBkF1Ois5PhA/dSKtI7N63hVgoQ8/AUBC3aw9tMyq3CkWoppcM + xoAiyx8f2qSq37GlssTFv19maICsxBWoqTX/aoXcy6TcyZgZbHuuXcG0tQ2sgdTRQcc0vhGhV22G + lAI1YCLFdgdI6QcbB66jXZTuRjBoe8AGNrWxjMlpck+qWjHomWWjx8Ut+kOyGx5FFyjL9qXZ4EcK + uVi1eroLlO8r4xTpU9g3lVg194WaGsyWIgp6TUAi7dkxKHVPR+26twusz67iMr3273vr7uRUwbC6 + Qa9u5BUtr/SjCa/1gCy5u01I4lS7N7lvS5VLcxjbxuqtTFWEcMFmPgt8JJEvxTdOD/vQht1z0D4v + JEXEo/MC3UOoaEt2v8uAp2tl1xEbdr0BAfEvNAJcRHzx9n/KIBpcT6X/Afw+tZ1mf3NAGeuP0pjC + tzaqrd2aWCDdCHRT6o7D5IfUCRxNYJczr6SVMuqHytjlgyrRhZYn5Yv6VFWu0S4ONcrq6gJXs7e3 + a9vyiuptPxThIRh07a9FRKVDW6xoHkoGMhT+NYHBgzIPbZkqlW/8g/DbOo9YjlxutFhBEZ/VuOy6 + /qCNHW15jG/xcZiEI7uj50//DjBco//pW7nm5wvrNCZy7x/+ymJ9ZQK/36R1tcAOwWBcGEiHVFdO + zKCQ0W9kCW9tBVpNCUZ+e0DaN6Rx3NrMJq8ZxTk9altXwsnlaVetqJwOvdvn7E6/j/uKl4fcSorv + RipQFaO9h8r+RpnYKrYJYYfadETUTP7F3gozKvL6N9hDV8zLctqWX1QaYQkyBLZSWfbIC3cfTVz2 + yHY8jp5wYXQLRUOeZZHFhvfwuni++ynwuKiEiJsxkmOjqXgOVj5dtYTH3MAoGlU12O43z3YbTAVk + KnvMzlpqWxmrd7vYNaYvXV2AfZnh13CR8S2cLnv0X/IcjSG1obh6FKj31eLiAqob/ARoLit3hW1O + 5J2BTVhbOGAaaVMqqZzMY666dhMzB5ttJniU1Qxarde4jpqL9eEJKQ0uMq7lZxWcWJ72nxUlinRW + DLU0NqZrjYxzsi7wnodQK1ZjblzW61fscFCC0sjAgbW3tQPjXGnSkhxxHysobu7N88TPzeHmRz19 + cTq89d+u6mp++xQf4vmkQFpjEnZkI3loUx/sgEB8+Ux8BB4BBJ4caSiSN9jygxNI9VzlGrSlX/J9 + MtRHsbTNmSrXmzLN/enCxgja+inqGF7aSZqE5gyVuoz01r7LBYtBQnB97ig6OlIj5zK+j86Ga7fz + IA3WcBFhqB5oK/9MG9S0nIF5IulKFjQy+Y2MLhZuo70c/Eu4lsYFJLRJQxg9a0ObdakNPoxaOEBr + Fj4Q3KoZr5pYa8Rk1EAsYctQwgK0PANmbp5TT96zjn1zVO/Y1EImG95iyoFCXKJMEaVbUnE9olKr + WQz+bX+7p4BhSOW5WWp9EpcbazBFNM/oAVtaUZlzHFZJVV2ialGzckWHDUtuWBx3jO+GyRBODE6m + Ci6Ydxu5rp3EWk70nFBalsxgKkQfOgiK9BbOEfNfuZojEjI6UCelhalx07dRxZ9g2H1WWTzI9QZv + iT7jMJoKau6HlmsPCZS/VYqF3us2djHeSt6s5D4KuZ8OX923lT/zgSrUDDzFM5UxsT0zkdXB6vqs + DtxGdrttQXZfY1ahK1aVD7g4sjGSiVxjfkXsSrjyBqrnHG638WpWGHAZbVjExaDejrKez/GDp0jy + ioqdmfDcd++5EMFRVRfT0dLYVL9JKpFTMWmPb6Ht3HeaZTw5Bfm0y7X/MD6Omr/7LEGSck/HuYpK + 7OI7kQi4YqO88IoLFEjDDUlalFQ1SgRFqT667YA4boM0DKH/JUYentQ2R9A2jnrKdjurs0PUJq/A + m+83Ta/rVSyh0rmVNKXwDR8ZY6IX55tTB8+i9Kmtq6zO7qqpuOqKstDUqnZsBEelwdh6AgiE/YBN + jNZR+G5x9pWEXg9QuWfXDwRXDWpI65r8kjGWRVVtbLUoaLaFtPsmoxMLRUzidWzNKJWU66Q7NKpN + 2RZH67CkPf7D7mzkisIdRnxB4qMa/AC5m0KEo6/n6Mt6ZILtiKOt4DoqrRFaLEoAwlzfDzZgqSvd + Tbgdp8vOkRfndMuvync6jX11nRPnAX04N/4illBxhSLurLlQvEigz62RrjoO885JuW9PY4oVbiGX + zwhxjN7U0wBkHSZtrmGdbguscY5S+FSNFjS1bWZHWbSo5yQaKrqsYYaaQs05zyT9PccWTUpGR7fU + RFqfk4uErvFeKKa5sYME8zsyHxHnI84uo9zIx4DhMJF9Db/BYLMGl1lx7p9AR2lbYfaIvWwDRWst + td0VOnqgJLLJZeC6RLi+2oLTOKEVkiGtL8lD9qdPcVyg12b+6Zh0SDTyIMhuHjJ8wqWCIg5+mLyk + 40oQ2uJa+Z5tC+Fn9motyftr2LWue9kFqXWVZIcpStNQ4vrts0OMsHUcUSBiLN9synnKIT2gib5R + QiHPXE1bMq/bCMI4P9urYhA9nZRjJMo8SSu90jwFrimZsv+jMM993wSO8WeNPbpwwCu/xFbZxwT0 + Fx4L1BF8t44KExZ6NcW22WxVlbYGx1UXJUuwKHXsvoQk+NdcoILDhBFx1pugCp3oqe+4XYFHeoJ7 + vNeWpN2Mvzk7rIfLSY6uDgf/7n4OfMCq2bacKon8Li/fZuf1BYgAkF3YHbqiIgKx680gsJ49qOYe + 19CxEDKfaaHPkVVIsX7X2nrIumwIblFkXF3XOR5H1OmCPUD74N20k/Sm2LlugFe3Ud8+q1ZlzemX + nqwsmYh1D3PJ9hULe7SO28B6vFjjOYhCl6tTVCaurY37Grb7GbAEUlcbaEGdku2p2xyJELPRIINg + Daq++gfFwnK65ddLAFy8LpcGqOVqetzxcFz5LiRtIDXdtbeYn4uik5uEr8+sycuEvl1HLQLSWlNb + MLzMLt7vCCrXMapYSsdYRQK3e17GxEF1YbTuRZdvh3kJHi3iwLFMSlTRBa0yZg0jZsBv93yYRW/X + WZHvsy7xNYqqOiU+xArkUIA3gKPwFjHpm6SKSzhCvwczsNgV0reF/J7Cv+KeF7b+WEVIre+cEJWr + bwVTl48vu3LWAJmTfXH7B/AbGPYkUM98Ba2BhLSzN9Ppv3HfUKdlGb1jE7pO8gcJ5xdsPOwvyi41 + 3tB8l3gI9is9mJZ0q5uqJ7rTrzVZPqqoOlw0KTKQ6JrieLmlX3POec1bJ8CjYPKUk1LXQ60pTvBG + zTb64C1s4M1JZ54aHYRWlJ0ivRU0AxPzNMfoC8JkwL+ZPxn9D/ees1Km76tadYE8wRBROAVHBWPw + ighUlIX3nxdBRapiB53XPeknc38/XSO2nQYwfeMWnlaqSXUWWyWVghmIZ4mnJ5qAlsOo6mGcFq8p + 8VidvhqLeMRQ4GbtCbDddQq5qW8qxzQwOigQ2Q2/YboI/Ym+EC98+zG0bXeF00u325JDi9OKvPWb + QJriq/Gv27azz3MMu48a7BJvVG3M5wTam67BiK5R0xNmHOo7vx1nP19fv5x7jywMmibYcUhYcRcJ + CFxaWmuuIvWQmEWIKimqlitMRYlbRN9xme4fxIiY4K3AnVvuuAuYudc0ViPpy/fKzK6wm7eaDEaB + nCgypBNwCUsVeSQNrdDR4LfNbI4tqtGeDx0CKeWp1RSXswxXBQHmfwP+Qbe39z8Svm0OOQyAB2tJ + X09GU7fK24mjxD9E8ITsMLfWYQfyvLW2md8IPo4MgFlVuv4+pdmq6eBs23xgOw7UNE8ca9hpyK7X + ZmgHcsJoZyufUhQjzIibPFRGEV+LtkP3Erp2RTK7lupQeIoWlYIpHkZkNxyj/PUNzo9Yp1lkiRza + bQyX9FSsPEJ4t5HhzUF75R3pI1dOilGBIXk8pBC0ylYl1K01bBsEXGse59M20GQilMBpCTV495ze + DksJ/vtI2vfvPT2vhiSyhGyeIUvzMzvP3EsyV5Yq2QMszyp/ZzMniwfR6ZeFuUoVhIEaUJFfuAO6 + CdoPSBMrPy+3hFepIevsH9O9e0t0ZiKlUCa3yGTIZfZS760U8IGQhek1buEmi7mZlS2S3kyXeRwS + SUpAzZEnKUwurp3vv/nV1YZvAF+QPfBX4VhhMwqB3d+3RMs80TxTskdbyZtYj8Ee+Peq73tgOtR3 + m1j507JQVbE23ZSG9BNEhF4d/gdn7nPfwGHnvKTT0icYWGaV616AMkgv8jZcYx6Ib8IZQA/9F3n0 + 2sUA2fUHYuA3SL2Dku661fJRFyPJvord2UkzdNsuiq2QUS0Fnl1kq2KZgOz+7mfnWmnJtn0NSrfn + QMYncDd4ui31IdfES+rBcfZ4Ftpe0MDp5V800t3dm2PvwTG/pcZbiTe838UiWVzZhnF8f+UFRbgx + 6G9cmyhV7daISFHXfilufGSECIgQkr0u8RIMSq5U85Rp7e4Rv2SKmjsWlwLfChmqaM9qaeeEEsTJ + zen4iBMf2OrU44qNeXSTyoEOFRKJLpNe7ceGXBeBgodFHftAvgOUbFQ3TMK7DYW5SweuOjNHuwrk + TCzuq72Dbx6+A83KQFc5zoLmjk7Th4fsKyTNL2+/+YgcjNfpVDsdZRwseVuBqBf+9nJ4sIvPyDok + AiSwTvDCQhiLJ3baZ5huEuN+Me4LZHj4vTZR2BAGevSlTepHhJePpGvjAUl3raNGtehWps1wsaY6 + qfch8RbysDeoXyOcfntKcxbAOocNX9/5l8/9N0+P6dUbAi4uJH7+usx653Q3YVRADWGyOQ4pXVRT + trI9D6ORbpew9W9jrPjVyyOECPFjmN7J1DnfkP5fiTLxMruD/ox6PaHecO/wnLAWGKsDyb8gH6Ys + CTy0sAQ4O2yQUQrAhK/NojMGNMFp1PCAfaSTGjNPHO1eQ5/8x+CIvnL5aWXTquKEv//sdGqWCltb + 7vtl49H/nYtd63mM7QMb2Codc8AE3t52fL+QrQv1n7cb7j9dDYMTpcvZY+JUzyjhtqNFKpmKEfGC + xvo9L0i9ctCqSO/PBrF1c+jU/kVJ2o4vFimw4ibG1w4ml1AmMekuiPWN095PmU50O2yuYIdTbL6A + qIFG2XYSh+rmXQmItalg26ibvCXU+nIfHf4v1GGG4ft/3ezVum/Qat4aIddWCBqEoACI0epFNWGL + ACGjgmY65LlMrbn9AXmENuxlbAImDXqL+uahD7C9u8TJECnsUN5TlEiSonqBeqbQHO/yjfquWnXQ + M8co331DH7Xfh69KiO7gk7GkWY2T6fypLJroPRnpCRx8d2tPTbYC1pd0Fz7J9oWRYKvoFgG8f9t4 + Ohb7QARBrYYzKOnCPWVYuy3d/YZXmYje34UE79sLhO79W08of2VZ4jhZTOh27r8W4Q0wB8oIsz8C + PrMLyR6CKU8qvr2KBuCQjTMKr9p+z3mKWpoDTAFT8PoaibgZaMn1LIBH0SZtOswwC0yomQ+Cs2PG + lMnAf9IHAssj/kSliTUT52xr6+38X76j4z9vAw4BnwMR9GeUvzLLabZrSqgHvcc6ecAQihIQfG3m + f69F60RbGpv/couoSMBViIrXI7jZ6yrsfgBogvVySjOVM05JAvZ4tZnd35ktjCYtSXLeE999h75d + 5VcQUEyx8v/ejFemD0Ad8dTcbtQQZVLB3U6F0ik/kSzspH4WF9aKgiNDBjuhM0eBjSXNMz9fRETb + m4L7gglv/bszZUPCQNV/WGKphookKRi+jt/cRfAgqn+735by/3dKJvTjPDvOfTi4ArzK3sLmWmhq + TJYigScLtp4wQmXGp+7SF7ngMj7h0wyBwhBeGL6KiwxX5f3Nsass4qG/tMlbH159myKaZtoUrIdL + S/MgO9uA5ywUi/2r61mKYOgWwu2oA/iaQ/W7FAGdbeYYvHlb91Zoz/H7CuMuoO/oe57Lt0buVn52 + R21kzAsq1uYT+dCD9MteeuHlQeyG9BupWT3MuQDBh5qNEnvcNYHNuzp4b2nJayaqOFRJROb0Ws4N + kVJSDZVVpnfBrJnwKgImYZlmdxEgdE0sDr0IfTl4X/1dN0BPkj/4GP/yzdE8zne77mL/mGlLa+83 + CV6ACQl58ZcK/kNs7FswxX6kBI0ZlqJ3bccVILy9lVbw0bk9f0HLVFELh+rYqkAb+4tlFLe5w/Ll + gYxISO/h8JiDqN7+3dFvfvWGrH0g91wnAQqNuAdQv2/MfenIDpMVzz+mL8PkeBn6eP9EG1yYcK0A + kKTrOmb4lpDtT1lQhcmrEtVcnZM3mWBeSZXGHCvnAlwm7GK8QKikZTaJCSbDl5CngvXLNGCt3cKX + zJkthoZuwpqqxGobE95p+b5N3EQk+Pr+JCER1Xn9PKRXn0br7qS3FMv0iPIKbwJu3C7F9T++GUP8 + xfuXyZEmh2HfUUOhq0Iu4JVDch1zl3PKnonQwnsphoVZlDg6a90PNSJY0kf/xHsKWrw7yltyD965 + JomK8oyWkbhJqbzV0V4z9uNakfXWVjaM4ubMMuf4PG5yeKwTvXv6DK8Cx2bdh/2yHqjhJ+f410ek + ZF8rpCzFQ9A+vlmGDTKUxy3RAbwFE4H4M9vlNpEgro1Z3X8U1pTWMSSyUrBYtJuIfTrMHx4ENPv9 + Dtar8QT3hBzbtZgdKA9p3nBhSq4PKhlDDBKOZRJijvPp8jcyYsHkpPjMgZqPYhKAAMCuabCTqEce + q+cOM3xGbCbbjOxHh10hA9yOBlAxOXHUdOI7TrGcSdlfQZt+st2PMyVQGXvhAZx0f3gdth8htOHG + qY7CXDkRA0cbJeUUrulTN52ovvPnRYBLc72nv//cW/AcMfMQ4tEOjhJsokvpBWY10Nhy4KFw/LJj + 2GnfFFXWW+GVt8JogRtaHSEv2yh1mWAUHtqlbDcwBcRiiqGDE4ZWKLPHtdmk2/E8ylOZqAi9bKbx + Mtp5iewGGkhW4L8Ada2TWoFSNrJG4ZalXFrHatvoTezfc3j7Jxqp/dW3I+DEvfOIJWoz9ZdVfCKx + mGbp9J0wsjLCPkk41ts3WdeuYMiEaaGhRjC+rsuLB1A3QnIqb1q5PEa3qqqsjraJlEpBZe0he9Vm + 7M/f8PcXjNf1dr39HZdmLRZFNJN8omUQhY8L0V0yFbGyXZSMFJS7+M+enHC9vxjjRYXl9HuM+LIh + sQNEousHmpC9v8YcO8xQ+ZlbCaV4ulMwDhtUzjG1GjYhZgjJRdSMtZNrxkeeUGKOCY/3Av37peqX + S/E+XAVkqBnyawtpK6JTyaM2gWjp2xjVN7mzuwTT3T7pmlz8e3su3XrOhhp8B6WKH9vgkpE28poJ + 3H/iO7CRPPluHi0unLYwYv0iV4zDYLCEAJhgSr3Bc0aznswHJVhNseTbhZKwWjrQb3/xQQPp6Tbq + NC8i+EoQK6qTnbuLdQSS8eO04z7kPwig8gKpE9+WDmLAtC03hgjkkhwyRnIg/6+ZM/9nwgHcuPso + kRxDzE2KDSnEDLkmx0eK5Cpnich9jCEhxoTcppB9UMgxYQiFCRtDbuYa5TbnjO/n+/r+E9/nh+cP + eF7v1/PT83p2XAZPyOiWfK1NjwAdncGm/C+PfF3MbOo5mPSJ0ollyjlpKEQxsNXwAMWpFdkc06ML + Af8aipphJBTCFHlNm7qI9gxVW9A0gECYU425ddZfJVSybEidMfB/l6kzX+0UcwmU/kaV/MkoNvhL + VRlXto4c0myOuJx01B3gNkltQWpYlJX4u9OQvTFDsnhFQz3F2DCkQPUPIcdIveDftPevPpAGHtUf + e/qg/bIgtU5C9akKtfY2h45jPNZAVA9S3toog7OLnGgF9v80mimr9karSHq2xqk6zOFzk7Nik3N/ + zhykxknRZOXibdRNG1hnBeMcmln9vaEwcw/Lbs4r5WUcdGXG7bulsViUUFjBm02D6E0+BtPgq++z + Ei0sRq6q/Lmk8TfIpAVoaFvclfdBL6KDxFrUreJ1Fn0rS8opQ2kTD8B8RqFyzcuQRnfj6dwzJkND + ApLCFZMutbcMcXJOYLtqG8WVF4Koe5tbnoq/X6zkK9WNZrlFhF5JY5qIeXKBrq7c+uHOCe/NM8Zb + GpKr1LWT2SrlIXkGfibpTK0jh4qyK9mTYQXUrh5nk710jQE7H1cg4OpLcQAch1haWUFPeBuhm6zT + h9Xk6yxk514Y6lhQRBl7qJ0KpM245I64kBJeqMUJToyt4Blet+mu/QH7jTtgLlO9+ZKHMLVpVaEC + 5TULzbfxP/QM0KUtc5WvHDrUqlTtlRLVhbFovmq4Rwxhl5yYsOjaLY9BoiyFLeXNEiByYgPf6wL/ + cO1emgj/6f91fuUpfrSroDKB9RB1c8HHLPcTP0wfLcBvqTtP/nGq4Heh4CbSQnNNbMdDbaUHHy2O + EQNFAK2VEksrDxtDzhs8tjz4dmksQ9F61QRYu6XmuouR2IjXG+/ANK6QBgnFvQI3Tcygde0oM961 + KPAVwT/Y6PxfzRpPYsncKBWXlCjkWKWMT/dueVLnUPfIO8xBRnuwsd/z6rCi7ECA5+M+7tJbAnpq + cWecyLlOvBYVr4VbY+3YzvmXJLt7ayhZbgy7VDT+U27SEyZz0uh8ZpQu4J2B/Cm38rRt5SQKn9Ai + LL7l0W9b2Z262jZetva4cuIYLswofy1yMNC/byK0L38oUb0LCKCnkVJ7DGoqxRtt9fOCiOPMn0Ac + zdbNdOnuLj5sCV/tGvL68fZbnlcpNy6n4nsbXySNH2u+4Vf0tGars45PFlhczsMvJP78RrD67boq + zP7d27z5cU3OQFOb8zb5ZUcCTbZxT+D5O3W209aZ7yl2I9G+TAUMFKqxr4bWnUX/8B9TO4mNi6Ds + 19Gkf1S1czIxUdkH75nEyKyOzTOSGUOJ4Xd+ooF6aNcHRk3Bs99w8T02q1X+uz4WvOAJqUfsjPnL + BZsuMM+2UnXNYuj6zdXnJ06GCUKOIJWdgsC6J63TyvZl2ooXgdnCle5/vORv73nn94qWaK+inoYy + GQP8DgRBCDf4QTx5iJdOjn4pL7E74rmO4vbrFvpTUVZxvaK29PqFyWHNk/ZzijPsKgOoUQW1d0md + 50UVUFCxLpub10bCAWZLDtpplWxT/0nyNBiSzfYdDAuI6s8vkaS85u55R3j07dK91svVLvmwr9dk + HAPVSm9qeChDKKsuFg2JYkZ/r9g9/Lfi+42A0wqJKi477mU9Uzk2QVSI4pgK3afTpc7966Ma0UO7 + YAgbWrJiT4whey+eeRZ8/K0PmgEHxorHAiVaFT4iDOYLeVfVzcqycTQyUpyAwUH+BNz2+9RnVD8f + MUZhZnvCasL7IRZk5RsnXPSEAPoalsSbfn36H8UbST6wwqxxnBTYwb2qtuELY1heGmYrt9q1czRr + EK4XQnzB8Ijv3YdKgSCcxIzi+GeXlb9JPe8ri44yWXovgzmIhcBweIxOs0GRUzEY/M4XdEReiEte + lCQ97f1QksjtAKfNTrJFbxL/NCsetCQ1aFVVnbef0wHDxRKwgDFYp7/A3rdeO+jh9a1eZlKCX+Jq + yhoVw8WO4QoHcNEAp8tgyil1UcXXIqGAS6o7prSFea5ODvvhOeQ2y+oHS2WNYsRZltd7acXQRdAd + 1E6GUkewOX81R+Ot5G8u71qUjvmuY711op7ky322vTjWBfqVamxpH9scDb+HtftqVxWag5mmFFXC + 5xkjt+OJhcU0DBcbxuwEgLwDKBAt2vGFAvdIUyrZxo6p4Wd6hX8AJ9OxNYwSodfak+fyn6DAkmAH + zQUnVHj9d+2XX/eU/FsNfVzG/sa6cyZnO1TuIBUHe21uCLZauF5QZUnheiR/o/ab1Oz3Fb75hqW7 + GlJCKaupmMDUuSEI/d3msX3xr4DYX9KzoilHr4bJLhLCxptpndn46C8z5WuGerke/DAcs/OF1fO9 + 7BtJFVIE/3Sc3Nm0Xb3Wn2ghfb9YUTQRCqGsU2NJJRct5DCn1C5eKF1jZbeeUE8hPUwIyidLmPS2 + 0n6oll9ufg0tGG651nENp2dA9dCvcbysJL6mPTsUGbetIl/zXuvll5PpGJJmcPCv67NpStLYj3IP + BAkj41IfTbAyKt7r2X0vDb5znPIJFfCiHVQhrfMbeE3KYgDIouw0UGe+J1nHk5SoF/pNDHKrBRjr + C4iVlulMJtIVRG051qTZID+G+LVajWcH0kJ4jnh4jlDxEffdnN61BsaLMqh8dl2/4yb2HAs8yuTI + sHav6l8AwPatSqzvYDyRFoTcgnbX8B3pjD11JCh1rZBL82p8wb4MxVEowZLxKBNwe312JKci0KGm + VsuwloFKowXxne2lP1/WDIqRZOkhQksCAvFHA/ag2VbyzLKmr0VqaIjO0q7agje/yvoqQG5xIm6b + K+667qFxHOWKcBDnIFsgwDjuV8SdQ9vAKrXCD1KXNdH4GjvzttNpNwah3ttLE1l9v59xdgp5P2wR + GXZer2ZHSmrEzLKazSp/C/010XIv6pRcUGSBCotQnR/QWPIWUgaGB8J33C6GlxOKlMFiUs2uaiK8 + l9JIvLtLQipNeuZV22w6euzwaqlaYaxDhkeVKJ6i8Jrf7ORWvL+JJDJ1VdxZFQfv2Vm2H5w7+378 + k5VCwYgWpQqnaIka5lkxMBMcLVGzPniVXPrzXFDkHvGSPEMrfTJp3IpHg2mLv9szseSenKevJo3M + Pnu2fAkRFtLXUscL+A9r9vSP1YnaTXNJaIp444D29Cf+aKN4R+2NEjbm2ArLkJtSOTycCToxvtvu + MbWywyJmEEzpB4fOLsCUb3ny7o1oLRkeDdZzLjmAcuTd83Uled9Z/2MSK/RsORPRXrB9oLFQXyIU + MfzJC0sW+8JTcYl2Uvo33nHtytqVqjhuq1aVWqBUnUrt3N0Q5uyqD171/xLHlAr6P+OBT87srNZ4 + iKtxQ8esPdlQv5MDcEE7PabRFxwa8aoznyRJIQEz2jxGRPX+woKFU8EZuqYpB3Ccsv8OqjBaGb9G + FLVZfQOh+KgEWafbroM+sjQ81GVf4oiV9t7ilwMgwaCwvYN0dV9Q6N4BshFqFhYxSXEbz7F/JuLh + Yy2Y4pi2K+9lkk/QDZDLGzP58u7pUlSEKHlfu/72tQzpv52yYTDxxf0aK6SoWxxsoOJZFKnZ33tM + BNnQIvDs8ojNQvqG0v0L9X4N5g+sYR8Fdf6N3wsCP91lC/PHL+er4yIDOqYaMTg6OVEcRHNIleFD + G35UW1Z/9nv6XuSsWMVQHHuDuy6DXsIHQJNL4aSUwjtzH5G4skwxU9+UjVKW/KRvylp73R/L7yq8 + TQNVwQHFvn/kGJqCRpuyjumcM4uNqXut9BiS+Kz/zoqSL8gyNOL2woZVwt5Hwo9swpV2v7BO3BLC + 5hpYYvVgLbWbirIUAt2vSDDGefRTJ5bzHYux6UxKsm33Qx+XNHReSLnMq58qISTd3KOs4+4X3p3f + +F8TH+Q0UlwHUeyilizSThqV/eORhTBu+aU0ul227wnMWHueA6LCVSG6Oz0aw8vIctcA8VZ9dtjO + 0yw9z/xp+d+85uCmzw8fWo0G3VSJFSFfl1WbihkTaW/VfvNPHyupT7ITGjuogBx8R7o5CCIc72zw + bg32OAAPNcM44Rt5Xm6t2ReNxahTu/qJOCa50Nci7hcM7JrhQtqff2NSBRM7sravueKUYEkrLH0r + 05RmhTApx6UvWjsMtnIArvvlcuI/He+b4mYTB6mxZxNacgCoHzwMvzbBCZB3BZVBLNiAxjrgX40L + +Er5AMxrYCE5jnzMapzPZKAbGmhmVhJ3mn2+295c+kIX9jaLG952sK3NU65divynGcXF1jsopBIY + k9kjbw0Cd+NygzWBHPHgGB5u7QXLXxock452687tVPqKst4otCziwVNk9x/GWkQSor6sEZn7UlXw + +U+s2gP3NS+rbAHDh1Y27/P5bwQLrPK+nG842IagiIc7kTwbz9MY7+9bnXHwml9uVfBXcw/XJp96 + 9/P0OFqwD47sThy1yNMhq3sf9U6SVQsYTnpneQthb74I2Ox/DIgVreJAuRpVIpNLpZSQ9t7d/zyM + bw4G+D05mEB9HRb5dGuSdM2yJLPz7wFngjG1zJMrFSwsXqhcmKqRF6i5GYaMpUTSHxe8Y4Djnuke + riLxPLdMQmrpbq2yXWFZ1HM64nxOJFgxTf9jqf49HsuIUDRqWOdxwrPq14Dgf6x4Rjf4DiK42CDd + iyBSDKH33EzpqeTl2qfElop1l/NGsT1BnIz0pkKcXyK0PtCAY4jft/ZT3VthX2sLV0BJtqCA4Zpu + 9v+GYj2ymRjftRfykztaB73Fd8TYtlUSyVMOr98sbgWprn4s1qmdKoGuqogEa4qcmMVGtu3ccwVP + 3VEiCE5nHBposTmv1gGLw7OI8VynnMXtHUXdVHVOzKvBMs1rNVWXDH3KkZ8qZgylY9crMuwcgti/ + WKETdiPrKZINCalSnRZFfsrF6kKkv6jV/TvUCJ3XANp1tDY9M4xD4ntyPDWVyyYursu12xe7ZIcl + xe2fL54fIH66vzJVV9CXjEuwQVe6zR+Hoi0vxx3FoLiZcNd0aTp683zxQKuABzTPrsopPZ35YJon + bQzRpJHKMvQmtdMWYqDeU8QfSMqEod99EjZ00iC+lw17mGEbXxxsOyrzPL+bTSrOGytF2B/iIUZF + U2jXNshrDISLRDRqF/6gS7KLKH+B9d2RKWIKPrWy31E0bTOe+hMg/JZBikMGvTrMeZEqUXJzQMhd + 2M4p7b2s4XOFlKAebSE9d5agje/GPpfLjCYnBfozN6OBa8cmc8ZhHdxI9NZiAqPeZV42xjYK31FV + zfBvf3WnzXiKhXNeaOhQ2tkri9zsEXZy0ML5EfSsMjKPbdOr2aTcqu+h/n5kkQSR5al1NiEg6P50 + dJK8gPj65hy4aw1FirlHHBuvjav4API3y7XOkjW0sxqJx2H5u80tRjOHn7VmbI4zLcvdjRgw+MaK + aaCYfn0ewhWTZX7fmjSXbXsKTT/Y5LO3HW/+YSMbtFFV69+TLmBz/zHM3bGt5lYVNkFNoO9Blapd + gEEuUaeTJ82JSHVuirqOQa7FSyZ6uk9EIUg8FnbjTdEHCUJJy7sdzV7zPng2W7gRR8oD4OOmaxH0 + n7JEEdEZuyvzxRKlk7/gc9OnNsk3PcS7ldz4YB18NQhT85SVPjHVmRHt4voqx7Lyd8MFnG8y+8zj + h03EJBp0oZwS9HCEYwcw+8UUkGVv+XbbNGXMx7BEcai3vLd6ZotYe+3wff3VRaZb7AyBo2YhCV/h + 1gtmfKZeB57EBneImyuFNkOHSDz1WcZtsH85RuI3bywN5lRMueTdlzrrjVNb4c0e2gr3ztdfuI9Y + zGnVZSvQNBkXYwihLYlL/XZ2neyyN7DWzy7s2M/HY+dfDCgwvcg3xJxNs5yHeZkZmQsk5UU65mJ7 + SUXPi6LwyKOeP5cupNFKg28cVC6GzLE7zFYxTgHBsufTMibP1iUR1eWZEubWJHfEyqR4a/sN0MTY + y/c0HYTtdkdM9KbQbow4zXLk0/TcTFsm+DABv/mLU5xjor26kLD8pgyDuBJ9LjR5+BtrOiLOatZy + qSsmYQlRozNFJ7/eTgkfsV3d4vpuG/5pzvjE/XRjTuu0DnJKGiROtp3yVZ7n/0tG+jCjdbQDaFsb + 3nNj6INZS9/T0jzY1NxM5PkQfabxF6TOeW0PI8ONXj/ZxcOnPNWv0MBvoapZBF+EH/AWu5b9XQLD + Ub+hgb0M3Dm1/VJ18PUT8v7u0zCE+CRNM+RsEGveYrP1xnXIy/Pgr+6EIWSqS6fxdUM7BrJafZpw + ePiBwB4ZYt5gfrt4vIV2IDTR8EkJ1KdHO6TPzCF40g6MUvpnHFow7Gedvlu+Ny09tvLnBlz3Mk4C + BAbtz+OY5zquP2PFYRsTfkNfT859ZX/TfXV7w0zHZ5zwsv+HOme/4NTIL76WEWYM//qtY0SbmRw3 + 2g4z3WD2V3dK54HN5KvnPa4h3FR00UZT+fdRKe0n8IT208P16puddfYqsYS+aNpDFx7+WEeWgAC+ + oemG0bOzVyJTZGzok0SdZwrsj2X+I0uJNrlx2D2MJdTL/Z0x1WY4lF/ogSatZ+iom0PGVX7+19jY + WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C + ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath + F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABVV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR + x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU + 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB + KQVSoPuDY/R2pT8uAQgiCuMbbNcG/ySrf/R3bH7jHZyBLaBQ6qOC90MoPhLEhTiXwNJGsAFMll1b + N/F6czOWUorg+aiO+9//XchfgHMprH6SKoQ16hqsUAhHaw0IiGCMIMrCtm1s6zJ0RKO1wdeCsiws + K3AoxiAiGBTKsnBsm8vBIAatNVqDshS2baGUQsSA1mgjaGXh2AEnqx/MCTF+7ixu6jOXOUaNMNh7 + 6TP/P1b77MYbhCOgrA//1YxgoBREL+0trXQeO43q68mIrxyUGyUeOjsb7YPlXOBADMYYjOXg9A+Y + Ivm+Ip5t48SiRM9zqtFGYdnW+SkqghiNsRxs1R9SH52dBXShiBOJQKKCCnvgnNeeCfhcELH6+je+ + Ka7jEC6LEY6PpXbKTG5fNJ56NyAs/SGIQVl2Ce0MH+zYzK/W7yHd0UU+m6NHQkg4QmU8QrL2WsZO + n8d104ZQ1R+LEZSlwOhzcNKcfG8Db2x+n5a2M6Q7MuSLggpHSVRVES0fRnRUI4tumsLMmrIB1jrD + 7hWraTncUgr+7DNRUrd+T55acUhO5D0JzIjWRrTWIsYTnTsl7euel394fKGEznt34LHqZ8uCJ5+V + F7e3y4msL0ZERGsxIqI9X8RoMcUeObVxmfzbE7dJfbm6KA4khelfkq89v0YO9vhS1CVKhd/Ij++4 + SW4FYdRoWyx1zkuJsTJhzhflr556U06XAjBGxNciumWV7H72C/LEkmkyOhU9x1Gd1DRUSio6gBMd + OUMab/yuPPmdzXK014iICX58EdOxW1pf+bp87/4ZMrE2PoAzdJJMmDFJJgw5h4+bktrJX5X7H98o + u5qzpQAOyD8uuk4WgDjf+uNvcuTIaba+u5Pm3ftoSR/iwOajvFxZx+g7buTWuhg1IbBVjr171vPv + S1/kxbWQBuquncbwiZ+g6prxzB/Zh9N1kNVr97J35x6aW3bwXkuajm6X2Q+M4VPjqqiwBWVrjh/Z + y89eeoGX3urmYBYiteOYNPdG5tywgFm1GtW+m7fX7WTb+/vZf7iN9j0reON4kjsfrGfyqAZs5RCv + qaE6EoHudFq6u09Jy6ZX5VsL5kiqPw1m3S03P7Nd3jkuIpIXSa+TH33nASl3gvHq+hHy5aeWyduH + O+RkZ0bSmW5Jd7dK2+afy1/eu1AqQEBJ2ZSFcu8Lm2TlKRERX0QOy/Kf/pnUVUXEAnEjMWl87O/l + B++0yql0VvpyWenrOS0dB1fKD7/9iKBsgZDUj2qSv311i3SJiBQOyzP33iZ3gDjJRAKA5JxbefCx + A3iRXpZt2kf7sVa2r23mzIIZoDtoW7ec7Ss20euHcZtu5tb7Psujn7+b62rcc86EJInZKR79Qw/l + Gl5ctZojHYdYu+EANzXNZFFKo0/soPn9lbR1GnDHUXnDJ/nc3Xfx2XnDSZ2FihIbu4A7F+xnw38v + ZfkhzfG2Hbx37DRpoAJwFMGxqv0Cntb4Jkbj3Z/knt+bRXmZizrRRmH3EbxsHlPs4vCqd+neeRjb + tXBHzGf4tHu5ttxC+0X6cgWyfb0Uix45P0T91El85pZxNMTCeO0+J/adpCdtgCI9O7dyYudmEk4R + NWQy1fMfYnHTKMY4QXHMZXNorfG1zYjRE/jGXbO5oaKKyoYmktFY6UwcKF1OUGRUUCBiQ4gObSAf + jiCcxj/yG7rTHXQUfPpO5FAeiDJ4O1rZ+5872Z+sYljKp+1kAdEFQvEqTChC+INNHNi0iXzWIuzE + 8bM2jgB+llM7mmnb4uNpcEfVMX3CNQxJhEEZlALLcc62E87IWcz+6k/464UZztjl1I8ZR6pEvCgK + G3Asy0HEwhKDb+LYkWGMdyK0WRnIpcnks+SUg52MEa60MZ0+pmU5q557H07WMrTOputMHmN8nLIk + Yll4hzbSuu0Aez0o0gVtebJdPiibWFU1djSMly1QlYowsy6Ki0GLYFs2jmsFDYAYTLiC8JjruH4M + g0yjsAAH1Z9MFo5dTSpZw1zLYYMBz3LQ2LguEAcvpAEFHKWXo/zil4OBB5uBoo/XUwQ7Rm3TaGqm + hlGrClRaimHV5cQiFrbyS/Ml8KGsQbct7RlsN/irKs10gsNCBY2V6aEnk6bZaHwFyjeElY94HrlO + TV9WgW1T2TSHaZMmUKegDI2HHfRHooOVs8txy5PUVUZxnSRebBqLpoURr0B3ZwZT0ABklaHXL+Dp + MMZWwcr3twpiQJ0fwsU6MAcxYFmAhW2n6UmfYJOXpyg24XCSRDiE42XwOorkMgKuS9X197HkS7/P + A6Mshtoead9CRLAthaCwLYP4BXp7c/R54ISj1NZGoK+T4zsPkDnShwWc6dG8357j0+OSpJyArNEG + 27YD8tle+tqP0tqdoccqI5EaztiGJA5BjySAoz0PTwm+7RK2PJxiD5ZXxKIOd3wjFZVDqQh1U5Fy + iUBwobArKK8sZ0g8WIXkRTKUzn289j8r2XLMZeLs+dx+e4qRNrjKx7UgpCDb2svmA2m6ZqYY6fgU + xaKYK0A0jLFd9NZd7PjuX/B0PsOh2tHc9NCTfO2e2YwCXBV0p44digakKHJ03VZ+veo9/GwOE6/B + mnwNbiJKKBKlfkKKxIgQul3o3PEue1dM5/j9jTTEBmd934G1rF72HD99ZQXvZobSmB/OsKa5jGyI + kJo8garxQ+lpOwNt+zm+/hccXvgoU6qrCAEht78Y5Dh0cCsvr1nJ60DO2c7I2x7BlEYtMQhg9W8d + Wrbw8lMv8E9L13A8A4wdxjVNFcTKATdB/ZQZDG9qAOOR3vAaa5b+nI17ushdyL74AZt/9hrPff+/ + 2LX/FDriUqhO0CcKnHKq5yxkzPyFRGNh6N2Kt+5p1qzfwK7MuSACretZc2QLL9sOeaC2tpamhmpq + S7vBN0EaOc1b3uZQSytr3volK1av41i+CJRTVzWJh24Zw4S4gKqgfOqnmT1yG1N0M7v1aXZsfoVn + fpjm8M2zmDF5MiOimhMtB1m3cQPblv+Kd7N50pQR8aazZO54plcBhFCpmUyf8R6fSf4Hb7ZD57Ej + rHjpXymcbGH3rCk0xPPk2vaxe+NG3ly9nh7tQ2IKubn3MXHkcPo/uLZDhMJh+JOHF8uNjaMHur9Q + ShLVd8mXv/26tMqAGdFy4Nkfy98MS8m0RFTc0vyyoSPk5vsflj/6yoOyZM7YAZxwtcRr7pG7Pv+q + 7O/yBnCMSO/ulfLrR+bIvQ0JiblBK63CcRm1YIl86nOL5PrGxFmcSCwpVbf9qcxbelR2nir104WD + 8s93LpLFIPQTCZ5KsRoflyf/ZbXs/KC75FIHrbSIFE+ekGP/u0yef2KxLDy35QVx7XN7+nJh6lfk + D36yVrbu65bArR+05b6I5DKSPbhWVj39hDz2iZpL3AUQqJA5D/+5/OCtfbLljEi2fx3y++X7C+fI + PBBn6tx5lIVCJOIJ3PIp1M27hS8+OJ9pFYDWGEuhEMTXuEOGUn/zfSxJ2kQqh1O/p40z6T4yvVny + YhGJRKmpSGDFJxOftZiHH5jHzOogp7VWWBYo8SESJzr2Bm6sCONEE4TH7KelM0cum0fERimLWDxG + zZhG5i75AktuGEOtU9obKLCTTF18B16iDrVt2xZRKkokUsmQoZWUx8O47uAqeJ4ZHz+fJdd5io50 + Hx15jTE+oUg5ZZUpKhJxyqMhQr8NB4PxCuTTnXTnfTKeA7ksEcvgVA4hligjHnJx7QsLmOAXPYzW + l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu + QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A + 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAFVVpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABVVaUh3+548iwwAAIYM + AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= + headers: + content-type: [application/zip] + transfer-encoding: [chunked] + via: [1.1 vegur] + status: {code: 200, message: OK} +- request: + body: "{\n \"body\": \"https://gratipay.com/Gratiteam/\\n\\n(This application will remain open for at least a week.)\",\n \"title\": \"Gratiteam\"\n}" headers: {} method: POST @@ -1831,7 +2450,6 @@ interactions: response: body: {string: !!python/unicode '{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}'} headers: - access-control-allow-credentials: ['true'] access-control-allow-origin: ['*'] access-control-expose-headers: ['ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, @@ -1998,7 +2616,7 @@ interactions: response: body: string: !!binary | - UEsDBBQAAAAIAM+EY0hx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + UEsDBBQAAAAIABdVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN @@ -2378,8 +2996,8 @@ interactions: WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi - 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIAM+E - Y0h3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABdV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB @@ -2435,8 +3053,8 @@ interactions: l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 - B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAz4RjSHHt - m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIAM+EY0h3+548iwwAAIYM + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAF1VpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABdVaUh3+548iwwAAIYM AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= headers: content-type: [application/zip] @@ -2444,7 +3062,7 @@ interactions: via: [1.1 vegur] status: {code: 200, message: OK} - request: - body: "{\n \"body\": \"https://gratipay.com/gratiteam/\\n\\n(This application + body: "{\n \"body\": \"https://gratipay.com/Gratiteam/\\n\\n(This application will remain open for at least a week.)\",\n \"title\": \"Gratiteam\"\n}" headers: {} method: POST @@ -2452,7 +3070,6 @@ interactions: response: body: {string: !!python/unicode '{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}'} headers: - access-control-allow-credentials: ['true'] access-control-allow-origin: ['*'] access-control-expose-headers: ['ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, @@ -2619,7 +3236,7 @@ interactions: response: body: string: !!binary | - UEsDBBQAAAAIANCEY0hx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt + UEsDBBQAAAAIABhVaUhx7ZuYqFQAAFlVAAADAAAAMTYwvHdjdyVM03WcE9u2bduZ2DZPbNu2ObFt 27aNiTXx5Lnur+8PeNfq2v2lV1VX1drVvaOUFKQQYHFhQUBAEGSkxVX+2wv/ZwCo/zBm3pIBBESd WEZcRM0z9+bbMoVcpq0sSkA2lodqkKy5qepOvyYWYIY18PODBG7EopXl0x1jZnHveDs2q/YgMrsj QEomo+7moWB6pKbNC+PhQlFPKKAX1rr2KFv/nCftfwfVs/Sz8ww7oPlR9/8HS/o9wA0uA8BsluIN @@ -2999,8 +3616,8 @@ interactions: WYrSdORh9B50OXqAUkTdsaQG9ewciJ7iU899THvb9oqGoXcFw8eyKPPM6Lpv0Fk0Yfp8u+rcbx6C ITSsEbCUe5E+m0chuVN3hWkTYJxXRzUVsnbzsd899t0eqPPRMTM1MJd+9n7fmGVjy9wy6Cnt9Ath F4v4g923u9KdU91Par/Aca549PjElon8S67cF4PAHlEVImX7VpxZ4TXWQxubo+csojVry1UD57Gi - 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIANCE - Y0h3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 + 2w/Z4J+2YAg50aX3TmuWpP+73fz/5uc8+Csrg8c7tpwM/wlmaGFQpf8k9n8AUEsDBBQAAAAIABhV + aUh3+548iwwAAIYMAAACAAAANDgBhgx584lQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5 hwAADE1JREFUeJztmXmQXcV1xn99l7fNvPdme5JmkYR2tI2k0QYWSFhisTAIG0Mwiw3E4NgOZVcR x+Wk7CTOHjt2YhMqVcSAwuLISYCgsjEoMmhD+wpaLWnEjKQZbbO8NzNvu7f75I/7RiNpJJngP1RU 6dTcqqnpvt/5Tt/TfU5/o0RE+BibdaUJ/K52NYArbVcDuNLmXGkCH80EozViBHX1GL3C9rFKIRFB @@ -3056,8 +3673,8 @@ interactions: l1IlBOML6oJLvWiNEQvbGVwRL26C9uUil3qD0YLl2B8Sx+AbhW0NrsVKay39MocxgdRh2xbWJZUu QYxBG4MQ6Dhn1RcRRAxGKOlLFvZlFDMRg9E60JEodREquN9ignNeWTaWZV2g8Aja14g5TxcKNJ9A 9vktuo9I4ORi80pjHwrnrJwYzFJKzv5+bmIM1pVK4yIoY4xcbuLl/QuD8++jyJQX6KIBmQ8lel39 - B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgA0IRjSHHt - m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIANCEY0h3+548iwwAAIYM + B8eVtqsBXGm7GsCVtqsBXGn7P9bMe0a9jTH8AAAAAElFTkSuQmCCUEsBAhQDFAAAAAgAGFVpSHHt + m5ioVAAAWVUAAAMAAAAAAAAAAAAAAIABAAAAADE2MFBLAQIUAxQAAAAIABhVaUh3+548iwwAAIYM AAACAAAAAAAAAAAAAACAAclUAAA0OFBLBQYAAAAAAgACAGEAAAB0YQAAAAA= headers: content-type: [application/zip] diff --git a/tests/py/test_teams.py b/tests/py/test_teams.py index a5749af080..59608e9086 100644 --- a/tests/py/test_teams.py +++ b/tests/py/test_teams.py @@ -235,6 +235,15 @@ def test_casing_of_urls_survives(self): assert team.onboarding_url == 'http://INSIDE.GRATipay.com/' assert team.todo_url == 'hTTPS://github.com/GRATIPAY' + def test_casing_of_slug_survives(self): + self.make_participant('alice', claimed_time='now', email_address='', last_paypal_result='') + data = dict(self.valid_data) + data['name'] = 'GratiTeam' + self.post_new(dict(data)) + team = Team.from_slug('GratiTeam') + assert team is not None + assert team.slug_lower == 'gratiteam' + def test_401_for_anon_creating_new_team(self): self.post_new(self.valid_data, auth_as=None, expected=401) assert self.db.one("SELECT COUNT(*) FROM teams") == 0