From 82e7d3cdd0c12974cccfd2728ad26281fc014a48 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 29 Apr 2018 19:23:22 -0600 Subject: [PATCH 01/21] Client for interacting with Airtable --- app/lib/airtable/client.rb | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/lib/airtable/client.rb diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb new file mode 100644 index 00000000..a487d3a3 --- /dev/null +++ b/app/lib/airtable/client.rb @@ -0,0 +1,41 @@ +require "httparty" + +module Airtable + class Client + include HTTParty + base_uri 'api.airtable.com/v0' + + attr_reader :base_id, :headers + + def initialize + api_key = "the api key" + @base_id = "the base id" + @headers = { :Authorization => "Bearer #{api_key}"} + end + + def get_records_for(table) + response = self.class.get("/#{base_id}/#{table}", headers: headers) + + return_value_for(response) + end + + private + + # If the Airtable rate limit is reached, a 429 status code is returned + # @see https://airtable.com/appSqQz7spgg0I1jQ/api/docs#curl/ratelimits + # + def return_value_for(response) + case response.code + when 200 + response.parsed_response['records'] + when 429 + raise AirtableError, 'Exceeded rate limit. Wait 30 seconds for subsequent requests.' + else + raise AirtableError, response.parsed_response + end + end + end + + class AirtableError < StandardError + end +end From 3376336bf2e7620d0175708ebe7307499dab70d3 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 29 Apr 2018 19:24:12 -0600 Subject: [PATCH 02/21] Service class to fetch mentor request data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the data that will be needed to populate the FE mentor request form’s drop down inputs. --- app/lib/airtable/mentorship.rb | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app/lib/airtable/mentorship.rb diff --git a/app/lib/airtable/mentorship.rb b/app/lib/airtable/mentorship.rb new file mode 100644 index 00000000..25bb1900 --- /dev/null +++ b/app/lib/airtable/mentorship.rb @@ -0,0 +1,52 @@ +module Airtable + class Mentorship + attr_reader :client + + def initialize + @client = Airtable::Client.new + end + + def mentor_request_data + { + mentors: mentors, + services: services, + skillsets: skillsets + } + end + + private + + def mentors + mentors = client.get_records_for('Mentors') + + mentors.map do |mentor| + { + id: mentor['id'], + full_name: mentor.dig('fields', 'Full Name') + } + end + end + + def services + services = client.get_records_for('Services') + + services.map do |serive| + { + id: serive['id'], + name: serive.dig('fields', 'Name') + } + end + end + + def skillsets + skillsets = client.get_records_for('Skillsets') + + skillsets.map do |skillset| + { + id: skillset['id'], + name: skillset.dig('fields', 'Name') + } + end + end + end +end From 6bc4676ee157b55c7e6abcc7e1451cafc49bd525 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 29 Apr 2018 19:24:46 -0600 Subject: [PATCH 03/21] Specs for the happy path when fetching mentor request data --- .../airtable/mentorship/successful.yml | 912 ++++++++++++++++++ test/requests/airtable/mentorship_test.rb | 34 + 2 files changed, 946 insertions(+) create mode 100644 test/cassettes/airtable/mentorship/successful.yml create mode 100644 test/requests/airtable/mentorship_test.rb diff --git a/test/cassettes/airtable/mentorship/successful.yml b/test/cassettes/airtable/mentorship/successful.yml new file mode 100644 index 00000000..3a40a258 --- /dev/null +++ b/test/cassettes/airtable/mentorship/successful.yml @@ -0,0 +1,912 @@ +--- +http_interactions: +- request: + method: get + uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Location: + - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Etag: + - W/"7044-ASsyZ8UBGjpIT3NIjPdImM+kzRQ" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '28740' + Connection: + - keep-alive + body: + encoding: ASCII-8BIT + string: !binary |- + eyJyZWNvcmRzIjpbeyJpZCI6InJlYzBTRFpESzJEaVc0UFk5IiwiZmllbGRz + Ijp7IlNsYWNrIE5hbWUiOiJ3YW5ndHJvbiIsIkZ1bGwgTmFtZSI6IkV2YW5z + IFdhbmciLCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWM5 + bG5IWmFEdDJDdlZyWiIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjQ1ZjN3Uz + a0NPTmhKZkYiLCJyZWNuUEhEZFdXMUowNmV2TyIsInJlY2s0bGtPVGtmc01S + UGtSIl0sIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaFNr + YzdwNDFzeDVqWXEiLCJyZWN6MXZJcUpuVFR6RGNCUyJdLCJFbWFpbCI6ImV2 + YW5zLndhbmdAb3BlcmF0aW9uY29kZS5vcmcifSwiY3JlYXRlZFRpbWUiOiIy + MDE4LTAyLTIyVDE1OjU5OjQ1LjAwMFoifSx7ImlkIjoicmVjMlFMUTc2dGhB + VlFqSDAiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkBidWlsdGJ5Y29vcGVy + IiwiRnVsbCBOYW1lIjoiRXZhbiBDb29wZXIiLCJTa2lsbHNldHMiOlsicmVj + SkJCN1p4VE9NNndMNXciLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY25QSERk + V1cxSjA2ZXZPIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWM1RllYVTZqVG5Y + S1BIZyJdLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoiZXZhbm5jb29wZXJAZ21h + aWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNVQyMTo0NDo1Mi4w + MDBaIn0seyJpZCI6InJlYzM4cHNsN3pJOHAzYWlUIiwiZmllbGRzIjp7IlNs + YWNrIE5hbWUiOiJsb25nX2NvbW1vbl9uYW1lIiwiRnVsbCBOYW1lIjoiV2ls + bGlhbSBNb250Z29tZXJ5IiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNPMVFs + VmZZIiwicmVjbDhWd28yeHVGaUVySnkiLCJyZWNxbXlDV2pQU0FxZ0NvcCIs + InJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2alRuWEtQSGciLCJyZWNm + SU56ckZmTEtTSTBHViJdLCJNYXggTWVudGVlcyI6MiwiQmlvIjoiUHJldmlv + dXNseSBVUyBBaXIgRm9yY2UgTWVkaWNhbCBMYWIgVGVjaCBhbmQgY3VycmVu + dGx5IGEgRGV2ZWxvcGVyIGF0IFRyYXZlbHBvcnQuICBFbmpveWluZyBkYXRh + IGFuYWx5c2lzLCBkYXRhIG1hbmlwdWxhdGlvbiwgbGVhcm5pbmcgZnJvbnQg + ZW5kIGFuZCBoZWxwaW5nIG90aGVyIHdpdGggcHl0aG9uLCBPQyBjb21tdW5p + dHkgbWVtYmVyIHNpbmNlIG1hciAyMDE3IiwiQWN0aXZlIjp0cnVlLCJNZW50 + b3IgUmVxdWVzdCI6WyJyZWNTWUJNenpkVjBOdmU4eiIsInJlY0VndzI3OE1i + WEZQalhWIiwicmVjeTZxb3BwU0tCeXAxa0giLCJyZWNEdGtwbjRmMEh3WmdP + bSJdLCJFbWFpbCI6IndpbW83MDgzQGNvbG9yYWRvLmVkdSJ9LCJjcmVhdGVk + VGltZSI6IjIwMTgtMDItMDRUMjA6NTM6MjkuMDAwWiJ9LHsiaWQiOiJyZWM0 + MjVWOWM4RHNRS2NrQyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoidmluY2Vu + dCIsIkZ1bGwgTmFtZSI6IlZpbmNlbnQgQWJydXp6byIsIlNraWxsc2V0cyI6 + WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY25QSERkV1cxSjA2ZXZPIiwicmVj + RTZHR2tMNHcyVDZwbkMiLCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlYzVGWVhV + NmpUblhLUEhnIiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWNxbXlDV2pQU0Fx + Z0NvcCIsInJlY2s0bGtPVGtmc01SUGtSIiwicmVjQ1ZjN3Uza0NPTmhKZkYi + LCJyZWNTanJsc0h0V2g5WFdPUCIsInJlY1dCTGZaQWJOZlBTcExyIiwicmVj + bjRJT3FyUTV1cEN3d1kiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6InZnYWJy + dXp6b0BnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI0VDE5 + OjE0OjA3LjAwMFoifSx7ImlkIjoicmVjNm5BNFdJcmhDdEtXNW4iLCJmaWVs + ZHMiOnsiU2xhY2sgTmFtZSI6ImpheSIsIkZ1bGwgTmFtZSI6IkpheSBEb3Jz + ZXkiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWM5bG5I + WmFEdDJDdlZyWiIsInJlY0NWYzd1M2tDT05oSmZGIl0sIkFjdGl2ZSI6dHJ1 + ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjVmxzY1Q1SWVWN0p5MGoiXSwiRW1h + aWwiOiJqYXlkb3JzZXlAZmFzdG1haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoi + MjAxOC0wMi0xMFQyMTo0MDo0OC4wMDBaIn0seyJpZCI6InJlYzdaU0VCclVK + VTlPd1JrIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJFZHdpbiIsIkZ1bGwg + TmFtZSI6IkVkd2luIE0gVCBDYXJ0ZXIiLCJTa2lsbHNldHMiOlsicmVjNUZZ + WFU2alRuWEtQSGciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY1dCTGZaQWJO + ZlBTcExyIiwicmVjSkhpVlFOSUMzT05NV3MiXSwiQWN0aXZlIjp0cnVlLCJF + bWFpbCI6ImNhcnRlci5lZHdpbkBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTAzLTI3VDE0OjQyOjU0LjAwMFoifSx7ImlkIjoicmVjN2k3SFlN + Ulg2QUFyQlMiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IlBhdHJpY2lhIEdh + dGVzIiwiRnVsbCBOYW1lIjoiUGF0cmljaWEgR2F0ZXMiLCJTa2lsbHNldHMi + OlsicmVjSW1yb1duZDZwMDJhWHUiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJl + YzVGWVhVNmpUblhLUEhnIl0sIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVl + c3QiOlsicmVjVUFqUmNXMU9qM0FiTnYiXSwiRW1haWwiOiJwYXRyaWNpYS5h + bml0YS5nYXRlc0BnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAz + LTI0VDE5OjE0OjA3LjAwMFoifSx7ImlkIjoicmVjOGdXVWEyYWd2V2U2Zmoi + LCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IktlbiBNdWdyYWdlIiwiRnVsbCBO + YW1lIjoiS2VuIE11Z3JhZ2UiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdo + OVhXT1AiLCJyZWNhb0V4MXEwUVJwdmNhUiJdLCJXaGF0IHRpbWUgem9uZSBh + cmUgeW91IGluPyI6IlBhY2lmaWMiLCJCaW8iOiJTZXBhcmF0ZWQgZnJvbSB0 + aGUgVVNNQyBpbiAnODkuXG5cbkFmdGVyIHRoYXQgSSB3b3JrZWQgYXMgYSBz + eXNhZG1pbiBmb3IgU2VhdHRsZSdzIGZpcnN0IGludGVybmV0IHNlcnZpY2Ug + cHJvdmlkZXIgYW5kIHRoZW4gd2VudCBvbiB0byBmb3VuZCBteSBvd24gd2Vi + IGRldmVsb3BtZW50IGNvbXBhbnkgaW4gMTk5NC4gSW4gdGhlIHllYXJzIHNp + bmNlIEkndmUgaGVsZCBqdXN0IGFib3V0IGV2ZXJ5IHRlY2huaWNhbCByb2xl + IGluIGEgc29mdHdhcmUgY29tcGFueSwgZnJvbSBkZXZlbG9wZXIgdG8gQ1RP + LiBcblxuSSBjdXJyZW50bHkgdGVhY2ggQ29udGludW91cyBEZWxpdmVyeSBh + bmQgRGV2T3BzIGZvciBUaG91Z2h0V29ya3MuIEknbSBhbHNvIG9uZSBvZiB0 + aGUgZ2xvYmFsIGNvcmUgb3JnYW5pemVycyBmb3IgRGV2T3BzRGF5cyAod2hl + cmUgdGhlIHRlcm0gRGV2T3BzIGNvbWVzIGZyb20pIFxuXG5JJ20gaGFwcHkg + dG8gb2ZmZXIgaGVscCB0byBhbnlvbmUgd2hvIG5lZWRzIGl0LiBJIHRyYXZl + bCBnbG9iYWxseSBmYWlybHkgb2Z0ZW4gc28gdGltZSB6b25lcyBjYW4gYmUg + YSBjaGFsbGVuZ2UsIGJ1dCBwcmV0dHkgZmxleGlibGUgb3RoZXJ3aXNlLiIs + IkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsicmVjcnk4czE0cUdKaEhlT0Mi + LCJyZWN0emdUR29ReXkyRlZNQyIsInJlY04wbEo0NkJZbnNJOHo5Il0sIk1l + bnRvciBSZXF1ZXN0IjpbInJlY040QUNyeU5CWmo4N01tIl0sIkVtYWlsIjoi + a211Z3JhZ2VAZ21haWwuY29tIiwiQ29kZSBvZiBDb25kdWN0IEFjY2VwdGVk + PyI6dHJ1ZSwiR3VpZGVib29rIFJlYWQ/Ijp0cnVlfSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTA0LTExVDAwOjIxOjE0LjAwMFoifSx7ImlkIjoicmVjOGhDdmRj + d0EydFIzdkYiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkVyaWsiLCJGdWxs + IE5hbWUiOiJFcmlrIEFuZGVyc29uIiwiU2tpbGxzZXRzIjpbInJlYzlsbkha + YUR0MkN2VnJaIiwicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY2V3ZjFqTGNPMVFsVmZZIiwicmVjRTZHR2tMNHcyVDZwbkMi + LCJyZWN3RmZJcnZQZXEwcUdYRyIsInJlYzhJVktlVHJ3c2dVUGNnIiwicmVj + Znc3OFZkbkQ3dHBaVnoiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNX + alBTQXFnQ29wIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWNDVmM3dTNrQ09O + aEpmRiIsInJlY1NqcmxzSHRXaDlYV09QIiwicmVjajJvbWR1N1duSVhMSmsi + LCJyZWNXQkxmWkFiTmZQU3BMciIsInJlY3lHNnNjRVR0eFp1VE54Il0sIk1h + eCBNZW50ZWVzIjoxLCJFbWFpbCI6ImVhbmRlcnNAcG9ib3guY29tIn0sImNy + ZWF0ZWRUaW1lIjoiMjAxOC0wNC0yNFQxNjo1MToyOC4wMDBaIn0seyJpZCI6 + InJlYzlNY3M1SlRGeFZvS1QxIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJr + eWxlbWgiLCJGdWxsIE5hbWUiOiJLeWxlIEhvbG1iZXJnIiwiU2tpbGxzZXRz + IjpbInJlY0pCQjdaeFRPTTZ3TDV3IiwicmVjZXdmMWpMY08xUWxWZlkiLCJy + ZWNFNkdHa0w0dzJUNnBuQyIsInJlY0ltcm9XbmQ2cDAyYVh1IiwicmVjcW15 + Q1dqUFNBcWdDb3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY25QSERkV1cx + SjA2ZXZPIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWM1RllYVTZqVG5YS1BI + ZyJdLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoia3lsZW1oLmVtYWlsQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjVUMjE6NDQ6NDkuMDAw + WiJ9LHsiaWQiOiJyZWNCTTlpYUx3YUFlZTRCUSIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoia2V2aW4ua2lrLmxlZSIsIkZ1bGwgTmFtZSI6IktldmluIEsu + IExlZSIsIlNraWxsc2V0cyI6WyJyZWNwZFY2dkFtdG1JNXBzTSIsInJlY1R1 + N3Q1TTBWaUlMbTVBIiwicmVjSkJCN1p4VE9NNndMNXciLCJyZWM5bG5IWmFE + dDJDdlZyWiIsInJlY0U2R0drTDR3MlQ2cG5DIl0sIldoYXQgdGltZSB6b25l + IGFyZSB5b3UgaW4/IjoiRVNUIiwiQmlvIjoiSm9obiBIYW1wdG9uIHdhcyBh + c3NpZ25lZCB0byBtZSBhcyBhIG1lbnRvci4gIFdoZW4gSSBzdGFydGVkIG15 + IGNyYXp5IGpvdXJuZXkgb2YgZ2V0dGluZyBpbnRvIGNvZGluZywgSSBmZWx0 + IHN1Y2ggY29tZm9ydCBrbm93aW5nIHRoYXQgdGhlcmUgd2FzIHNvbWVvbmUg + aW4gdGhlIHdvcmxkIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCBJIGFtIGRvaW5n + LiAgSSB3YW50IHRvIHByb3ZpZGUgdGhlIHNhbWUgZm9yIG90aGVycy4gICIs + IkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsicmVjdHpnVEdvUXl5MkZWTUMi + LCJyZWNyeThzMTRxR0poSGVPQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVj + S0xSVW9sQ3hzdldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0 + NkJZbnNJOHo5Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY3E0QjhhZ3V4R1dk + Y3dUIl0sIkVtYWlsIjoia2V2aW4ua2lrLmxlZUBnbWFpbC5jb20iLCJDb2Rl + IG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8i + OnRydWV9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDEtMTJUMTc6MzU6NDguMDAw + WiJ9LHsiaWQiOiJyZWNFb2U5WXFzNllNR20xTCIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoibWFnZ2kiLCJGdWxsIE5hbWUiOiJNYWdnaSBNb2xpbmEiLCJT + a2lsbHNldHMiOlsicmVjVVY5RExFb0sxSnFSVjkiLCJyZWN6bDVsaVFKT0pD + YXA3TCIsInJlY3lHbmRnVVlra3lQQ3JTIiwicmVjZjBVYlBXdzI4OUxLanci + LCJyZWNSeVBCd04xSkJqOUQ5bCIsInJlY1hlVjRGbTBsSG5VdDJlIl0sIkFj + dGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjeTlaT2dHQ2RKNE9q + eFgiLCJyZWNqczBtUWpMMDFveVFnaiIsInJlY2xFc2I1VG42M1l6MTd1Il0s + IkVtYWlsIjoibWFnZ2lAb3BlcmF0aW9uY29kZS5vcmcifSwiY3JlYXRlZFRp + bWUiOiIyMDE3LTA2LTA3VDE5OjM1OjUxLjAwMFoifSx7ImlkIjoicmVjRXJB + VlJac2p3anBVTEwiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkhpbHRzIiwi + Tm90ZXMiOiJHbyB0byBZb3VUdWJlIGFuZCBzZWFyY2ggZm9yIFwiYm9iJ3Mg + YXV0aG9yIHRhbGtzXCIgdG8gc2VlIG1lLiAgSSBob3N0ZWQgYWJvdXQgMTUg + dGFsa3MgYXQgR29vZ2xlLiIsIkZ1bGwgTmFtZSI6IkJvYiBQdXJ2eSIsIlNr + aWxsc2V0cyI6WyJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2R0drTDR3MlQ2 + cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNJbXJvV25kNnAwMmFYdSIs + InJlY2oyb21kdTdXbklYTEprIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hh + dCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJQYWNpZmljIiwiQmlvIjoiSSdt + IHJldGlyZWQgbm93LCBhZnRlciAxMiB5ZWFycyBhdCBHb29nbGU7ICBhbHNv + IGEgc3VjY2Vzc2Z1bCBzdGFydHVwIChQYWNrZXRlZXIpOyAgT3JhY2xlOyAg + M0NvbTsgIFhlcm94ICh0aGUgWGVyb3ggU3RhcikuICBNLlMuIGluIENvbXB1 + dGVyIFNjaWVuY2UgZnJvbSBVLiBvZiBJbGxpbm9pcy4iLCJBY3RpdmUiOnRy + dWUsIlNlcnZpY2VzIjpbInJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjcnk4czE0 + cUdKaEhlT0MiLCJyZWNOMGxKNDZCWW5zSTh6OSJdLCJNZW50b3IgUmVxdWVz + dCI6WyJyZWNoT1kwTHZuck81cDh1TSIsInJlYzZQbXZ4VTg1cDU5Z0lLIiwi + cmVjVVEyU2xnVlptdXA4ak0iXSwiRW1haWwiOiJicHVydnlAZ21haWwuY29t + IiwiQ29kZSBvZiBDb25kdWN0IEFjY2VwdGVkPyI6dHJ1ZSwiR3VpZGVib29r + IFJlYWQ/Ijp0cnVlfSwiY3JlYXRlZFRpbWUiOiIyMDE3LTExLTI2VDE1OjUw + OjU0LjAwMFoifSx7ImlkIjoicmVjRjRvQnpqRTNKNkEwd28iLCJmaWVsZHMi + OnsiU2xhY2sgTmFtZSI6InRvYWR6a3kiLCJGdWxsIE5hbWUiOiJEYXZpZCBI + YXJyaXMiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWNK + QkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlM + b0JDZ2g2VHEiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY09mR3k5dE1lVXdq + Tjc4IiwicmVjNUZZWFU2alRuWEtQSGciXSwiTWF4IE1lbnRlZXMiOjIsIldo + YXQgdGltZSB6b25lIGFyZSB5b3UgaW4/IjoiTW91bnRhaW4iLCJIb3cgbWFu + eSBob3VycyB3b3VsZCB5b3UgbGlrZSB0byBtZW50b3IgZm9yLCBwZXIgbW9u + dGg/IjoiNCIsIkJpbyI6IkknbSBhIHByb2Zlc3Npb25hbCBzb2Z0d2FyZSBl + bmdpbmVlciB3aXRoIGEgZGVncmVlIGluIENvbXB1dGVyIFNjaWVuY2UuIEkg + ZGlkIDExIHllYXJzIGluIHRoZSBBcm15IE5hdGlvbmFsIEd1YXJkLCBpbmNs + dWRpbmcgMiBkZXBsb3ltZW50cyB0byBJcmFxLiBJIHNwZWNpYWxpemUgaW4g + YmFja2VuZCBzeXN0ZW1zIGZvciBjbG91ZCBzZXJ2aWNlcywgbW9zdGx5IHdy + aXR0ZW4gaW4gSmF2YSwgYnV0IHdpdGggZXhwZXJpZW5jZSBpbiBDIyBhbmQg + Tm9kZSBhcyB3ZWxsLiBJJ3ZlIGFsc28gZG9uZSBzb21lIG1vYmlsZSB3b3Jr + LCBib3RoIGluIG5hdGl2ZSBBbmRyb2lkIGFuZCB1c2luZyB0aGUgWGFtYXJp + biBDIyBmcmFtZXdvcmsuIFxuXG5JIGNhbWUgdG8gT3BlcmF0aW9uIENvZGUg + dGhyb3VnaCBhIGZyaWVuZCBmcm9tIGEgcHJldmlvdXMgam9iLiBJJ20gaGFw + cHkgdG8gbWVudG9yIGFueW9uZSwgYnV0IEknZCBwcmVmZXIgc29tZW9uZSB3 + aG8gaXMgaW50ZXJlc3RlZCBpbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCBiZWNh + dXNlIHRoZXkgaGF2ZSBhIHBhc3Npb24gZm9yIHByb2JsZW0gc29sdmluZyBh + bmQgdGVjaG5vbG9neSwgbm90IGp1c3QgYmVjYXVzZSBpdCdzIGEgaGlnaCBw + YXlpbmcgam9iLiIsIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsi + cmVjUWRkQ3UyNmowTUdtTzUiLCJyZWM1amF3a0tQUUtpbE83dCIsInJlY2RH + UGljVTNBTTZqVW50IiwicmVjZU9TMzgxVGhLOEwyN3YiXSwiRW1haWwiOiJ0 + b2Fkemt5QGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDItMTRU + MTY6MjI6MDQuMDAwWiJ9LHsiaWQiOiJyZWNHcDJkeXREdDMyb2psNiIsImZp + ZWxkcyI6eyJTbGFjayBOYW1lIjoiZnJvc3RtYXR0aGV3IiwiRnVsbCBOYW1l + IjoiTWF0dGhldyBGcm9zdCIsIlNraWxsc2V0cyI6WyJyZWNFNkdHa0w0dzJU + NnBuQyIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjOWxuSFphRHQyQ3ZWcloi + LCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVj + NUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8i + OiJFYXN0ZXJuIiwiQmlvIjoiSSd2ZSBiZWVuIGEgc29mdHdhcmUgZW5naW5l + ZXIgZm9yIG92ZXIgZml2ZSB5ZWFycy4gVGhlIGZpcnN0IHR3byB5ZWFycyBJ + IHdhcyB0aGUgc29sZSBkZXZlbG9wZXIgYXQgYSBzbWFsbCBJbmZvU2VjIG5v + bnByb2ZpdCBhbmQgZm9yIHRoZSBsYXN0IHRocmVlIEkndmUgYmVlbiBhdCBW + TXdhcmUgd29ya2luZyBvbiB2Q2xvdWQgRGlyZWN0b3IuIFByaW9yIHRvIHRo + YXQgSSB3b3JrZWQgaW4gaG90ZWxzIGFzIGEgYmFucXVldCBtYW5hZ2VyIGJl + Zm9yZSBnb2luZyBiYWNrIHRvIHNjaG9vbCB0byBzd2l0Y2ggY2FyZWVycy5c + blxuSSBqdXN0IGRpc2NvdmVyZWQgT3BlcmF0aW9uIENvZGUgYSBjb3VwbGUg + ZGF5cyBhZ28gdGhhbmtzIHRvIGEgQmFja0NoYW5uZWwgcG9zdCBhbmQgSSdt + IGluY3JlZGlibHkgZXhjaXRlZCBieSBpdHMgbWlzc2lvbiBhcyBJIGhhdmUg + YSBzdHJvbmcgaW50ZXJlc3QgaW4gaGVscGluZyB0aG9zZSB3aG8gaGF2ZSBz + ZXJ2ZWQgKGUuZy4gYXQgVk13YXJlIEknbSBvbiBhbiBpbmZvcm1hbCBjb21t + aXR0ZWUgdG8gZW5jb3VyYWdlIChjb21wYW55LXdpZGUpIGhpcmluZyBvZiB2 + ZXRlcmFucykuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0emdU + R29ReXkyRlZNQyIsInJlY3J5OHMxNHFHSmhIZU9DIiwicmVjS0xSVW9sQ3hz + dldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0NkJZbnNJOHo5 + Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY1BYeHNqa3hDSzMwbDV3IiwicmVj + N0MzYUQxWjRXSmNHbkQiLCJyZWNCRVBHdGpTYUE0dnl0YSIsInJlY0tvWGZK + Wmh5Q0RVRkNWIiwicmVjMUNNdlRZZ2NNM2MwQTUiLCJyZWNmNmZ1emRnWTRm + d2dRbSIsInJlY2hDdjFheDA0cks4a3p5IiwicmVjN3Vmd1M0SWQzVk9rZTUi + LCJyZWM5VDFBUDJ0ZVdRTHRFZiJdLCJFbWFpbCI6Im1mQG1hdHRoZXdmcm9z + dC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA1LTA3VDE0OjIwOjExLjAw + MFoifSx7ImlkIjoicmVjSDhlMlpEdGZ0YkZxUkMiLCJmaWVsZHMiOnsiU2xh + Y2sgTmFtZSI6IkppbSBGdW5nIiwiRnVsbCBOYW1lIjoiSmltIEZ1bmciLCJT + a2lsbHNldHMiOlsicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNhb0V4MXEwUVJw + dmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYi + XSwiTWF4IE1lbnRlZXMiOjEsIkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJqaW10 + aGVlbmdpbmVlckBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTA0 + LTA0VDAwOjM2OjEwLjAwMFoifSx7ImlkIjoicmVjSVBLSW5TdnhyMzByY0Yi + LCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6ImFiYW50aGVzIiwiRnVsbCBOYW1l + IjoiQWxsZW4gQW50aGVzIiwiU2tpbGxzZXRzIjpbInJlYzZpcWhNeEhobFJa + cmh4Il0sIkJpbyI6IkZvciB0ZXN0aW5nIiwiTWVudG9yIFJlcXVlc3QiOlsi + cmVjV2c0bTdSQU4xeXVoSDQiXSwiRW1haWwiOiJhYmFudGhlc0BnbWFpbC5j + b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTE5VDE4OjA1OjEyLjAwMFoi + fSx7ImlkIjoicmVjSjhXaTJMT3FsWTFnYWYiLCJmaWVsZHMiOnsiU2xhY2sg + TmFtZSI6ImpkdWNvZXVyIiwiRnVsbCBOYW1lIjoiTWFyayBXYWtzIiwiU2tp + bGxzZXRzIjpbInJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjWkcxNHNTN1lZVmtW + M1IiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6ImpkdWNvZXVyQGdtYWlsLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTE6MDMuMDAwWiJ9 + LHsiaWQiOiJyZWNKa1lmYlJidXhPWFRMQSIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiaGFycnkiLCJOb3RlcyI6IkhlcmUgYXJlIHNvbWUgcmVsZXZhbnQg + bGlua3M6XG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9ocGphalxuaHR0cHM6Ly93 + d3cubGlua2VkaW4uY29tL2luL2hhcnJ5bWxldmluZS9cbmh0dHBzOi8vYmxv + Zy50ZWNoYXRwb3dlci5jb20vQGhhcnJ5bWxldmluZVxuaHR0cDovL2hwamFq + LmNvbS9cbmh0dHBzOi8vbWVkaXVtLmNvbS9AaGFycnltbGV2aW5lL2EtdGVh + Y2hlcnMtdHdvLWNlbnRzLXdoZW4tbGVhcm5pbmctcnVieS1vbi1yYWlscy1j + ZjUxODA4NTgxZDRcblxuVGhhbmtzISIsIkFzc2lnbm1lbnRzIjpbInJlYzJS + bmJVMk13Z2Z2dHVkIl0sIkZ1bGwgTmFtZSI6IkhhcnJ5IExldmluZSIsIlNr + aWxsc2V0cyI6WyJyZWM5bG5IWmFEdDJDdlZyWiIsInJlY3FteUNXalBTQXFn + Q29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYiXSwiV2hhdCB0aW1lIHpvbmUgYXJl + IHlvdSBpbj8iOiJNb3VudGFpbiIsIkJpbyI6IknigJltIGEgZnVsbCBzdGFj + ayB3ZWIgZGV2ZWxvcGVyIGZvciBQb3dlciBIUkcgKHd3dy5wb3dlcmhyZy5j + b20pLCBwcmltYXJpbHkgZm9jdXNzZWQgb24gUnVieSBvbiBSYWlscy4gIEJl + aW5nIGZ1bGwgc3RhY2ssIEkgYWxzbyB1c2UgSFRNTCwgQ1NTLCBhbmQgSmF2 + YVNjcmlwdCBzb21ld2hhdCByZWd1bGFybHkuXG5cbkkgbGl2ZSBpbiBEZW52 + ZXIsIENPLiAgSSBoYXZlIGJlZW4gYSBzb2Z0d2FyZSBkZXZlbG9wZXIsIHBy + b2Zlc3Npb25hbGx5LCBmb3IganVzdCB1bmRlciB0aHJlZSB5ZWFycy4gIEFz + IHBhcnQgb2YgbXkgdHJhbnNpdGlvbiBpbnRvIHNvZnR3YXJlIGRldmVsb3Bt + ZW50LCBJIGF0dGVuZGVkIGFuZCBncmFkdWF0ZWQgZnJvbSBCbG9jLmlvLlxu + XG5QcmlvciB0byBjb2RpbmcgSSB3YXMgaW4gdGVhY2hpbmcgYW5kIGVkdWNh + dGlvbiBmb3IgMTIgeWVhcnMuICBJIGRpZCBldmVyeXRoaW5nIGZyb20gVC5B + LidpbmcgY29sbGVnZSBLaW5lc2lvbG9neSwgdG8gdHV0b3JpbmcgY2hpbGRy + ZW4gaW4gSXRhbHksIHRvIHRlYWNoaW5nIGhpZ2ggc2Nob29sIHNjaWVuY2Us + IHRvIGNvcnBvcmF0ZSB0cmFpbmluZywgdG8gdGVjaG5pY2FsIHRyYWluaW5n + IGZvciBhIHNvZnR3YXJlIGNvbXBhbnksIHRvIHRlY2huaWNhbCB0cmFpbmlu + ZyBkb25lIHZpcnR1YWxseSAodmlhIEdvVG9NZWV0aW5nLCBldGMuKSwgdG8g + YmVpbmcgdGhlIGRpcmVjdG9yIG9mIHRyYWluaW5nIGZvciBhIHNvZnR3YXJl + IGNvbXBhbnksIHRvIGluc3RydWN0aW9uYWwgZGVzaWduLCB0byBjdXJyaWN1 + bHVtIGRldmVsb3BtZW50LCBhbmQgbW9yZS5cblxuSSBqb2luZWQgT3BlcmF0 + aW9uIENvZGUgdG8gc2VlIGlmIEkgY2FuIGxlbmQgYSBoYW5kIHRvIGFueW9u + ZSBvdXQgdGhlcmUgbGVhcm5pbmcgdG8gY29kZS4gIEnigJl2ZSBiZWVuIHRo + ZXJlLCBJIGFwcHJlY2lhdGUgb3VyIHZldGVyYW5zLCBhbmQgd291bGQgbGlr + ZSB0byBoZWxwIGlmIEkgY2FuISIsIkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMi + OlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThzMTRxR0poSGVPQyIsInJl + Y3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9sQ3hzdldCdUYiXSwiTWVudG9y + IFJlcXVlc3QiOlsicmVjSmYzb0hYQk56QWRKSzgiLCJyZWNBd1FUdkZlSVRU + ZlhlOCIsInJlY3ZKdTIyelo0eHk1RkdzIl0sIkVtYWlsIjoiaG1sZXZpbmVA + Z21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxNy0wNS0xNFQwMTo0Njo1 + NS4wMDBaIn0seyJpZCI6InJlY1AwTk5EZkRxMDJ2bDZZIiwiZmllbGRzIjp7 + IlNsYWNrIE5hbWUiOiJib25pY2lsbG8ubSIsIkZ1bGwgTmFtZSI6Ik1hcmsg + Qm9uaWNpbGxvIiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNPMVFsVmZZIiwi + cmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNsOFZ3bzJ4dUZpRXJKeSIsInJlY0lt + cm9XbmQ2cDAyYVh1IiwicmVjZnc3OFZkbkQ3dHBaVnoiLCJyZWNVVjlETEVv + SzFKcVJWOSIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjcW15Q1dqUFNBcWdD + b3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZaQWJOZlBTcExyIl0s + IkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjRjVoN0h2eEl2 + UHVMSlYiLCJyZWNJRXFpMHhHRzEyaDNxMiJdLCJFbWFpbCI6Im1hcmthYm9u + aWNpbGxvQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRU + MTk6MTQ6MDcuMDAwWiJ9LHsiaWQiOiJyZWNQcTF5N05nWmZyQmU2bSIsImZp + ZWxkcyI6eyJTbGFjayBOYW1lIjoiQW5kcmV3IiwiRnVsbCBOYW1lIjoiQW5k + cmV3IFBob21tYXRoZXAiLCJTa2lsbHNldHMiOlsicmVjRTZHR2tMNHcyVDZw + bkMiLCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlY0NWYzd1M2tDT05oSmZGIiwi + cmVjUTZleDlHRjVpalFUb2QiXSwiTWF4IE1lbnRlZXMiOjEsIkFjdGl2ZSI6 + dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjWldnQkhxTmFXaXBFbHciLCJy + ZWNSeERPVnF5QmZTbHg5TCJdLCJFbWFpbCI6IjEzZGVzdGluaWVzQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMDdUMDM6MzM6MTguMDAw + WiJ9LHsiaWQiOiJyZWNRclp2ZlNSNGpuM1JOTyIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiYnJpYW5rYWhycyIsIkZ1bGwgTmFtZSI6IkJyaWFuIEthaHJz + IiwiU2tpbGxzZXRzIjpbInJlY1VWOURMRW9LMUpxUlY5IiwicmVjNUZZWFU2 + alRuWEtQSGciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3ZER2hHZlBVSzVV + d0cwIl0sIk1heCBNZW50ZWVzIjoxLCJFbWFpbCI6ImJyaWFuLmthaHJzQGdt + YWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMjNUMTg6NTI6NDQu + MDAwWiJ9LHsiaWQiOiJyZWNSbEtjekdBY05LTjI2RyIsImZpZWxkcyI6eyJT + bGFjayBOYW1lIjoiYm9iLXJvYiIsIkZ1bGwgTmFtZSI6IkJvYiBSb2JlcnRz + IiwiU2tpbGxzZXRzIjpbInJlYzlsbkhaYUR0MkN2VnJaIl0sIldoYXQgdGlt + ZSB6b25lIGFyZSB5b3UgaW4/IjoiQ2VudHJhbCIsIkJpbyI6IkkgaGF2ZSBi + ZWVuIHVzaW5nIFJvUiBmb3IgOCB5ZWFycyBub3cgYW5kIHN0aWxsIGxvdmUg + aXQuICBJIGhhdmUgZG9uZSBzb21lIG1lbnRvcmluZyBhbmQgSSBlbmpveSBo + ZWxwaW5nIG90aGVycyBsZWFybiBhcyBvdGhlciBoYWQgaGVscGVkIG1lIGlu + IG15IHBhc3QuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThz + MTRxR0poSGVPQyIsInJlY0tMUlVvbEN4c3ZXQnVGIl0sIk1lbnRvciBSZXF1 + ZXN0IjpbInJlY0sxRWtaU1pDTEZBMDA3IiwicmVjak1HQjkzY0NUQlJBWlki + LCJyZWMwV1hud0Z1MGdSblpyNiIsInJlY0Q3OFlVQkVCNUM3bERGIiwicmVj + TXRoODJBc1Uzbm5nU3MiXSwiRW1haWwiOiJjYXJkc2ZhbmJvYkBnbWFpbC5j + b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA1LTEzVDA0OjMwOjM4LjAwMFoi + fSx7ImlkIjoicmVjUmxXRXpsU1M3eFBjTUQiLCJmaWVsZHMiOnsiU2xhY2sg + TmFtZSI6Im5yeW91bmciLCJOb3RlcyI6IkkgZGlkIG5vdCBoYXZlIGVub3Vn + aCBtZW50b3JzIHRoYXQgcmVhbGx5IGhlbHBlZCBteSBwdXNoIG15IGNhcmVl + ciBmb3J3YXJkIGFuZCBJIGFtIGxvb2tpbmcgdG8gXCJwYXkgaXQgZm9yd2Fy + ZFwiLiBJIGhhdmUgd2FudGVkIHRvIHZvbHVudGVlciBteSB0aW1lIGhlbHBp + bmcgdmV0ZXJhbnMgbGlrZSBteXNlbGYgZm9yIHNvbWUgdGltZSBhbmQgSSBm + aW5hbGx5IGZvdW5kIE9wZXJhdGlvbiBDb2RlLCB3aGljaCBzZWVtcyBsaWtl + IGEgZ29vZCBmaXQuIiwiRnVsbCBOYW1lIjoiTmljIFlvdW5nIiwiU2tpbGxz + ZXRzIjpbInJlY1NqcmxzSHRXaDlYV09QIiwicmVjSkJCN1p4VE9NNndMNXci + LCJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVj + Znc3OFZkbkQ3dHBaVnoiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNX + alBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY2s0bGtPVGtmc01SUGtSIiwicmVjNUZZWFU2alRuWEtQSGci + XSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJNRFQvTVNUIiwiQmlv + IjoiSSBqb2luZWQgdGhlIEFybXkgaW4gMjAwNSBhbmQgc2VydmVkIGZvciAz + LjUgeWVhcnMgYXMgaW5mYW50cnkuIEFmdGVyIGdldHRpbmcgb3V0IG9mIHRo + ZSBtaWxpdGFyeSBJIHdlbnQgZGlyZWN0bHkgdG8gc2Nob29sIGFuZCByZWNl + aXZlZCBteSBCYWNoZWxvcnMgb2YgU2NpZW5jZSBpbiBDb21wdXRlciBTY2ll + bmNlIGZyb20gdGhlIFVuaXZlcnNpdHkgb2YgQ29sb3JhZG8gYXQgRGVudmVy + IGluIDIwMTQuIER1cmluZyBteSBzZW5pb3IgeWVhciBhdCBVbml2ZXJzaXR5 + IEkgZ290IGEgZnVsbCB0aW1lIHBvc2l0aW9uIGFzIGEgU29mdHdhcmUgRW5n + aW5lZXIgbW9zdGx5IHVzaW5nIFB5dGhvbi4gSSBhbSBub3cgZW1wbG95ZWQg + ZnVsbCB0aW1lIGFzIGEgRnVsbCBTdGFjayBFbmdpbmVlciBhdCBhIHNvZnR3 + YXJlIGNvbnN1bHRhbmN5IGJhc2VkIG91dCBvZiBOWUMgY2FsbGVkIFBvc3Rs + aWdodC4gSSBhbSBtb3N0bHkgd3JpdGluZyBFUzYgYW5kIFJlYWN0LCBidXQg + SSBhbSBjb21mb3J0YWJsZSB1cCBhbmQgZG93biB0aGUgc3RhY2sgb2YgYW4g + YXBwbGljYXRpb24uIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0 + emdUR29ReXkyRlZNQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9s + Q3hzdldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0NkJZbnNJ + OHo5Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY2lFUzVEcDVzUjVVaVREIiwi + cmVjOGc5RFdSaGZjRmhMZ2wiXSwiRW1haWwiOiJucnlvdW5nQGdtYWlsLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDYtMDJUMTg6MjU6MDUuMDAwWiJ9 + LHsiaWQiOiJyZWNUUW80Q2JLZ2RtVDlYdiIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiZGF2aWRfdGh1cmVzb24iLCJGdWxsIE5hbWUiOiJEYXZpZCBUaHVy + ZXNvbiIsIlNraWxsc2V0cyI6WyJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2 + R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNhb0V4MXEw + UVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhK + ZkYiLCJyZWNqMm9tZHU3V25JWExKayIsInJlYzVGWVhVNmpUblhLUEhnIl0s + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJEYXZpZC5HLlRodXJlc29uQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTI6NDguMDAw + WiJ9LHsiaWQiOiJyZWNWMHFKRDI4a2kyUThrciIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiSGVsaW8gQ29sYSIsIkZ1bGwgTmFtZSI6IkhlbGlvIENvbGEi + LCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNFNkdHa0w0 + dzJUNnBuQyIsInJlYzlsbkhaYUR0MkN2VnJaIiwicmVjcW15Q1dqUFNBcWdD + b3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZaQWJOZlBTcExyIl0s + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJoZWxpby5jb2xhQGdtYWlsLmNvbSJ9 + LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6MjUuMDAwWiJ9LHsi + aWQiOiJyZWNXUHl4clkyUUtBa1BWTCIsImZpZWxkcyI6eyJTbGFjayBOYW1l + IjoibWlrZXJvZF9zZCIsIkZ1bGwgTmFtZSI6Ik1pY2hhZWwgUm9kcmlndWV6 + IiwiU2tpbGxzZXRzIjpbInJlY3lHNnNjRVR0eFp1VE54Il0sIkFjdGl2ZSI6 + dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjVjJvcGpBclNYVWtNODUiLCJy + ZWN3NXlKZFdJcDZ0OUx3ZyJdLCJFbWFpbCI6InJvZHJpZ3Vlem1sQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTBUMjI6NDY6MDAuMDAw + WiJ9LHsiaWQiOiJyZWNaSUV4Vno3eWhLdGZhOCIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiamhhbXB0b24iLCJOb3RlcyI6Im9wZW4gdG8gaGVscGluZyBh + bnlvbmUgdy8gSFRNTC9DU1MgdG9vXG4iLCJBc3NpZ25tZW50cyI6WyJyZWNY + SGRYVjExMEZTTUJxdCJdLCJGdWxsIE5hbWUiOiJKb2huIEhhbXB0b24iLCJT + a2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNrNGxrT1RrZnNN + UlBrUiIsInJlYzVGWVhVNmpUblhLUEhnIl0sIk1heCBNZW50ZWVzIjoxLCJX + aGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkVTVCIsIkhvdyBtYW55IGhv + dXJzIHdvdWxkIHlvdSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8i + OiI0IiwiQmlvIjoiSSdtIGFuIEFybXkgdmV0ZXJhbiBvZiA3IHllYXJzIChh + Y3RpdmUtZHV0eSBlbmxpc3RlZCwgNjhLIE1lZGljYWwgTGFib3JhdG9yeSkg + d2hvIHN3aXRjaGVkIGNhcmVlcnMgYWZ0ZXIgc2VwYXJhdGluZyBhbmQgaGF2 + ZSBiZWVuIHdvcmtpbmcgYXMgYSBmdWxsLXRpbWUgZGV2ZWxvcGVyIHNpbmNl + IG1pZC0yMDE1LiAgSSBmb3VuZCBPcGVyYXRpb24gQ29kZSBzaG9ydGx5IGJl + Zm9yZSB0aGVuLCBhbmQgdGhleSd2ZSBiZWVuIGEgY29uc2lzdGVudCBzb3Vy + Y2Ugb2Ygc3VwcG9ydCB0aHJvdWdob3V0LiAgSSdtIGxvb2tpbmcgdG8gZ2l2 + ZSBiYWNrIGFuZCBoZWxwIG90aGVyIHZldGVyYW5zIHdobyBhcmUgdHJ5aW5n + IHRvIGJyZWFrIGludG8gdGhpcyBpbmR1c3RyeS4gIFdoaWxlIEkgYXR0ZW5k + ZWQgYSAxMi13ZWVrIGZyb250LWVuZCBib290Y2FtcCwgSSBhbHNvIGNvbnNp + ZGVyIG15c2VsZiBhIHNlbGYtdGF1Z2h0IGRldmVsb3Blci4gIEkgd29yayBt + b3N0bHkgdy8gSmF2YXNjcmlwdCAvIFR5cGVzY3JpcHQgLyBBbmd1bGFyIGZy + b250LWVuZCBzdGFjaywgYnV0IGFsc28gaGF2ZSBleHBlcmllbmNlIHcvIFJl + YWN0LCBFbWJlciwgYW5kIHZhcmlvdXMgb3RoZXIgZnJvbnQtZW5kLWlzaCBz + dHVmZi4gV291bGQgcHJlZmVyIHRvIG1lbnRvciBhbnlvbmUgd2hvIGhhcyBh + IHN0cm9uZyBkZXNpcmUgdG8gZm9jdXMgb24gSmF2YXNjcmlwdCAoZnJvbnQt + ZW5kIG9yIGJhY2stZW5kKS4iLCJBY3RpdmUiOnRydWUsIlNxdWFkcyI6WyJy + ZWNzSzd2alc1OW0wRW11VCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWN2RXNI + MFdLd2ZPSXZhdCIsInJlYzNTcDlQNWdUZ01GZHViIiwicmVjRnpVaEJPMEtZ + NDk2aHkiLCJyZWNYNks3RTR5ZE8wWWpQeSIsInJlY3BJbzZJbm9DcUNLem5q + IiwicmVjREZqRjVLVEJ5a25MMmoiLCJyZWN0TElKRnFqVlM2V2hwTSIsInJl + Y1A5M1ZVZVlleWhyTlZ6IiwicmVjVHpiUUltbFlzQmkxTTYiLCJyZWNJMGVU + SHhkb0FPc0tqUSJdLCJFbWFpbCI6ImpvaG5fal9oYW1wdG9uQHlhaG9vLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYtMTItMDJUMDM6MDU6MTkuMDAwWiJ9 + LHsiaWQiOiJyZWNiNllFS1phQktBeXQ4eSIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiS2VuIE11Z3JhZ2UiLCJGdWxsIE5hbWUiOiJLZW4gTXVncmFnZSIs + IlNraWxsc2V0cyI6WyJyZWM1RllYVTZqVG5YS1BIZyIsInJlY2FvRXgxcTBR + UnB2Y2FSIiwicmVjU2pybHNIdFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjMs + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJrbXVncmFnZUBnbWFpbC5jb20ifSwi + Y3JlYXRlZFRpbWUiOiIyMDE4LTA0LTExVDAwOjI5OjMzLjAwMFoifSx7Imlk + IjoicmVjY0tyRWMwdzg4ZlNzN1ciLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6 + Im1vbGphYyIsIkZ1bGwgTmFtZSI6Ik1pbGplbmtvIEN2amV0a28iLCJTa2ls + bHNldHMiOlsicmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNKQUN4a1p1SFRaU1Uy + aiIsInJlY1NqcmxzSHRXaDlYV09QIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJy + ZWNTeTRIbUlHdElMcVpSdiIsInJlY09mR3k5dE1lVXdqTjc4IiwicmVjWTBH + MjhESW5hZkJ4Z1QiLCJyZWNVVjlETEVvSzFKcVJWOSIsInJlY0NWYzd1M2tD + T05oSmZGIiwicmVjTTlrYjNTYXpGNDY2eG8iLCJyZWNDS3JQbkhEcU9kbGhB + ZyJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkNFVCAiLCJCaW8i + OiIrIE1pY3Jvc29mdCBGVEUgKFhhbWFyaW4gVGVhbSAtIENvbXBvbmVudHMg + VGVhbSkgc2luY2UgMjAxNi4wNy4wMVxuKyBYYW1hcmluIEludGVybmF0aW9u + YWwgQ29udHJhY3RvciBzaW5jZSAyMDE0LjAxXG4rIG93bmVyIG9mIHNtYWxs + IGJ1c2luZXNzIChIb2xpc3RpY1dhcmUpIC0gdXNlZCB0byB3b3JrIGZvciBY + YW1hcmluIGFzIGludGVybmF0aW9uYWwgY29udHJhY3RvclxuKyBmdWxsIHN0 + YWNrIGRldmVsb3BlciAoLk5FVCwgQyMsIFhhbWFyaW4uKiwgQVNQLm5ldCBD + b3JlKVxuKyB2ZXRlcmFuIChDcm9hdGlhbiBQb2xpY2UgYW5kIEFybXkgMTk5 + MS0xOTkzKSBtaWxpdGFyeSBzZXJ2aWNlIDMrIHllYXJzXG4rIHRyeWluZyB0 + byBoZWxwIGxvY2FsIHZldGVyYW4gY29tbXVuaXR5IGluIENyb2F0aWEgc28g + SSBzZWFyY2hlZCBhcm91bmQgYW5kIGpvaW5lZCBPcGVyYXRpb25Db2RlIGNv + cyBJIG1pZ2h0IGJlIGhlbHBmdWxsXG4rIHByZWZlcmVuY2VzIC0gLk5FVCBz + dGFjayAoSSByZWFkIGphdmEgYW5kIG9iamMtYywgYnV0IG5vdCB3cml0ZSks + IEMvQysrIGlzIGEgYml0IHJ1c3R5IChsYXRlIDE5OTBzKSIsIkFjdGl2ZSI6 + dHJ1ZSwiU2VydmljZXMiOlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThz + MTRxR0poSGVPQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9sQ3hz + dldCdUYiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjSDF1T2J2aG1RdzZCQmci + LCJyZWNUeDRmV2R5V0E1WGlBVCIsInJlY3VsNHdIMGZVWHBja3U1IiwicmVj + QUJhTWV0UUdCMldzcjQiLCJyZWNldnRBM0xhWVpNcVNJMiJdLCJFbWFpbCI6 + Im1jdmpldGtvQGhvbGlzdGljd2FyZS5jb20iLCJDb2RlIG9mIENvbmR1Y3Qg + QWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVh + dGVkVGltZSI6IjIwMTctMTItMjBUMjA6MTI6NDEuMDAwWiJ9LHsiaWQiOiJy + ZWNlQmVUeXVXbExmQXBIQiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2F0 + b3JxdWUiLCJOb3RlcyI6IklmIHlvdSB3YW50IHRvIGxlYXJuIEMsIEMrKywg + Q01ha2UsIExpbnV4LCBHaXQsIGVtYmVkZGVkIGRldmljZXMsIGNvbXBpbGVy + cywgb3IgT09QIGNvbmNlcHRzIEkgY2FuIGhlbHAgeW91IG91dC4gSWYgeW91 + IGFyZSB0YWtpbmcgQ1M1MCBmcm9tIGVkWCAtIEkgY2FuIGhlbHAgeW91IHdp + dGggeW91ciBhc3NpZ25tZW50cyAod2l0aG91dCBnaXZpbmcgdGhlIGFuc3dl + cnMpLiIsIkFzc2lnbm1lbnRzIjpbInJlY0lNRW80dTlJeGNld3o4Il0sIkZ1 + bGwgTmFtZSI6IlJ5YW4gTGluZGVtYW4iLCJTa2lsbHNldHMiOlsicmVjRko5 + RlhFNnp4cmQ5aTQiLCJyZWNvc1J2aUxvQkNnaDZUcSIsInJlY2w4VndvMnh1 + RmlFckp5Il0sIk1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUg + eW91IGluPyI6Ik1TVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlvdSBsaWtl + IHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiIyMCIsIkJpbyI6IkknbSBh + IGxhcmdlbHkgc2VsZiB0YXVnaHQgcHJvZ3JhbW1lciB3aXRoIGEgQlMgaW4g + Q29tcHV0ZXIgU2NpZW5jZSBhbmQgTVMgaW4gQ29tcHV0ZXIgRW5naW5lZXJp + bmcuIEkgY3VycmVudGx5IHdvcmsgZm9yIENBIEVuZ2luZWVyaW5nIHByb3Zp + ZGluZyB3aXJlbGVzcyAoODAyLjExLCBaaWdiZWUsIEJsdWV0b290aCwgZXRj + KSBjb25zdWx0aW5nIHNlcnZpY2VzIG1haW5seSBmb3IgUXVhbENvbW0gQXRo + ZXJvcyBjdXN0b21lcnMuXG5JIGxvdmUgaGVscGluZyBwZW9wbGUgbGVhcm4g + dG8gcHJvZ3JhbSBhbmQgaW1wb3J0YW50IGNvbmNlcHRzIGxpa2UgZGF0YSBz + dHJ1Y3R1cmVzLCB0aHJlYWRpbmcsIGFyY2hpdGVjdHVyZSwgYW5kIGFsZ29y + aXRobXMuIEluIG15IHNwYXJlIHRpbWUgSSBsaWtlIHRvIHJlYWQsIHN0dWR5 + IG5ldyBwcm9ncmFtbWluZyBjb25jZXB0cywgYW5kIHdyaXRlIGNvbXB1dGVy + IGdhbWVzIChBbmRyb2lkIGFuZCBkZXNrdG9wKS4iLCJBY3RpdmUiOnRydWUs + Ik1lbnRvciBSZXF1ZXN0IjpbInJlY2I1RG5VanlESVM0U1JWIl0sIkVtYWls + IjoicnlhbmxpbmRlbWFuQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIw + MTYtMTItMjFUMDI6NTM6NTYuMDAwWiJ9LHsiaWQiOiJyZWNlR0tGUkF4WmEw + WkhOZiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZW1tYWRzdXJnZW9uIiwi + RnVsbCBOYW1lIjoiRW1tYW51ZWwgSWRlaGFuIiwiU2tpbGxzZXRzIjpbInJl + Y29zUnZpTG9CQ2doNlRxIiwicmVjbDhWd28yeHVGaUVySnkiLCJyZWNJbXJv + V25kNnAwMmFYdSIsInJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjVVY5RExFb0sx + SnFSVjkiLCJyZWNXQkxmWkFiTmZQU3BMciIsInJlY1kwRzI4REluYWZCeGdU + IiwicmVjajJvbWR1N1duSVhMSmsiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6 + ImVtbWFudWVsLmlkZWhlbkBtdnN1LmVkdSJ9LCJjcmVhdGVkVGltZSI6IjIw + MTgtMDMtMjRUMTk6MTQ6MDcuMDAwWiJ9LHsiaWQiOiJyZWNmdE5pRDkxSGhq + OTUwNiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2VvcmdlbWF1ZXIiLCJB + c3NpZ25tZW50cyI6WyJyZWNnUDM3VDFRVjRJdkZseSIsInJlY2NxbTFObUdS + MW10TXBhIl0sIkZ1bGwgTmFtZSI6Ikdlb3JnZSBNYXVlciIsIlNraWxsc2V0 + cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2cG5DIiwi + cmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNmS3g4Y3JncmpNTXZTayIsInJlY25Q + SERkV1cxSjA2ZXZPIiwicmVjcW15Q1dqUFNBcWdDb3AiLCJyZWNrNGxrT1Rr + ZnNNUlBrUiIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjU3ppY0VzWVhHNFAx + QTQiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY2Z3NzhWZG5EN3RwWlZ6Il0s + Ik1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6 + IkNlbnRyYWwiLCJIb3cgbWFueSBob3VycyB3b3VsZCB5b3UgbGlrZSB0byBt + ZW50b3IgZm9yLCBwZXIgbW9udGg/IjoiMTAiLCJCaW8iOiJJJ20gRGlyZWN0 + b3Igb2YgRGV2ZWxvcG1lbnQgYXQgU3VyZ2UgQ29uc3VsdGluZy4gSSB3cml0 + ZSBjb2RlIGZ1bGwgdGltZSBhbmQgc3BlYWssIG1lbnRvciwgYW5kIHdyaXRl + IG9uIGFsbCBzb3J0cyBvZiB0b3BpY3MgaW4gdGhlIGRldmVsb3BtZW50IHNw + YWNlIGxhcmdlbHkgZm9jdXNpbmcgb24gSmF2YXNjcmlwdCwgU29mdHdhcmUg + QXJjaGl0ZWN0dXJlLCBUZXN0aW5nLCBGdW5jdGlvbmFsIFByb2dyYW1taW5n + LCBhbmQgVGVhY2hpbmcuIEknbSBhIG1lbnRvciBhbmQgZ3Vlc3QgbGVjdHVy + ZXIgd2l0aCBPcGVyYXRpb24gU3BhcmsgYW5kIG9jY2FzaW9uYWxseSB0aGUg + VGVjaCBUYWxlbnQgU291dGggY29kZSBjYW1wcy4gSSBsb3ZlIHRhbGtpbmcg + YWJvdXQgdGhpcyBzdHVmZi4gSSdtIG5vdCBhIHZldCBidXQgaGFwcHkgdG8g + aGVscCBvdXQuIiwiQWN0aXZlIjp0cnVlLCJNZW50b3IgUmVxdWVzdCI6WyJy + ZWNMM2hNM0VMSUhRanRwRCIsInJlY1BNNzVmSU9QZlhSNTFtIiwicmVjOE9Z + dTZGOG45TzJwYnYiLCJyZWNxVnU0NVhmZk9JNDhRNSIsInJlY3Y1WmdsNFdx + RjlSWHFyIiwicmVjZ3ZtVU9yZmJQNzN3STUiLCJyZWNhSzFSbW1Ud1BidFFj + aCIsInJlY3dlVXlDcjQybDVzc3JOIiwicmVjQlZiMFplZ1VjR21MbW4iLCJy + ZWNkNGhXNzNYcG9TZ1dWcSJdLCJFbWFpbCI6ImdtYXVlckBnbWFpbC5jb20i + fSwiY3JlYXRlZFRpbWUiOiIyMDE3LTAyLTEyVDE4OjU2OjMyLjAwMFoifSx7 + ImlkIjoicmVjaVpJMU9tQlpDZHVqQzUiLCJmaWVsZHMiOnsiU2xhY2sgTmFt + ZSI6ImNhZXNhcmFydW0iLCJGdWxsIE5hbWUiOiJQZXRlciBQb29sZSIsIlNr + aWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2 + cG5DIiwicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNhb0V4MXEwUVJwdmNhUiIs + InJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiQWN0 + aXZlIjp0cnVlLCJFbWFpbCI6InBldGVyLmoucG9vbGVAZ21haWwuY29tIn0s + ImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNFQxOToxNDowMy4wMDBaIn0seyJp + ZCI6InJlY2paRDhmcXVnWDhjMnkzIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUi + OiJidXNoaWRvY29kZXMiLCJGdWxsIE5hbWUiOiJTZWFuIE1jQnJpZGUiLCJT + a2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVjNUZZWFU2alRuWEtQSGci + LCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVj + azRsa09Ua2ZzTVJQa1IiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZa + QWJOZlBTcExyIl0sIk1heCBNZW50ZWVzIjoyLCJBY3RpdmUiOnRydWUsIkVt + YWlsIjoic3BtY2JyaWRlMTIwMUBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTA0LTExVDIwOjQyOjQzLjAwMFoifSx7ImlkIjoicmVjbGdBNGRn + Z20zMGIyV1EiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkouVC4iLCJGdWxs + IE5hbWUiOiJKb2huIEtub3giLCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9N + NndMNXciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29w + IiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJB + Y3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY2syMEtURkFBQm82 + QmUxIl0sIkVtYWlsIjoianRrbm94OTFAZ21haWwuY29tIn0sImNyZWF0ZWRU + aW1lIjoiMjAxOC0wMy0xOVQxMjowNzo0Ny4wMDBaIn0seyJpZCI6InJlY29B + QjlOY0R3bEJnSGtqIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJtYWNrc29s + ZCIsIkZ1bGwgTmFtZSI6Ik1hcmsgU29sZGF2aW5pIiwiU2tpbGxzZXRzIjpb + InJlY1NqcmxzSHRXaDlYV09QIiwicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF + NkdHa0w0dzJUNnBuQyIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjTk9OSjhT + MXAxVGpmS1YiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY0NWYzd1M2tDT05o + SmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUgYXJl + IHlvdSBpbj8iOiJFU1QiLCJCaW8iOiJTVU1NQVJJWkVEIFBST0ZFU1NJT05B + TCBFWFBFUklFTkNFXG5JVCBQcm9mZXNzaW9uYWwgd2l0aCBvdmVyIHR3ZW50 + eSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHNvZnR3YXJlIGRldmVsb3BtZW50 + LiBKYXZhIGFuZCBQeXRob24gZGV2ZWxvcGVyIHdpdGggYWRkaXRpb25hbCBz + a2lsbHMgaW4gdGhlIGFyZWFzIG9mIHdlYiBhcHBsaWNhdGlvbiBzZWN1cml0 + eSwgc29mdHdhcmUgZGVzaWduLCBhbmQgdGVhbSBsZWFkZXJzaGlwLiBFeHBl + cmllbmNlZCBpbiBhZ2lsZSBkZXZlbG9wbWVudCBhbmQgYnVpbGRpbmcgcXVh + bGl0eSBzb2Z0d2FyZSB0aHJvdWdoIGEgcHJvY2VzcyB0aGF0IGluY2x1ZGVz + IHVuaXQgdGVzdGluZyBhbmQgY29udGludW91cyBpbnRlZ3JhdGlvbi4gRm91 + ci15ZWFyIHRvdXIgaW4gdGhlIFVTIEFybXkgSW5mYW50cnkgZGV2ZWxvcGVk + IGxlYWRlcnNoaXAgYW5kIHRyYWluaW5nIHNraWxscy5cblxuSSBhbSBoZXJl + IGJlY2F1c2UgSSB3YXMgYSBncnVudCB0aGF0IGxlYXJuZWQgdG8gY29kZSAy + MCB5ZWFycyBhZ28uIEkga25vdyB0aGUgdHJhbnNpdGlvbiBjYW4gYmUgZG9u + ZSBhbmQgd291bGQgbGlrZSB0byB0cnkgYW5kIGhlbHAgb3RoZXJzLiBJIGFt + IGluIHRoZSBEQyBhcmVhLiIsIkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsi + cmVjcnk4czE0cUdKaEhlT0MiLCJyZWNLTFJVb2xDeHN2V0J1RiIsInJlYzNa + UU1DUXNLUEtsRTJDIiwicmVjTjBsSjQ2Qlluc0k4ejkiXSwiRW1haWwiOiJt + YWNrc29sZEB5YWhvby5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA3LTAz + VDE0OjE4OjU4LjAwMFoifSx7ImlkIjoicmVjb29aT0NQWjVtUjZBUnAiLCJm + aWVsZHMiOnsiU2xhY2sgTmFtZSI6Im1pa2VvZXJ0bGkiLCJGdWxsIE5hbWUi + OiJNaWtlIE9lcnRsaSIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZU + cSIsInJlYzVGWVhVNmpUblhLUEhnIl0sIldoYXQgdGltZSB6b25lIGFyZSB5 + b3UgaW4/IjoiTVNUIiwiQmlvIjoiSSdtIGEgamF2YSBkZXZlbG9wZXIgd2l0 + aCBhIHN0cm9uZyBpbnRlcmVzdCBpbiBzbWFsbCBidXNpbmVzcyBvcGVyYXRp + b25zLiBJIHdvcmsgZm9yIGEgc21hbGwgRG9EIGNvbnRyYWN0IHNob3AgaW4g + RGVudmVyLCBoYXBweSB0byBoZWxwIGhvd2V2ZXIgSSBjYW4hIiwiQWN0aXZl + Ijp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThzMTRxR0poSGVPQyIsInJlY04w + bEo0NkJZbnNJOHo5IiwicmVjM1pRTUNRc0tQS2xFMkMiLCJyZWNLTFJVb2xD + eHN2V0J1RiIsInJlY3R6Z1RHb1F5eTJGVk1DIl0sIkVtYWlsIjoibWlrZW9l + cnRsaUBnbWFpbC5jb20iLCJDb2RlIG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0 + cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVhdGVkVGltZSI6IjIw + MTctMDgtMTdUMjA6MDU6MDMuMDAwWiJ9LHsiaWQiOiJyZWNxRThabDhGaDRi + bzRQRyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZnJhbmt5dSIsIkZ1bGwg + TmFtZSI6IkZyYW5rIFl1IiwiU2tpbGxzZXRzIjpbInJlY0ltcm9XbmQ2cDAy + YVh1IiwicmVjVVY5RExFb0sxSnFSVjkiXSwiQWN0aXZlIjp0cnVlLCJFbWFp + bCI6ImZyYW5reXVAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0w + My0yNFQxOToxMzo1OS4wMDBaIn0seyJpZCI6InJlY3FyQWVGeWxqbFd0c1hD + IiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJBc2hsZXkiLCJGdWxsIE5hbWUi + OiJBc2hsZXkgVGVtcGxldCIsIlNraWxsc2V0cyI6WyJyZWN5RzZzY0VUdHha + dVROeCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNNM3g4TzVOeW0yaEFFTSIs + InJlYzVOdWZHSXc2UExKWGNEIiwicmVjbFd1QU9JelRuMVBydnkiLCJyZWNW + RkxIOG9WeFFQNGVFUiJdLCJFbWFpbCI6ImFzaGxleS50ZW1wbGV0QGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTNUMTk6NTI6MDkuMDAw + WiJ9LHsiaWQiOiJyZWNzYmx6eVNMRkhPU2wxZiIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoib2hhaXdhbHQiLCJGdWxsIE5hbWUiOiJNYXR0aGV3IFdhbHRl + ciIsIlNraWxsc2V0cyI6WyJyZWNTanJsc0h0V2g5WFdPUCIsInJlY2V3ZjFq + TGNPMVFsVmZZIiwicmVjNUZZWFU2alRuWEtQSGciLCJyZWNmS3g4Y3JncmpN + TXZTayJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IlVUQy00Iiwi + QmlvIjoiRm9ybWVyIE5hdnkgSVQxIHR1cm5lZCBMaW51eCBzeXNhZG1pbiwg + bm93IFNpdGUgUmVsaWFiaWxpdHkgRW5naW5lZXIgYXQgc29jaWFsbHkgY29u + c2Npb3VzIEdvdlRlY2ggc3RhcnR1cCBTZWFtbGVzc0RvY3MuIEFsbCB0aGlu + Z3MgY29udGFpbmVycywgbW9uaXRvcmluZywgYXV0b21hdGlvbiwgY2xvdWQs + IGluZnJhc3RydWN0dXJlLCBzZWN1cml0eSwgYW5kIHNhZmUgc3lzdGVtcy5c + blxuSW50ZXJlc3RlZCBpbiBoZWxwaW5nIG91dCBmZWxsb3cgdmV0ZXJhbnMg + YW5kIG1ha2luZyB0aGUgdHJhbnNpdGlvbiBlYXNpZXIsIHNpbmNlIG1pbmUg + d2FzIHByZXR0eSByb3VnaCBhbmQgSSBhbSB2ZXJ5IGx1Y2t5L2JsZXNzZWQg + dG8gYmUgd2hlcmUgSSBhbSB0b2RheS4iLCJBY3RpdmUiOnRydWUsIlNlcnZp + Y2VzIjpbInJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjcnk4czE0cUdKaEhlT0Mi + LCJyZWN4RHJwRkw5dzV0TnprVyIsInJlY0tMUlVvbEN4c3ZXQnVGIiwicmVj + TjBsSjQ2Qlluc0k4ejkiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaG1QMzZw + S1dJOHFETGoiXSwiRW1haWwiOiJvaGFpd2FsdEBnbWFpbC5jb20iLCJDb2Rl + IG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8i + OnRydWV9LCJjcmVhdGVkVGltZSI6IjIwMTctMDgtMThUMTY6MDQ6NTcuMDAw + WiJ9LHsiaWQiOiJyZWN1eFVicVBlckx4Z29GZSIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiemRpZWhsaW8iLCJGdWxsIE5hbWUiOiJaYWNoYXJ5IEwgRGll + aGwiLCJTa2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhE + ZFdXMUowNmV2TyIsInJlY1VWOURMRW9LMUpxUlY5IiwicmVjYW9FeDFxMFFS + cHZjYVIiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJNYXggTWVudGVlcyI6NSwi + RW1haWwiOiJ6YWNoYXJ5LmRpZWhsQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGlt + ZSI6IjIwMTgtMDQtMjZUMTY6NDU6NTcuMDAwWiJ9LHsiaWQiOiJyZWN2VUt5 + NkpsQ1RIR0NaaSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiYXVicmV5Iiwi + RnVsbCBOYW1lIjoiQXVicmV5IEFyY2FuZ2VsIiwiU2tpbGxzZXRzIjpbInJl + Y0pCQjdaeFRPTTZ3TDV3IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWM1RllY + VTZqVG5YS1BIZyJdLCJBY3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0Ijpb + InJlY003Qm52Nmg5a1AxaEFiIl0sIkVtYWlsIjoiYWFyY2FuZ2VsQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6NTEuMDAw + WiJ9LHsiaWQiOiJyZWN3TFBnRDlURlRENDFkUiIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiaU9TVG9tIiwiRnVsbCBOYW1lIjoiVGhvbWFzIiwiU2tpbGxz + ZXRzIjpbInJlY29zUnZpTG9CQ2doNlRxIiwicmVjV0JMZlpBYk5mUFNwTHIi + LCJyZWNZMEcyOERJbmFmQnhnVCIsInJlY3lHNnNjRVR0eFp1VE54Il0sIk1h + eCBNZW50ZWVzIjoxLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoidGhvbWFzLm1h + cmxlckBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI2VDE0 + OjI1OjUyLjAwMFoifSx7ImlkIjoicmVjeFlPMWpxTDRIV25KYkkiLCJmaWVs + ZHMiOnsiU2xhY2sgTmFtZSI6Im1zY290dCIsIkZ1bGwgTmFtZSI6Ik1pY2hh + ZWwgSyBTY290dCIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZUcSIs + InJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWNx + bXlDV2pQU0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2 + alRuWEtQSGciXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6Im1pY2hhZWwua2Vs + bHkuc2NvdHRAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0y + NlQwNjoxMTo0Ni4wMDBaIn0seyJpZCI6InJlY3hiZVQxRGF6TGRaMkk4Iiwi + ZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJqcmFtZXMiLCJOb3RlcyI6IkkgYW0g + YWxyZWFkeSBtZW50b3JpbmcgUm9uIFJpaG9vLiAgSG9wZWZ1bGx5IEkgd2ls + bCBoYXZlIG1vcmUgYmFuZHdpZHRoIGluIHRoZSBmdXR1cmUsIGJ1dCBjdXJy + ZW50bHkgbXkgaGFuZHMgYXJlIHByZXR0eSBmdWxsIHdpdGggUm9uIGFuZCBz + b21lIG90aGVycyBJIHN0YXJ0ZWQgaGVscGluZyByZWNlbnRseS4iLCJBc3Np + Z25tZW50cyI6WyJyZWNNcVFCOFVRUFlIZVk3MCJdLCJGdWxsIE5hbWUiOiJK + ZWZmIFJhbWVzIiwiU2tpbGxzZXRzIjpbInJlY1kwRzI4REluYWZCeGdUIiwi + cmVjNUZZWFU2alRuWEtQSGciLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY2Fv + RXgxcTBRUnB2Y2FSIl0sIk1heCBNZW50ZWVzIjoxLCJXaGF0IHRpbWUgem9u + ZSBhcmUgeW91IGluPyI6IkNTVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv + dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI1IiwiQmlvIjoi + SSBoYXZlIHdvcmtlZCBhdCBhIGZvcnR1bmUgNTAgY29tcGFueSwgYSAyIHBl + cnNvbiBjb25zdWx0aW5nIGZpcm0sIGFuZCBjdXJyZW50bHkgYSBzbWFsbCBi + dXNpbmVzcyBhYm91dCBhYm91dCAxMDAgZW1wbG95ZWVzLiAgSSBjdXJyZW50 + bHkgd29yayBvbiBpT1MgbWVkaWNhbCBlbnRlcnByaXNlIHNvZnR3YXJlLiAg + SSBhbHNvIGRvIHdyaXRpbmcgYW5kIHRlY2huaWNhbCBlZGl0aW5nIGZvciBh + IHR1dG9yaWFsIHNpdGUsIHJheXdlbmRlcmxpY2guY29tLlxuXG5JJ20gYWx3 + YXlzIGhhcHB5IHRvIGhlbHAgcGVvcGxlIHRoYXQgYXJlIHN0YXJ0aW5nIG91 + dCwgYW5kIG9ubHkgcmVjZW50bHkgcmVhbGl6ZWQgSSBzaG91bGQgbG9vayBm + b3Igb2ZmaWNpYWwgbWVudG9yaW5nIG9wcG9ydHVuaXRpZXMuIFNvbWVvbmUg + bWVudGlvbmVkIE9wZXJhdGlvbiBDb2RlLCBhbmQgSSB3YXMgaW1tZWRpYXRl + bHkgaW50ZXJlc3RlZC4gIEkgbGlrZSB0aGUgaWRlYSBvZiBnaXZpbmcgYmFj + ayB0byBhIGNvbW11bml0eSB0aGF0IGhhcyBnaXZlbiBzbyBtdWNoIGZvciBv + dXIgY291bnRyeS5cblxuSSdtIGJlc3QgcG9zaXRpb25lZCB0byBoZWxwIHBl + b3BsZSBpbnRlcmVzdGVkIGluIG1vYmlsZSBhcHBsaWNhdGlvbiBkZXZlbG9w + bWVudC4gIENhcmVlciBndWlkYW5jZSBpcyBhbHNvIGFub3RoZXIgYXJlYSB3 + aGVyZSBJIGNhbiBwcm92aWRlIHNvbWUgaGVscCwgcGFydGljdWxhcmx5IHRv + IHRob3NlIGVhcmx5IGluIHRoZWlyIGNhcmVlcnMuICAiLCJBY3RpdmUiOnRy + dWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY0lJdVpWZjBROW1SY2hMIl0sIkVt + YWlsIjoianJhbWVzQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYt + MTItMThUMTg6NTk6NDQuMDAwWiJ9LHsiaWQiOiJyZWN5R0dTb3ZUcnVsNDAx + WSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiTWJhY2giLCJBc3NpZ25tZW50 + cyI6WyJyZWNDV0ZobVNGd1J2VkpvSSJdLCJGdWxsIE5hbWUiOiJNYXR0aGV3 + IEJhY2giLCJTa2lsbHNldHMiOlsicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF + NkdHa0w0dzJUNnBuQyIsInJlY1R1N3Q1TTBWaUlMbTVBIiwicmVjU2pybHNI + dFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjIsIldoYXQgdGltZSB6b25lIGFy + ZSB5b3UgaW4/IjoiRWFzdGVybiIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv + dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI4IiwiQmlvIjoi + V291bGQgcHJlZmVyIHNvbWVvbmUgd2hvIGlzIGVhZ2VyIHRvIHByb2JsZW0g + c29sdmUgd2l0aCBQeXRob24gYXMgYW4gYXV0b21hdGlvbiBsYW5ndWFnZS4g + VGhpcyBpcyBsaWtlbHkgd2hlcmUgSSBjYW4gYmUgdGhlIG1vc3QgaGVscCwg + YnV0IEknbSB3aWxsaW5nIHRvIHRha2Ugb24gYW55b25lIHdobydzIGludGVy + ZXN0ZWQuICIsIkFjdGl2ZSI6dHJ1ZSwiU3F1YWRzIjpbInJlY0k0aUhwVVBq + a2RuclVnIl0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY0ZmV29lbFpqS2NUT2Iw + Il0sIkVtYWlsIjoibWJhY2gwNEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE3LTAxLTAyVDE2OjMwOjQ2LjAwMFoifV19 + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Location: + - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Etag: + - W/"188b-ZKAMD6Yvl9hZgAq+Q/KY5tI7PJU" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '6283' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"records":[{"id":"rec3ZQMCQsKPKlE2C","fields":{"Name":"Mock Interview","Description":"Have + one of our mentors conduct a mock coding interview.","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recBM9iaLwaAee4BQ"],"Mentor + Request":["recPM75fIOPfXR51m","recFzUhBO0KY496hy","recpIo6InoCqCKznj","recPRPi6IzrcHPSfR","recJ3q5zTOccP0Wnt","recgvmUOrfbP73wI5"],"Mentor + Skills":["recbn3OVB3DUPWuI0","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":5,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:07.000Z"},{"id":"recKLRUolCxsvWBuF","fields":{"Name":"Code + Review","Description":"Have a mentor look over a PR, code exercise or software + architecture","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentor + Request":["recvhYWculzcAxvi2","recP93VUeYeyhrNVz","recvJu22zZ4xy5FGs","recAF7yKRfpfHjrhK"],"Mentor + Skills":["recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:09:58.000Z"},{"id":"recN0lJ46BYnsI8z9","fields":{"Name":"Resume + Review","Description":"Have one of our mentors look over your resume","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + Request":["rec0tJIOd8GpmqZ5V","recfwDlYeOARfJoe8","recw5Xw9qkv3VrzE2","reczhwH7rtfs8clc4","recCMQKVmFULiFdAI","recxcgnhlG58HvTmn","recyk8xo77dMdaogb","reclWuAOIzTn1Prvy","rec1CMvTYgcM3c0A5","recufM56SJoHpZP5u","recVNznRKWyKFfQRF","recc1jYPa3GkV1aac","recUAjRcW1Oj3AbNv","rechmP36pKWI8qDLj"],"Mentor + Skills":["recXxKHRRiglWGPWt","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":8,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:10.000Z"},{"id":"recry8s14qGJhHeOC","fields":{"Name":"General + Guidance - Slack Chat","Description":"Chat 1 on 1 with a mentor via slack + chat","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentees":["recwZDCOVDH3QU3Vq","recQxZqkW2QfrDX7E"],"Mentor + Request":["recQlLUpf76DI9uRt","recxTxNKZcYuZPgiV","recWD3SbCvBHCtPEv","reckywOc9xoVAQ4vl","rec7C3aD1Z4WJcGnD","recvEsH0WKwfOIvat","recJf3oHXBNzAdJK8","recUNPVezaf8UNuqi","recMU7Jm7lU8GKSNy","recy9ZOgGCdJ4OjxX","recHVC8HTzXWsZeLg","rec7rx7ilpWb1W88v","rece8pNd1jYbi6Myc","recL3hM3ELIHQjtpD","recISHnxSOMjxKrgi","recYBK56Xp8AVEkYX","recRwfkRluRKOhKM4","recX6K7E4ydO0YjPy","recK1EkZSZCLFA007","recEXEwOmEWnxHdne","recF6AkQMSJaAa7ki","recjMGB93cCTBRAZY","rechii0wYCNIqdw8P","recGuKPSSlzj7mdM1","recBargZbtPOcpotA","rec9aa5x8ZRwA47Zr","recCymG2ALbKUAIXB","rec3aMjN13XEM2cUW","recjnrbWiZEl0brY1","rectLIJFqjVS6WhpM","recIIuZVf0Q9mRchL","recqVu45XffOI48Q5","recLnucDYfq0Mu1cA","recH5papKgKz88dbM","rec5BghMVYJ2KntB9","recYfXnoqFBgxwlDA","recBEPGtjSaA4vyta","recKoXfJZhyCDUFCV","recFekw7gHVMUlndt","rec6H2ZHUVnPU1IhC","recxD9kZnxYjJrut5","recjs0mQjL01oyQgj","recFfWoelZjKcTOb0","recmV1rL9Nfvo6tLx","recTzbQImlYsBi1M6","recSYBMzzdV0Nve8z","recbno9og0y0awr3Z","rechSkc7p41sx5jYq","recQP3XP3MUcpnkE0","recy6qoppSKByp1kH","rec9JNuk4ukpteyIR","recBNrnoQr0LEnBPd","recq4B8aguxGWdcwT","recVFLH8oVxQP4eER","recfV4wkoKGrcrlju","rechCv1ax04rK8kzy","recI0eTHxdoAOsKjQ","rec5jawkKPQKilO7t","recH1uObvhmQw6BBg","recweUyCr42l5ssrN","rec6PmvxU85p59gIK","recUQ2SlgVZmup8jM","rec8g9DWRhfcFhLgl","rec7ufwS4Id3VOke5","rec9T1AP2teWQLtEf","reck20KTFAABo6Be1","recABaMetQGB2Wsr4","reczPcsp85arch31m","recDtkpn4f0HwZgOm","recWg4m7RAN1yuhH4","recYwqjVh4sKOnOCS","recMth82AsU3nngSs","recOLfWE8TwHPzAmd","recRxDOVqyBfSlx9L","recZWgBHqNaWipElw","recb5DnUjyDIS4SRV","recN4ACryNBZj87Mm"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":10,"Mentee Requests":2},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"rectzgTGoQyy2FVMC","fields":{"Name":"General + Guidance - Voice Chat","Description":"Chat 1 on 1 with a mentor via voice + or video","Mentors":["recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + Request":["reciES5Dp5sR5UiTD","recPXxsjkxCK30l5w","rec86L1kFMGYOmnGn","rec3Sp9P5gTgMFdub","recWJcrc7yshLW535","recyw52g0meDKcxBS","recTrJNLGZeyZrQso","recle23ZC0KGpzq7f","recI84guIOF7Rm4xN","recFiFgdmv7q8OI0k","recfxAuJUGJZQuyOv","recDsbdLGttUXWmUk","rec2n9fNgVJOvk9N3","recb3rcFjBP66pEsM","recO0gtj5NOox5cvU","rec72rOLM74NmG7mL","recEgw278MbXFPjXV","rec5NufGIw6PLJXcD","recVlscT5IeV7Jy0j","recV2opjArSXUkM85","recoHLGJd46435i6v","rec0WXnwFu0gRnZr6","recTx4fWdyWA5XiAT","recf6fuzdgY4fwgQm","recBVb0ZegUcGmLmn","rechOY0LvnrO5p8uM","recdFALRdOkpObGsO","recaK1RmmTwPbtQch","rechlkZKhQIPebb5X","recM3x8O5Nym2hAEM","recqqkBPcUrpozV8f","reclEsb5Tn63Yz17u","receOS381ThK8L27v","recul4wH0fUXpcku5","rec2CpCt6XTrmKf2I","recF5h7HvxIvPuLJV","recIEqi0xGG12h3q2","recM7Bnv6h9kP1hAb","recWPOb4pbLJLSBBO","recw5yJdWIp6t9Lwg","recd4hW73XpoSgWVq","recuyrOhS8FwT1TdH"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"recxDrpFL9w5tNzkW","fields":{"Name":"Pair + Programming","Description":"Spend an hour with a mentor programming together","Mentors":["recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentees":["recQxZqkW2QfrDX7E"],"Mentor + Request":["recoZWLdBba0RtObw","recfuT67S14yMmRsR","recH75YcWSGHzoDgL","recVcYxcQZNhZBz8R","rec8OYu6F8n9O2pbv","recbLo1LZkH78m0tf","recPz02jtI7F5Vw4d","recDFjF5KTByknL2j","recWka1ynPANo5s3X","recBtZ6gFrjpRFYFM","recAwQTvFeITTfXe8","recv5Zgl4WqF9RXqr","recD78YUBEB5C7lDF","recpgngdrEXCHdoZK","recQddCu26j0MGmO5","recdGPicU3AM6jUnt","recz1vIqJnTTzDcBS","recevtA3LaYZMqSI2"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":5,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:24 GMT + Location: + - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:24 GMT +- request: + method: get + uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer keyoLxJvLhvUj9MnF + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:24 GMT + Etag: + - W/"286b-1vcTHyIdkMCD4HHe4fcXmNd6RBs" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '10347' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"records":[{"id":"rec5FYXU6jTnXKPHg","fields":{"Name":"Resume Reviews","Mentors":["recZIExVz7yhKtfa8","recxbeT1DazLdZ2I8","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec6iqhMxHhlRZrhx","fields":{"Name":"Bot + Specialist","Mentors":["recIPKInSvxr30rcF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec8IVKeTrwsgUPcg","fields":{"Name":"C#/Net","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"rec9lnHZaDt2CvVrZ","fields":{"Name":"Ruby + / Rails","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recBM9iaLwaAee4BQ","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","recH8e2ZDtftbFqRC","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recBIhDduJD3YLaHq","fields":{"Name":"JavaScript","Mentors":["recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-04-11T20:42:43.000Z"},{"id":"recCKrPnHDqOdlhAg","fields":{"Name":"Cake","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recCVc7u3kCONhJfF","fields":{"Name":"Back + End Development","Mentors":["recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W","rec38psl7zI8p3aiT","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recE6GGkL4w2T6pnC","fields":{"Name":"SQL","Mentors":["recyGGSovTrul401Y","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recFJ9FXE6zxrd9i4","fields":{"Name":"Mobile + (Android)","Mentors":["receBeTyuWlLfApHB"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recImroWnd6p02aXu","fields":{"Name":"Design + / UX","Mentors":["recErAVRZsjwjpULL","recqE8Zl8Fh4bo4PG","rec7i7HYMRX6AArBS","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJACxkZuHTZSU2j","fields":{"Name":"Data + Science","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJBB7ZxTOM6wL5w","fields":{"Name":"Javascript","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recBM9iaLwaAee4BQ","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recV0qJD28ki2Q8kr","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJHiVQNIC3ONMWs","fields":{"Name":"UNIX + Linux Mac OS and command line operation and scripting","Mentors":["rec7ZSEBrUJU9OwRk"]},"createdTime":"2018-03-27T14:42:54.000Z"},{"id":"recM9kb3SazF466xo","fields":{"Name":"Azure","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recNONJ8S1p1TjfKV","fields":{"Name":"C# + / .NET","Mentors":["recftNiD91Hhj9506","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recOfGy9tMeUwjN78","fields":{"Name":"Android + Development","Mentors":["recF4oBzjE3J6A0wo","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recQ6ex9GF5ijQTod","fields":{"Name":"PHP","Mentors":["recPq1y7NgZfrBe6m"]},"createdTime":"2018-04-07T03:33:18.000Z"},{"id":"recRyPBwN1JBj9D9l","fields":{"Name":"Ethics","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSjrlsHtWh9XWOP","fields":{"Name":"DevOps","Mentors":["recyGGSovTrul401Y","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","rec6nA4WIrhCtKW5n","rec425V9c8DsQKckC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSy4HmIGtILqZRv","fields":{"Name":"Xamarian","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSzicEsYXG4P1A4","fields":{"Name":"Architecture","Mentors":["recftNiD91Hhj9506"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recTu7t5M0ViILm5A","fields":{"Name":"Web + (Backend Development)","Mentors":["recyGGSovTrul401Y","recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recUV9DLEoK1JqRV9","fields":{"Name":"Entrepreneurship","Mentors":["recEoe9Yqs6YMGm1L","reccKrEc0w88fSs7W","recqE8Zl8Fh4bo4PG","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recQrZvfSR4jn3RNO","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recWBLfZAbNfPSpLr","fields":{"Name":"Linux","Mentors":["recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recwLPgD9TFTD41dR","rec7ZSEBrUJU9OwRk","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recXeV4Fm0lHnUt2e","fields":{"Name":"Slack","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recY0G28DInafBxgT","fields":{"Name":"IoS + Development","Mentors":["recxbeT1DazLdZ2I8","reccKrEc0w88fSs7W","receGKFRAxZa0ZHNf","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recZG14sS7YYVkV3R","fields":{"Name":"scala","Mentors":["recJ8Wi2LOqlY1gaf"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recaoEx1q0QRpvcaR","fields":{"Name":"General + Career Advice","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recH8e2ZDtftbFqRC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recewf1jLcO1QlVfY","fields":{"Name":"Python","Mentors":["recyGGSovTrul401Y","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recf0UbPWw289LKjw","fields":{"Name":"Dancing","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfINzrFfLKSI0GV","fields":{"Name":"Prolog","Mentors":["rec38psl7zI8p3aiT"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfKx8crgrjMMvSk","fields":{"Name":"Cat + Pictures","Mentors":["recftNiD91Hhj9506","recsblzySLFHOSl1f"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfw78VdnD7tpZVz","fields":{"Name":"Functional + Programming","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recJ8Wi2LOqlY1gaf","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recPq1y7NgZfrBe6m","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recj2omdu7WnIXLJk","fields":{"Name":"Data-Science","Mentors":["recErAVRZsjwjpULL","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reck4lkOTkfsMRPkR","fields":{"Name":"Front + End Development","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recl8Vwo2xuFiErJy","fields":{"Name":"C + / C++","Mentors":["receBeTyuWlLfApHB","rec38psl7zI8p3aiT","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recn4IOqrQ5upCwwY","fields":{"Name":"Cyber-Security","Mentors":["rec425V9c8DsQKckC"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recnPHDdWW1J06evO","fields":{"Name":"React","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recosRviLoBCgh6Tq","fields":{"Name":"Java","Mentors":["receBeTyuWlLfApHB","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recpdV6vAmtmI5psM","fields":{"Name":"Web + (Frontend Development)","Mentors":["recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recqmyCWjPSAqgCop","fields":{"Name":"Code + Review","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","rec38psl7zI8p3aiT","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recvDGhGfPUK5UwG0","fields":{"Name":"product + and program management (transitioning to or growing within the function)","Mentors":["recQrZvfSR4jn3RNO"]},"createdTime":"2018-04-23T18:52:44.000Z"},{"id":"recwFfIrvPeq0qGXG","fields":{"Name":"C/C++","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"recyG6scETtxZuTNx","fields":{"Name":"Cyber-security","Mentors":["recWPyxrY2QKAkPVL","recqrAeFyljlWtsXC","recwLPgD9TFTD41dR","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recyGndgUYkkyPCrS","fields":{"Name":"Career + Advice","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reczl5liQJOJCap7L","fields":{"Name":"Resume + Review","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"}]}' + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:24 GMT +recorded_with: VCR 3.0.3 diff --git a/test/requests/airtable/mentorship_test.rb b/test/requests/airtable/mentorship_test.rb new file mode 100644 index 00000000..d5925d69 --- /dev/null +++ b/test/requests/airtable/mentorship_test.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class MentorshipTest < Minitest::Test + def setup + VCR.use_cassette('airtable/mentorship/successful') do + @successful_response = Airtable::Mentorship.new.mentor_request_data + end + end + + def test_mentor_request_data_returns_correct_keys + assert @successful_response.keys.sort == [:mentors, :services, :skillsets] + end + + def test_mentor_request_data_returns_correct_mentor_data + mentor = @successful_response[:mentors].first + + assert mentor[:id].present? + assert mentor[:full_name].present? + end + + def test_mentor_request_data_returns_correct_service_data + service = @successful_response[:services].first + + assert service[:id].present? + assert service[:name].present? + end + +def test_mentor_request_data_returns_correct_skillset_data + skillset = @successful_response[:skillsets].first + + assert skillset[:id].present? + assert skillset[:name].present? + end +end From 6cb81687328e922423bdc1ce376b72fbdfc70ebd Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 29 Apr 2018 19:26:47 -0600 Subject: [PATCH 04/21] No longer need two gems now that we have a client We were using two different gems to interact with Airtable. This is unneeded complexity. This implementation goes directly to the source, removes any confusion, and any babysitting of dependencies. --- Gemfile | 1 - Gemfile.lock | 6 ------ 2 files changed, 7 deletions(-) diff --git a/Gemfile b/Gemfile index 92dc1653..14de8d03 100644 --- a/Gemfile +++ b/Gemfile @@ -19,7 +19,6 @@ gem 'httparty' gem 'jwt' gem 'lograge' gem 'logstash-event' -gem 'operationcode-airtable' gem 'operationcode-slack' gem 'pg', '~> 0.18' gem 'puma', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 37be78e8..cb2df053 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -59,8 +59,6 @@ GEM activerecord (>= 4.2.8) addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) - airtable (0.0.9) - httparty arbre (1.1.1) activesupport (>= 3.0.0) arel (7.1.4) @@ -170,9 +168,6 @@ GEM nio4r (2.0.0) nokogiri (1.8.2) mini_portile2 (~> 2.3.0) - operationcode-airtable (0.3.0) - activesupport - airtable operationcode-slack (0.6.0) activesupport httparty @@ -309,7 +304,6 @@ DEPENDENCIES lograge logstash-event mocha - operationcode-airtable operationcode-slack pg (~> 0.18) pry-rails From 316ee3594e85b22286d2c4c498585b2453b5aa47 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sat, 5 May 2018 09:48:03 -0600 Subject: [PATCH 05/21] Creates secrets and env vars for Airtable --- app/lib/airtable/client.rb | 4 +- config/secrets.yml | 6 +++ .../airtable/mentorship/successful.yml | 42 +++++++++---------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index a487d3a3..d885f52c 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -8,8 +8,8 @@ class Client attr_reader :base_id, :headers def initialize - api_key = "the api key" - @base_id = "the base id" + api_key = Rails.application.secrets.airtable_api_key + @base_id = Rails.application.secrets.airtable_base_id @headers = { :Authorization => "Bearer #{api_key}"} end diff --git a/config/secrets.yml b/config/secrets.yml index c905b1d5..5555c48e 100644 --- a/config/secrets.yml +++ b/config/secrets.yml @@ -11,6 +11,8 @@ # if you're sharing your code publicly. development: + airtable_api_key: 'some_random_key' + airtable_base_id: 'some_random_id' git_hub_client_id: 'some random id' git_hub_client_secret: 'some random key' git_hub_oauth_token: 'some_random_token' @@ -20,6 +22,8 @@ development: secret_key_base: 5d44826022fd9ef943fa7d5dcaf76722893b63e264fd8b3d22174992a001ed0bd8bb91131928d9ab2d25b6eccce54ebca320a7676942d05ae3defe96e2f04346 test: + airtable_api_key: 'some_random_key' + airtable_base_id: 'some_random_id' git_hub_client_id: 'some random id' git_hub_client_secret: 'some random key' git_hub_oauth_token: 'some_random_token' @@ -31,6 +35,8 @@ test: # Do not keep production secrets in the repository, # instead read values from the environment. production: + airtable_api_key: <%= ENV["AIRTABLE_API_KEY"] %> + airtable_base_id: <%= ENV["AIRTABLE_BASE_ID"] %> git_hub_client_id: <%= ENV["GIT_HUB_CLIENT_ID"] %> git_hub_client_secret: <%= ENV["GIT_HUB_CLIENT_SECRET"] %> git_hub_oauth_token: <%= ENV["GIT_HUB_OAUTH_TOKEN"] %> diff --git a/test/cassettes/airtable/mentorship/successful.yml b/test/cassettes/airtable/mentorship/successful.yml index 3a40a258..b19603e1 100644 --- a/test/cassettes/airtable/mentorship/successful.yml +++ b/test/cassettes/airtable/mentorship/successful.yml @@ -2,13 +2,13 @@ http_interactions: - request: method: get - uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + uri: http://api.airtable.com/v0/some_random_id/Mentors body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 301 @@ -19,7 +19,7 @@ http_interactions: Date: - Sun, 29 Apr 2018 23:16:23 GMT Location: - - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + - https://api.airtable.com/v0/some_random_id/Mentors Server: - Tengine Content-Length: @@ -32,17 +32,17 @@ http_interactions: Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n

The requested resource has been assigned a new permanent URI.

\r\n
Powered by Tengine\r\n\r\n" - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:23 GMT - request: method: get - uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Mentors + uri: https://api.airtable.com/v0/some_random_id/Mentors body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 200 @@ -711,17 +711,17 @@ http_interactions: a2RuclVnIl0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY0ZmV29lbFpqS2NUT2Iw Il0sIkVtYWlsIjoibWJhY2gwNEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi OiIyMDE3LTAxLTAyVDE2OjMwOjQ2LjAwMFoifV19 - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:23 GMT - request: method: get - uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + uri: http://api.airtable.com/v0/some_random_id/Services body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 301 @@ -732,7 +732,7 @@ http_interactions: Date: - Sun, 29 Apr 2018 23:16:23 GMT Location: - - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + - https://api.airtable.com/v0/some_random_id/Services Server: - Tengine Content-Length: @@ -745,17 +745,17 @@ http_interactions: Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n

The requested resource has been assigned a new permanent URI.

\r\n
Powered by Tengine\r\n\r\n" - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:23 GMT - request: method: get - uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Services + uri: https://api.airtable.com/v0/some_random_id/Services body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 200 @@ -812,17 +812,17 @@ http_interactions: Request":["recoZWLdBba0RtObw","recfuT67S14yMmRsR","recH75YcWSGHzoDgL","recVcYxcQZNhZBz8R","rec8OYu6F8n9O2pbv","recbLo1LZkH78m0tf","recPz02jtI7F5Vw4d","recDFjF5KTByknL2j","recWka1ynPANo5s3X","recBtZ6gFrjpRFYFM","recAwQTvFeITTfXe8","recv5Zgl4WqF9RXqr","recD78YUBEB5C7lDF","recpgngdrEXCHdoZK","recQddCu26j0MGmO5","recdGPicU3AM6jUnt","recz1vIqJnTTzDcBS","recevtA3LaYZMqSI2"],"Mentor Skills":["recCbfP26C9oyF6oZ","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor Count":5,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:23 GMT - request: method: get - uri: http://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + uri: http://api.airtable.com/v0/some_random_id/Skillsets body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 301 @@ -833,7 +833,7 @@ http_interactions: Date: - Sun, 29 Apr 2018 23:16:24 GMT Location: - - https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + - https://api.airtable.com/v0/some_random_id/Skillsets Server: - Tengine Content-Length: @@ -846,17 +846,17 @@ http_interactions: Moved Permanently\r\n\r\n

301 Moved Permanently

\r\n

The requested resource has been assigned a new permanent URI.

\r\n
Powered by Tengine\r\n\r\n" - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:24 GMT - request: method: get - uri: https://api.airtable.com/v0/appSqQz7spgg0I1jQ/Skillsets + uri: https://api.airtable.com/v0/some_random_id/Skillsets body: encoding: US-ASCII string: '' headers: Authorization: - - Bearer keyoLxJvLhvUj9MnF + - Bearer some_random_key response: status: code: 200 @@ -907,6 +907,6 @@ http_interactions: and program management (transitioning to or growing within the function)","Mentors":["recQrZvfSR4jn3RNO"]},"createdTime":"2018-04-23T18:52:44.000Z"},{"id":"recwFfIrvPeq0qGXG","fields":{"Name":"C/C++","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"recyG6scETtxZuTNx","fields":{"Name":"Cyber-security","Mentors":["recWPyxrY2QKAkPVL","recqrAeFyljlWtsXC","recwLPgD9TFTD41dR","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recyGndgUYkkyPCrS","fields":{"Name":"Career Advice","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reczl5liQJOJCap7L","fields":{"Name":"Resume Review","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"}]}' - http_version: + http_version: recorded_at: Sun, 29 Apr 2018 23:16:24 GMT recorded_with: VCR 3.0.3 From ebf3f9605f160c1808028813d71daf715fc25293 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sat, 5 May 2018 09:50:26 -0600 Subject: [PATCH 06/21] Creates a custom Airtable error class --- app/lib/airtable/client.rb | 7 ++----- app/lib/airtable/error.rb | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 app/lib/airtable/error.rb diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index d885f52c..d034b884 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -29,13 +29,10 @@ def return_value_for(response) when 200 response.parsed_response['records'] when 429 - raise AirtableError, 'Exceeded rate limit. Wait 30 seconds for subsequent requests.' + raise Airtable::Error, 'Exceeded Airtable rate limit. Wait 30 seconds for subsequent requests.' else - raise AirtableError, response.parsed_response + raise Airtable::Error, response.parsed_response end end end - - class AirtableError < StandardError - end end diff --git a/app/lib/airtable/error.rb b/app/lib/airtable/error.rb new file mode 100644 index 00000000..d61a9c68 --- /dev/null +++ b/app/lib/airtable/error.rb @@ -0,0 +1,4 @@ +module Airtable + class Error < StandardError + end +end From 61aec46743e4dc0d9adfb912c6c1a1ccf53f58eb Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sat, 5 May 2018 09:51:41 -0600 Subject: [PATCH 07/21] Tests the 429 rate limit exceeded case --- .../mentorship/exceeded_rate_limit.yml | 912 ++++++++++++++++++ test/requests/airtable/mentorship_test.rb | 10 +- 2 files changed, 921 insertions(+), 1 deletion(-) create mode 100644 test/cassettes/airtable/mentorship/exceeded_rate_limit.yml diff --git a/test/cassettes/airtable/mentorship/exceeded_rate_limit.yml b/test/cassettes/airtable/mentorship/exceeded_rate_limit.yml new file mode 100644 index 00000000..d247498d --- /dev/null +++ b/test/cassettes/airtable/mentorship/exceeded_rate_limit.yml @@ -0,0 +1,912 @@ +--- +http_interactions: +- request: + method: get + uri: http://api.airtable.com/v0/some_random_id/Mentors + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Location: + - https://api.airtable.com/v0/some_random_id/Mentors + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: https://api.airtable.com/v0/some_random_id/Mentors + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 429 + message: '' + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Etag: + - W/"7044-ASsyZ8UBGjpIT3NIjPdImM+kzRQ" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '28740' + Connection: + - keep-alive + body: + encoding: ASCII-8BIT + string: !binary |- + eyJyZWNvcmRzIjpbeyJpZCI6InJlYzBTRFpESzJEaVc0UFk5IiwiZmllbGRz + Ijp7IlNsYWNrIE5hbWUiOiJ3YW5ndHJvbiIsIkZ1bGwgTmFtZSI6IkV2YW5z + IFdhbmciLCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWM5 + bG5IWmFEdDJDdlZyWiIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjQ1ZjN3Uz + a0NPTmhKZkYiLCJyZWNuUEhEZFdXMUowNmV2TyIsInJlY2s0bGtPVGtmc01S + UGtSIl0sIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaFNr + YzdwNDFzeDVqWXEiLCJyZWN6MXZJcUpuVFR6RGNCUyJdLCJFbWFpbCI6ImV2 + YW5zLndhbmdAb3BlcmF0aW9uY29kZS5vcmcifSwiY3JlYXRlZFRpbWUiOiIy + MDE4LTAyLTIyVDE1OjU5OjQ1LjAwMFoifSx7ImlkIjoicmVjMlFMUTc2dGhB + VlFqSDAiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkBidWlsdGJ5Y29vcGVy + IiwiRnVsbCBOYW1lIjoiRXZhbiBDb29wZXIiLCJTa2lsbHNldHMiOlsicmVj + SkJCN1p4VE9NNndMNXciLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY25QSERk + V1cxSjA2ZXZPIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWM1RllYVTZqVG5Y + S1BIZyJdLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoiZXZhbm5jb29wZXJAZ21h + aWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNVQyMTo0NDo1Mi4w + MDBaIn0seyJpZCI6InJlYzM4cHNsN3pJOHAzYWlUIiwiZmllbGRzIjp7IlNs + YWNrIE5hbWUiOiJsb25nX2NvbW1vbl9uYW1lIiwiRnVsbCBOYW1lIjoiV2ls + bGlhbSBNb250Z29tZXJ5IiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNPMVFs + VmZZIiwicmVjbDhWd28yeHVGaUVySnkiLCJyZWNxbXlDV2pQU0FxZ0NvcCIs + InJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2alRuWEtQSGciLCJyZWNm + SU56ckZmTEtTSTBHViJdLCJNYXggTWVudGVlcyI6MiwiQmlvIjoiUHJldmlv + dXNseSBVUyBBaXIgRm9yY2UgTWVkaWNhbCBMYWIgVGVjaCBhbmQgY3VycmVu + dGx5IGEgRGV2ZWxvcGVyIGF0IFRyYXZlbHBvcnQuICBFbmpveWluZyBkYXRh + IGFuYWx5c2lzLCBkYXRhIG1hbmlwdWxhdGlvbiwgbGVhcm5pbmcgZnJvbnQg + ZW5kIGFuZCBoZWxwaW5nIG90aGVyIHdpdGggcHl0aG9uLCBPQyBjb21tdW5p + dHkgbWVtYmVyIHNpbmNlIG1hciAyMDE3IiwiQWN0aXZlIjp0cnVlLCJNZW50 + b3IgUmVxdWVzdCI6WyJyZWNTWUJNenpkVjBOdmU4eiIsInJlY0VndzI3OE1i + WEZQalhWIiwicmVjeTZxb3BwU0tCeXAxa0giLCJyZWNEdGtwbjRmMEh3WmdP + bSJdLCJFbWFpbCI6IndpbW83MDgzQGNvbG9yYWRvLmVkdSJ9LCJjcmVhdGVk + VGltZSI6IjIwMTgtMDItMDRUMjA6NTM6MjkuMDAwWiJ9LHsiaWQiOiJyZWM0 + MjVWOWM4RHNRS2NrQyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoidmluY2Vu + dCIsIkZ1bGwgTmFtZSI6IlZpbmNlbnQgQWJydXp6byIsIlNraWxsc2V0cyI6 + WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY25QSERkV1cxSjA2ZXZPIiwicmVj + RTZHR2tMNHcyVDZwbkMiLCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlYzVGWVhV + NmpUblhLUEhnIiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWNxbXlDV2pQU0Fx + Z0NvcCIsInJlY2s0bGtPVGtmc01SUGtSIiwicmVjQ1ZjN3Uza0NPTmhKZkYi + LCJyZWNTanJsc0h0V2g5WFdPUCIsInJlY1dCTGZaQWJOZlBTcExyIiwicmVj + bjRJT3FyUTV1cEN3d1kiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6InZnYWJy + dXp6b0BnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI0VDE5 + OjE0OjA3LjAwMFoifSx7ImlkIjoicmVjNm5BNFdJcmhDdEtXNW4iLCJmaWVs + ZHMiOnsiU2xhY2sgTmFtZSI6ImpheSIsIkZ1bGwgTmFtZSI6IkpheSBEb3Jz + ZXkiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWM5bG5I + WmFEdDJDdlZyWiIsInJlY0NWYzd1M2tDT05oSmZGIl0sIkFjdGl2ZSI6dHJ1 + ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjVmxzY1Q1SWVWN0p5MGoiXSwiRW1h + aWwiOiJqYXlkb3JzZXlAZmFzdG1haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoi + MjAxOC0wMi0xMFQyMTo0MDo0OC4wMDBaIn0seyJpZCI6InJlYzdaU0VCclVK + VTlPd1JrIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJFZHdpbiIsIkZ1bGwg + TmFtZSI6IkVkd2luIE0gVCBDYXJ0ZXIiLCJTa2lsbHNldHMiOlsicmVjNUZZ + WFU2alRuWEtQSGciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY1dCTGZaQWJO + ZlBTcExyIiwicmVjSkhpVlFOSUMzT05NV3MiXSwiQWN0aXZlIjp0cnVlLCJF + bWFpbCI6ImNhcnRlci5lZHdpbkBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTAzLTI3VDE0OjQyOjU0LjAwMFoifSx7ImlkIjoicmVjN2k3SFlN + Ulg2QUFyQlMiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IlBhdHJpY2lhIEdh + dGVzIiwiRnVsbCBOYW1lIjoiUGF0cmljaWEgR2F0ZXMiLCJTa2lsbHNldHMi + OlsicmVjSW1yb1duZDZwMDJhWHUiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJl + YzVGWVhVNmpUblhLUEhnIl0sIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVl + c3QiOlsicmVjVUFqUmNXMU9qM0FiTnYiXSwiRW1haWwiOiJwYXRyaWNpYS5h + bml0YS5nYXRlc0BnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAz + LTI0VDE5OjE0OjA3LjAwMFoifSx7ImlkIjoicmVjOGdXVWEyYWd2V2U2Zmoi + LCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IktlbiBNdWdyYWdlIiwiRnVsbCBO + YW1lIjoiS2VuIE11Z3JhZ2UiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdo + OVhXT1AiLCJyZWNhb0V4MXEwUVJwdmNhUiJdLCJXaGF0IHRpbWUgem9uZSBh + cmUgeW91IGluPyI6IlBhY2lmaWMiLCJCaW8iOiJTZXBhcmF0ZWQgZnJvbSB0 + aGUgVVNNQyBpbiAnODkuXG5cbkFmdGVyIHRoYXQgSSB3b3JrZWQgYXMgYSBz + eXNhZG1pbiBmb3IgU2VhdHRsZSdzIGZpcnN0IGludGVybmV0IHNlcnZpY2Ug + cHJvdmlkZXIgYW5kIHRoZW4gd2VudCBvbiB0byBmb3VuZCBteSBvd24gd2Vi + IGRldmVsb3BtZW50IGNvbXBhbnkgaW4gMTk5NC4gSW4gdGhlIHllYXJzIHNp + bmNlIEkndmUgaGVsZCBqdXN0IGFib3V0IGV2ZXJ5IHRlY2huaWNhbCByb2xl + IGluIGEgc29mdHdhcmUgY29tcGFueSwgZnJvbSBkZXZlbG9wZXIgdG8gQ1RP + LiBcblxuSSBjdXJyZW50bHkgdGVhY2ggQ29udGludW91cyBEZWxpdmVyeSBh + bmQgRGV2T3BzIGZvciBUaG91Z2h0V29ya3MuIEknbSBhbHNvIG9uZSBvZiB0 + aGUgZ2xvYmFsIGNvcmUgb3JnYW5pemVycyBmb3IgRGV2T3BzRGF5cyAod2hl + cmUgdGhlIHRlcm0gRGV2T3BzIGNvbWVzIGZyb20pIFxuXG5JJ20gaGFwcHkg + dG8gb2ZmZXIgaGVscCB0byBhbnlvbmUgd2hvIG5lZWRzIGl0LiBJIHRyYXZl + bCBnbG9iYWxseSBmYWlybHkgb2Z0ZW4gc28gdGltZSB6b25lcyBjYW4gYmUg + YSBjaGFsbGVuZ2UsIGJ1dCBwcmV0dHkgZmxleGlibGUgb3RoZXJ3aXNlLiIs + IkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsicmVjcnk4czE0cUdKaEhlT0Mi + LCJyZWN0emdUR29ReXkyRlZNQyIsInJlY04wbEo0NkJZbnNJOHo5Il0sIk1l + bnRvciBSZXF1ZXN0IjpbInJlY040QUNyeU5CWmo4N01tIl0sIkVtYWlsIjoi + a211Z3JhZ2VAZ21haWwuY29tIiwiQ29kZSBvZiBDb25kdWN0IEFjY2VwdGVk + PyI6dHJ1ZSwiR3VpZGVib29rIFJlYWQ/Ijp0cnVlfSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTA0LTExVDAwOjIxOjE0LjAwMFoifSx7ImlkIjoicmVjOGhDdmRj + d0EydFIzdkYiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkVyaWsiLCJGdWxs + IE5hbWUiOiJFcmlrIEFuZGVyc29uIiwiU2tpbGxzZXRzIjpbInJlYzlsbkha + YUR0MkN2VnJaIiwicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY2V3ZjFqTGNPMVFsVmZZIiwicmVjRTZHR2tMNHcyVDZwbkMi + LCJyZWN3RmZJcnZQZXEwcUdYRyIsInJlYzhJVktlVHJ3c2dVUGNnIiwicmVj + Znc3OFZkbkQ3dHBaVnoiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNX + alBTQXFnQ29wIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWNDVmM3dTNrQ09O + aEpmRiIsInJlY1NqcmxzSHRXaDlYV09QIiwicmVjajJvbWR1N1duSVhMSmsi + LCJyZWNXQkxmWkFiTmZQU3BMciIsInJlY3lHNnNjRVR0eFp1VE54Il0sIk1h + eCBNZW50ZWVzIjoxLCJFbWFpbCI6ImVhbmRlcnNAcG9ib3guY29tIn0sImNy + ZWF0ZWRUaW1lIjoiMjAxOC0wNC0yNFQxNjo1MToyOC4wMDBaIn0seyJpZCI6 + InJlYzlNY3M1SlRGeFZvS1QxIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJr + eWxlbWgiLCJGdWxsIE5hbWUiOiJLeWxlIEhvbG1iZXJnIiwiU2tpbGxzZXRz + IjpbInJlY0pCQjdaeFRPTTZ3TDV3IiwicmVjZXdmMWpMY08xUWxWZlkiLCJy + ZWNFNkdHa0w0dzJUNnBuQyIsInJlY0ltcm9XbmQ2cDAyYVh1IiwicmVjcW15 + Q1dqUFNBcWdDb3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY25QSERkV1cx + SjA2ZXZPIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWM1RllYVTZqVG5YS1BI + ZyJdLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoia3lsZW1oLmVtYWlsQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjVUMjE6NDQ6NDkuMDAw + WiJ9LHsiaWQiOiJyZWNCTTlpYUx3YUFlZTRCUSIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoia2V2aW4ua2lrLmxlZSIsIkZ1bGwgTmFtZSI6IktldmluIEsu + IExlZSIsIlNraWxsc2V0cyI6WyJyZWNwZFY2dkFtdG1JNXBzTSIsInJlY1R1 + N3Q1TTBWaUlMbTVBIiwicmVjSkJCN1p4VE9NNndMNXciLCJyZWM5bG5IWmFE + dDJDdlZyWiIsInJlY0U2R0drTDR3MlQ2cG5DIl0sIldoYXQgdGltZSB6b25l + IGFyZSB5b3UgaW4/IjoiRVNUIiwiQmlvIjoiSm9obiBIYW1wdG9uIHdhcyBh + c3NpZ25lZCB0byBtZSBhcyBhIG1lbnRvci4gIFdoZW4gSSBzdGFydGVkIG15 + IGNyYXp5IGpvdXJuZXkgb2YgZ2V0dGluZyBpbnRvIGNvZGluZywgSSBmZWx0 + IHN1Y2ggY29tZm9ydCBrbm93aW5nIHRoYXQgdGhlcmUgd2FzIHNvbWVvbmUg + aW4gdGhlIHdvcmxkIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCBJIGFtIGRvaW5n + LiAgSSB3YW50IHRvIHByb3ZpZGUgdGhlIHNhbWUgZm9yIG90aGVycy4gICIs + IkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsicmVjdHpnVEdvUXl5MkZWTUMi + LCJyZWNyeThzMTRxR0poSGVPQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVj + S0xSVW9sQ3hzdldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0 + NkJZbnNJOHo5Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY3E0QjhhZ3V4R1dk + Y3dUIl0sIkVtYWlsIjoia2V2aW4ua2lrLmxlZUBnbWFpbC5jb20iLCJDb2Rl + IG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8i + OnRydWV9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDEtMTJUMTc6MzU6NDguMDAw + WiJ9LHsiaWQiOiJyZWNFb2U5WXFzNllNR20xTCIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoibWFnZ2kiLCJGdWxsIE5hbWUiOiJNYWdnaSBNb2xpbmEiLCJT + a2lsbHNldHMiOlsicmVjVVY5RExFb0sxSnFSVjkiLCJyZWN6bDVsaVFKT0pD + YXA3TCIsInJlY3lHbmRnVVlra3lQQ3JTIiwicmVjZjBVYlBXdzI4OUxLanci + LCJyZWNSeVBCd04xSkJqOUQ5bCIsInJlY1hlVjRGbTBsSG5VdDJlIl0sIkFj + dGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjeTlaT2dHQ2RKNE9q + eFgiLCJyZWNqczBtUWpMMDFveVFnaiIsInJlY2xFc2I1VG42M1l6MTd1Il0s + IkVtYWlsIjoibWFnZ2lAb3BlcmF0aW9uY29kZS5vcmcifSwiY3JlYXRlZFRp + bWUiOiIyMDE3LTA2LTA3VDE5OjM1OjUxLjAwMFoifSx7ImlkIjoicmVjRXJB + VlJac2p3anBVTEwiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkhpbHRzIiwi + Tm90ZXMiOiJHbyB0byBZb3VUdWJlIGFuZCBzZWFyY2ggZm9yIFwiYm9iJ3Mg + YXV0aG9yIHRhbGtzXCIgdG8gc2VlIG1lLiAgSSBob3N0ZWQgYWJvdXQgMTUg + dGFsa3MgYXQgR29vZ2xlLiIsIkZ1bGwgTmFtZSI6IkJvYiBQdXJ2eSIsIlNr + aWxsc2V0cyI6WyJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2R0drTDR3MlQ2 + cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNJbXJvV25kNnAwMmFYdSIs + InJlY2oyb21kdTdXbklYTEprIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hh + dCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJQYWNpZmljIiwiQmlvIjoiSSdt + IHJldGlyZWQgbm93LCBhZnRlciAxMiB5ZWFycyBhdCBHb29nbGU7ICBhbHNv + IGEgc3VjY2Vzc2Z1bCBzdGFydHVwIChQYWNrZXRlZXIpOyAgT3JhY2xlOyAg + M0NvbTsgIFhlcm94ICh0aGUgWGVyb3ggU3RhcikuICBNLlMuIGluIENvbXB1 + dGVyIFNjaWVuY2UgZnJvbSBVLiBvZiBJbGxpbm9pcy4iLCJBY3RpdmUiOnRy + dWUsIlNlcnZpY2VzIjpbInJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjcnk4czE0 + cUdKaEhlT0MiLCJyZWNOMGxKNDZCWW5zSTh6OSJdLCJNZW50b3IgUmVxdWVz + dCI6WyJyZWNoT1kwTHZuck81cDh1TSIsInJlYzZQbXZ4VTg1cDU5Z0lLIiwi + cmVjVVEyU2xnVlptdXA4ak0iXSwiRW1haWwiOiJicHVydnlAZ21haWwuY29t + IiwiQ29kZSBvZiBDb25kdWN0IEFjY2VwdGVkPyI6dHJ1ZSwiR3VpZGVib29r + IFJlYWQ/Ijp0cnVlfSwiY3JlYXRlZFRpbWUiOiIyMDE3LTExLTI2VDE1OjUw + OjU0LjAwMFoifSx7ImlkIjoicmVjRjRvQnpqRTNKNkEwd28iLCJmaWVsZHMi + OnsiU2xhY2sgTmFtZSI6InRvYWR6a3kiLCJGdWxsIE5hbWUiOiJEYXZpZCBI + YXJyaXMiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWNK + QkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlM + b0JDZ2g2VHEiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY09mR3k5dE1lVXdq + Tjc4IiwicmVjNUZZWFU2alRuWEtQSGciXSwiTWF4IE1lbnRlZXMiOjIsIldo + YXQgdGltZSB6b25lIGFyZSB5b3UgaW4/IjoiTW91bnRhaW4iLCJIb3cgbWFu + eSBob3VycyB3b3VsZCB5b3UgbGlrZSB0byBtZW50b3IgZm9yLCBwZXIgbW9u + dGg/IjoiNCIsIkJpbyI6IkknbSBhIHByb2Zlc3Npb25hbCBzb2Z0d2FyZSBl + bmdpbmVlciB3aXRoIGEgZGVncmVlIGluIENvbXB1dGVyIFNjaWVuY2UuIEkg + ZGlkIDExIHllYXJzIGluIHRoZSBBcm15IE5hdGlvbmFsIEd1YXJkLCBpbmNs + dWRpbmcgMiBkZXBsb3ltZW50cyB0byBJcmFxLiBJIHNwZWNpYWxpemUgaW4g + YmFja2VuZCBzeXN0ZW1zIGZvciBjbG91ZCBzZXJ2aWNlcywgbW9zdGx5IHdy + aXR0ZW4gaW4gSmF2YSwgYnV0IHdpdGggZXhwZXJpZW5jZSBpbiBDIyBhbmQg + Tm9kZSBhcyB3ZWxsLiBJJ3ZlIGFsc28gZG9uZSBzb21lIG1vYmlsZSB3b3Jr + LCBib3RoIGluIG5hdGl2ZSBBbmRyb2lkIGFuZCB1c2luZyB0aGUgWGFtYXJp + biBDIyBmcmFtZXdvcmsuIFxuXG5JIGNhbWUgdG8gT3BlcmF0aW9uIENvZGUg + dGhyb3VnaCBhIGZyaWVuZCBmcm9tIGEgcHJldmlvdXMgam9iLiBJJ20gaGFw + cHkgdG8gbWVudG9yIGFueW9uZSwgYnV0IEknZCBwcmVmZXIgc29tZW9uZSB3 + aG8gaXMgaW50ZXJlc3RlZCBpbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCBiZWNh + dXNlIHRoZXkgaGF2ZSBhIHBhc3Npb24gZm9yIHByb2JsZW0gc29sdmluZyBh + bmQgdGVjaG5vbG9neSwgbm90IGp1c3QgYmVjYXVzZSBpdCdzIGEgaGlnaCBw + YXlpbmcgam9iLiIsIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsi + cmVjUWRkQ3UyNmowTUdtTzUiLCJyZWM1amF3a0tQUUtpbE83dCIsInJlY2RH + UGljVTNBTTZqVW50IiwicmVjZU9TMzgxVGhLOEwyN3YiXSwiRW1haWwiOiJ0 + b2Fkemt5QGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDItMTRU + MTY6MjI6MDQuMDAwWiJ9LHsiaWQiOiJyZWNHcDJkeXREdDMyb2psNiIsImZp + ZWxkcyI6eyJTbGFjayBOYW1lIjoiZnJvc3RtYXR0aGV3IiwiRnVsbCBOYW1l + IjoiTWF0dGhldyBGcm9zdCIsIlNraWxsc2V0cyI6WyJyZWNFNkdHa0w0dzJU + NnBuQyIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjOWxuSFphRHQyQ3ZWcloi + LCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVj + NUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8i + OiJFYXN0ZXJuIiwiQmlvIjoiSSd2ZSBiZWVuIGEgc29mdHdhcmUgZW5naW5l + ZXIgZm9yIG92ZXIgZml2ZSB5ZWFycy4gVGhlIGZpcnN0IHR3byB5ZWFycyBJ + IHdhcyB0aGUgc29sZSBkZXZlbG9wZXIgYXQgYSBzbWFsbCBJbmZvU2VjIG5v + bnByb2ZpdCBhbmQgZm9yIHRoZSBsYXN0IHRocmVlIEkndmUgYmVlbiBhdCBW + TXdhcmUgd29ya2luZyBvbiB2Q2xvdWQgRGlyZWN0b3IuIFByaW9yIHRvIHRo + YXQgSSB3b3JrZWQgaW4gaG90ZWxzIGFzIGEgYmFucXVldCBtYW5hZ2VyIGJl + Zm9yZSBnb2luZyBiYWNrIHRvIHNjaG9vbCB0byBzd2l0Y2ggY2FyZWVycy5c + blxuSSBqdXN0IGRpc2NvdmVyZWQgT3BlcmF0aW9uIENvZGUgYSBjb3VwbGUg + ZGF5cyBhZ28gdGhhbmtzIHRvIGEgQmFja0NoYW5uZWwgcG9zdCBhbmQgSSdt + IGluY3JlZGlibHkgZXhjaXRlZCBieSBpdHMgbWlzc2lvbiBhcyBJIGhhdmUg + YSBzdHJvbmcgaW50ZXJlc3QgaW4gaGVscGluZyB0aG9zZSB3aG8gaGF2ZSBz + ZXJ2ZWQgKGUuZy4gYXQgVk13YXJlIEknbSBvbiBhbiBpbmZvcm1hbCBjb21t + aXR0ZWUgdG8gZW5jb3VyYWdlIChjb21wYW55LXdpZGUpIGhpcmluZyBvZiB2 + ZXRlcmFucykuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0emdU + R29ReXkyRlZNQyIsInJlY3J5OHMxNHFHSmhIZU9DIiwicmVjS0xSVW9sQ3hz + dldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0NkJZbnNJOHo5 + Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY1BYeHNqa3hDSzMwbDV3IiwicmVj + N0MzYUQxWjRXSmNHbkQiLCJyZWNCRVBHdGpTYUE0dnl0YSIsInJlY0tvWGZK + Wmh5Q0RVRkNWIiwicmVjMUNNdlRZZ2NNM2MwQTUiLCJyZWNmNmZ1emRnWTRm + d2dRbSIsInJlY2hDdjFheDA0cks4a3p5IiwicmVjN3Vmd1M0SWQzVk9rZTUi + LCJyZWM5VDFBUDJ0ZVdRTHRFZiJdLCJFbWFpbCI6Im1mQG1hdHRoZXdmcm9z + dC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA1LTA3VDE0OjIwOjExLjAw + MFoifSx7ImlkIjoicmVjSDhlMlpEdGZ0YkZxUkMiLCJmaWVsZHMiOnsiU2xh + Y2sgTmFtZSI6IkppbSBGdW5nIiwiRnVsbCBOYW1lIjoiSmltIEZ1bmciLCJT + a2lsbHNldHMiOlsicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNhb0V4MXEwUVJw + dmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYi + XSwiTWF4IE1lbnRlZXMiOjEsIkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJqaW10 + aGVlbmdpbmVlckBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTA0 + LTA0VDAwOjM2OjEwLjAwMFoifSx7ImlkIjoicmVjSVBLSW5TdnhyMzByY0Yi + LCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6ImFiYW50aGVzIiwiRnVsbCBOYW1l + IjoiQWxsZW4gQW50aGVzIiwiU2tpbGxzZXRzIjpbInJlYzZpcWhNeEhobFJa + cmh4Il0sIkJpbyI6IkZvciB0ZXN0aW5nIiwiTWVudG9yIFJlcXVlc3QiOlsi + cmVjV2c0bTdSQU4xeXVoSDQiXSwiRW1haWwiOiJhYmFudGhlc0BnbWFpbC5j + b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTE5VDE4OjA1OjEyLjAwMFoi + fSx7ImlkIjoicmVjSjhXaTJMT3FsWTFnYWYiLCJmaWVsZHMiOnsiU2xhY2sg + TmFtZSI6ImpkdWNvZXVyIiwiRnVsbCBOYW1lIjoiTWFyayBXYWtzIiwiU2tp + bGxzZXRzIjpbInJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjWkcxNHNTN1lZVmtW + M1IiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6ImpkdWNvZXVyQGdtYWlsLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTE6MDMuMDAwWiJ9 + LHsiaWQiOiJyZWNKa1lmYlJidXhPWFRMQSIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiaGFycnkiLCJOb3RlcyI6IkhlcmUgYXJlIHNvbWUgcmVsZXZhbnQg + bGlua3M6XG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9ocGphalxuaHR0cHM6Ly93 + d3cubGlua2VkaW4uY29tL2luL2hhcnJ5bWxldmluZS9cbmh0dHBzOi8vYmxv + Zy50ZWNoYXRwb3dlci5jb20vQGhhcnJ5bWxldmluZVxuaHR0cDovL2hwamFq + LmNvbS9cbmh0dHBzOi8vbWVkaXVtLmNvbS9AaGFycnltbGV2aW5lL2EtdGVh + Y2hlcnMtdHdvLWNlbnRzLXdoZW4tbGVhcm5pbmctcnVieS1vbi1yYWlscy1j + ZjUxODA4NTgxZDRcblxuVGhhbmtzISIsIkFzc2lnbm1lbnRzIjpbInJlYzJS + bmJVMk13Z2Z2dHVkIl0sIkZ1bGwgTmFtZSI6IkhhcnJ5IExldmluZSIsIlNr + aWxsc2V0cyI6WyJyZWM5bG5IWmFEdDJDdlZyWiIsInJlY3FteUNXalBTQXFn + Q29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYiXSwiV2hhdCB0aW1lIHpvbmUgYXJl + IHlvdSBpbj8iOiJNb3VudGFpbiIsIkJpbyI6IknigJltIGEgZnVsbCBzdGFj + ayB3ZWIgZGV2ZWxvcGVyIGZvciBQb3dlciBIUkcgKHd3dy5wb3dlcmhyZy5j + b20pLCBwcmltYXJpbHkgZm9jdXNzZWQgb24gUnVieSBvbiBSYWlscy4gIEJl + aW5nIGZ1bGwgc3RhY2ssIEkgYWxzbyB1c2UgSFRNTCwgQ1NTLCBhbmQgSmF2 + YVNjcmlwdCBzb21ld2hhdCByZWd1bGFybHkuXG5cbkkgbGl2ZSBpbiBEZW52 + ZXIsIENPLiAgSSBoYXZlIGJlZW4gYSBzb2Z0d2FyZSBkZXZlbG9wZXIsIHBy + b2Zlc3Npb25hbGx5LCBmb3IganVzdCB1bmRlciB0aHJlZSB5ZWFycy4gIEFz + IHBhcnQgb2YgbXkgdHJhbnNpdGlvbiBpbnRvIHNvZnR3YXJlIGRldmVsb3Bt + ZW50LCBJIGF0dGVuZGVkIGFuZCBncmFkdWF0ZWQgZnJvbSBCbG9jLmlvLlxu + XG5QcmlvciB0byBjb2RpbmcgSSB3YXMgaW4gdGVhY2hpbmcgYW5kIGVkdWNh + dGlvbiBmb3IgMTIgeWVhcnMuICBJIGRpZCBldmVyeXRoaW5nIGZyb20gVC5B + LidpbmcgY29sbGVnZSBLaW5lc2lvbG9neSwgdG8gdHV0b3JpbmcgY2hpbGRy + ZW4gaW4gSXRhbHksIHRvIHRlYWNoaW5nIGhpZ2ggc2Nob29sIHNjaWVuY2Us + IHRvIGNvcnBvcmF0ZSB0cmFpbmluZywgdG8gdGVjaG5pY2FsIHRyYWluaW5n + IGZvciBhIHNvZnR3YXJlIGNvbXBhbnksIHRvIHRlY2huaWNhbCB0cmFpbmlu + ZyBkb25lIHZpcnR1YWxseSAodmlhIEdvVG9NZWV0aW5nLCBldGMuKSwgdG8g + YmVpbmcgdGhlIGRpcmVjdG9yIG9mIHRyYWluaW5nIGZvciBhIHNvZnR3YXJl + IGNvbXBhbnksIHRvIGluc3RydWN0aW9uYWwgZGVzaWduLCB0byBjdXJyaWN1 + bHVtIGRldmVsb3BtZW50LCBhbmQgbW9yZS5cblxuSSBqb2luZWQgT3BlcmF0 + aW9uIENvZGUgdG8gc2VlIGlmIEkgY2FuIGxlbmQgYSBoYW5kIHRvIGFueW9u + ZSBvdXQgdGhlcmUgbGVhcm5pbmcgdG8gY29kZS4gIEnigJl2ZSBiZWVuIHRo + ZXJlLCBJIGFwcHJlY2lhdGUgb3VyIHZldGVyYW5zLCBhbmQgd291bGQgbGlr + ZSB0byBoZWxwIGlmIEkgY2FuISIsIkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMi + OlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThzMTRxR0poSGVPQyIsInJl + Y3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9sQ3hzdldCdUYiXSwiTWVudG9y + IFJlcXVlc3QiOlsicmVjSmYzb0hYQk56QWRKSzgiLCJyZWNBd1FUdkZlSVRU + ZlhlOCIsInJlY3ZKdTIyelo0eHk1RkdzIl0sIkVtYWlsIjoiaG1sZXZpbmVA + Z21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxNy0wNS0xNFQwMTo0Njo1 + NS4wMDBaIn0seyJpZCI6InJlY1AwTk5EZkRxMDJ2bDZZIiwiZmllbGRzIjp7 + IlNsYWNrIE5hbWUiOiJib25pY2lsbG8ubSIsIkZ1bGwgTmFtZSI6Ik1hcmsg + Qm9uaWNpbGxvIiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNPMVFsVmZZIiwi + cmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNsOFZ3bzJ4dUZpRXJKeSIsInJlY0lt + cm9XbmQ2cDAyYVh1IiwicmVjZnc3OFZkbkQ3dHBaVnoiLCJyZWNVVjlETEVv + SzFKcVJWOSIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjcW15Q1dqUFNBcWdD + b3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZaQWJOZlBTcExyIl0s + IkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjRjVoN0h2eEl2 + UHVMSlYiLCJyZWNJRXFpMHhHRzEyaDNxMiJdLCJFbWFpbCI6Im1hcmthYm9u + aWNpbGxvQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRU + MTk6MTQ6MDcuMDAwWiJ9LHsiaWQiOiJyZWNQcTF5N05nWmZyQmU2bSIsImZp + ZWxkcyI6eyJTbGFjayBOYW1lIjoiQW5kcmV3IiwiRnVsbCBOYW1lIjoiQW5k + cmV3IFBob21tYXRoZXAiLCJTa2lsbHNldHMiOlsicmVjRTZHR2tMNHcyVDZw + bkMiLCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlY0NWYzd1M2tDT05oSmZGIiwi + cmVjUTZleDlHRjVpalFUb2QiXSwiTWF4IE1lbnRlZXMiOjEsIkFjdGl2ZSI6 + dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjWldnQkhxTmFXaXBFbHciLCJy + ZWNSeERPVnF5QmZTbHg5TCJdLCJFbWFpbCI6IjEzZGVzdGluaWVzQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMDdUMDM6MzM6MTguMDAw + WiJ9LHsiaWQiOiJyZWNRclp2ZlNSNGpuM1JOTyIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiYnJpYW5rYWhycyIsIkZ1bGwgTmFtZSI6IkJyaWFuIEthaHJz + IiwiU2tpbGxzZXRzIjpbInJlY1VWOURMRW9LMUpxUlY5IiwicmVjNUZZWFU2 + alRuWEtQSGciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3ZER2hHZlBVSzVV + d0cwIl0sIk1heCBNZW50ZWVzIjoxLCJFbWFpbCI6ImJyaWFuLmthaHJzQGdt + YWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMjNUMTg6NTI6NDQu + MDAwWiJ9LHsiaWQiOiJyZWNSbEtjekdBY05LTjI2RyIsImZpZWxkcyI6eyJT + bGFjayBOYW1lIjoiYm9iLXJvYiIsIkZ1bGwgTmFtZSI6IkJvYiBSb2JlcnRz + IiwiU2tpbGxzZXRzIjpbInJlYzlsbkhaYUR0MkN2VnJaIl0sIldoYXQgdGlt + ZSB6b25lIGFyZSB5b3UgaW4/IjoiQ2VudHJhbCIsIkJpbyI6IkkgaGF2ZSBi + ZWVuIHVzaW5nIFJvUiBmb3IgOCB5ZWFycyBub3cgYW5kIHN0aWxsIGxvdmUg + aXQuICBJIGhhdmUgZG9uZSBzb21lIG1lbnRvcmluZyBhbmQgSSBlbmpveSBo + ZWxwaW5nIG90aGVycyBsZWFybiBhcyBvdGhlciBoYWQgaGVscGVkIG1lIGlu + IG15IHBhc3QuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThz + MTRxR0poSGVPQyIsInJlY0tMUlVvbEN4c3ZXQnVGIl0sIk1lbnRvciBSZXF1 + ZXN0IjpbInJlY0sxRWtaU1pDTEZBMDA3IiwicmVjak1HQjkzY0NUQlJBWlki + LCJyZWMwV1hud0Z1MGdSblpyNiIsInJlY0Q3OFlVQkVCNUM3bERGIiwicmVj + TXRoODJBc1Uzbm5nU3MiXSwiRW1haWwiOiJjYXJkc2ZhbmJvYkBnbWFpbC5j + b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA1LTEzVDA0OjMwOjM4LjAwMFoi + fSx7ImlkIjoicmVjUmxXRXpsU1M3eFBjTUQiLCJmaWVsZHMiOnsiU2xhY2sg + TmFtZSI6Im5yeW91bmciLCJOb3RlcyI6IkkgZGlkIG5vdCBoYXZlIGVub3Vn + aCBtZW50b3JzIHRoYXQgcmVhbGx5IGhlbHBlZCBteSBwdXNoIG15IGNhcmVl + ciBmb3J3YXJkIGFuZCBJIGFtIGxvb2tpbmcgdG8gXCJwYXkgaXQgZm9yd2Fy + ZFwiLiBJIGhhdmUgd2FudGVkIHRvIHZvbHVudGVlciBteSB0aW1lIGhlbHBp + bmcgdmV0ZXJhbnMgbGlrZSBteXNlbGYgZm9yIHNvbWUgdGltZSBhbmQgSSBm + aW5hbGx5IGZvdW5kIE9wZXJhdGlvbiBDb2RlLCB3aGljaCBzZWVtcyBsaWtl + IGEgZ29vZCBmaXQuIiwiRnVsbCBOYW1lIjoiTmljIFlvdW5nIiwiU2tpbGxz + ZXRzIjpbInJlY1NqcmxzSHRXaDlYV09QIiwicmVjSkJCN1p4VE9NNndMNXci + LCJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVj + Znc3OFZkbkQ3dHBaVnoiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNX + alBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY2s0bGtPVGtmc01SUGtSIiwicmVjNUZZWFU2alRuWEtQSGci + XSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJNRFQvTVNUIiwiQmlv + IjoiSSBqb2luZWQgdGhlIEFybXkgaW4gMjAwNSBhbmQgc2VydmVkIGZvciAz + LjUgeWVhcnMgYXMgaW5mYW50cnkuIEFmdGVyIGdldHRpbmcgb3V0IG9mIHRo + ZSBtaWxpdGFyeSBJIHdlbnQgZGlyZWN0bHkgdG8gc2Nob29sIGFuZCByZWNl + aXZlZCBteSBCYWNoZWxvcnMgb2YgU2NpZW5jZSBpbiBDb21wdXRlciBTY2ll + bmNlIGZyb20gdGhlIFVuaXZlcnNpdHkgb2YgQ29sb3JhZG8gYXQgRGVudmVy + IGluIDIwMTQuIER1cmluZyBteSBzZW5pb3IgeWVhciBhdCBVbml2ZXJzaXR5 + IEkgZ290IGEgZnVsbCB0aW1lIHBvc2l0aW9uIGFzIGEgU29mdHdhcmUgRW5n + aW5lZXIgbW9zdGx5IHVzaW5nIFB5dGhvbi4gSSBhbSBub3cgZW1wbG95ZWQg + ZnVsbCB0aW1lIGFzIGEgRnVsbCBTdGFjayBFbmdpbmVlciBhdCBhIHNvZnR3 + YXJlIGNvbnN1bHRhbmN5IGJhc2VkIG91dCBvZiBOWUMgY2FsbGVkIFBvc3Rs + aWdodC4gSSBhbSBtb3N0bHkgd3JpdGluZyBFUzYgYW5kIFJlYWN0LCBidXQg + SSBhbSBjb21mb3J0YWJsZSB1cCBhbmQgZG93biB0aGUgc3RhY2sgb2YgYW4g + YXBwbGljYXRpb24uIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0 + emdUR29ReXkyRlZNQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9s + Q3hzdldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0NkJZbnNJ + OHo5Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY2lFUzVEcDVzUjVVaVREIiwi + cmVjOGc5RFdSaGZjRmhMZ2wiXSwiRW1haWwiOiJucnlvdW5nQGdtYWlsLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDYtMDJUMTg6MjU6MDUuMDAwWiJ9 + LHsiaWQiOiJyZWNUUW80Q2JLZ2RtVDlYdiIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiZGF2aWRfdGh1cmVzb24iLCJGdWxsIE5hbWUiOiJEYXZpZCBUaHVy + ZXNvbiIsIlNraWxsc2V0cyI6WyJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2 + R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNhb0V4MXEw + UVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhK + ZkYiLCJyZWNqMm9tZHU3V25JWExKayIsInJlYzVGWVhVNmpUblhLUEhnIl0s + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJEYXZpZC5HLlRodXJlc29uQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTI6NDguMDAw + WiJ9LHsiaWQiOiJyZWNWMHFKRDI4a2kyUThrciIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiSGVsaW8gQ29sYSIsIkZ1bGwgTmFtZSI6IkhlbGlvIENvbGEi + LCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNFNkdHa0w0 + dzJUNnBuQyIsInJlYzlsbkhaYUR0MkN2VnJaIiwicmVjcW15Q1dqUFNBcWdD + b3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZaQWJOZlBTcExyIl0s + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJoZWxpby5jb2xhQGdtYWlsLmNvbSJ9 + LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6MjUuMDAwWiJ9LHsi + aWQiOiJyZWNXUHl4clkyUUtBa1BWTCIsImZpZWxkcyI6eyJTbGFjayBOYW1l + IjoibWlrZXJvZF9zZCIsIkZ1bGwgTmFtZSI6Ik1pY2hhZWwgUm9kcmlndWV6 + IiwiU2tpbGxzZXRzIjpbInJlY3lHNnNjRVR0eFp1VE54Il0sIkFjdGl2ZSI6 + dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjVjJvcGpBclNYVWtNODUiLCJy + ZWN3NXlKZFdJcDZ0OUx3ZyJdLCJFbWFpbCI6InJvZHJpZ3Vlem1sQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTBUMjI6NDY6MDAuMDAw + WiJ9LHsiaWQiOiJyZWNaSUV4Vno3eWhLdGZhOCIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiamhhbXB0b24iLCJOb3RlcyI6Im9wZW4gdG8gaGVscGluZyBh + bnlvbmUgdy8gSFRNTC9DU1MgdG9vXG4iLCJBc3NpZ25tZW50cyI6WyJyZWNY + SGRYVjExMEZTTUJxdCJdLCJGdWxsIE5hbWUiOiJKb2huIEhhbXB0b24iLCJT + a2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNrNGxrT1RrZnNN + UlBrUiIsInJlYzVGWVhVNmpUblhLUEhnIl0sIk1heCBNZW50ZWVzIjoxLCJX + aGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkVTVCIsIkhvdyBtYW55IGhv + dXJzIHdvdWxkIHlvdSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8i + OiI0IiwiQmlvIjoiSSdtIGFuIEFybXkgdmV0ZXJhbiBvZiA3IHllYXJzIChh + Y3RpdmUtZHV0eSBlbmxpc3RlZCwgNjhLIE1lZGljYWwgTGFib3JhdG9yeSkg + d2hvIHN3aXRjaGVkIGNhcmVlcnMgYWZ0ZXIgc2VwYXJhdGluZyBhbmQgaGF2 + ZSBiZWVuIHdvcmtpbmcgYXMgYSBmdWxsLXRpbWUgZGV2ZWxvcGVyIHNpbmNl + IG1pZC0yMDE1LiAgSSBmb3VuZCBPcGVyYXRpb24gQ29kZSBzaG9ydGx5IGJl + Zm9yZSB0aGVuLCBhbmQgdGhleSd2ZSBiZWVuIGEgY29uc2lzdGVudCBzb3Vy + Y2Ugb2Ygc3VwcG9ydCB0aHJvdWdob3V0LiAgSSdtIGxvb2tpbmcgdG8gZ2l2 + ZSBiYWNrIGFuZCBoZWxwIG90aGVyIHZldGVyYW5zIHdobyBhcmUgdHJ5aW5n + IHRvIGJyZWFrIGludG8gdGhpcyBpbmR1c3RyeS4gIFdoaWxlIEkgYXR0ZW5k + ZWQgYSAxMi13ZWVrIGZyb250LWVuZCBib290Y2FtcCwgSSBhbHNvIGNvbnNp + ZGVyIG15c2VsZiBhIHNlbGYtdGF1Z2h0IGRldmVsb3Blci4gIEkgd29yayBt + b3N0bHkgdy8gSmF2YXNjcmlwdCAvIFR5cGVzY3JpcHQgLyBBbmd1bGFyIGZy + b250LWVuZCBzdGFjaywgYnV0IGFsc28gaGF2ZSBleHBlcmllbmNlIHcvIFJl + YWN0LCBFbWJlciwgYW5kIHZhcmlvdXMgb3RoZXIgZnJvbnQtZW5kLWlzaCBz + dHVmZi4gV291bGQgcHJlZmVyIHRvIG1lbnRvciBhbnlvbmUgd2hvIGhhcyBh + IHN0cm9uZyBkZXNpcmUgdG8gZm9jdXMgb24gSmF2YXNjcmlwdCAoZnJvbnQt + ZW5kIG9yIGJhY2stZW5kKS4iLCJBY3RpdmUiOnRydWUsIlNxdWFkcyI6WyJy + ZWNzSzd2alc1OW0wRW11VCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWN2RXNI + MFdLd2ZPSXZhdCIsInJlYzNTcDlQNWdUZ01GZHViIiwicmVjRnpVaEJPMEtZ + NDk2aHkiLCJyZWNYNks3RTR5ZE8wWWpQeSIsInJlY3BJbzZJbm9DcUNLem5q + IiwicmVjREZqRjVLVEJ5a25MMmoiLCJyZWN0TElKRnFqVlM2V2hwTSIsInJl + Y1A5M1ZVZVlleWhyTlZ6IiwicmVjVHpiUUltbFlzQmkxTTYiLCJyZWNJMGVU + SHhkb0FPc0tqUSJdLCJFbWFpbCI6ImpvaG5fal9oYW1wdG9uQHlhaG9vLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYtMTItMDJUMDM6MDU6MTkuMDAwWiJ9 + LHsiaWQiOiJyZWNiNllFS1phQktBeXQ4eSIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoiS2VuIE11Z3JhZ2UiLCJGdWxsIE5hbWUiOiJLZW4gTXVncmFnZSIs + IlNraWxsc2V0cyI6WyJyZWM1RllYVTZqVG5YS1BIZyIsInJlY2FvRXgxcTBR + UnB2Y2FSIiwicmVjU2pybHNIdFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjMs + IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJrbXVncmFnZUBnbWFpbC5jb20ifSwi + Y3JlYXRlZFRpbWUiOiIyMDE4LTA0LTExVDAwOjI5OjMzLjAwMFoifSx7Imlk + IjoicmVjY0tyRWMwdzg4ZlNzN1ciLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6 + Im1vbGphYyIsIkZ1bGwgTmFtZSI6Ik1pbGplbmtvIEN2amV0a28iLCJTa2ls + bHNldHMiOlsicmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNKQUN4a1p1SFRaU1Uy + aiIsInJlY1NqcmxzSHRXaDlYV09QIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJy + ZWNTeTRIbUlHdElMcVpSdiIsInJlY09mR3k5dE1lVXdqTjc4IiwicmVjWTBH + MjhESW5hZkJ4Z1QiLCJyZWNVVjlETEVvSzFKcVJWOSIsInJlY0NWYzd1M2tD + T05oSmZGIiwicmVjTTlrYjNTYXpGNDY2eG8iLCJyZWNDS3JQbkhEcU9kbGhB + ZyJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkNFVCAiLCJCaW8i + OiIrIE1pY3Jvc29mdCBGVEUgKFhhbWFyaW4gVGVhbSAtIENvbXBvbmVudHMg + VGVhbSkgc2luY2UgMjAxNi4wNy4wMVxuKyBYYW1hcmluIEludGVybmF0aW9u + YWwgQ29udHJhY3RvciBzaW5jZSAyMDE0LjAxXG4rIG93bmVyIG9mIHNtYWxs + IGJ1c2luZXNzIChIb2xpc3RpY1dhcmUpIC0gdXNlZCB0byB3b3JrIGZvciBY + YW1hcmluIGFzIGludGVybmF0aW9uYWwgY29udHJhY3RvclxuKyBmdWxsIHN0 + YWNrIGRldmVsb3BlciAoLk5FVCwgQyMsIFhhbWFyaW4uKiwgQVNQLm5ldCBD + b3JlKVxuKyB2ZXRlcmFuIChDcm9hdGlhbiBQb2xpY2UgYW5kIEFybXkgMTk5 + MS0xOTkzKSBtaWxpdGFyeSBzZXJ2aWNlIDMrIHllYXJzXG4rIHRyeWluZyB0 + byBoZWxwIGxvY2FsIHZldGVyYW4gY29tbXVuaXR5IGluIENyb2F0aWEgc28g + SSBzZWFyY2hlZCBhcm91bmQgYW5kIGpvaW5lZCBPcGVyYXRpb25Db2RlIGNv + cyBJIG1pZ2h0IGJlIGhlbHBmdWxsXG4rIHByZWZlcmVuY2VzIC0gLk5FVCBz + dGFjayAoSSByZWFkIGphdmEgYW5kIG9iamMtYywgYnV0IG5vdCB3cml0ZSks + IEMvQysrIGlzIGEgYml0IHJ1c3R5IChsYXRlIDE5OTBzKSIsIkFjdGl2ZSI6 + dHJ1ZSwiU2VydmljZXMiOlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThz + MTRxR0poSGVPQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9sQ3hz + dldCdUYiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjSDF1T2J2aG1RdzZCQmci + LCJyZWNUeDRmV2R5V0E1WGlBVCIsInJlY3VsNHdIMGZVWHBja3U1IiwicmVj + QUJhTWV0UUdCMldzcjQiLCJyZWNldnRBM0xhWVpNcVNJMiJdLCJFbWFpbCI6 + Im1jdmpldGtvQGhvbGlzdGljd2FyZS5jb20iLCJDb2RlIG9mIENvbmR1Y3Qg + QWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVh + dGVkVGltZSI6IjIwMTctMTItMjBUMjA6MTI6NDEuMDAwWiJ9LHsiaWQiOiJy + ZWNlQmVUeXVXbExmQXBIQiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2F0 + b3JxdWUiLCJOb3RlcyI6IklmIHlvdSB3YW50IHRvIGxlYXJuIEMsIEMrKywg + Q01ha2UsIExpbnV4LCBHaXQsIGVtYmVkZGVkIGRldmljZXMsIGNvbXBpbGVy + cywgb3IgT09QIGNvbmNlcHRzIEkgY2FuIGhlbHAgeW91IG91dC4gSWYgeW91 + IGFyZSB0YWtpbmcgQ1M1MCBmcm9tIGVkWCAtIEkgY2FuIGhlbHAgeW91IHdp + dGggeW91ciBhc3NpZ25tZW50cyAod2l0aG91dCBnaXZpbmcgdGhlIGFuc3dl + cnMpLiIsIkFzc2lnbm1lbnRzIjpbInJlY0lNRW80dTlJeGNld3o4Il0sIkZ1 + bGwgTmFtZSI6IlJ5YW4gTGluZGVtYW4iLCJTa2lsbHNldHMiOlsicmVjRko5 + RlhFNnp4cmQ5aTQiLCJyZWNvc1J2aUxvQkNnaDZUcSIsInJlY2w4VndvMnh1 + RmlFckp5Il0sIk1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUg + eW91IGluPyI6Ik1TVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlvdSBsaWtl + IHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiIyMCIsIkJpbyI6IkknbSBh + IGxhcmdlbHkgc2VsZiB0YXVnaHQgcHJvZ3JhbW1lciB3aXRoIGEgQlMgaW4g + Q29tcHV0ZXIgU2NpZW5jZSBhbmQgTVMgaW4gQ29tcHV0ZXIgRW5naW5lZXJp + bmcuIEkgY3VycmVudGx5IHdvcmsgZm9yIENBIEVuZ2luZWVyaW5nIHByb3Zp + ZGluZyB3aXJlbGVzcyAoODAyLjExLCBaaWdiZWUsIEJsdWV0b290aCwgZXRj + KSBjb25zdWx0aW5nIHNlcnZpY2VzIG1haW5seSBmb3IgUXVhbENvbW0gQXRo + ZXJvcyBjdXN0b21lcnMuXG5JIGxvdmUgaGVscGluZyBwZW9wbGUgbGVhcm4g + dG8gcHJvZ3JhbSBhbmQgaW1wb3J0YW50IGNvbmNlcHRzIGxpa2UgZGF0YSBz + dHJ1Y3R1cmVzLCB0aHJlYWRpbmcsIGFyY2hpdGVjdHVyZSwgYW5kIGFsZ29y + aXRobXMuIEluIG15IHNwYXJlIHRpbWUgSSBsaWtlIHRvIHJlYWQsIHN0dWR5 + IG5ldyBwcm9ncmFtbWluZyBjb25jZXB0cywgYW5kIHdyaXRlIGNvbXB1dGVy + IGdhbWVzIChBbmRyb2lkIGFuZCBkZXNrdG9wKS4iLCJBY3RpdmUiOnRydWUs + Ik1lbnRvciBSZXF1ZXN0IjpbInJlY2I1RG5VanlESVM0U1JWIl0sIkVtYWls + IjoicnlhbmxpbmRlbWFuQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIw + MTYtMTItMjFUMDI6NTM6NTYuMDAwWiJ9LHsiaWQiOiJyZWNlR0tGUkF4WmEw + WkhOZiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZW1tYWRzdXJnZW9uIiwi + RnVsbCBOYW1lIjoiRW1tYW51ZWwgSWRlaGFuIiwiU2tpbGxzZXRzIjpbInJl + Y29zUnZpTG9CQ2doNlRxIiwicmVjbDhWd28yeHVGaUVySnkiLCJyZWNJbXJv + V25kNnAwMmFYdSIsInJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjVVY5RExFb0sx + SnFSVjkiLCJyZWNXQkxmWkFiTmZQU3BMciIsInJlY1kwRzI4REluYWZCeGdU + IiwicmVjajJvbWR1N1duSVhMSmsiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6 + ImVtbWFudWVsLmlkZWhlbkBtdnN1LmVkdSJ9LCJjcmVhdGVkVGltZSI6IjIw + MTgtMDMtMjRUMTk6MTQ6MDcuMDAwWiJ9LHsiaWQiOiJyZWNmdE5pRDkxSGhq + OTUwNiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2VvcmdlbWF1ZXIiLCJB + c3NpZ25tZW50cyI6WyJyZWNnUDM3VDFRVjRJdkZseSIsInJlY2NxbTFObUdS + MW10TXBhIl0sIkZ1bGwgTmFtZSI6Ikdlb3JnZSBNYXVlciIsIlNraWxsc2V0 + cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2cG5DIiwi + cmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNmS3g4Y3JncmpNTXZTayIsInJlY25Q + SERkV1cxSjA2ZXZPIiwicmVjcW15Q1dqUFNBcWdDb3AiLCJyZWNrNGxrT1Rr + ZnNNUlBrUiIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjU3ppY0VzWVhHNFAx + QTQiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY2Z3NzhWZG5EN3RwWlZ6Il0s + Ik1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6 + IkNlbnRyYWwiLCJIb3cgbWFueSBob3VycyB3b3VsZCB5b3UgbGlrZSB0byBt + ZW50b3IgZm9yLCBwZXIgbW9udGg/IjoiMTAiLCJCaW8iOiJJJ20gRGlyZWN0 + b3Igb2YgRGV2ZWxvcG1lbnQgYXQgU3VyZ2UgQ29uc3VsdGluZy4gSSB3cml0 + ZSBjb2RlIGZ1bGwgdGltZSBhbmQgc3BlYWssIG1lbnRvciwgYW5kIHdyaXRl + IG9uIGFsbCBzb3J0cyBvZiB0b3BpY3MgaW4gdGhlIGRldmVsb3BtZW50IHNw + YWNlIGxhcmdlbHkgZm9jdXNpbmcgb24gSmF2YXNjcmlwdCwgU29mdHdhcmUg + QXJjaGl0ZWN0dXJlLCBUZXN0aW5nLCBGdW5jdGlvbmFsIFByb2dyYW1taW5n + LCBhbmQgVGVhY2hpbmcuIEknbSBhIG1lbnRvciBhbmQgZ3Vlc3QgbGVjdHVy + ZXIgd2l0aCBPcGVyYXRpb24gU3BhcmsgYW5kIG9jY2FzaW9uYWxseSB0aGUg + VGVjaCBUYWxlbnQgU291dGggY29kZSBjYW1wcy4gSSBsb3ZlIHRhbGtpbmcg + YWJvdXQgdGhpcyBzdHVmZi4gSSdtIG5vdCBhIHZldCBidXQgaGFwcHkgdG8g + aGVscCBvdXQuIiwiQWN0aXZlIjp0cnVlLCJNZW50b3IgUmVxdWVzdCI6WyJy + ZWNMM2hNM0VMSUhRanRwRCIsInJlY1BNNzVmSU9QZlhSNTFtIiwicmVjOE9Z + dTZGOG45TzJwYnYiLCJyZWNxVnU0NVhmZk9JNDhRNSIsInJlY3Y1WmdsNFdx + RjlSWHFyIiwicmVjZ3ZtVU9yZmJQNzN3STUiLCJyZWNhSzFSbW1Ud1BidFFj + aCIsInJlY3dlVXlDcjQybDVzc3JOIiwicmVjQlZiMFplZ1VjR21MbW4iLCJy + ZWNkNGhXNzNYcG9TZ1dWcSJdLCJFbWFpbCI6ImdtYXVlckBnbWFpbC5jb20i + fSwiY3JlYXRlZFRpbWUiOiIyMDE3LTAyLTEyVDE4OjU2OjMyLjAwMFoifSx7 + ImlkIjoicmVjaVpJMU9tQlpDZHVqQzUiLCJmaWVsZHMiOnsiU2xhY2sgTmFt + ZSI6ImNhZXNhcmFydW0iLCJGdWxsIE5hbWUiOiJQZXRlciBQb29sZSIsIlNr + aWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2 + cG5DIiwicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNhb0V4MXEwUVJwdmNhUiIs + InJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiQWN0 + aXZlIjp0cnVlLCJFbWFpbCI6InBldGVyLmoucG9vbGVAZ21haWwuY29tIn0s + ImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNFQxOToxNDowMy4wMDBaIn0seyJp + ZCI6InJlY2paRDhmcXVnWDhjMnkzIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUi + OiJidXNoaWRvY29kZXMiLCJGdWxsIE5hbWUiOiJTZWFuIE1jQnJpZGUiLCJT + a2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhEZFdXMUow + NmV2TyIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVjNUZZWFU2alRuWEtQSGci + LCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVj + azRsa09Ua2ZzTVJQa1IiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZa + QWJOZlBTcExyIl0sIk1heCBNZW50ZWVzIjoyLCJBY3RpdmUiOnRydWUsIkVt + YWlsIjoic3BtY2JyaWRlMTIwMUBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE4LTA0LTExVDIwOjQyOjQzLjAwMFoifSx7ImlkIjoicmVjbGdBNGRn + Z20zMGIyV1EiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkouVC4iLCJGdWxs + IE5hbWUiOiJKb2huIEtub3giLCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9N + NndMNXciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29w + IiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJB + Y3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY2syMEtURkFBQm82 + QmUxIl0sIkVtYWlsIjoianRrbm94OTFAZ21haWwuY29tIn0sImNyZWF0ZWRU + aW1lIjoiMjAxOC0wMy0xOVQxMjowNzo0Ny4wMDBaIn0seyJpZCI6InJlY29B + QjlOY0R3bEJnSGtqIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJtYWNrc29s + ZCIsIkZ1bGwgTmFtZSI6Ik1hcmsgU29sZGF2aW5pIiwiU2tpbGxzZXRzIjpb + InJlY1NqcmxzSHRXaDlYV09QIiwicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF + NkdHa0w0dzJUNnBuQyIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjTk9OSjhT + MXAxVGpmS1YiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY0NWYzd1M2tDT05o + SmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUgYXJl + IHlvdSBpbj8iOiJFU1QiLCJCaW8iOiJTVU1NQVJJWkVEIFBST0ZFU1NJT05B + TCBFWFBFUklFTkNFXG5JVCBQcm9mZXNzaW9uYWwgd2l0aCBvdmVyIHR3ZW50 + eSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHNvZnR3YXJlIGRldmVsb3BtZW50 + LiBKYXZhIGFuZCBQeXRob24gZGV2ZWxvcGVyIHdpdGggYWRkaXRpb25hbCBz + a2lsbHMgaW4gdGhlIGFyZWFzIG9mIHdlYiBhcHBsaWNhdGlvbiBzZWN1cml0 + eSwgc29mdHdhcmUgZGVzaWduLCBhbmQgdGVhbSBsZWFkZXJzaGlwLiBFeHBl + cmllbmNlZCBpbiBhZ2lsZSBkZXZlbG9wbWVudCBhbmQgYnVpbGRpbmcgcXVh + bGl0eSBzb2Z0d2FyZSB0aHJvdWdoIGEgcHJvY2VzcyB0aGF0IGluY2x1ZGVz + IHVuaXQgdGVzdGluZyBhbmQgY29udGludW91cyBpbnRlZ3JhdGlvbi4gRm91 + ci15ZWFyIHRvdXIgaW4gdGhlIFVTIEFybXkgSW5mYW50cnkgZGV2ZWxvcGVk + IGxlYWRlcnNoaXAgYW5kIHRyYWluaW5nIHNraWxscy5cblxuSSBhbSBoZXJl + IGJlY2F1c2UgSSB3YXMgYSBncnVudCB0aGF0IGxlYXJuZWQgdG8gY29kZSAy + MCB5ZWFycyBhZ28uIEkga25vdyB0aGUgdHJhbnNpdGlvbiBjYW4gYmUgZG9u + ZSBhbmQgd291bGQgbGlrZSB0byB0cnkgYW5kIGhlbHAgb3RoZXJzLiBJIGFt + IGluIHRoZSBEQyBhcmVhLiIsIkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsi + cmVjcnk4czE0cUdKaEhlT0MiLCJyZWNLTFJVb2xDeHN2V0J1RiIsInJlYzNa + UU1DUXNLUEtsRTJDIiwicmVjTjBsSjQ2Qlluc0k4ejkiXSwiRW1haWwiOiJt + YWNrc29sZEB5YWhvby5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA3LTAz + VDE0OjE4OjU4LjAwMFoifSx7ImlkIjoicmVjb29aT0NQWjVtUjZBUnAiLCJm + aWVsZHMiOnsiU2xhY2sgTmFtZSI6Im1pa2VvZXJ0bGkiLCJGdWxsIE5hbWUi + OiJNaWtlIE9lcnRsaSIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZU + cSIsInJlYzVGWVhVNmpUblhLUEhnIl0sIldoYXQgdGltZSB6b25lIGFyZSB5 + b3UgaW4/IjoiTVNUIiwiQmlvIjoiSSdtIGEgamF2YSBkZXZlbG9wZXIgd2l0 + aCBhIHN0cm9uZyBpbnRlcmVzdCBpbiBzbWFsbCBidXNpbmVzcyBvcGVyYXRp + b25zLiBJIHdvcmsgZm9yIGEgc21hbGwgRG9EIGNvbnRyYWN0IHNob3AgaW4g + RGVudmVyLCBoYXBweSB0byBoZWxwIGhvd2V2ZXIgSSBjYW4hIiwiQWN0aXZl + Ijp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThzMTRxR0poSGVPQyIsInJlY04w + bEo0NkJZbnNJOHo5IiwicmVjM1pRTUNRc0tQS2xFMkMiLCJyZWNLTFJVb2xD + eHN2V0J1RiIsInJlY3R6Z1RHb1F5eTJGVk1DIl0sIkVtYWlsIjoibWlrZW9l + cnRsaUBnbWFpbC5jb20iLCJDb2RlIG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0 + cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVhdGVkVGltZSI6IjIw + MTctMDgtMTdUMjA6MDU6MDMuMDAwWiJ9LHsiaWQiOiJyZWNxRThabDhGaDRi + bzRQRyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZnJhbmt5dSIsIkZ1bGwg + TmFtZSI6IkZyYW5rIFl1IiwiU2tpbGxzZXRzIjpbInJlY0ltcm9XbmQ2cDAy + YVh1IiwicmVjVVY5RExFb0sxSnFSVjkiXSwiQWN0aXZlIjp0cnVlLCJFbWFp + bCI6ImZyYW5reXVAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0w + My0yNFQxOToxMzo1OS4wMDBaIn0seyJpZCI6InJlY3FyQWVGeWxqbFd0c1hD + IiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJBc2hsZXkiLCJGdWxsIE5hbWUi + OiJBc2hsZXkgVGVtcGxldCIsIlNraWxsc2V0cyI6WyJyZWN5RzZzY0VUdHha + dVROeCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNNM3g4TzVOeW0yaEFFTSIs + InJlYzVOdWZHSXc2UExKWGNEIiwicmVjbFd1QU9JelRuMVBydnkiLCJyZWNW + RkxIOG9WeFFQNGVFUiJdLCJFbWFpbCI6ImFzaGxleS50ZW1wbGV0QGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTNUMTk6NTI6MDkuMDAw + WiJ9LHsiaWQiOiJyZWNzYmx6eVNMRkhPU2wxZiIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoib2hhaXdhbHQiLCJGdWxsIE5hbWUiOiJNYXR0aGV3IFdhbHRl + ciIsIlNraWxsc2V0cyI6WyJyZWNTanJsc0h0V2g5WFdPUCIsInJlY2V3ZjFq + TGNPMVFsVmZZIiwicmVjNUZZWFU2alRuWEtQSGciLCJyZWNmS3g4Y3JncmpN + TXZTayJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IlVUQy00Iiwi + QmlvIjoiRm9ybWVyIE5hdnkgSVQxIHR1cm5lZCBMaW51eCBzeXNhZG1pbiwg + bm93IFNpdGUgUmVsaWFiaWxpdHkgRW5naW5lZXIgYXQgc29jaWFsbHkgY29u + c2Npb3VzIEdvdlRlY2ggc3RhcnR1cCBTZWFtbGVzc0RvY3MuIEFsbCB0aGlu + Z3MgY29udGFpbmVycywgbW9uaXRvcmluZywgYXV0b21hdGlvbiwgY2xvdWQs + IGluZnJhc3RydWN0dXJlLCBzZWN1cml0eSwgYW5kIHNhZmUgc3lzdGVtcy5c + blxuSW50ZXJlc3RlZCBpbiBoZWxwaW5nIG91dCBmZWxsb3cgdmV0ZXJhbnMg + YW5kIG1ha2luZyB0aGUgdHJhbnNpdGlvbiBlYXNpZXIsIHNpbmNlIG1pbmUg + d2FzIHByZXR0eSByb3VnaCBhbmQgSSBhbSB2ZXJ5IGx1Y2t5L2JsZXNzZWQg + dG8gYmUgd2hlcmUgSSBhbSB0b2RheS4iLCJBY3RpdmUiOnRydWUsIlNlcnZp + Y2VzIjpbInJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjcnk4czE0cUdKaEhlT0Mi + LCJyZWN4RHJwRkw5dzV0TnprVyIsInJlY0tMUlVvbEN4c3ZXQnVGIiwicmVj + TjBsSjQ2Qlluc0k4ejkiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaG1QMzZw + S1dJOHFETGoiXSwiRW1haWwiOiJvaGFpd2FsdEBnbWFpbC5jb20iLCJDb2Rl + IG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8i + OnRydWV9LCJjcmVhdGVkVGltZSI6IjIwMTctMDgtMThUMTY6MDQ6NTcuMDAw + WiJ9LHsiaWQiOiJyZWN1eFVicVBlckx4Z29GZSIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiemRpZWhsaW8iLCJGdWxsIE5hbWUiOiJaYWNoYXJ5IEwgRGll + aGwiLCJTa2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhE + ZFdXMUowNmV2TyIsInJlY1VWOURMRW9LMUpxUlY5IiwicmVjYW9FeDFxMFFS + cHZjYVIiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJNYXggTWVudGVlcyI6NSwi + RW1haWwiOiJ6YWNoYXJ5LmRpZWhsQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGlt + ZSI6IjIwMTgtMDQtMjZUMTY6NDU6NTcuMDAwWiJ9LHsiaWQiOiJyZWN2VUt5 + NkpsQ1RIR0NaaSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiYXVicmV5Iiwi + RnVsbCBOYW1lIjoiQXVicmV5IEFyY2FuZ2VsIiwiU2tpbGxzZXRzIjpbInJl + Y0pCQjdaeFRPTTZ3TDV3IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWM1RllY + VTZqVG5YS1BIZyJdLCJBY3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0Ijpb + InJlY003Qm52Nmg5a1AxaEFiIl0sIkVtYWlsIjoiYWFyY2FuZ2VsQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6NTEuMDAw + WiJ9LHsiaWQiOiJyZWN3TFBnRDlURlRENDFkUiIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiaU9TVG9tIiwiRnVsbCBOYW1lIjoiVGhvbWFzIiwiU2tpbGxz + ZXRzIjpbInJlY29zUnZpTG9CQ2doNlRxIiwicmVjV0JMZlpBYk5mUFNwTHIi + LCJyZWNZMEcyOERJbmFmQnhnVCIsInJlY3lHNnNjRVR0eFp1VE54Il0sIk1h + eCBNZW50ZWVzIjoxLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoidGhvbWFzLm1h + cmxlckBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI2VDE0 + OjI1OjUyLjAwMFoifSx7ImlkIjoicmVjeFlPMWpxTDRIV25KYkkiLCJmaWVs + ZHMiOnsiU2xhY2sgTmFtZSI6Im1zY290dCIsIkZ1bGwgTmFtZSI6Ik1pY2hh + ZWwgSyBTY290dCIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZUcSIs + InJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWNx + bXlDV2pQU0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2 + alRuWEtQSGciXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6Im1pY2hhZWwua2Vs + bHkuc2NvdHRAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0y + NlQwNjoxMTo0Ni4wMDBaIn0seyJpZCI6InJlY3hiZVQxRGF6TGRaMkk4Iiwi + ZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJqcmFtZXMiLCJOb3RlcyI6IkkgYW0g + YWxyZWFkeSBtZW50b3JpbmcgUm9uIFJpaG9vLiAgSG9wZWZ1bGx5IEkgd2ls + bCBoYXZlIG1vcmUgYmFuZHdpZHRoIGluIHRoZSBmdXR1cmUsIGJ1dCBjdXJy + ZW50bHkgbXkgaGFuZHMgYXJlIHByZXR0eSBmdWxsIHdpdGggUm9uIGFuZCBz + b21lIG90aGVycyBJIHN0YXJ0ZWQgaGVscGluZyByZWNlbnRseS4iLCJBc3Np + Z25tZW50cyI6WyJyZWNNcVFCOFVRUFlIZVk3MCJdLCJGdWxsIE5hbWUiOiJK + ZWZmIFJhbWVzIiwiU2tpbGxzZXRzIjpbInJlY1kwRzI4REluYWZCeGdUIiwi + cmVjNUZZWFU2alRuWEtQSGciLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY2Fv + RXgxcTBRUnB2Y2FSIl0sIk1heCBNZW50ZWVzIjoxLCJXaGF0IHRpbWUgem9u + ZSBhcmUgeW91IGluPyI6IkNTVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv + dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI1IiwiQmlvIjoi + SSBoYXZlIHdvcmtlZCBhdCBhIGZvcnR1bmUgNTAgY29tcGFueSwgYSAyIHBl + cnNvbiBjb25zdWx0aW5nIGZpcm0sIGFuZCBjdXJyZW50bHkgYSBzbWFsbCBi + dXNpbmVzcyBhYm91dCBhYm91dCAxMDAgZW1wbG95ZWVzLiAgSSBjdXJyZW50 + bHkgd29yayBvbiBpT1MgbWVkaWNhbCBlbnRlcnByaXNlIHNvZnR3YXJlLiAg + SSBhbHNvIGRvIHdyaXRpbmcgYW5kIHRlY2huaWNhbCBlZGl0aW5nIGZvciBh + IHR1dG9yaWFsIHNpdGUsIHJheXdlbmRlcmxpY2guY29tLlxuXG5JJ20gYWx3 + YXlzIGhhcHB5IHRvIGhlbHAgcGVvcGxlIHRoYXQgYXJlIHN0YXJ0aW5nIG91 + dCwgYW5kIG9ubHkgcmVjZW50bHkgcmVhbGl6ZWQgSSBzaG91bGQgbG9vayBm + b3Igb2ZmaWNpYWwgbWVudG9yaW5nIG9wcG9ydHVuaXRpZXMuIFNvbWVvbmUg + bWVudGlvbmVkIE9wZXJhdGlvbiBDb2RlLCBhbmQgSSB3YXMgaW1tZWRpYXRl + bHkgaW50ZXJlc3RlZC4gIEkgbGlrZSB0aGUgaWRlYSBvZiBnaXZpbmcgYmFj + ayB0byBhIGNvbW11bml0eSB0aGF0IGhhcyBnaXZlbiBzbyBtdWNoIGZvciBv + dXIgY291bnRyeS5cblxuSSdtIGJlc3QgcG9zaXRpb25lZCB0byBoZWxwIHBl + b3BsZSBpbnRlcmVzdGVkIGluIG1vYmlsZSBhcHBsaWNhdGlvbiBkZXZlbG9w + bWVudC4gIENhcmVlciBndWlkYW5jZSBpcyBhbHNvIGFub3RoZXIgYXJlYSB3 + aGVyZSBJIGNhbiBwcm92aWRlIHNvbWUgaGVscCwgcGFydGljdWxhcmx5IHRv + IHRob3NlIGVhcmx5IGluIHRoZWlyIGNhcmVlcnMuICAiLCJBY3RpdmUiOnRy + dWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY0lJdVpWZjBROW1SY2hMIl0sIkVt + YWlsIjoianJhbWVzQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYt + MTItMThUMTg6NTk6NDQuMDAwWiJ9LHsiaWQiOiJyZWN5R0dTb3ZUcnVsNDAx + WSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiTWJhY2giLCJBc3NpZ25tZW50 + cyI6WyJyZWNDV0ZobVNGd1J2VkpvSSJdLCJGdWxsIE5hbWUiOiJNYXR0aGV3 + IEJhY2giLCJTa2lsbHNldHMiOlsicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF + NkdHa0w0dzJUNnBuQyIsInJlY1R1N3Q1TTBWaUlMbTVBIiwicmVjU2pybHNI + dFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjIsIldoYXQgdGltZSB6b25lIGFy + ZSB5b3UgaW4/IjoiRWFzdGVybiIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv + dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI4IiwiQmlvIjoi + V291bGQgcHJlZmVyIHNvbWVvbmUgd2hvIGlzIGVhZ2VyIHRvIHByb2JsZW0g + c29sdmUgd2l0aCBQeXRob24gYXMgYW4gYXV0b21hdGlvbiBsYW5ndWFnZS4g + VGhpcyBpcyBsaWtlbHkgd2hlcmUgSSBjYW4gYmUgdGhlIG1vc3QgaGVscCwg + YnV0IEknbSB3aWxsaW5nIHRvIHRha2Ugb24gYW55b25lIHdobydzIGludGVy + ZXN0ZWQuICIsIkFjdGl2ZSI6dHJ1ZSwiU3F1YWRzIjpbInJlY0k0aUhwVVBq + a2RuclVnIl0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY0ZmV29lbFpqS2NUT2Iw + Il0sIkVtYWlsIjoibWJhY2gwNEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi + OiIyMDE3LTAxLTAyVDE2OjMwOjQ2LjAwMFoifV19 + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: http://api.airtable.com/v0/some_random_id/Services + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Location: + - https://api.airtable.com/v0/some_random_id/Services + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: https://api.airtable.com/v0/some_random_id/Services + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 429 + message: '' + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:23 GMT + Etag: + - W/"188b-ZKAMD6Yvl9hZgAq+Q/KY5tI7PJU" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '6283' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"records":[{"id":"rec3ZQMCQsKPKlE2C","fields":{"Name":"Mock Interview","Description":"Have + one of our mentors conduct a mock coding interview.","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recBM9iaLwaAee4BQ"],"Mentor + Request":["recPM75fIOPfXR51m","recFzUhBO0KY496hy","recpIo6InoCqCKznj","recPRPi6IzrcHPSfR","recJ3q5zTOccP0Wnt","recgvmUOrfbP73wI5"],"Mentor + Skills":["recbn3OVB3DUPWuI0","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":5,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:07.000Z"},{"id":"recKLRUolCxsvWBuF","fields":{"Name":"Code + Review","Description":"Have a mentor look over a PR, code exercise or software + architecture","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentor + Request":["recvhYWculzcAxvi2","recP93VUeYeyhrNVz","recvJu22zZ4xy5FGs","recAF7yKRfpfHjrhK"],"Mentor + Skills":["recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:09:58.000Z"},{"id":"recN0lJ46BYnsI8z9","fields":{"Name":"Resume + Review","Description":"Have one of our mentors look over your resume","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + Request":["rec0tJIOd8GpmqZ5V","recfwDlYeOARfJoe8","recw5Xw9qkv3VrzE2","reczhwH7rtfs8clc4","recCMQKVmFULiFdAI","recxcgnhlG58HvTmn","recyk8xo77dMdaogb","reclWuAOIzTn1Prvy","rec1CMvTYgcM3c0A5","recufM56SJoHpZP5u","recVNznRKWyKFfQRF","recc1jYPa3GkV1aac","recUAjRcW1Oj3AbNv","rechmP36pKWI8qDLj"],"Mentor + Skills":["recXxKHRRiglWGPWt","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":8,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:10.000Z"},{"id":"recry8s14qGJhHeOC","fields":{"Name":"General + Guidance - Slack Chat","Description":"Chat 1 on 1 with a mentor via slack + chat","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentees":["recwZDCOVDH3QU3Vq","recQxZqkW2QfrDX7E"],"Mentor + Request":["recQlLUpf76DI9uRt","recxTxNKZcYuZPgiV","recWD3SbCvBHCtPEv","reckywOc9xoVAQ4vl","rec7C3aD1Z4WJcGnD","recvEsH0WKwfOIvat","recJf3oHXBNzAdJK8","recUNPVezaf8UNuqi","recMU7Jm7lU8GKSNy","recy9ZOgGCdJ4OjxX","recHVC8HTzXWsZeLg","rec7rx7ilpWb1W88v","rece8pNd1jYbi6Myc","recL3hM3ELIHQjtpD","recISHnxSOMjxKrgi","recYBK56Xp8AVEkYX","recRwfkRluRKOhKM4","recX6K7E4ydO0YjPy","recK1EkZSZCLFA007","recEXEwOmEWnxHdne","recF6AkQMSJaAa7ki","recjMGB93cCTBRAZY","rechii0wYCNIqdw8P","recGuKPSSlzj7mdM1","recBargZbtPOcpotA","rec9aa5x8ZRwA47Zr","recCymG2ALbKUAIXB","rec3aMjN13XEM2cUW","recjnrbWiZEl0brY1","rectLIJFqjVS6WhpM","recIIuZVf0Q9mRchL","recqVu45XffOI48Q5","recLnucDYfq0Mu1cA","recH5papKgKz88dbM","rec5BghMVYJ2KntB9","recYfXnoqFBgxwlDA","recBEPGtjSaA4vyta","recKoXfJZhyCDUFCV","recFekw7gHVMUlndt","rec6H2ZHUVnPU1IhC","recxD9kZnxYjJrut5","recjs0mQjL01oyQgj","recFfWoelZjKcTOb0","recmV1rL9Nfvo6tLx","recTzbQImlYsBi1M6","recSYBMzzdV0Nve8z","recbno9og0y0awr3Z","rechSkc7p41sx5jYq","recQP3XP3MUcpnkE0","recy6qoppSKByp1kH","rec9JNuk4ukpteyIR","recBNrnoQr0LEnBPd","recq4B8aguxGWdcwT","recVFLH8oVxQP4eER","recfV4wkoKGrcrlju","rechCv1ax04rK8kzy","recI0eTHxdoAOsKjQ","rec5jawkKPQKilO7t","recH1uObvhmQw6BBg","recweUyCr42l5ssrN","rec6PmvxU85p59gIK","recUQ2SlgVZmup8jM","rec8g9DWRhfcFhLgl","rec7ufwS4Id3VOke5","rec9T1AP2teWQLtEf","reck20KTFAABo6Be1","recABaMetQGB2Wsr4","reczPcsp85arch31m","recDtkpn4f0HwZgOm","recWg4m7RAN1yuhH4","recYwqjVh4sKOnOCS","recMth82AsU3nngSs","recOLfWE8TwHPzAmd","recRxDOVqyBfSlx9L","recZWgBHqNaWipElw","recb5DnUjyDIS4SRV","recN4ACryNBZj87Mm"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":10,"Mentee Requests":2},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"rectzgTGoQyy2FVMC","fields":{"Name":"General + Guidance - Voice Chat","Description":"Chat 1 on 1 with a mentor via voice + or video","Mentors":["recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + Request":["reciES5Dp5sR5UiTD","recPXxsjkxCK30l5w","rec86L1kFMGYOmnGn","rec3Sp9P5gTgMFdub","recWJcrc7yshLW535","recyw52g0meDKcxBS","recTrJNLGZeyZrQso","recle23ZC0KGpzq7f","recI84guIOF7Rm4xN","recFiFgdmv7q8OI0k","recfxAuJUGJZQuyOv","recDsbdLGttUXWmUk","rec2n9fNgVJOvk9N3","recb3rcFjBP66pEsM","recO0gtj5NOox5cvU","rec72rOLM74NmG7mL","recEgw278MbXFPjXV","rec5NufGIw6PLJXcD","recVlscT5IeV7Jy0j","recV2opjArSXUkM85","recoHLGJd46435i6v","rec0WXnwFu0gRnZr6","recTx4fWdyWA5XiAT","recf6fuzdgY4fwgQm","recBVb0ZegUcGmLmn","rechOY0LvnrO5p8uM","recdFALRdOkpObGsO","recaK1RmmTwPbtQch","rechlkZKhQIPebb5X","recM3x8O5Nym2hAEM","recqqkBPcUrpozV8f","reclEsb5Tn63Yz17u","receOS381ThK8L27v","recul4wH0fUXpcku5","rec2CpCt6XTrmKf2I","recF5h7HvxIvPuLJV","recIEqi0xGG12h3q2","recM7Bnv6h9kP1hAb","recWPOb4pbLJLSBBO","recw5yJdWIp6t9Lwg","recd4hW73XpoSgWVq","recuyrOhS8FwT1TdH"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"recxDrpFL9w5tNzkW","fields":{"Name":"Pair + Programming","Description":"Spend an hour with a mentor programming together","Mentors":["recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentees":["recQxZqkW2QfrDX7E"],"Mentor + Request":["recoZWLdBba0RtObw","recfuT67S14yMmRsR","recH75YcWSGHzoDgL","recVcYxcQZNhZBz8R","rec8OYu6F8n9O2pbv","recbLo1LZkH78m0tf","recPz02jtI7F5Vw4d","recDFjF5KTByknL2j","recWka1ynPANo5s3X","recBtZ6gFrjpRFYFM","recAwQTvFeITTfXe8","recv5Zgl4WqF9RXqr","recD78YUBEB5C7lDF","recpgngdrEXCHdoZK","recQddCu26j0MGmO5","recdGPicU3AM6jUnt","recz1vIqJnTTzDcBS","recevtA3LaYZMqSI2"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":5,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:23 GMT +- request: + method: get + uri: http://api.airtable.com/v0/some_random_id/Skillsets + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 301 + message: Moved Permanently + headers: + Content-Type: + - text/html + Date: + - Sun, 29 Apr 2018 23:16:24 GMT + Location: + - https://api.airtable.com/v0/some_random_id/Skillsets + Server: + - Tengine + Content-Length: + - '278' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: "\r\n\r\n301 + Moved Permanently\r\n\r\n

301 Moved + Permanently

\r\n

The requested resource has been assigned a new permanent + URI.

\r\n
Powered by Tengine\r\n\r\n" + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:24 GMT +- request: + method: get + uri: https://api.airtable.com/v0/some_random_id/Skillsets + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 429 + message: '' + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 29 Apr 2018 23:16:24 GMT + Etag: + - W/"286b-1vcTHyIdkMCD4HHe4fcXmNd6RBs" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '10347' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"records":[{"id":"rec5FYXU6jTnXKPHg","fields":{"Name":"Resume Reviews","Mentors":["recZIExVz7yhKtfa8","recxbeT1DazLdZ2I8","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec6iqhMxHhlRZrhx","fields":{"Name":"Bot + Specialist","Mentors":["recIPKInSvxr30rcF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec8IVKeTrwsgUPcg","fields":{"Name":"C#/Net","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"rec9lnHZaDt2CvVrZ","fields":{"Name":"Ruby + / Rails","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recBM9iaLwaAee4BQ","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","recH8e2ZDtftbFqRC","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recBIhDduJD3YLaHq","fields":{"Name":"JavaScript","Mentors":["recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-04-11T20:42:43.000Z"},{"id":"recCKrPnHDqOdlhAg","fields":{"Name":"Cake","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recCVc7u3kCONhJfF","fields":{"Name":"Back + End Development","Mentors":["recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W","rec38psl7zI8p3aiT","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recE6GGkL4w2T6pnC","fields":{"Name":"SQL","Mentors":["recyGGSovTrul401Y","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recFJ9FXE6zxrd9i4","fields":{"Name":"Mobile + (Android)","Mentors":["receBeTyuWlLfApHB"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recImroWnd6p02aXu","fields":{"Name":"Design + / UX","Mentors":["recErAVRZsjwjpULL","recqE8Zl8Fh4bo4PG","rec7i7HYMRX6AArBS","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJACxkZuHTZSU2j","fields":{"Name":"Data + Science","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJBB7ZxTOM6wL5w","fields":{"Name":"Javascript","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recBM9iaLwaAee4BQ","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recV0qJD28ki2Q8kr","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJHiVQNIC3ONMWs","fields":{"Name":"UNIX + Linux Mac OS and command line operation and scripting","Mentors":["rec7ZSEBrUJU9OwRk"]},"createdTime":"2018-03-27T14:42:54.000Z"},{"id":"recM9kb3SazF466xo","fields":{"Name":"Azure","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recNONJ8S1p1TjfKV","fields":{"Name":"C# + / .NET","Mentors":["recftNiD91Hhj9506","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recOfGy9tMeUwjN78","fields":{"Name":"Android + Development","Mentors":["recF4oBzjE3J6A0wo","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recQ6ex9GF5ijQTod","fields":{"Name":"PHP","Mentors":["recPq1y7NgZfrBe6m"]},"createdTime":"2018-04-07T03:33:18.000Z"},{"id":"recRyPBwN1JBj9D9l","fields":{"Name":"Ethics","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSjrlsHtWh9XWOP","fields":{"Name":"DevOps","Mentors":["recyGGSovTrul401Y","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","rec6nA4WIrhCtKW5n","rec425V9c8DsQKckC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSy4HmIGtILqZRv","fields":{"Name":"Xamarian","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSzicEsYXG4P1A4","fields":{"Name":"Architecture","Mentors":["recftNiD91Hhj9506"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recTu7t5M0ViILm5A","fields":{"Name":"Web + (Backend Development)","Mentors":["recyGGSovTrul401Y","recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recUV9DLEoK1JqRV9","fields":{"Name":"Entrepreneurship","Mentors":["recEoe9Yqs6YMGm1L","reccKrEc0w88fSs7W","recqE8Zl8Fh4bo4PG","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recQrZvfSR4jn3RNO","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recWBLfZAbNfPSpLr","fields":{"Name":"Linux","Mentors":["recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recwLPgD9TFTD41dR","rec7ZSEBrUJU9OwRk","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recXeV4Fm0lHnUt2e","fields":{"Name":"Slack","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recY0G28DInafBxgT","fields":{"Name":"IoS + Development","Mentors":["recxbeT1DazLdZ2I8","reccKrEc0w88fSs7W","receGKFRAxZa0ZHNf","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recZG14sS7YYVkV3R","fields":{"Name":"scala","Mentors":["recJ8Wi2LOqlY1gaf"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recaoEx1q0QRpvcaR","fields":{"Name":"General + Career Advice","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recH8e2ZDtftbFqRC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recewf1jLcO1QlVfY","fields":{"Name":"Python","Mentors":["recyGGSovTrul401Y","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recf0UbPWw289LKjw","fields":{"Name":"Dancing","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfINzrFfLKSI0GV","fields":{"Name":"Prolog","Mentors":["rec38psl7zI8p3aiT"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfKx8crgrjMMvSk","fields":{"Name":"Cat + Pictures","Mentors":["recftNiD91Hhj9506","recsblzySLFHOSl1f"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfw78VdnD7tpZVz","fields":{"Name":"Functional + Programming","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recJ8Wi2LOqlY1gaf","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recPq1y7NgZfrBe6m","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recj2omdu7WnIXLJk","fields":{"Name":"Data-Science","Mentors":["recErAVRZsjwjpULL","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reck4lkOTkfsMRPkR","fields":{"Name":"Front + End Development","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recl8Vwo2xuFiErJy","fields":{"Name":"C + / C++","Mentors":["receBeTyuWlLfApHB","rec38psl7zI8p3aiT","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recn4IOqrQ5upCwwY","fields":{"Name":"Cyber-Security","Mentors":["rec425V9c8DsQKckC"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recnPHDdWW1J06evO","fields":{"Name":"React","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recosRviLoBCgh6Tq","fields":{"Name":"Java","Mentors":["receBeTyuWlLfApHB","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recpdV6vAmtmI5psM","fields":{"Name":"Web + (Frontend Development)","Mentors":["recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recqmyCWjPSAqgCop","fields":{"Name":"Code + Review","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","rec38psl7zI8p3aiT","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recvDGhGfPUK5UwG0","fields":{"Name":"product + and program management (transitioning to or growing within the function)","Mentors":["recQrZvfSR4jn3RNO"]},"createdTime":"2018-04-23T18:52:44.000Z"},{"id":"recwFfIrvPeq0qGXG","fields":{"Name":"C/C++","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"recyG6scETtxZuTNx","fields":{"Name":"Cyber-security","Mentors":["recWPyxrY2QKAkPVL","recqrAeFyljlWtsXC","recwLPgD9TFTD41dR","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recyGndgUYkkyPCrS","fields":{"Name":"Career + Advice","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reczl5liQJOJCap7L","fields":{"Name":"Resume + Review","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"}]}' + http_version: + recorded_at: Sun, 29 Apr 2018 23:16:24 GMT +recorded_with: VCR 3.0.3 diff --git a/test/requests/airtable/mentorship_test.rb b/test/requests/airtable/mentorship_test.rb index d5925d69..a1c3d693 100644 --- a/test/requests/airtable/mentorship_test.rb +++ b/test/requests/airtable/mentorship_test.rb @@ -25,10 +25,18 @@ def test_mentor_request_data_returns_correct_service_data assert service[:name].present? end -def test_mentor_request_data_returns_correct_skillset_data + def test_mentor_request_data_returns_correct_skillset_data skillset = @successful_response[:skillsets].first assert skillset[:id].present? assert skillset[:name].present? end + + def test_429_raises_airtable_error + VCR.use_cassette('airtable/mentorship/exceeded_rate_limit') do + assert_raises Airtable::Error do + Airtable::Mentorship.new.mentor_request_data + end + end + end end From 91321a832f9a7990832ce8bd92fe26805fa8dc4e Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sat, 5 May 2018 09:52:15 -0600 Subject: [PATCH 08/21] Creates route, controller, and controller tests --- .../api/v1/airtable/mentorships_controller.rb | 17 ++++++++++++ config/routes.rb | 4 +++ .../airtable/mentorships_controller_test.rb | 26 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 app/controllers/api/v1/airtable/mentorships_controller.rb create mode 100644 test/controllers/api/v1/airtable/mentorships_controller_test.rb diff --git a/app/controllers/api/v1/airtable/mentorships_controller.rb b/app/controllers/api/v1/airtable/mentorships_controller.rb new file mode 100644 index 00000000..03824d3a --- /dev/null +++ b/app/controllers/api/v1/airtable/mentorships_controller.rb @@ -0,0 +1,17 @@ +module Api + module V1 + module Airtable + class MentorshipsController < ApiController + before_action :authenticate_user! + + def index + mentorship_data = ::Airtable::Mentorship.new.mentor_request_data + + render json: mentorship_data, status: :ok + rescue ::Airtable::Error => e + render json: { error: e.message }, status: :unprocessable_entity + end + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 0b749538..9ef6a516 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,6 +51,10 @@ namespace :users do post '/passwords/reset', to: 'passwords#reset' end + + namespace :airtable do + resources :mentorships, only: :index + end end end end diff --git a/test/controllers/api/v1/airtable/mentorships_controller_test.rb b/test/controllers/api/v1/airtable/mentorships_controller_test.rb new file mode 100644 index 00000000..9d4c3c57 --- /dev/null +++ b/test/controllers/api/v1/airtable/mentorships_controller_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::IntegrationTest + setup do + user = create(:user) + @headers = authorization_headers(user) + end + + test ':index renders mentorship data' do + VCR.use_cassette('airtable/mentorship/successful') do + get api_v1_airtable_mentorships_path, headers: @headers, as: :json + + assert response.status == 200 + assert response.parsed_body.keys.sort == ['mentors', 'services', 'skillsets'] + end + end + + test ':index when rate limit returns a 422 and error message' do + VCR.use_cassette('airtable/mentorship/exceeded_rate_limit') do + get api_v1_airtable_mentorships_path, headers: @headers, as: :json + + assert response.status == 422 + assert response.parsed_body['error'].present? + end + end +end From 9edbc331bc977036281b86915ccb7fb463eb2933 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:04:58 -0600 Subject: [PATCH 09/21] =?UTF-8?q?DRY=E2=80=99s=20up=20the=20similar=20call?= =?UTF-8?q?s=20to=20get=20new=20records?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/airtable/mentorship.rb | 32 +++++++++++------------ test/requests/airtable/mentorship_test.rb | 2 +- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/lib/airtable/mentorship.rb b/app/lib/airtable/mentorship.rb index 25bb1900..843c6308 100644 --- a/app/lib/airtable/mentorship.rb +++ b/app/lib/airtable/mentorship.rb @@ -6,11 +6,16 @@ def initialize @client = Airtable::Client.new end + # Fetches all the records from the mentors, services, and skillsets Airtables, + # and re-formats the data into a custom hash + # + # @return [Hash] Hash of mentor, services, and skillsets data + # def mentor_request_data { - mentors: mentors, - services: services, - skillsets: skillsets + mentors: data_for('Mentors', name_key: 'Full Name'), + services: data_for('Services'), + skillsets: data_for('Skillsets') } end @@ -27,26 +32,19 @@ def mentors end end - def services - services = client.get_records_for('Services') + private + + def data_for(table, name_key: 'Name') + records = client.get_records_for(table) - services.map do |serive| + records['records'].map do |record| { - id: serive['id'], - name: serive.dig('fields', 'Name') + id: record['id'], + name: record.dig('fields', name_key) } end end - def skillsets - skillsets = client.get_records_for('Skillsets') - - skillsets.map do |skillset| - { - id: skillset['id'], - name: skillset.dig('fields', 'Name') - } - end end end end diff --git a/test/requests/airtable/mentorship_test.rb b/test/requests/airtable/mentorship_test.rb index a1c3d693..10249e24 100644 --- a/test/requests/airtable/mentorship_test.rb +++ b/test/requests/airtable/mentorship_test.rb @@ -15,7 +15,7 @@ def test_mentor_request_data_returns_correct_mentor_data mentor = @successful_response[:mentors].first assert mentor[:id].present? - assert mentor[:full_name].present? + assert mentor[:name].present? end def test_mentor_request_data_returns_correct_service_data From 40c0c9a1c6e47f9f3cac6e98966c1bed11a98348 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:07:24 -0600 Subject: [PATCH 10/21] Calls HTTParty directly and cleans up URL --- app/lib/airtable/client.rb | 39 +++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index d034b884..e9e84349 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -1,33 +1,54 @@ -require "httparty" - module Airtable class Client include HTTParty - base_uri 'api.airtable.com/v0' - attr_reader :base_id, :headers + attr_reader :base_id, :headers, :base_url def initialize - api_key = Rails.application.secrets.airtable_api_key - @base_id = Rails.application.secrets.airtable_base_id - @headers = { :Authorization => "Bearer #{api_key}"} + api_key = Rails.application.secrets.airtable_api_key + @base_id = Rails.application.secrets.airtable_base_id + @headers = { :Authorization => "Bearer #{api_key}"} + @base_url = "https://api.airtable.com/v0/#{base_id}/" end + # Fetches all of the records for the passed Airtable + # + # @param table [String] Name of the table in Airtable + # @return [Hash] The parsed_response from Airtable + # def get_records_for(table) - response = self.class.get("/#{base_id}/#{table}", headers: headers) + response = HTTParty.get(url_for(table), headers: headers) + + return_value_for(response) + end return_value_for(response) end private + def url_for(table) + base_url + escaped(table) + end + + # URL-encodes the passed string for cases where the string has spaces + # + # @param url_string [String] a URL string + # @return [String] String where any spaces are URL-encoded + # @example escaped('Mentor Request') => 'Mentor%20Request' + # @see http://ruby-doc.org/stdlib-2.3.3/libdoc/uri/rdoc/URI/Escape.html + # + def escaped(url_string) + URI.escape url_string + end + # If the Airtable rate limit is reached, a 429 status code is returned # @see https://airtable.com/appSqQz7spgg0I1jQ/api/docs#curl/ratelimits # def return_value_for(response) case response.code when 200 - response.parsed_response['records'] + response.parsed_response when 429 raise Airtable::Error, 'Exceeded Airtable rate limit. Wait 30 seconds for subsequent requests.' else From fe5154b15cc757e1b60f542fbb1063bc0a813059 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:08:03 -0600 Subject: [PATCH 11/21] Client method to POST a record to Airtable --- app/lib/airtable/client.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index e9e84349..b77beb5e 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -22,6 +22,19 @@ def get_records_for(table) return_value_for(response) end + # Creates a new record in the passed Airtable + # + # @param table [String] Name of the table in Airtable + # @param body [JSON] JSON string of request body attributes + # @return [Hash] The parsed_response from Airtable + # + def post_record(table, body) + response = HTTParty.post( + url_for(table), + headers: update_headers, + body: body + ) + return_value_for(response) end @@ -55,5 +68,11 @@ def return_value_for(response) raise Airtable::Error, response.parsed_response end end + + def update_headers + headers.merge( + 'Content-Type' => 'application/json' + ) + end end end From e850f3e4adf1d075ee54f6d0616a39eab15662bc Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:08:42 -0600 Subject: [PATCH 12/21] Client test coverage --- .../client/get_records_successful.yml | 70 +++++++++++++++++++ .../client/post_record_successful.yml | 48 +++++++++++++ test/requests/airtable/client_test.rb | 36 ++++++++++ 3 files changed, 154 insertions(+) create mode 100644 test/cassettes/airtable/client/get_records_successful.yml create mode 100644 test/cassettes/airtable/client/post_record_successful.yml create mode 100644 test/requests/airtable/client_test.rb diff --git a/test/cassettes/airtable/client/get_records_successful.yml b/test/cassettes/airtable/client/get_records_successful.yml new file mode 100644 index 00000000..b0579fbe --- /dev/null +++ b/test/cassettes/airtable/client/get_records_successful.yml @@ -0,0 +1,70 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.airtable.com/v0/some_random_id/Services + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer some_random_key + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 06 May 2018 16:39:50 GMT + Etag: + - W/"1905-MIKFMHVdDXjLEi25UpV9coUOiKs" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '6405' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"records":[{"id":"rec3ZQMCQsKPKlE2C","fields":{"Name":"Mock Interview","Description":"Have + one of our mentors conduct a mock coding interview.","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recBM9iaLwaAee4BQ"],"Mentor + Request":["recPM75fIOPfXR51m","recFzUhBO0KY496hy","recpIo6InoCqCKznj","recPRPi6IzrcHPSfR","recJ3q5zTOccP0Wnt","recgvmUOrfbP73wI5","recPr5qFiMDGc9624"],"Mentor + Skills":["recbn3OVB3DUPWuI0","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":5,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:07.000Z"},{"id":"recKLRUolCxsvWBuF","fields":{"Name":"Code + Review","Description":"Have a mentor look over a PR, code exercise or software + architecture","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","recQI7eSAFvP5LEhP"],"Mentor + Request":["recvhYWculzcAxvi2","recP93VUeYeyhrNVz","recvJu22zZ4xy5FGs","recAF7yKRfpfHjrhK"],"Mentor + Skills":["recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":10,"Mentee Requests":0},"createdTime":"2017-03-05T19:09:58.000Z"},{"id":"recN0lJ46BYnsI8z9","fields":{"Name":"Resume + Review","Description":"Have one of our mentors look over your resume","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentor + Request":["rec0tJIOd8GpmqZ5V","recfwDlYeOARfJoe8","recw5Xw9qkv3VrzE2","reczhwH7rtfs8clc4","recCMQKVmFULiFdAI","recxcgnhlG58HvTmn","recyk8xo77dMdaogb","reclWuAOIzTn1Prvy","rec1CMvTYgcM3c0A5","recufM56SJoHpZP5u","recVNznRKWyKFfQRF","recc1jYPa3GkV1aac","recUAjRcW1Oj3AbNv","rechmP36pKWI8qDLj"],"Mentor + Skills":["recXxKHRRiglWGPWt","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:10.000Z"},{"id":"recry8s14qGJhHeOC","fields":{"Name":"General + Guidance - Slack Chat","Description":"Chat 1 on 1 with a mentor via slack + chat","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentees":["recwZDCOVDH3QU3Vq","recQxZqkW2QfrDX7E"],"Mentor + Request":["recQlLUpf76DI9uRt","recxTxNKZcYuZPgiV","recWD3SbCvBHCtPEv","reckywOc9xoVAQ4vl","rec7C3aD1Z4WJcGnD","recvEsH0WKwfOIvat","recJf3oHXBNzAdJK8","recUNPVezaf8UNuqi","recMU7Jm7lU8GKSNy","recy9ZOgGCdJ4OjxX","recHVC8HTzXWsZeLg","rec7rx7ilpWb1W88v","rece8pNd1jYbi6Myc","recL3hM3ELIHQjtpD","recISHnxSOMjxKrgi","recYBK56Xp8AVEkYX","recRwfkRluRKOhKM4","recX6K7E4ydO0YjPy","recK1EkZSZCLFA007","recEXEwOmEWnxHdne","recF6AkQMSJaAa7ki","recjMGB93cCTBRAZY","rechii0wYCNIqdw8P","recGuKPSSlzj7mdM1","recBargZbtPOcpotA","rec9aa5x8ZRwA47Zr","recCymG2ALbKUAIXB","rec3aMjN13XEM2cUW","recjnrbWiZEl0brY1","rectLIJFqjVS6WhpM","recIIuZVf0Q9mRchL","recqVu45XffOI48Q5","recLnucDYfq0Mu1cA","recH5papKgKz88dbM","rec5BghMVYJ2KntB9","recYfXnoqFBgxwlDA","recBEPGtjSaA4vyta","recKoXfJZhyCDUFCV","recFekw7gHVMUlndt","rec6H2ZHUVnPU1IhC","recxD9kZnxYjJrut5","recjs0mQjL01oyQgj","recFfWoelZjKcTOb0","recmV1rL9Nfvo6tLx","recTzbQImlYsBi1M6","recSYBMzzdV0Nve8z","recbno9og0y0awr3Z","rechSkc7p41sx5jYq","recQP3XP3MUcpnkE0","recy6qoppSKByp1kH","rec9JNuk4ukpteyIR","recBNrnoQr0LEnBPd","recq4B8aguxGWdcwT","recVFLH8oVxQP4eER","recfV4wkoKGrcrlju","rechCv1ax04rK8kzy","recI0eTHxdoAOsKjQ","rec5jawkKPQKilO7t","recH1uObvhmQw6BBg","recweUyCr42l5ssrN","rec6PmvxU85p59gIK","recUQ2SlgVZmup8jM","rec8g9DWRhfcFhLgl","rec7ufwS4Id3VOke5","rec9T1AP2teWQLtEf","reck20KTFAABo6Be1","recABaMetQGB2Wsr4","reczPcsp85arch31m","recDtkpn4f0HwZgOm","recWg4m7RAN1yuhH4","recYwqjVh4sKOnOCS","recMth82AsU3nngSs","recOLfWE8TwHPzAmd","recRxDOVqyBfSlx9L","recZWgBHqNaWipElw","recb5DnUjyDIS4SRV","recN4ACryNBZj87Mm"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":11,"Mentee Requests":2},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"rectzgTGoQyy2FVMC","fields":{"Name":"General + Guidance - Voice Chat","Description":"Chat 1 on 1 with a mentor via voice + or video","Mentors":["recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentor + Request":["reciES5Dp5sR5UiTD","recPXxsjkxCK30l5w","rec86L1kFMGYOmnGn","rec3Sp9P5gTgMFdub","recWJcrc7yshLW535","recyw52g0meDKcxBS","recTrJNLGZeyZrQso","recle23ZC0KGpzq7f","recI84guIOF7Rm4xN","recFiFgdmv7q8OI0k","recfxAuJUGJZQuyOv","recDsbdLGttUXWmUk","rec2n9fNgVJOvk9N3","recb3rcFjBP66pEsM","recO0gtj5NOox5cvU","rec72rOLM74NmG7mL","recEgw278MbXFPjXV","rec5NufGIw6PLJXcD","recVlscT5IeV7Jy0j","recV2opjArSXUkM85","recoHLGJd46435i6v","rec0WXnwFu0gRnZr6","recTx4fWdyWA5XiAT","recf6fuzdgY4fwgQm","recBVb0ZegUcGmLmn","rechOY0LvnrO5p8uM","recdFALRdOkpObGsO","recaK1RmmTwPbtQch","rechlkZKhQIPebb5X","recM3x8O5Nym2hAEM","recqqkBPcUrpozV8f","reclEsb5Tn63Yz17u","receOS381ThK8L27v","recul4wH0fUXpcku5","rec2CpCt6XTrmKf2I","recF5h7HvxIvPuLJV","recIEqi0xGG12h3q2","recM7Bnv6h9kP1hAb","recWPOb4pbLJLSBBO","recw5yJdWIp6t9Lwg","recd4hW73XpoSgWVq","recuyrOhS8FwT1TdH"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":10,"Mentee Requests":0},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"recxDrpFL9w5tNzkW","fields":{"Name":"Pair + Programming","Description":"Spend an hour with a mentor programming together","Mentors":["recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","recQI7eSAFvP5LEhP"],"Mentees":["recQxZqkW2QfrDX7E"],"Mentor + Request":["recoZWLdBba0RtObw","recfuT67S14yMmRsR","recH75YcWSGHzoDgL","recVcYxcQZNhZBz8R","rec8OYu6F8n9O2pbv","recbLo1LZkH78m0tf","recPz02jtI7F5Vw4d","recDFjF5KTByknL2j","recWka1ynPANo5s3X","recBtZ6gFrjpRFYFM","recAwQTvFeITTfXe8","recv5Zgl4WqF9RXqr","recD78YUBEB5C7lDF","recpgngdrEXCHdoZK","recQddCu26j0MGmO5","recdGPicU3AM6jUnt","recz1vIqJnTTzDcBS","recevtA3LaYZMqSI2"],"Mentor + Skills":["recCbfP26C9oyF6oZ","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor + Count":6,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' + http_version: + recorded_at: Sun, 06 May 2018 16:39:52 GMT +recorded_with: VCR 3.0.3 diff --git a/test/cassettes/airtable/client/post_record_successful.yml b/test/cassettes/airtable/client/post_record_successful.yml new file mode 100644 index 00000000..3d44a079 --- /dev/null +++ b/test/cassettes/airtable/client/post_record_successful.yml @@ -0,0 +1,48 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.airtable.com/v0/some_random_id/Mentor%20Request + body: + encoding: UTF-8 + string: '{"fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Java"],"Additional + Details":"Some test description.","Mentor Requested":["rec0SDZDK2DiW4PY9"]}}' + headers: + Authorization: + - Bearer some_random_key + Content-Type: + - application/json + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 06 May 2018 16:47:48 GMT + Etag: + - W/"11d-Xl6S4CZUyAGFCtB7g81qkH8g6uM" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '285' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"id":"recMyCjs0vX1LCd8w","fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Java"],"Additional + Details":"Some test description.","Mentor Requested":["rec0SDZDK2DiW4PY9"],"Created + At":"2018-05-06T16:47:48.000Z"},"createdTime":"2018-05-06T16:47:48.353Z"}' + http_version: + recorded_at: Sun, 06 May 2018 16:47:50 GMT +recorded_with: VCR 3.0.3 diff --git a/test/requests/airtable/client_test.rb b/test/requests/airtable/client_test.rb new file mode 100644 index 00000000..351b5e90 --- /dev/null +++ b/test/requests/airtable/client_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' + +class ClientTest < Minitest::Test + def test_get_records_for_gets_all_the_records_for_the_passed_table + VCR.use_cassette('airtable/client/get_records_successful') do + response = Airtable::Client.new.get_records_for('Services') + + assert response['records'].present? + end + end + + def test_post_record_creates_a_new_record_in_the_passed_table + request_body = { + "fields" => { + "Slack User" => "test_case_1", + "Service" => [ + "rec3ZQMCQsKPKlE2C" + ], + "Skillsets" => [ + "Java" + ], + "Additional Details" => "Some test description.", + "Mentor Requested" => [ + "rec0SDZDK2DiW4PY9" + ] + } + }.to_json + + VCR.use_cassette('airtable/client/post_record_successful') do + response = Airtable::Client.new.post_record('Mentor Request', request_body) + + assert response['id'].present? + assert response['createdTime'].present? + end + end +end From 69210cc3076d973fd8507cf23be66991c8709afb Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:09:35 -0600 Subject: [PATCH 13/21] Method to create a record a new Mentor Request in Airtable --- app/lib/airtable/mentorship.rb | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/app/lib/airtable/mentorship.rb b/app/lib/airtable/mentorship.rb index 843c6308..c86e416b 100644 --- a/app/lib/airtable/mentorship.rb +++ b/app/lib/airtable/mentorship.rb @@ -19,17 +19,23 @@ def mentor_request_data } end - private - - def mentors - mentors = client.get_records_for('Mentors') - - mentors.map do |mentor| - { - id: mentor['id'], - full_name: mentor.dig('fields', 'Full Name') + # Creates a new mentor request record in the Mentor Request Airtable + # + # @param body [Hash] Hash of mentor request attributes + # @return [Hash] Hash of the newly created mentor request Airtable record + # + def create_mentor_request(body) + request_body = { + "fields" => { + "Slack User" => body[:slack_user], + "Service" => format_for_posting(body[:services]), + "Skillsets" => format_for_posting(body[:skillsets]), + "Additional Details" => body[:additional_details], + "Mentor Requested" => format_for_posting(body[:mentor_requested]) } - end + }.to_json + + client.post_record('Mentor Request', request_body) end private @@ -45,6 +51,13 @@ def data_for(table, name_key: 'Name') end end + # Converts a comman separated string into an array of strings + # + # @param data_string [String] Comma separated strings of data + # @return [Array] An array of stripped strings + # + def format_for_posting(data_string) + data_string.split(",").map(&:strip) end end end From 4a7bd9980e26aeeba815718abed7aabf60e781b6 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:10:11 -0600 Subject: [PATCH 14/21] Mentorship POSTing test coverage --- .../airtable/mentorship/post_successful.yml | 48 + .../airtable/mentorship/successful.yml | 985 +++++++++--------- test/requests/airtable/mentorship_test.rb | 34 + 3 files changed, 566 insertions(+), 501 deletions(-) create mode 100644 test/cassettes/airtable/mentorship/post_successful.yml diff --git a/test/cassettes/airtable/mentorship/post_successful.yml b/test/cassettes/airtable/mentorship/post_successful.yml new file mode 100644 index 00000000..5fd23525 --- /dev/null +++ b/test/cassettes/airtable/mentorship/post_successful.yml @@ -0,0 +1,48 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.airtable.com/v0/some_random_id/Mentor%20Request + body: + encoding: UTF-8 + string: '{"fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Java"],"Additional + Details":"Some test description.","Mentor Requested":["rec0SDZDK2DiW4PY9"]}}' + headers: + Authorization: + - Bearer some_random_key + Content-Type: + - application/json + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 06 May 2018 02:10:37 GMT + Etag: + - W/"11d-aFN6bt/wzubKc+KtOD2gB/yAJEk" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '285' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"id":"recPr5qFiMDGc9624","fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Java"],"Additional + Details":"Some test description.","Mentor Requested":["rec0SDZDK2DiW4PY9"],"Created + At":"2018-05-06T02:10:37.000Z"},"createdTime":"2018-05-06T02:10:37.565Z"}' + http_version: + recorded_at: Sun, 06 May 2018 02:10:37 GMT +recorded_with: VCR 3.0.3 diff --git a/test/cassettes/airtable/mentorship/successful.yml b/test/cassettes/airtable/mentorship/successful.yml index b19603e1..7cd1d096 100644 --- a/test/cassettes/airtable/mentorship/successful.yml +++ b/test/cassettes/airtable/mentorship/successful.yml @@ -1,39 +1,5 @@ --- http_interactions: -- request: - method: get - uri: http://api.airtable.com/v0/some_random_id/Mentors - body: - encoding: US-ASCII - string: '' - headers: - Authorization: - - Bearer some_random_key - response: - status: - code: 301 - message: Moved Permanently - headers: - Content-Type: - - text/html - Date: - - Sun, 29 Apr 2018 23:16:23 GMT - Location: - - https://api.airtable.com/v0/some_random_id/Mentors - Server: - - Tengine - Content-Length: - - '278' - Connection: - - keep-alive - body: - encoding: UTF-8 - string: "\r\n\r\n301 - Moved Permanently\r\n\r\n

301 Moved - Permanently

\r\n

The requested resource has been assigned a new permanent - URI.

\r\n
Powered by Tengine\r\n\r\n" - http_version: - recorded_at: Sun, 29 Apr 2018 23:16:23 GMT - request: method: get uri: https://api.airtable.com/v0/some_random_id/Mentors @@ -58,15 +24,15 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Sun, 29 Apr 2018 23:16:23 GMT + - Sun, 06 May 2018 16:27:04 GMT Etag: - - W/"7044-ASsyZ8UBGjpIT3NIjPdImM+kzRQ" + - W/"7f15-r62oO8NOnrSkz5HdI+/nw9mwzDU" Server: - Tengine Vary: - Accept-Encoding Content-Length: - - '28740' + - '32533' Connection: - keep-alive body: @@ -346,407 +312,457 @@ http_interactions: dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjWldnQkhxTmFXaXBFbHciLCJy ZWNSeERPVnF5QmZTbHg5TCJdLCJFbWFpbCI6IjEzZGVzdGluaWVzQGdtYWls LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMDdUMDM6MzM6MTguMDAw - WiJ9LHsiaWQiOiJyZWNRclp2ZlNSNGpuM1JOTyIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoiYnJpYW5rYWhycyIsIkZ1bGwgTmFtZSI6IkJyaWFuIEthaHJz - IiwiU2tpbGxzZXRzIjpbInJlY1VWOURMRW9LMUpxUlY5IiwicmVjNUZZWFU2 - alRuWEtQSGciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3ZER2hHZlBVSzVV - d0cwIl0sIk1heCBNZW50ZWVzIjoxLCJFbWFpbCI6ImJyaWFuLmthaHJzQGdt - YWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMjNUMTg6NTI6NDQu - MDAwWiJ9LHsiaWQiOiJyZWNSbEtjekdBY05LTjI2RyIsImZpZWxkcyI6eyJT - bGFjayBOYW1lIjoiYm9iLXJvYiIsIkZ1bGwgTmFtZSI6IkJvYiBSb2JlcnRz - IiwiU2tpbGxzZXRzIjpbInJlYzlsbkhaYUR0MkN2VnJaIl0sIldoYXQgdGlt - ZSB6b25lIGFyZSB5b3UgaW4/IjoiQ2VudHJhbCIsIkJpbyI6IkkgaGF2ZSBi - ZWVuIHVzaW5nIFJvUiBmb3IgOCB5ZWFycyBub3cgYW5kIHN0aWxsIGxvdmUg - aXQuICBJIGhhdmUgZG9uZSBzb21lIG1lbnRvcmluZyBhbmQgSSBlbmpveSBo - ZWxwaW5nIG90aGVycyBsZWFybiBhcyBvdGhlciBoYWQgaGVscGVkIG1lIGlu - IG15IHBhc3QuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThz - MTRxR0poSGVPQyIsInJlY0tMUlVvbEN4c3ZXQnVGIl0sIk1lbnRvciBSZXF1 - ZXN0IjpbInJlY0sxRWtaU1pDTEZBMDA3IiwicmVjak1HQjkzY0NUQlJBWlki - LCJyZWMwV1hud0Z1MGdSblpyNiIsInJlY0Q3OFlVQkVCNUM3bERGIiwicmVj - TXRoODJBc1Uzbm5nU3MiXSwiRW1haWwiOiJjYXJkc2ZhbmJvYkBnbWFpbC5j - b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA1LTEzVDA0OjMwOjM4LjAwMFoi - fSx7ImlkIjoicmVjUmxXRXpsU1M3eFBjTUQiLCJmaWVsZHMiOnsiU2xhY2sg - TmFtZSI6Im5yeW91bmciLCJOb3RlcyI6IkkgZGlkIG5vdCBoYXZlIGVub3Vn - aCBtZW50b3JzIHRoYXQgcmVhbGx5IGhlbHBlZCBteSBwdXNoIG15IGNhcmVl - ciBmb3J3YXJkIGFuZCBJIGFtIGxvb2tpbmcgdG8gXCJwYXkgaXQgZm9yd2Fy - ZFwiLiBJIGhhdmUgd2FudGVkIHRvIHZvbHVudGVlciBteSB0aW1lIGhlbHBp - bmcgdmV0ZXJhbnMgbGlrZSBteXNlbGYgZm9yIHNvbWUgdGltZSBhbmQgSSBm - aW5hbGx5IGZvdW5kIE9wZXJhdGlvbiBDb2RlLCB3aGljaCBzZWVtcyBsaWtl - IGEgZ29vZCBmaXQuIiwiRnVsbCBOYW1lIjoiTmljIFlvdW5nIiwiU2tpbGxz - ZXRzIjpbInJlY1NqcmxzSHRXaDlYV09QIiwicmVjSkJCN1p4VE9NNndMNXci - LCJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVj - Znc3OFZkbkQ3dHBaVnoiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNX - alBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNuUEhEZFdXMUow - NmV2TyIsInJlY2s0bGtPVGtmc01SUGtSIiwicmVjNUZZWFU2alRuWEtQSGci - XSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJNRFQvTVNUIiwiQmlv - IjoiSSBqb2luZWQgdGhlIEFybXkgaW4gMjAwNSBhbmQgc2VydmVkIGZvciAz - LjUgeWVhcnMgYXMgaW5mYW50cnkuIEFmdGVyIGdldHRpbmcgb3V0IG9mIHRo - ZSBtaWxpdGFyeSBJIHdlbnQgZGlyZWN0bHkgdG8gc2Nob29sIGFuZCByZWNl - aXZlZCBteSBCYWNoZWxvcnMgb2YgU2NpZW5jZSBpbiBDb21wdXRlciBTY2ll - bmNlIGZyb20gdGhlIFVuaXZlcnNpdHkgb2YgQ29sb3JhZG8gYXQgRGVudmVy - IGluIDIwMTQuIER1cmluZyBteSBzZW5pb3IgeWVhciBhdCBVbml2ZXJzaXR5 - IEkgZ290IGEgZnVsbCB0aW1lIHBvc2l0aW9uIGFzIGEgU29mdHdhcmUgRW5n - aW5lZXIgbW9zdGx5IHVzaW5nIFB5dGhvbi4gSSBhbSBub3cgZW1wbG95ZWQg - ZnVsbCB0aW1lIGFzIGEgRnVsbCBTdGFjayBFbmdpbmVlciBhdCBhIHNvZnR3 - YXJlIGNvbnN1bHRhbmN5IGJhc2VkIG91dCBvZiBOWUMgY2FsbGVkIFBvc3Rs - aWdodC4gSSBhbSBtb3N0bHkgd3JpdGluZyBFUzYgYW5kIFJlYWN0LCBidXQg - SSBhbSBjb21mb3J0YWJsZSB1cCBhbmQgZG93biB0aGUgc3RhY2sgb2YgYW4g - YXBwbGljYXRpb24uIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0 - emdUR29ReXkyRlZNQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9s - Q3hzdldCdUYiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY04wbEo0NkJZbnNJ - OHo5Il0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY2lFUzVEcDVzUjVVaVREIiwi - cmVjOGc5RFdSaGZjRmhMZ2wiXSwiRW1haWwiOiJucnlvdW5nQGdtYWlsLmNv - bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDYtMDJUMTg6MjU6MDUuMDAwWiJ9 - LHsiaWQiOiJyZWNUUW80Q2JLZ2RtVDlYdiIsImZpZWxkcyI6eyJTbGFjayBO - YW1lIjoiZGF2aWRfdGh1cmVzb24iLCJGdWxsIE5hbWUiOiJEYXZpZCBUaHVy - ZXNvbiIsIlNraWxsc2V0cyI6WyJyZWNld2YxakxjTzFRbFZmWSIsInJlY0U2 - R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNhb0V4MXEw - UVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVjQ1ZjN3Uza0NPTmhK - ZkYiLCJyZWNqMm9tZHU3V25JWExKayIsInJlYzVGWVhVNmpUblhLUEhnIl0s - IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJEYXZpZC5HLlRodXJlc29uQGdtYWls - LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTI6NDguMDAw - WiJ9LHsiaWQiOiJyZWNWMHFKRDI4a2kyUThrciIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoiSGVsaW8gQ29sYSIsIkZ1bGwgTmFtZSI6IkhlbGlvIENvbGEi - LCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNFNkdHa0w0 - dzJUNnBuQyIsInJlYzlsbkhaYUR0MkN2VnJaIiwicmVjcW15Q1dqUFNBcWdD - b3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZaQWJOZlBTcExyIl0s - IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJoZWxpby5jb2xhQGdtYWlsLmNvbSJ9 - LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6MjUuMDAwWiJ9LHsi - aWQiOiJyZWNXUHl4clkyUUtBa1BWTCIsImZpZWxkcyI6eyJTbGFjayBOYW1l - IjoibWlrZXJvZF9zZCIsIkZ1bGwgTmFtZSI6Ik1pY2hhZWwgUm9kcmlndWV6 - IiwiU2tpbGxzZXRzIjpbInJlY3lHNnNjRVR0eFp1VE54Il0sIkFjdGl2ZSI6 - dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjVjJvcGpBclNYVWtNODUiLCJy - ZWN3NXlKZFdJcDZ0OUx3ZyJdLCJFbWFpbCI6InJvZHJpZ3Vlem1sQGdtYWls - LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTBUMjI6NDY6MDAuMDAw - WiJ9LHsiaWQiOiJyZWNaSUV4Vno3eWhLdGZhOCIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoiamhhbXB0b24iLCJOb3RlcyI6Im9wZW4gdG8gaGVscGluZyBh - bnlvbmUgdy8gSFRNTC9DU1MgdG9vXG4iLCJBc3NpZ25tZW50cyI6WyJyZWNY - SGRYVjExMEZTTUJxdCJdLCJGdWxsIE5hbWUiOiJKb2huIEhhbXB0b24iLCJT - a2lsbHNldHMiOlsicmVjSkJCN1p4VE9NNndMNXciLCJyZWNrNGxrT1RrZnNN - UlBrUiIsInJlYzVGWVhVNmpUblhLUEhnIl0sIk1heCBNZW50ZWVzIjoxLCJX - aGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkVTVCIsIkhvdyBtYW55IGhv - dXJzIHdvdWxkIHlvdSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8i - OiI0IiwiQmlvIjoiSSdtIGFuIEFybXkgdmV0ZXJhbiBvZiA3IHllYXJzIChh - Y3RpdmUtZHV0eSBlbmxpc3RlZCwgNjhLIE1lZGljYWwgTGFib3JhdG9yeSkg - d2hvIHN3aXRjaGVkIGNhcmVlcnMgYWZ0ZXIgc2VwYXJhdGluZyBhbmQgaGF2 - ZSBiZWVuIHdvcmtpbmcgYXMgYSBmdWxsLXRpbWUgZGV2ZWxvcGVyIHNpbmNl - IG1pZC0yMDE1LiAgSSBmb3VuZCBPcGVyYXRpb24gQ29kZSBzaG9ydGx5IGJl - Zm9yZSB0aGVuLCBhbmQgdGhleSd2ZSBiZWVuIGEgY29uc2lzdGVudCBzb3Vy - Y2Ugb2Ygc3VwcG9ydCB0aHJvdWdob3V0LiAgSSdtIGxvb2tpbmcgdG8gZ2l2 - ZSBiYWNrIGFuZCBoZWxwIG90aGVyIHZldGVyYW5zIHdobyBhcmUgdHJ5aW5n - IHRvIGJyZWFrIGludG8gdGhpcyBpbmR1c3RyeS4gIFdoaWxlIEkgYXR0ZW5k - ZWQgYSAxMi13ZWVrIGZyb250LWVuZCBib290Y2FtcCwgSSBhbHNvIGNvbnNp - ZGVyIG15c2VsZiBhIHNlbGYtdGF1Z2h0IGRldmVsb3Blci4gIEkgd29yayBt - b3N0bHkgdy8gSmF2YXNjcmlwdCAvIFR5cGVzY3JpcHQgLyBBbmd1bGFyIGZy - b250LWVuZCBzdGFjaywgYnV0IGFsc28gaGF2ZSBleHBlcmllbmNlIHcvIFJl - YWN0LCBFbWJlciwgYW5kIHZhcmlvdXMgb3RoZXIgZnJvbnQtZW5kLWlzaCBz - dHVmZi4gV291bGQgcHJlZmVyIHRvIG1lbnRvciBhbnlvbmUgd2hvIGhhcyBh - IHN0cm9uZyBkZXNpcmUgdG8gZm9jdXMgb24gSmF2YXNjcmlwdCAoZnJvbnQt - ZW5kIG9yIGJhY2stZW5kKS4iLCJBY3RpdmUiOnRydWUsIlNxdWFkcyI6WyJy - ZWNzSzd2alc1OW0wRW11VCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWN2RXNI - MFdLd2ZPSXZhdCIsInJlYzNTcDlQNWdUZ01GZHViIiwicmVjRnpVaEJPMEtZ - NDk2aHkiLCJyZWNYNks3RTR5ZE8wWWpQeSIsInJlY3BJbzZJbm9DcUNLem5q - IiwicmVjREZqRjVLVEJ5a25MMmoiLCJyZWN0TElKRnFqVlM2V2hwTSIsInJl - Y1A5M1ZVZVlleWhyTlZ6IiwicmVjVHpiUUltbFlzQmkxTTYiLCJyZWNJMGVU - SHhkb0FPc0tqUSJdLCJFbWFpbCI6ImpvaG5fal9oYW1wdG9uQHlhaG9vLmNv - bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYtMTItMDJUMDM6MDU6MTkuMDAwWiJ9 - LHsiaWQiOiJyZWNiNllFS1phQktBeXQ4eSIsImZpZWxkcyI6eyJTbGFjayBO - YW1lIjoiS2VuIE11Z3JhZ2UiLCJGdWxsIE5hbWUiOiJLZW4gTXVncmFnZSIs - IlNraWxsc2V0cyI6WyJyZWM1RllYVTZqVG5YS1BIZyIsInJlY2FvRXgxcTBR - UnB2Y2FSIiwicmVjU2pybHNIdFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjMs - IkFjdGl2ZSI6dHJ1ZSwiRW1haWwiOiJrbXVncmFnZUBnbWFpbC5jb20ifSwi - Y3JlYXRlZFRpbWUiOiIyMDE4LTA0LTExVDAwOjI5OjMzLjAwMFoifSx7Imlk - IjoicmVjY0tyRWMwdzg4ZlNzN1ciLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6 - Im1vbGphYyIsIkZ1bGwgTmFtZSI6Ik1pbGplbmtvIEN2amV0a28iLCJTa2ls - bHNldHMiOlsicmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNKQUN4a1p1SFRaU1Uy - aiIsInJlY1NqcmxzSHRXaDlYV09QIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJy - ZWNTeTRIbUlHdElMcVpSdiIsInJlY09mR3k5dE1lVXdqTjc4IiwicmVjWTBH - MjhESW5hZkJ4Z1QiLCJyZWNVVjlETEVvSzFKcVJWOSIsInJlY0NWYzd1M2tD - T05oSmZGIiwicmVjTTlrYjNTYXpGNDY2eG8iLCJyZWNDS3JQbkhEcU9kbGhB - ZyJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkNFVCAiLCJCaW8i - OiIrIE1pY3Jvc29mdCBGVEUgKFhhbWFyaW4gVGVhbSAtIENvbXBvbmVudHMg - VGVhbSkgc2luY2UgMjAxNi4wNy4wMVxuKyBYYW1hcmluIEludGVybmF0aW9u - YWwgQ29udHJhY3RvciBzaW5jZSAyMDE0LjAxXG4rIG93bmVyIG9mIHNtYWxs - IGJ1c2luZXNzIChIb2xpc3RpY1dhcmUpIC0gdXNlZCB0byB3b3JrIGZvciBY - YW1hcmluIGFzIGludGVybmF0aW9uYWwgY29udHJhY3RvclxuKyBmdWxsIHN0 - YWNrIGRldmVsb3BlciAoLk5FVCwgQyMsIFhhbWFyaW4uKiwgQVNQLm5ldCBD - b3JlKVxuKyB2ZXRlcmFuIChDcm9hdGlhbiBQb2xpY2UgYW5kIEFybXkgMTk5 - MS0xOTkzKSBtaWxpdGFyeSBzZXJ2aWNlIDMrIHllYXJzXG4rIHRyeWluZyB0 - byBoZWxwIGxvY2FsIHZldGVyYW4gY29tbXVuaXR5IGluIENyb2F0aWEgc28g - SSBzZWFyY2hlZCBhcm91bmQgYW5kIGpvaW5lZCBPcGVyYXRpb25Db2RlIGNv - cyBJIG1pZ2h0IGJlIGhlbHBmdWxsXG4rIHByZWZlcmVuY2VzIC0gLk5FVCBz - dGFjayAoSSByZWFkIGphdmEgYW5kIG9iamMtYywgYnV0IG5vdCB3cml0ZSks - IEMvQysrIGlzIGEgYml0IHJ1c3R5IChsYXRlIDE5OTBzKSIsIkFjdGl2ZSI6 - dHJ1ZSwiU2VydmljZXMiOlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThz - MTRxR0poSGVPQyIsInJlY3hEcnBGTDl3NXROemtXIiwicmVjS0xSVW9sQ3hz - dldCdUYiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjSDF1T2J2aG1RdzZCQmci - LCJyZWNUeDRmV2R5V0E1WGlBVCIsInJlY3VsNHdIMGZVWHBja3U1IiwicmVj - QUJhTWV0UUdCMldzcjQiLCJyZWNldnRBM0xhWVpNcVNJMiJdLCJFbWFpbCI6 - Im1jdmpldGtvQGhvbGlzdGljd2FyZS5jb20iLCJDb2RlIG9mIENvbmR1Y3Qg - QWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVh - dGVkVGltZSI6IjIwMTctMTItMjBUMjA6MTI6NDEuMDAwWiJ9LHsiaWQiOiJy - ZWNlQmVUeXVXbExmQXBIQiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2F0 - b3JxdWUiLCJOb3RlcyI6IklmIHlvdSB3YW50IHRvIGxlYXJuIEMsIEMrKywg - Q01ha2UsIExpbnV4LCBHaXQsIGVtYmVkZGVkIGRldmljZXMsIGNvbXBpbGVy - cywgb3IgT09QIGNvbmNlcHRzIEkgY2FuIGhlbHAgeW91IG91dC4gSWYgeW91 - IGFyZSB0YWtpbmcgQ1M1MCBmcm9tIGVkWCAtIEkgY2FuIGhlbHAgeW91IHdp - dGggeW91ciBhc3NpZ25tZW50cyAod2l0aG91dCBnaXZpbmcgdGhlIGFuc3dl - cnMpLiIsIkFzc2lnbm1lbnRzIjpbInJlY0lNRW80dTlJeGNld3o4Il0sIkZ1 - bGwgTmFtZSI6IlJ5YW4gTGluZGVtYW4iLCJTa2lsbHNldHMiOlsicmVjRko5 - RlhFNnp4cmQ5aTQiLCJyZWNvc1J2aUxvQkNnaDZUcSIsInJlY2w4VndvMnh1 - RmlFckp5Il0sIk1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUg - eW91IGluPyI6Ik1TVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlvdSBsaWtl - IHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiIyMCIsIkJpbyI6IkknbSBh - IGxhcmdlbHkgc2VsZiB0YXVnaHQgcHJvZ3JhbW1lciB3aXRoIGEgQlMgaW4g - Q29tcHV0ZXIgU2NpZW5jZSBhbmQgTVMgaW4gQ29tcHV0ZXIgRW5naW5lZXJp - bmcuIEkgY3VycmVudGx5IHdvcmsgZm9yIENBIEVuZ2luZWVyaW5nIHByb3Zp - ZGluZyB3aXJlbGVzcyAoODAyLjExLCBaaWdiZWUsIEJsdWV0b290aCwgZXRj - KSBjb25zdWx0aW5nIHNlcnZpY2VzIG1haW5seSBmb3IgUXVhbENvbW0gQXRo - ZXJvcyBjdXN0b21lcnMuXG5JIGxvdmUgaGVscGluZyBwZW9wbGUgbGVhcm4g - dG8gcHJvZ3JhbSBhbmQgaW1wb3J0YW50IGNvbmNlcHRzIGxpa2UgZGF0YSBz - dHJ1Y3R1cmVzLCB0aHJlYWRpbmcsIGFyY2hpdGVjdHVyZSwgYW5kIGFsZ29y - aXRobXMuIEluIG15IHNwYXJlIHRpbWUgSSBsaWtlIHRvIHJlYWQsIHN0dWR5 - IG5ldyBwcm9ncmFtbWluZyBjb25jZXB0cywgYW5kIHdyaXRlIGNvbXB1dGVy - IGdhbWVzIChBbmRyb2lkIGFuZCBkZXNrdG9wKS4iLCJBY3RpdmUiOnRydWUs - Ik1lbnRvciBSZXF1ZXN0IjpbInJlY2I1RG5VanlESVM0U1JWIl0sIkVtYWls - IjoicnlhbmxpbmRlbWFuQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIw - MTYtMTItMjFUMDI6NTM6NTYuMDAwWiJ9LHsiaWQiOiJyZWNlR0tGUkF4WmEw - WkhOZiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZW1tYWRzdXJnZW9uIiwi - RnVsbCBOYW1lIjoiRW1tYW51ZWwgSWRlaGFuIiwiU2tpbGxzZXRzIjpbInJl - Y29zUnZpTG9CQ2doNlRxIiwicmVjbDhWd28yeHVGaUVySnkiLCJyZWNJbXJv - V25kNnAwMmFYdSIsInJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjVVY5RExFb0sx - SnFSVjkiLCJyZWNXQkxmWkFiTmZQU3BMciIsInJlY1kwRzI4REluYWZCeGdU - IiwicmVjajJvbWR1N1duSVhMSmsiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6 - ImVtbWFudWVsLmlkZWhlbkBtdnN1LmVkdSJ9LCJjcmVhdGVkVGltZSI6IjIw - MTgtMDMtMjRUMTk6MTQ6MDcuMDAwWiJ9LHsiaWQiOiJyZWNmdE5pRDkxSGhq - OTUwNiIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZ2VvcmdlbWF1ZXIiLCJB - c3NpZ25tZW50cyI6WyJyZWNnUDM3VDFRVjRJdkZseSIsInJlY2NxbTFObUdS - MW10TXBhIl0sIkZ1bGwgTmFtZSI6Ikdlb3JnZSBNYXVlciIsIlNraWxsc2V0 - cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2cG5DIiwi - cmVjTk9OSjhTMXAxVGpmS1YiLCJyZWNmS3g4Y3JncmpNTXZTayIsInJlY25Q - SERkV1cxSjA2ZXZPIiwicmVjcW15Q1dqUFNBcWdDb3AiLCJyZWNrNGxrT1Rr - ZnNNUlBrUiIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjU3ppY0VzWVhHNFAx - QTQiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY2Z3NzhWZG5EN3RwWlZ6Il0s - Ik1heCBNZW50ZWVzIjoyLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6 - IkNlbnRyYWwiLCJIb3cgbWFueSBob3VycyB3b3VsZCB5b3UgbGlrZSB0byBt - ZW50b3IgZm9yLCBwZXIgbW9udGg/IjoiMTAiLCJCaW8iOiJJJ20gRGlyZWN0 - b3Igb2YgRGV2ZWxvcG1lbnQgYXQgU3VyZ2UgQ29uc3VsdGluZy4gSSB3cml0 - ZSBjb2RlIGZ1bGwgdGltZSBhbmQgc3BlYWssIG1lbnRvciwgYW5kIHdyaXRl - IG9uIGFsbCBzb3J0cyBvZiB0b3BpY3MgaW4gdGhlIGRldmVsb3BtZW50IHNw - YWNlIGxhcmdlbHkgZm9jdXNpbmcgb24gSmF2YXNjcmlwdCwgU29mdHdhcmUg - QXJjaGl0ZWN0dXJlLCBUZXN0aW5nLCBGdW5jdGlvbmFsIFByb2dyYW1taW5n - LCBhbmQgVGVhY2hpbmcuIEknbSBhIG1lbnRvciBhbmQgZ3Vlc3QgbGVjdHVy - ZXIgd2l0aCBPcGVyYXRpb24gU3BhcmsgYW5kIG9jY2FzaW9uYWxseSB0aGUg - VGVjaCBUYWxlbnQgU291dGggY29kZSBjYW1wcy4gSSBsb3ZlIHRhbGtpbmcg - YWJvdXQgdGhpcyBzdHVmZi4gSSdtIG5vdCBhIHZldCBidXQgaGFwcHkgdG8g - aGVscCBvdXQuIiwiQWN0aXZlIjp0cnVlLCJNZW50b3IgUmVxdWVzdCI6WyJy - ZWNMM2hNM0VMSUhRanRwRCIsInJlY1BNNzVmSU9QZlhSNTFtIiwicmVjOE9Z - dTZGOG45TzJwYnYiLCJyZWNxVnU0NVhmZk9JNDhRNSIsInJlY3Y1WmdsNFdx - RjlSWHFyIiwicmVjZ3ZtVU9yZmJQNzN3STUiLCJyZWNhSzFSbW1Ud1BidFFj - aCIsInJlY3dlVXlDcjQybDVzc3JOIiwicmVjQlZiMFplZ1VjR21MbW4iLCJy - ZWNkNGhXNzNYcG9TZ1dWcSJdLCJFbWFpbCI6ImdtYXVlckBnbWFpbC5jb20i - fSwiY3JlYXRlZFRpbWUiOiIyMDE3LTAyLTEyVDE4OjU2OjMyLjAwMFoifSx7 - ImlkIjoicmVjaVpJMU9tQlpDZHVqQzUiLCJmaWVsZHMiOnsiU2xhY2sgTmFt - ZSI6ImNhZXNhcmFydW0iLCJGdWxsIE5hbWUiOiJQZXRlciBQb29sZSIsIlNr - aWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2R0drTDR3MlQ2 - cG5DIiwicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNhb0V4MXEwUVJwdmNhUiIs - InJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiQWN0 - aXZlIjp0cnVlLCJFbWFpbCI6InBldGVyLmoucG9vbGVAZ21haWwuY29tIn0s - ImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNFQxOToxNDowMy4wMDBaIn0seyJp - ZCI6InJlY2paRDhmcXVnWDhjMnkzIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUi - OiJidXNoaWRvY29kZXMiLCJGdWxsIE5hbWUiOiJTZWFuIE1jQnJpZGUiLCJT - a2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhEZFdXMUow - NmV2TyIsInJlY0U2R0drTDR3MlQ2cG5DIiwicmVjNUZZWFU2alRuWEtQSGci - LCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29wIiwicmVj - azRsa09Ua2ZzTVJQa1IiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY1dCTGZa - QWJOZlBTcExyIl0sIk1heCBNZW50ZWVzIjoyLCJBY3RpdmUiOnRydWUsIkVt - YWlsIjoic3BtY2JyaWRlMTIwMUBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi - OiIyMDE4LTA0LTExVDIwOjQyOjQzLjAwMFoifSx7ImlkIjoicmVjbGdBNGRn - Z20zMGIyV1EiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6IkouVC4iLCJGdWxs - IE5hbWUiOiJKb2huIEtub3giLCJTa2lsbHNldHMiOlsicmVjSkJCN1p4VE9N - NndMNXciLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY3FteUNXalBTQXFnQ29w - IiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJB - Y3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY2syMEtURkFBQm82 - QmUxIl0sIkVtYWlsIjoianRrbm94OTFAZ21haWwuY29tIn0sImNyZWF0ZWRU - aW1lIjoiMjAxOC0wMy0xOVQxMjowNzo0Ny4wMDBaIn0seyJpZCI6InJlY29B - QjlOY0R3bEJnSGtqIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJtYWNrc29s - ZCIsIkZ1bGwgTmFtZSI6Ik1hcmsgU29sZGF2aW5pIiwiU2tpbGxzZXRzIjpb - InJlY1NqcmxzSHRXaDlYV09QIiwicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF - NkdHa0w0dzJUNnBuQyIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjTk9OSjhT - MXAxVGpmS1YiLCJyZWNhb0V4MXEwUVJwdmNhUiIsInJlY0NWYzd1M2tDT05o - SmZGIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUgYXJl - IHlvdSBpbj8iOiJFU1QiLCJCaW8iOiJTVU1NQVJJWkVEIFBST0ZFU1NJT05B - TCBFWFBFUklFTkNFXG5JVCBQcm9mZXNzaW9uYWwgd2l0aCBvdmVyIHR3ZW50 - eSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHNvZnR3YXJlIGRldmVsb3BtZW50 - LiBKYXZhIGFuZCBQeXRob24gZGV2ZWxvcGVyIHdpdGggYWRkaXRpb25hbCBz - a2lsbHMgaW4gdGhlIGFyZWFzIG9mIHdlYiBhcHBsaWNhdGlvbiBzZWN1cml0 - eSwgc29mdHdhcmUgZGVzaWduLCBhbmQgdGVhbSBsZWFkZXJzaGlwLiBFeHBl - cmllbmNlZCBpbiBhZ2lsZSBkZXZlbG9wbWVudCBhbmQgYnVpbGRpbmcgcXVh - bGl0eSBzb2Z0d2FyZSB0aHJvdWdoIGEgcHJvY2VzcyB0aGF0IGluY2x1ZGVz - IHVuaXQgdGVzdGluZyBhbmQgY29udGludW91cyBpbnRlZ3JhdGlvbi4gRm91 - ci15ZWFyIHRvdXIgaW4gdGhlIFVTIEFybXkgSW5mYW50cnkgZGV2ZWxvcGVk - IGxlYWRlcnNoaXAgYW5kIHRyYWluaW5nIHNraWxscy5cblxuSSBhbSBoZXJl - IGJlY2F1c2UgSSB3YXMgYSBncnVudCB0aGF0IGxlYXJuZWQgdG8gY29kZSAy - MCB5ZWFycyBhZ28uIEkga25vdyB0aGUgdHJhbnNpdGlvbiBjYW4gYmUgZG9u - ZSBhbmQgd291bGQgbGlrZSB0byB0cnkgYW5kIGhlbHAgb3RoZXJzLiBJIGFt - IGluIHRoZSBEQyBhcmVhLiIsIkFjdGl2ZSI6dHJ1ZSwiU2VydmljZXMiOlsi - cmVjcnk4czE0cUdKaEhlT0MiLCJyZWNLTFJVb2xDeHN2V0J1RiIsInJlYzNa - UU1DUXNLUEtsRTJDIiwicmVjTjBsSjQ2Qlluc0k4ejkiXSwiRW1haWwiOiJt - YWNrc29sZEB5YWhvby5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA3LTAz - VDE0OjE4OjU4LjAwMFoifSx7ImlkIjoicmVjb29aT0NQWjVtUjZBUnAiLCJm - aWVsZHMiOnsiU2xhY2sgTmFtZSI6Im1pa2VvZXJ0bGkiLCJGdWxsIE5hbWUi - OiJNaWtlIE9lcnRsaSIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZU - cSIsInJlYzVGWVhVNmpUblhLUEhnIl0sIldoYXQgdGltZSB6b25lIGFyZSB5 - b3UgaW4/IjoiTVNUIiwiQmlvIjoiSSdtIGEgamF2YSBkZXZlbG9wZXIgd2l0 - aCBhIHN0cm9uZyBpbnRlcmVzdCBpbiBzbWFsbCBidXNpbmVzcyBvcGVyYXRp - b25zLiBJIHdvcmsgZm9yIGEgc21hbGwgRG9EIGNvbnRyYWN0IHNob3AgaW4g - RGVudmVyLCBoYXBweSB0byBoZWxwIGhvd2V2ZXIgSSBjYW4hIiwiQWN0aXZl - Ijp0cnVlLCJTZXJ2aWNlcyI6WyJyZWNyeThzMTRxR0poSGVPQyIsInJlY04w - bEo0NkJZbnNJOHo5IiwicmVjM1pRTUNRc0tQS2xFMkMiLCJyZWNLTFJVb2xD - eHN2V0J1RiIsInJlY3R6Z1RHb1F5eTJGVk1DIl0sIkVtYWlsIjoibWlrZW9l - cnRsaUBnbWFpbC5jb20iLCJDb2RlIG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0 - cnVlLCJHdWlkZWJvb2sgUmVhZD8iOnRydWV9LCJjcmVhdGVkVGltZSI6IjIw - MTctMDgtMTdUMjA6MDU6MDMuMDAwWiJ9LHsiaWQiOiJyZWNxRThabDhGaDRi - bzRQRyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiZnJhbmt5dSIsIkZ1bGwg - TmFtZSI6IkZyYW5rIFl1IiwiU2tpbGxzZXRzIjpbInJlY0ltcm9XbmQ2cDAy - YVh1IiwicmVjVVY5RExFb0sxSnFSVjkiXSwiQWN0aXZlIjp0cnVlLCJFbWFp - bCI6ImZyYW5reXVAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0w - My0yNFQxOToxMzo1OS4wMDBaIn0seyJpZCI6InJlY3FyQWVGeWxqbFd0c1hD - IiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJBc2hsZXkiLCJGdWxsIE5hbWUi - OiJBc2hsZXkgVGVtcGxldCIsIlNraWxsc2V0cyI6WyJyZWN5RzZzY0VUdHha - dVROeCJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNNM3g4TzVOeW0yaEFFTSIs - InJlYzVOdWZHSXc2UExKWGNEIiwicmVjbFd1QU9JelRuMVBydnkiLCJyZWNW - RkxIOG9WeFFQNGVFUiJdLCJFbWFpbCI6ImFzaGxleS50ZW1wbGV0QGdtYWls - LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDItMTNUMTk6NTI6MDkuMDAw - WiJ9LHsiaWQiOiJyZWNzYmx6eVNMRkhPU2wxZiIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoib2hhaXdhbHQiLCJGdWxsIE5hbWUiOiJNYXR0aGV3IFdhbHRl - ciIsIlNraWxsc2V0cyI6WyJyZWNTanJsc0h0V2g5WFdPUCIsInJlY2V3ZjFq - TGNPMVFsVmZZIiwicmVjNUZZWFU2alRuWEtQSGciLCJyZWNmS3g4Y3JncmpN - TXZTayJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IlVUQy00Iiwi - QmlvIjoiRm9ybWVyIE5hdnkgSVQxIHR1cm5lZCBMaW51eCBzeXNhZG1pbiwg - bm93IFNpdGUgUmVsaWFiaWxpdHkgRW5naW5lZXIgYXQgc29jaWFsbHkgY29u - c2Npb3VzIEdvdlRlY2ggc3RhcnR1cCBTZWFtbGVzc0RvY3MuIEFsbCB0aGlu - Z3MgY29udGFpbmVycywgbW9uaXRvcmluZywgYXV0b21hdGlvbiwgY2xvdWQs - IGluZnJhc3RydWN0dXJlLCBzZWN1cml0eSwgYW5kIHNhZmUgc3lzdGVtcy5c - blxuSW50ZXJlc3RlZCBpbiBoZWxwaW5nIG91dCBmZWxsb3cgdmV0ZXJhbnMg - YW5kIG1ha2luZyB0aGUgdHJhbnNpdGlvbiBlYXNpZXIsIHNpbmNlIG1pbmUg - d2FzIHByZXR0eSByb3VnaCBhbmQgSSBhbSB2ZXJ5IGx1Y2t5L2JsZXNzZWQg - dG8gYmUgd2hlcmUgSSBhbSB0b2RheS4iLCJBY3RpdmUiOnRydWUsIlNlcnZp - Y2VzIjpbInJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjcnk4czE0cUdKaEhlT0Mi - LCJyZWN4RHJwRkw5dzV0TnprVyIsInJlY0tMUlVvbEN4c3ZXQnVGIiwicmVj - TjBsSjQ2Qlluc0k4ejkiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaG1QMzZw - S1dJOHFETGoiXSwiRW1haWwiOiJvaGFpd2FsdEBnbWFpbC5jb20iLCJDb2Rl - IG9mIENvbmR1Y3QgQWNjZXB0ZWQ/Ijp0cnVlLCJHdWlkZWJvb2sgUmVhZD8i - OnRydWV9LCJjcmVhdGVkVGltZSI6IjIwMTctMDgtMThUMTY6MDQ6NTcuMDAw - WiJ9LHsiaWQiOiJyZWN1eFVicVBlckx4Z29GZSIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoiemRpZWhsaW8iLCJGdWxsIE5hbWUiOiJaYWNoYXJ5IEwgRGll - aGwiLCJTa2lsbHNldHMiOlsicmVjQkloRGR1SkQzWUxhSHEiLCJyZWNuUEhE - ZFdXMUowNmV2TyIsInJlY1VWOURMRW9LMUpxUlY5IiwicmVjYW9FeDFxMFFS - cHZjYVIiLCJyZWNrNGxrT1RrZnNNUlBrUiJdLCJNYXggTWVudGVlcyI6NSwi - RW1haWwiOiJ6YWNoYXJ5LmRpZWhsQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGlt - ZSI6IjIwMTgtMDQtMjZUMTY6NDU6NTcuMDAwWiJ9LHsiaWQiOiJyZWN2VUt5 - NkpsQ1RIR0NaaSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiYXVicmV5Iiwi - RnVsbCBOYW1lIjoiQXVicmV5IEFyY2FuZ2VsIiwiU2tpbGxzZXRzIjpbInJl - Y0pCQjdaeFRPTTZ3TDV3IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWM1RllY - VTZqVG5YS1BIZyJdLCJBY3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0Ijpb - InJlY003Qm52Nmg5a1AxaEFiIl0sIkVtYWlsIjoiYWFyY2FuZ2VsQGdtYWls - LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDMtMjRUMTk6MTM6NTEuMDAw - WiJ9LHsiaWQiOiJyZWN3TFBnRDlURlRENDFkUiIsImZpZWxkcyI6eyJTbGFj - ayBOYW1lIjoiaU9TVG9tIiwiRnVsbCBOYW1lIjoiVGhvbWFzIiwiU2tpbGxz - ZXRzIjpbInJlY29zUnZpTG9CQ2doNlRxIiwicmVjV0JMZlpBYk5mUFNwTHIi - LCJyZWNZMEcyOERJbmFmQnhnVCIsInJlY3lHNnNjRVR0eFp1VE54Il0sIk1h - eCBNZW50ZWVzIjoxLCJBY3RpdmUiOnRydWUsIkVtYWlsIjoidGhvbWFzLm1h - cmxlckBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI2VDE0 - OjI1OjUyLjAwMFoifSx7ImlkIjoicmVjeFlPMWpxTDRIV25KYkkiLCJmaWVs - ZHMiOnsiU2xhY2sgTmFtZSI6Im1zY290dCIsIkZ1bGwgTmFtZSI6Ik1pY2hh - ZWwgSyBTY290dCIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZUcSIs - InJlY2Z3NzhWZG5EN3RwWlZ6IiwicmVjYW9FeDFxMFFScHZjYVIiLCJyZWNx - bXlDV2pQU0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjNUZZWFU2 - alRuWEtQSGciXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6Im1pY2hhZWwua2Vs - bHkuc2NvdHRAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0y - NlQwNjoxMTo0Ni4wMDBaIn0seyJpZCI6InJlY3hiZVQxRGF6TGRaMkk4Iiwi - ZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJqcmFtZXMiLCJOb3RlcyI6IkkgYW0g - YWxyZWFkeSBtZW50b3JpbmcgUm9uIFJpaG9vLiAgSG9wZWZ1bGx5IEkgd2ls - bCBoYXZlIG1vcmUgYmFuZHdpZHRoIGluIHRoZSBmdXR1cmUsIGJ1dCBjdXJy - ZW50bHkgbXkgaGFuZHMgYXJlIHByZXR0eSBmdWxsIHdpdGggUm9uIGFuZCBz - b21lIG90aGVycyBJIHN0YXJ0ZWQgaGVscGluZyByZWNlbnRseS4iLCJBc3Np - Z25tZW50cyI6WyJyZWNNcVFCOFVRUFlIZVk3MCJdLCJGdWxsIE5hbWUiOiJK - ZWZmIFJhbWVzIiwiU2tpbGxzZXRzIjpbInJlY1kwRzI4REluYWZCeGdUIiwi - cmVjNUZZWFU2alRuWEtQSGciLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY2Fv - RXgxcTBRUnB2Y2FSIl0sIk1heCBNZW50ZWVzIjoxLCJXaGF0IHRpbWUgem9u - ZSBhcmUgeW91IGluPyI6IkNTVCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv - dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI1IiwiQmlvIjoi - SSBoYXZlIHdvcmtlZCBhdCBhIGZvcnR1bmUgNTAgY29tcGFueSwgYSAyIHBl - cnNvbiBjb25zdWx0aW5nIGZpcm0sIGFuZCBjdXJyZW50bHkgYSBzbWFsbCBi - dXNpbmVzcyBhYm91dCBhYm91dCAxMDAgZW1wbG95ZWVzLiAgSSBjdXJyZW50 - bHkgd29yayBvbiBpT1MgbWVkaWNhbCBlbnRlcnByaXNlIHNvZnR3YXJlLiAg - SSBhbHNvIGRvIHdyaXRpbmcgYW5kIHRlY2huaWNhbCBlZGl0aW5nIGZvciBh - IHR1dG9yaWFsIHNpdGUsIHJheXdlbmRlcmxpY2guY29tLlxuXG5JJ20gYWx3 - YXlzIGhhcHB5IHRvIGhlbHAgcGVvcGxlIHRoYXQgYXJlIHN0YXJ0aW5nIG91 - dCwgYW5kIG9ubHkgcmVjZW50bHkgcmVhbGl6ZWQgSSBzaG91bGQgbG9vayBm - b3Igb2ZmaWNpYWwgbWVudG9yaW5nIG9wcG9ydHVuaXRpZXMuIFNvbWVvbmUg - bWVudGlvbmVkIE9wZXJhdGlvbiBDb2RlLCBhbmQgSSB3YXMgaW1tZWRpYXRl - bHkgaW50ZXJlc3RlZC4gIEkgbGlrZSB0aGUgaWRlYSBvZiBnaXZpbmcgYmFj - ayB0byBhIGNvbW11bml0eSB0aGF0IGhhcyBnaXZlbiBzbyBtdWNoIGZvciBv - dXIgY291bnRyeS5cblxuSSdtIGJlc3QgcG9zaXRpb25lZCB0byBoZWxwIHBl - b3BsZSBpbnRlcmVzdGVkIGluIG1vYmlsZSBhcHBsaWNhdGlvbiBkZXZlbG9w - bWVudC4gIENhcmVlciBndWlkYW5jZSBpcyBhbHNvIGFub3RoZXIgYXJlYSB3 - aGVyZSBJIGNhbiBwcm92aWRlIHNvbWUgaGVscCwgcGFydGljdWxhcmx5IHRv - IHRob3NlIGVhcmx5IGluIHRoZWlyIGNhcmVlcnMuICAiLCJBY3RpdmUiOnRy - dWUsIk1lbnRvciBSZXF1ZXN0IjpbInJlY0lJdVpWZjBROW1SY2hMIl0sIkVt - YWlsIjoianJhbWVzQGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTYt - MTItMThUMTg6NTk6NDQuMDAwWiJ9LHsiaWQiOiJyZWN5R0dTb3ZUcnVsNDAx - WSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiTWJhY2giLCJBc3NpZ25tZW50 - cyI6WyJyZWNDV0ZobVNGd1J2VkpvSSJdLCJGdWxsIE5hbWUiOiJNYXR0aGV3 - IEJhY2giLCJTa2lsbHNldHMiOlsicmVjZXdmMWpMY08xUWxWZlkiLCJyZWNF - NkdHa0w0dzJUNnBuQyIsInJlY1R1N3Q1TTBWaUlMbTVBIiwicmVjU2pybHNI - dFdoOVhXT1AiXSwiTWF4IE1lbnRlZXMiOjIsIldoYXQgdGltZSB6b25lIGFy - ZSB5b3UgaW4/IjoiRWFzdGVybiIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlv - dSBsaWtlIHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiI4IiwiQmlvIjoi - V291bGQgcHJlZmVyIHNvbWVvbmUgd2hvIGlzIGVhZ2VyIHRvIHByb2JsZW0g - c29sdmUgd2l0aCBQeXRob24gYXMgYW4gYXV0b21hdGlvbiBsYW5ndWFnZS4g - VGhpcyBpcyBsaWtlbHkgd2hlcmUgSSBjYW4gYmUgdGhlIG1vc3QgaGVscCwg - YnV0IEknbSB3aWxsaW5nIHRvIHRha2Ugb24gYW55b25lIHdobydzIGludGVy - ZXN0ZWQuICIsIkFjdGl2ZSI6dHJ1ZSwiU3F1YWRzIjpbInJlY0k0aUhwVVBq - a2RuclVnIl0sIk1lbnRvciBSZXF1ZXN0IjpbInJlY0ZmV29lbFpqS2NUT2Iw - Il0sIkVtYWlsIjoibWJhY2gwNEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUi - OiIyMDE3LTAxLTAyVDE2OjMwOjQ2LjAwMFoifV19 - http_version: - recorded_at: Sun, 29 Apr 2018 23:16:23 GMT -- request: - method: get - uri: http://api.airtable.com/v0/some_random_id/Services - body: - encoding: US-ASCII - string: '' - headers: - Authorization: - - Bearer some_random_key - response: - status: - code: 301 - message: Moved Permanently - headers: - Content-Type: - - text/html - Date: - - Sun, 29 Apr 2018 23:16:23 GMT - Location: - - https://api.airtable.com/v0/some_random_id/Services - Server: - - Tengine - Content-Length: - - '278' - Connection: - - keep-alive - body: - encoding: UTF-8 - string: "\r\n\r\n301 - Moved Permanently\r\n\r\n

301 Moved - Permanently

\r\n

The requested resource has been assigned a new permanent - URI.

\r\n
Powered by Tengine\r\n\r\n" + WiJ9LHsiaWQiOiJyZWNRSTdlU0FGdlA1TEVoUCIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiZmJyYWRmaWVsZCIsIk5vdGVzIjoiTGlua3MgdG8gQ29kZSBv + ZiBDb25kdWN0IGFuZCBHdWlkZWJvb2sgYmVsb3cgZG9uJ3QgYXBwZWFyIHRv + IHdvcmsgYW55bW9yZSAoZG9jdW1lbnRzIHJlcG8gZG9lc24ndCBleGlzdCku + IiwiRnVsbCBOYW1lIjoiRnJhbmtsaW4gQnJhZGZpZWxkIiwiU2tpbGxzZXRz + IjpbInJlY3lHbmRnVVlra3lQQ3JTIiwicmVjZXdmMWpMY08xUWxWZlkiLCJy + ZWNKQUN4a1p1SFRaU1UyaiIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjcW15 + Q1dqUFNBcWdDb3AiLCJyZWM1RllYVTZqVG5YS1BIZyIsInJlY2FvRXgxcTBR + UnB2Y2FSIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNKSGlWUU5JQzNPTk1X + cyIsInJlY1dCTGZaQWJOZlBTcExyIiwicmVjVHU3dDVNMFZpSUxtNUEiXSwi + V2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJFYXN0ZXJuIiwiQmlvIjoi + SSdtIGEgc2VsZi10YXVnaHQgdGVjaCBwcm9mZXNzaW9uYWwsIGN1cnJlbnRs + eSBlbXBsb3llZCBhcyBSZXNlYXJjaCBFbmdpbmVlciBhdCBHZW9yZ2lhIFRl + Y2ggUmVzZWFyY2ggSW5zdGl0dXRlLCB3aG8ncyBpbnRlcmVzdGVkIGluIHZl + dGVyYW4gb3V0cmVhY2guIE15IHdvcmsgcHJpbWFyaWx5IGNlbnRlcnMgYXJv + dW5kIGRhdGEgc2NpZW5jZSwgbWFjaGluZSBsZWFybmluZywgYW5kIG5hdHVy + YWwgbGFuZ3VhZ2UgcHJvY2Vzc2luZy4gSW4gdGhpcyBjYXBhY2l0eSwgSSB3 + b3JrIG9uIG5vdmVsIHJlc2VhcmNoIGZvciBsYXJnZS1zY2FsZSBkZWZlbnNl + IHN5c3RlbXMgdXNpbmcgYSB3aWRlIGFycmF5IG9mIHRlY2hub2xvZ2llcyB0 + aGF0IGFyZSBrZXkgdG8gdG9kYXkncyBpbmR1c3RyeSwgaW5jbHVkaW5nIFB5 + dGhvbiwgSmF2YSwgSmF2YXNjcmlwdCAvIEhUTUwgLyBDU1MsIERhdGFiYXNl + cyAoTW9uZ29EQiwgTXlTUUwpLCBMaW51eCwgR2l0LCBEb2NrZXIsIGFuZCBt + b3JlLiBcblxuR3JhZHVhdGluZyBmcm9tIEdlb3JnaWEgU3RhdGUgVW5pdmVy + c2l0eSB3aXRoIGRlZ3JlZXMgaW4gQXBwbGllZCBMaW5ndWlzdGljcyBhbmQg + RWNvbm9taWNzIGluIDIwMTQsIG15IGltbWVkaWF0ZSBjYXJlZXIgcHJvc3Bl + Y3RzIHdlcmVuJ3QgdG9vIGdyZWF0IGFzIHVuZGVyZ3JhZHVhdGVzIGZyb20g + dGhlc2UgbWFqb3JzIGFyZSBub3QgdG9vIGhpZ2hseSBzb3VnaHQgb3V0IGlu + IGluZHVzdHJ5LiBCdWlsZGluZyBvbiBhIHN0dWR5IGFicm9hZCBleHBlcmll + bmNlIEkgaGFkIGluIENoaW5hIHdoaWxlIGluIHNjaG9vbCwgSSBkZWNpZGVk + IHRvIG1vdmUgdG8gdGhlIGNvdW50cnkgYWZ0ZXIgZ3JhZHVhdGluZyB0byBi + ZSB3aXRoIG15IGN1cnJlbnQgd2lmZSBhbmQgd29yayBhcyBhbiBFbmdsaXNo + IHRlYWNoZXIuIFRoZXJlIEkgcXVpY2tseSBnb3QgYm9yZWQgdGVhY2hpbmcg + bXkgbmF0aXZlIGxhbmd1YWdlLCBzbyBJIGJyYW5jaGVkIG91dCBpbnRvIG1v + cmUgcXVhbnRpdGF0aXZlIHN1YmplY3RzIHN1Y2ggYXMgc3RhdGlzdGljcyBh + bmQgbWF0aGVtYXRpY3MuIEdldHRpbmcgaW50byBteSBzZWNvbmQgeWVhciB0 + aGVyZSwgSSBkZWNpZGVkIEkgZGlkbid0IHdhbnQgdG8gbWFpbnRhaW4gdGhh + dCBsaWZlc3R5bGUgZm9yZXZlciwgc28gSSBmaW5hbGx5IGNvbW1pdHRlZCB0 + byB0YWtpbmcgb24gYSBjaGFsbGVuZ2UgdGhhdCBoYWQgaW50aW1pZGF0ZWQg + bWUgZm9yIHllYXJzOiB0ZWFjaCBteXNlbGYgcHJvZ3JhbW1pbmcgYW5kIGRh + dGEgc2NpZW5jZSB0byB0aGUgcG9pbnQgb2YgZ2V0dGluZyBoaXJlZCBpbiB0 + aGUgdGVjaCBpbmR1c3RyeS4gTG9uZyBzdG9yeSBzaG9ydCwgYWZ0ZXIgMTgg + bW9udGhzIG9mIGRpbGlnZW5jZSwgbXkgZWZmb3J0cyBwcm92ZWQgd29ydGh3 + aGlsZSB3aGVuIEkgd2FzIGhpcmVkIGZvciBteSBjdXJyZW50IHBvc2l0aW9u + IGluIE9jdC4gMjAxNy4gSGF2aW5nIGdvbmUgZnJvbSBiYXJlbHkgYmVpbmcg + YWJsZSB0byB3cml0ZSBhIHByaW50IHN0YXRlbWVudCB0byBsYW5kaW5nIGEg + c2F0aXNmeWluZyBqb2IgaW4gdGhpcyBmaWVsZCwgSSBrbm93IHdlbGwgdGhl + IGNoYWxsZW5nZXMgYW5kIHJld2FyZHMgdGhhdCBjb21lIHdpdGggbWFraW5n + IHN1Y2ggYSBjYXJlZXIgdHJhbnNpdGlvbi4gXG5cbkFzIHRoZSBncmFuZHNv + biBvZiBhIEtvcmVhbiBXYXIgdmV0LCBhbmQgYSBmcmllbmQgb2Ygc2V2ZXJh + bCBJcmFxIHZldHMsIEkndmUgY29tZSB0byBjb21wcmVoZW5kIHRoZSBleHBl + cmllbmNlcyB0aGF0IHZldGVyYW5zIGZhY2UgYWZ0ZXIgdGhlaXIgc2Vydmlj + ZS4gSSd2ZSB3YW50ZWQgdG8gcmVhY2ggb3V0LCBnZXQgdG8ga25vdywgYW5k + IGhlbHAgdGhpcyBjb21tdW5pdHkgaW4gYW55IHdheSBJIGNvdWxkIGZvciB5 + ZWFycywgYnV0IG5ldmVyIGhhZCB0aGUgY29uZmlkZW5jZSBvciBjb3VyYWdl + IHRvIFwidGFrZSB0aGUgbGVhcFwiLiBOb3Qgd2FudGluZyB0byBiZSBwYXNz + aXZlIGFueSBsb25nZXIgaG93ZXZlciwgSSBzdGFydGVkIHJlc2VhcmNoaW5n + IGNoYXJpdGllcyBhbmQgb3JnYW5pemF0aW9ucyB0aGF0IG9wZXJhdGUgaW4g + dGhpcyBhcmVhLiBTb21lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMgaGF2ZSBj + b21tdW5pdHkgdm9sdW50ZWVyIHByb2dyYW1zIHRoYXQgSSBjb3VsZCBiZSBh + IHBhcnQgb2YsIGJ1dCB3aGVuIEkgZm91bmQgT3BlcmF0aW9uIENvZGUsIEkg + a25ldyBpbW1lZGlhdGVseSB0aGF0IG1lbnRvcmluZyBpbiB0aGlzIHByb2dy + YW0gd291bGQgaGFuZHMtZG93biBiZSB0aGUgaGlnaGVzdCB2YWx1ZSBhY3Rp + dml0eSB0aGF0IEkgaGF2ZSB0byBvZmZlci4gSSdtIHJlYWxseSBleGNpdGVk + IGFib3V0IHRoaXMgY2F1c2UgYW5kIGhvcGUgdG8gY29udHJpYnV0ZSB3aGVy + ZSBJJ20gYWJsZS4gIEkgZmVlbCBteSBiYWNrZ3JvdW5kIGlzIGVzcGVjaWFs + bHkgc3VpdGFibGUgZm9yIHRob3NlIHdpdGggYSBwYXJ0aWN1bGFyIGludGVy + ZXN0IGluIGRhdGEgc2NpZW5jZSAvIG1hY2hpbmUgbGVhcm5pbmcsIGJ1dCBJ + J20gb3BlbiB0byBtZW50b3JpbmcgYW55IGJlZ2lubmVycyB0byB0ZWNoIC8g + cHJvZ3JhbW1pbmcgdGhhdCBhcmUgcGFzc2lvbmF0ZSBhbmQgZWFnZXIgYWJv + dXQgZGl2aW5nIGluLCBtYWtpbmcgdGhpcyB0cmFuc2l0aW9uLCBhbmQgZ2V0 + dGluZyBoaXJlZCB3aXRoIHRoZWlyIG5ldyBza2lsbHMuIiwiU2VydmljZXMi + OlsicmVjdHpnVEdvUXl5MkZWTUMiLCJyZWNyeThzMTRxR0poSGVPQyIsInJl + Y04wbEo0NkJZbnNJOHo5IiwicmVjeERycEZMOXc1dE56a1ciLCJyZWNLTFJV + b2xDeHN2V0J1RiJdLCJFbWFpbCI6ImZicmFkZmllbGQxQGdtYWlsLmNvbSIs + IkNvZGUgb2YgQ29uZHVjdCBBY2NlcHRlZD8iOnRydWUsIkd1aWRlYm9vayBS + ZWFkPyI6dHJ1ZX0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wNS0wM1QwNDo0MTox + MC4wMDBaIn0seyJpZCI6InJlY1FyWnZmU1I0am4zUk5PIiwiZmllbGRzIjp7 + IlNsYWNrIE5hbWUiOiJicmlhbmthaHJzIiwiRnVsbCBOYW1lIjoiQnJpYW4g + S2FocnMiLCJTa2lsbHNldHMiOlsicmVjVVY5RExFb0sxSnFSVjkiLCJyZWM1 + RllYVTZqVG5YS1BIZyIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjdkRHaEdm + UFVLNVV3RzAiXSwiTWF4IE1lbnRlZXMiOjEsIkVtYWlsIjoiYnJpYW4ua2Fo + cnNAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wNC0yM1QxODo1 + Mjo0NC4wMDBaIn0seyJpZCI6InJlY1JsS2N6R0FjTktOMjZHIiwiZmllbGRz + Ijp7IlNsYWNrIE5hbWUiOiJib2Itcm9iIiwiRnVsbCBOYW1lIjoiQm9iIFJv + YmVydHMiLCJTa2lsbHNldHMiOlsicmVjOWxuSFphRHQyQ3ZWcloiXSwiV2hh + dCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJDZW50cmFsIiwiQmlvIjoiSSBo + YXZlIGJlZW4gdXNpbmcgUm9SIGZvciA4IHllYXJzIG5vdyBhbmQgc3RpbGwg + bG92ZSBpdC4gIEkgaGF2ZSBkb25lIHNvbWUgbWVudG9yaW5nIGFuZCBJIGVu + am95IGhlbHBpbmcgb3RoZXJzIGxlYXJuIGFzIG90aGVyIGhhZCBoZWxwZWQg + bWUgaW4gbXkgcGFzdC4iLCJBY3RpdmUiOnRydWUsIlNlcnZpY2VzIjpbInJl + Y3J5OHMxNHFHSmhIZU9DIiwicmVjS0xSVW9sQ3hzdldCdUYiXSwiTWVudG9y + IFJlcXVlc3QiOlsicmVjSzFFa1pTWkNMRkEwMDciLCJyZWNqTUdCOTNjQ1RC + UkFaWSIsInJlYzBXWG53RnUwZ1JuWnI2IiwicmVjRDc4WVVCRUI1QzdsREYi + LCJyZWNNdGg4MkFzVTNubmdTcyJdLCJFbWFpbCI6ImNhcmRzZmFuYm9iQGdt + YWlsLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDUtMTNUMDQ6MzA6Mzgu + MDAwWiJ9LHsiaWQiOiJyZWNSbFdFemxTUzd4UGNNRCIsImZpZWxkcyI6eyJT + bGFjayBOYW1lIjoibnJ5b3VuZyIsIk5vdGVzIjoiSSBkaWQgbm90IGhhdmUg + ZW5vdWdoIG1lbnRvcnMgdGhhdCByZWFsbHkgaGVscGVkIG15IHB1c2ggbXkg + Y2FyZWVyIGZvcndhcmQgYW5kIEkgYW0gbG9va2luZyB0byBcInBheSBpdCBm + b3J3YXJkXCIuIEkgaGF2ZSB3YW50ZWQgdG8gdm9sdW50ZWVyIG15IHRpbWUg + aGVscGluZyB2ZXRlcmFucyBsaWtlIG15c2VsZiBmb3Igc29tZSB0aW1lIGFu + ZCBJIGZpbmFsbHkgZm91bmQgT3BlcmF0aW9uIENvZGUsIHdoaWNoIHNlZW1z + IGxpa2UgYSBnb29kIGZpdC4iLCJGdWxsIE5hbWUiOiJOaWMgWW91bmciLCJT + a2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWNKQkI3WnhUT002 + d0w1dyIsInJlY2V3ZjFqTGNPMVFsVmZZIiwicmVjRTZHR2tMNHcyVDZwbkMi + LCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVj + cW15Q1dqUFNBcWdDb3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY25QSERk + V1cxSjA2ZXZPIiwicmVjazRsa09Ua2ZzTVJQa1IiLCJyZWM1RllYVTZqVG5Y + S1BIZyJdLCJXaGF0IHRpbWUgem9uZSBhcmUgeW91IGluPyI6Ik1EVC9NU1Qi + LCJCaW8iOiJJIGpvaW5lZCB0aGUgQXJteSBpbiAyMDA1IGFuZCBzZXJ2ZWQg + Zm9yIDMuNSB5ZWFycyBhcyBpbmZhbnRyeS4gQWZ0ZXIgZ2V0dGluZyBvdXQg + b2YgdGhlIG1pbGl0YXJ5IEkgd2VudCBkaXJlY3RseSB0byBzY2hvb2wgYW5k + IHJlY2VpdmVkIG15IEJhY2hlbG9ycyBvZiBTY2llbmNlIGluIENvbXB1dGVy + IFNjaWVuY2UgZnJvbSB0aGUgVW5pdmVyc2l0eSBvZiBDb2xvcmFkbyBhdCBE + ZW52ZXIgaW4gMjAxNC4gRHVyaW5nIG15IHNlbmlvciB5ZWFyIGF0IFVuaXZl + cnNpdHkgSSBnb3QgYSBmdWxsIHRpbWUgcG9zaXRpb24gYXMgYSBTb2Z0d2Fy + ZSBFbmdpbmVlciBtb3N0bHkgdXNpbmcgUHl0aG9uLiBJIGFtIG5vdyBlbXBs + b3llZCBmdWxsIHRpbWUgYXMgYSBGdWxsIFN0YWNrIEVuZ2luZWVyIGF0IGEg + c29mdHdhcmUgY29uc3VsdGFuY3kgYmFzZWQgb3V0IG9mIE5ZQyBjYWxsZWQg + UG9zdGxpZ2h0LiBJIGFtIG1vc3RseSB3cml0aW5nIEVTNiBhbmQgUmVhY3Qs + IGJ1dCBJIGFtIGNvbWZvcnRhYmxlIHVwIGFuZCBkb3duIHRoZSBzdGFjayBv + ZiBhbiBhcHBsaWNhdGlvbi4iLCJBY3RpdmUiOnRydWUsIlNlcnZpY2VzIjpb + InJlY3R6Z1RHb1F5eTJGVk1DIiwicmVjeERycEZMOXc1dE56a1ciLCJyZWNL + TFJVb2xDeHN2V0J1RiIsInJlYzNaUU1DUXNLUEtsRTJDIiwicmVjTjBsSjQ2 + Qlluc0k4ejkiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjaUVTNURwNXNSNVVp + VEQiLCJyZWM4ZzlEV1JoZmNGaExnbCJdLCJFbWFpbCI6Im5yeW91bmdAZ21h + aWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxNy0wNi0wMlQxODoyNTowNS4w + MDBaIn0seyJpZCI6InJlY1RRbzRDYktnZG1UOVh2IiwiZmllbGRzIjp7IlNs + YWNrIE5hbWUiOiJkYXZpZF90aHVyZXNvbiIsIkZ1bGwgTmFtZSI6IkRhdmlk + IFRodXJlc29uIiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNPMVFsVmZZIiwi + cmVjRTZHR2tMNHcyVDZwbkMiLCJyZWNvc1J2aUxvQkNnaDZUcSIsInJlY2Fv + RXgxcTBRUnB2Y2FSIiwicmVjcW15Q1dqUFNBcWdDb3AiLCJyZWNDVmM3dTNr + Q09OaEpmRiIsInJlY2oyb21kdTdXbklYTEprIiwicmVjNUZZWFU2alRuWEtQ + SGciXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6IkRhdmlkLkcuVGh1cmVzb25A + Z21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNFQxOToxMjo0 + OC4wMDBaIn0seyJpZCI6InJlY1YwcUpEMjhraTJROGtyIiwiZmllbGRzIjp7 + IlNsYWNrIE5hbWUiOiJIZWxpbyBDb2xhIiwiRnVsbCBOYW1lIjoiSGVsaW8g + Q29sYSIsIlNraWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY0U2 + R0drTDR3MlQ2cG5DIiwicmVjOWxuSFphRHQyQ3ZWcloiLCJyZWNxbXlDV2pQ + U0FxZ0NvcCIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVjV0JMZlpBYk5mUFNw + THIiXSwiQWN0aXZlIjp0cnVlLCJFbWFpbCI6ImhlbGlvLmNvbGFAZ21haWwu + Y29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMy0yNFQxOToxMzoyNS4wMDBa + In0seyJpZCI6InJlY1dQeXhyWTJRS0FrUFZMIiwiZmllbGRzIjp7IlNsYWNr + IE5hbWUiOiJtaWtlcm9kX3NkIiwiRnVsbCBOYW1lIjoiTWljaGFlbCBSb2Ry + aWd1ZXoiLCJTa2lsbHNldHMiOlsicmVjeUc2c2NFVHR4WnVUTngiXSwiQWN0 + aXZlIjp0cnVlLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNWMm9wakFyU1hVa004 + NSIsInJlY3c1eUpkV0lwNnQ5THdnIl0sIkVtYWlsIjoicm9kcmlndWV6bWxA + Z21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxOC0wMi0xMFQyMjo0Njow + MC4wMDBaIn0seyJpZCI6InJlY1pJRXhWejd5aEt0ZmE4IiwiZmllbGRzIjp7 + IlNsYWNrIE5hbWUiOiJqaGFtcHRvbiIsIk5vdGVzIjoib3BlbiB0byBoZWxw + aW5nIGFueW9uZSB3LyBIVE1ML0NTUyB0b29cbiIsIkFzc2lnbm1lbnRzIjpb + InJlY1hIZFhWMTEwRlNNQnF0Il0sIkZ1bGwgTmFtZSI6IkpvaG4gSGFtcHRv + biIsIlNraWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY2s0bGtP + VGtmc01SUGtSIiwicmVjNUZZWFU2alRuWEtQSGciXSwiTWF4IE1lbnRlZXMi + OjEsIldoYXQgdGltZSB6b25lIGFyZSB5b3UgaW4/IjoiRVNUIiwiSG93IG1h + bnkgaG91cnMgd291bGQgeW91IGxpa2UgdG8gbWVudG9yIGZvciwgcGVyIG1v + bnRoPyI6IjQiLCJCaW8iOiJJJ20gYW4gQXJteSB2ZXRlcmFuIG9mIDcgeWVh + cnMgKGFjdGl2ZS1kdXR5IGVubGlzdGVkLCA2OEsgTWVkaWNhbCBMYWJvcmF0 + b3J5KSB3aG8gc3dpdGNoZWQgY2FyZWVycyBhZnRlciBzZXBhcmF0aW5nIGFu + ZCBoYXZlIGJlZW4gd29ya2luZyBhcyBhIGZ1bGwtdGltZSBkZXZlbG9wZXIg + c2luY2UgbWlkLTIwMTUuICBJIGZvdW5kIE9wZXJhdGlvbiBDb2RlIHNob3J0 + bHkgYmVmb3JlIHRoZW4sIGFuZCB0aGV5J3ZlIGJlZW4gYSBjb25zaXN0ZW50 + IHNvdXJjZSBvZiBzdXBwb3J0IHRocm91Z2hvdXQuICBJJ20gbG9va2luZyB0 + byBnaXZlIGJhY2sgYW5kIGhlbHAgb3RoZXIgdmV0ZXJhbnMgd2hvIGFyZSB0 + cnlpbmcgdG8gYnJlYWsgaW50byB0aGlzIGluZHVzdHJ5LiAgV2hpbGUgSSBh + dHRlbmRlZCBhIDEyLXdlZWsgZnJvbnQtZW5kIGJvb3RjYW1wLCBJIGFsc28g + Y29uc2lkZXIgbXlzZWxmIGEgc2VsZi10YXVnaHQgZGV2ZWxvcGVyLiAgSSB3 + b3JrIG1vc3RseSB3LyBKYXZhc2NyaXB0IC8gVHlwZXNjcmlwdCAvIEFuZ3Vs + YXIgZnJvbnQtZW5kIHN0YWNrLCBidXQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ug + dy8gUmVhY3QsIEVtYmVyLCBhbmQgdmFyaW91cyBvdGhlciBmcm9udC1lbmQt + aXNoIHN0dWZmLiBXb3VsZCBwcmVmZXIgdG8gbWVudG9yIGFueW9uZSB3aG8g + aGFzIGEgc3Ryb25nIGRlc2lyZSB0byBmb2N1cyBvbiBKYXZhc2NyaXB0IChm + cm9udC1lbmQgb3IgYmFjay1lbmQpLiIsIkFjdGl2ZSI6dHJ1ZSwiU3F1YWRz + IjpbInJlY3NLN3ZqVzU5bTBFbXVUIl0sIk1lbnRvciBSZXF1ZXN0IjpbInJl + Y3ZFc0gwV0t3Zk9JdmF0IiwicmVjM1NwOVA1Z1RnTUZkdWIiLCJyZWNGelVo + Qk8wS1k0OTZoeSIsInJlY1g2SzdFNHlkTzBZalB5IiwicmVjcElvNklub0Nx + Q0t6bmoiLCJyZWNERmpGNUtUQnlrbkwyaiIsInJlY3RMSUpGcWpWUzZXaHBN + IiwicmVjUDkzVlVlWWV5aHJOVnoiLCJyZWNUemJRSW1sWXNCaTFNNiIsInJl + Y0kwZVRIeGRvQU9zS2pRIl0sIkVtYWlsIjoiam9obl9qX2hhbXB0b25AeWFo + b28uY29tIn0sImNyZWF0ZWRUaW1lIjoiMjAxNi0xMi0wMlQwMzowNToxOS4w + MDBaIn0seyJpZCI6InJlY2I2WUVLWmFCS0F5dDh5IiwiZmllbGRzIjp7IlNs + YWNrIE5hbWUiOiJLZW4gTXVncmFnZSIsIkZ1bGwgTmFtZSI6IktlbiBNdWdy + YWdlIiwiU2tpbGxzZXRzIjpbInJlYzVGWVhVNmpUblhLUEhnIiwicmVjYW9F + eDFxMFFScHZjYVIiLCJyZWNTanJsc0h0V2g5WFdPUCJdLCJNYXggTWVudGVl + cyI6MywiQWN0aXZlIjp0cnVlLCJFbWFpbCI6ImttdWdyYWdlQGdtYWlsLmNv + bSJ9LCJjcmVhdGVkVGltZSI6IjIwMTgtMDQtMTFUMDA6Mjk6MzMuMDAwWiJ9 + LHsiaWQiOiJyZWNjS3JFYzB3ODhmU3M3VyIsImZpZWxkcyI6eyJTbGFjayBO + YW1lIjoibW9samFjIiwiRnVsbCBOYW1lIjoiTWlsamVua28gQ3ZqZXRrbyIs + IlNraWxsc2V0cyI6WyJyZWNOT05KOFMxcDFUamZLViIsInJlY0pBQ3hrWnVI + VFpTVTJqIiwicmVjU2pybHNIdFdoOVhXT1AiLCJyZWNvc1J2aUxvQkNnaDZU + cSIsInJlY1N5NEhtSUd0SUxxWlJ2IiwicmVjT2ZHeTl0TWVVd2pONzgiLCJy + ZWNZMEcyOERJbmFmQnhnVCIsInJlY1VWOURMRW9LMUpxUlY5IiwicmVjQ1Zj + N3Uza0NPTmhKZkYiLCJyZWNNOWtiM1NhekY0NjZ4byIsInJlY0NLclBuSERx + T2RsaEFnIl0sIldoYXQgdGltZSB6b25lIGFyZSB5b3UgaW4/IjoiQ0VUICIs + IkJpbyI6IisgTWljcm9zb2Z0IEZURSAoWGFtYXJpbiBUZWFtIC0gQ29tcG9u + ZW50cyBUZWFtKSBzaW5jZSAyMDE2LjA3LjAxXG4rIFhhbWFyaW4gSW50ZXJu + YXRpb25hbCBDb250cmFjdG9yIHNpbmNlIDIwMTQuMDFcbisgb3duZXIgb2Yg + c21hbGwgYnVzaW5lc3MgKEhvbGlzdGljV2FyZSkgLSB1c2VkIHRvIHdvcmsg + Zm9yIFhhbWFyaW4gYXMgaW50ZXJuYXRpb25hbCBjb250cmFjdG9yXG4rIGZ1 + bGwgc3RhY2sgZGV2ZWxvcGVyICguTkVULCBDIywgWGFtYXJpbi4qLCBBU1Au + bmV0IENvcmUpXG4rIHZldGVyYW4gKENyb2F0aWFuIFBvbGljZSBhbmQgQXJt + eSAxOTkxLTE5OTMpIG1pbGl0YXJ5IHNlcnZpY2UgMysgeWVhcnNcbisgdHJ5 + aW5nIHRvIGhlbHAgbG9jYWwgdmV0ZXJhbiBjb21tdW5pdHkgaW4gQ3JvYXRp + YSBzbyBJIHNlYXJjaGVkIGFyb3VuZCBhbmQgam9pbmVkIE9wZXJhdGlvbkNv + ZGUgY29zIEkgbWlnaHQgYmUgaGVscGZ1bGxcbisgcHJlZmVyZW5jZXMgLSAu + TkVUIHN0YWNrIChJIHJlYWQgamF2YSBhbmQgb2JqYy1jLCBidXQgbm90IHdy + aXRlKSwgQy9DKysgaXMgYSBiaXQgcnVzdHkgKGxhdGUgMTk5MHMpIiwiQWN0 + aXZlIjp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0emdUR29ReXkyRlZNQyIsInJl + Y3J5OHMxNHFHSmhIZU9DIiwicmVjeERycEZMOXc1dE56a1ciLCJyZWNLTFJV + b2xDeHN2V0J1RiJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNIMXVPYnZobVF3 + NkJCZyIsInJlY1R4NGZXZHlXQTVYaUFUIiwicmVjdWw0d0gwZlVYcGNrdTUi + LCJyZWNBQmFNZXRRR0IyV3NyNCIsInJlY2V2dEEzTGFZWk1xU0kyIl0sIkVt + YWlsIjoibWN2amV0a29AaG9saXN0aWN3YXJlLmNvbSIsIkNvZGUgb2YgQ29u + ZHVjdCBBY2NlcHRlZD8iOnRydWUsIkd1aWRlYm9vayBSZWFkPyI6dHJ1ZX0s + ImNyZWF0ZWRUaW1lIjoiMjAxNy0xMi0yMFQyMDoxMjo0MS4wMDBaIn0seyJp + ZCI6InJlY2VCZVR5dVdsTGZBcEhCIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUi + OiJnYXRvcnF1ZSIsIk5vdGVzIjoiSWYgeW91IHdhbnQgdG8gbGVhcm4gQywg + QysrLCBDTWFrZSwgTGludXgsIEdpdCwgZW1iZWRkZWQgZGV2aWNlcywgY29t + cGlsZXJzLCBvciBPT1AgY29uY2VwdHMgSSBjYW4gaGVscCB5b3Ugb3V0LiBJ + ZiB5b3UgYXJlIHRha2luZyBDUzUwIGZyb20gZWRYIC0gSSBjYW4gaGVscCB5 + b3Ugd2l0aCB5b3VyIGFzc2lnbm1lbnRzICh3aXRob3V0IGdpdmluZyB0aGUg + YW5zd2VycykuIiwiQXNzaWdubWVudHMiOlsicmVjSU1FbzR1OUl4Y2V3ejgi + XSwiRnVsbCBOYW1lIjoiUnlhbiBMaW5kZW1hbiIsIlNraWxsc2V0cyI6WyJy + ZWNGSjlGWEU2enhyZDlpNCIsInJlY29zUnZpTG9CQ2doNlRxIiwicmVjbDhW + d28yeHVGaUVySnkiXSwiTWF4IE1lbnRlZXMiOjIsIldoYXQgdGltZSB6b25l + IGFyZSB5b3UgaW4/IjoiTVNUIiwiSG93IG1hbnkgaG91cnMgd291bGQgeW91 + IGxpa2UgdG8gbWVudG9yIGZvciwgcGVyIG1vbnRoPyI6IjIwIiwiQmlvIjoi + SSdtIGEgbGFyZ2VseSBzZWxmIHRhdWdodCBwcm9ncmFtbWVyIHdpdGggYSBC + UyBpbiBDb21wdXRlciBTY2llbmNlIGFuZCBNUyBpbiBDb21wdXRlciBFbmdp + bmVlcmluZy4gSSBjdXJyZW50bHkgd29yayBmb3IgQ0EgRW5naW5lZXJpbmcg + cHJvdmlkaW5nIHdpcmVsZXNzICg4MDIuMTEsIFppZ2JlZSwgQmx1ZXRvb3Ro + LCBldGMpIGNvbnN1bHRpbmcgc2VydmljZXMgbWFpbmx5IGZvciBRdWFsQ29t + bSBBdGhlcm9zIGN1c3RvbWVycy5cbkkgbG92ZSBoZWxwaW5nIHBlb3BsZSBs + ZWFybiB0byBwcm9ncmFtIGFuZCBpbXBvcnRhbnQgY29uY2VwdHMgbGlrZSBk + YXRhIHN0cnVjdHVyZXMsIHRocmVhZGluZywgYXJjaGl0ZWN0dXJlLCBhbmQg + YWxnb3JpdGhtcy4gSW4gbXkgc3BhcmUgdGltZSBJIGxpa2UgdG8gcmVhZCwg + c3R1ZHkgbmV3IHByb2dyYW1taW5nIGNvbmNlcHRzLCBhbmQgd3JpdGUgY29t + cHV0ZXIgZ2FtZXMgKEFuZHJvaWQgYW5kIGRlc2t0b3ApLiIsIkFjdGl2ZSI6 + dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjYjVEblVqeURJUzRTUlYiXSwi + RW1haWwiOiJyeWFubGluZGVtYW5AZ21haWwuY29tIn0sImNyZWF0ZWRUaW1l + IjoiMjAxNi0xMi0yMVQwMjo1Mzo1Ni4wMDBaIn0seyJpZCI6InJlY2VHS0ZS + QXhaYTBaSE5mIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJlbW1hZHN1cmdl + b24iLCJGdWxsIE5hbWUiOiJFbW1hbnVlbCBJZGVoYW4iLCJTa2lsbHNldHMi + OlsicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNsOFZ3bzJ4dUZpRXJKeSIsInJl + Y0ltcm9XbmQ2cDAyYVh1IiwicmVjZnc3OFZkbkQ3dHBaVnoiLCJyZWNVVjlE + TEVvSzFKcVJWOSIsInJlY1dCTGZaQWJOZlBTcExyIiwicmVjWTBHMjhESW5h + ZkJ4Z1QiLCJyZWNqMm9tZHU3V25JWExKayJdLCJBY3RpdmUiOnRydWUsIkVt + YWlsIjoiZW1tYW51ZWwuaWRlaGVuQG12c3UuZWR1In0sImNyZWF0ZWRUaW1l + IjoiMjAxOC0wMy0yNFQxOToxNDowNy4wMDBaIn0seyJpZCI6InJlY2Z0TmlE + OTFIaGo5NTA2IiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJnZW9yZ2VtYXVl + ciIsIkFzc2lnbm1lbnRzIjpbInJlY2dQMzdUMVFWNEl2Rmx5IiwicmVjY3Ft + MU5tR1IxbXRNcGEiXSwiRnVsbCBOYW1lIjoiR2VvcmdlIE1hdWVyIiwiU2tp + bGxzZXRzIjpbInJlY0pCQjdaeFRPTTZ3TDV3IiwicmVjRTZHR2tMNHcyVDZw + bkMiLCJyZWNOT05KOFMxcDFUamZLViIsInJlY2ZLeDhjcmdyak1NdlNrIiwi + cmVjblBIRGRXVzFKMDZldk8iLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY2s0 + bGtPVGtmc01SUGtSIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWNTemljRXNZ + WEc0UDFBNCIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjZnc3OFZkbkQ3dHBa + VnoiXSwiTWF4IE1lbnRlZXMiOjIsIldoYXQgdGltZSB6b25lIGFyZSB5b3Ug + aW4/IjoiQ2VudHJhbCIsIkhvdyBtYW55IGhvdXJzIHdvdWxkIHlvdSBsaWtl + IHRvIG1lbnRvciBmb3IsIHBlciBtb250aD8iOiIxMCIsIkJpbyI6IkknbSBE + aXJlY3RvciBvZiBEZXZlbG9wbWVudCBhdCBTdXJnZSBDb25zdWx0aW5nLiBJ + IHdyaXRlIGNvZGUgZnVsbCB0aW1lIGFuZCBzcGVhaywgbWVudG9yLCBhbmQg + d3JpdGUgb24gYWxsIHNvcnRzIG9mIHRvcGljcyBpbiB0aGUgZGV2ZWxvcG1l + bnQgc3BhY2UgbGFyZ2VseSBmb2N1c2luZyBvbiBKYXZhc2NyaXB0LCBTb2Z0 + d2FyZSBBcmNoaXRlY3R1cmUsIFRlc3RpbmcsIEZ1bmN0aW9uYWwgUHJvZ3Jh + bW1pbmcsIGFuZCBUZWFjaGluZy4gSSdtIGEgbWVudG9yIGFuZCBndWVzdCBs + ZWN0dXJlciB3aXRoIE9wZXJhdGlvbiBTcGFyayBhbmQgb2NjYXNpb25hbGx5 + IHRoZSBUZWNoIFRhbGVudCBTb3V0aCBjb2RlIGNhbXBzLiBJIGxvdmUgdGFs + a2luZyBhYm91dCB0aGlzIHN0dWZmLiBJJ20gbm90IGEgdmV0IGJ1dCBoYXBw + eSB0byBoZWxwIG91dC4iLCJBY3RpdmUiOnRydWUsIk1lbnRvciBSZXF1ZXN0 + IjpbInJlY0wzaE0zRUxJSFFqdHBEIiwicmVjUE03NWZJT1BmWFI1MW0iLCJy + ZWM4T1l1NkY4bjlPMnBidiIsInJlY3FWdTQ1WGZmT0k0OFE1IiwicmVjdjVa + Z2w0V3FGOVJYcXIiLCJyZWNndm1VT3JmYlA3M3dJNSIsInJlY2FLMVJtbVR3 + UGJ0UWNoIiwicmVjd2VVeUNyNDJsNXNzck4iLCJyZWNCVmIwWmVnVWNHbUxt + biIsInJlY2Q0aFc3M1hwb1NnV1ZxIl0sIkVtYWlsIjoiZ21hdWVyQGdtYWls + LmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTctMDItMTJUMTg6NTY6MzIuMDAw + WiJ9LHsiaWQiOiJyZWNpWkkxT21CWkNkdWpDNSIsImZpZWxkcyI6eyJTbGFj + ayBOYW1lIjoiY2Flc2FyYXJ1bSIsIkZ1bGwgTmFtZSI6IlBldGVyIFBvb2xl + IiwiU2tpbGxzZXRzIjpbInJlY0pCQjdaeFRPTTZ3TDV3IiwicmVjRTZHR2tM + NHcyVDZwbkMiLCJyZWM5bG5IWmFEdDJDdlZyWiIsInJlY2FvRXgxcTBRUnB2 + Y2FSIiwicmVjQ1ZjN3Uza0NPTmhKZkYiLCJyZWM1RllYVTZqVG5YS1BIZyJd + LCJBY3RpdmUiOnRydWUsIkVtYWlsIjoicGV0ZXIuai5wb29sZUBnbWFpbC5j + b20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI0VDE5OjE0OjAzLjAwMFoi + fSx7ImlkIjoicmVjalpEOGZxdWdYOGMyeTMiLCJmaWVsZHMiOnsiU2xhY2sg + TmFtZSI6ImJ1c2hpZG9jb2RlcyIsIkZ1bGwgTmFtZSI6IlNlYW4gTWNCcmlk + ZSIsIlNraWxsc2V0cyI6WyJyZWNCSWhEZHVKRDNZTGFIcSIsInJlY25QSERk + V1cxSjA2ZXZPIiwicmVjRTZHR2tMNHcyVDZwbkMiLCJyZWM1RllYVTZqVG5Y + S1BIZyIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjcW15Q1dqUFNBcWdDb3Ai + LCJyZWNrNGxrT1RrZnNNUlBrUiIsInJlY0NWYzd1M2tDT05oSmZGIiwicmVj + V0JMZlpBYk5mUFNwTHIiXSwiTWF4IE1lbnRlZXMiOjIsIkFjdGl2ZSI6dHJ1 + ZSwiRW1haWwiOiJzcG1jYnJpZGUxMjAxQGdtYWlsLmNvbSJ9LCJjcmVhdGVk + VGltZSI6IjIwMTgtMDQtMTFUMjA6NDI6NDMuMDAwWiJ9LHsiaWQiOiJyZWNs + Z0E0ZGdnbTMwYjJXUSIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiSi5ULiIs + IkZ1bGwgTmFtZSI6IkpvaG4gS25veCIsIlNraWxsc2V0cyI6WyJyZWNKQkI3 + WnhUT002d0w1dyIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjcW15Q1dqUFNB + cWdDb3AiLCJyZWNDVmM3dTNrQ09OaEpmRiIsInJlY2s0bGtPVGtmc01SUGtS + Il0sIkFjdGl2ZSI6dHJ1ZSwiTWVudG9yIFJlcXVlc3QiOlsicmVjazIwS1RG + QUFCbzZCZTEiXSwiRW1haWwiOiJqdGtub3g5MUBnbWFpbC5jb20ifSwiY3Jl + YXRlZFRpbWUiOiIyMDE4LTAzLTE5VDEyOjA3OjQ3LjAwMFoifSx7ImlkIjoi + cmVjb0FCOU5jRHdsQmdIa2oiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6Im1h + Y2tzb2xkIiwiRnVsbCBOYW1lIjoiTWFyayBTb2xkYXZpbmkiLCJTa2lsbHNl + dHMiOlsicmVjU2pybHNIdFdoOVhXT1AiLCJyZWNld2YxakxjTzFRbFZmWSIs + InJlY0U2R0drTDR3MlQ2cG5DIiwicmVjb3NSdmlMb0JDZ2g2VHEiLCJyZWNO + T05KOFMxcDFUamZLViIsInJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjQ1ZjN3Uz + a0NPTmhKZkYiLCJyZWM1RllYVTZqVG5YS1BIZyJdLCJXaGF0IHRpbWUgem9u + ZSBhcmUgeW91IGluPyI6IkVTVCIsIkJpbyI6IlNVTU1BUklaRUQgUFJPRkVT + U0lPTkFMIEVYUEVSSUVOQ0VcbklUIFByb2Zlc3Npb25hbCB3aXRoIG92ZXIg + dHdlbnR5IHllYXJzIG9mIGV4cGVyaWVuY2UgaW4gc29mdHdhcmUgZGV2ZWxv + cG1lbnQuIEphdmEgYW5kIFB5dGhvbiBkZXZlbG9wZXIgd2l0aCBhZGRpdGlv + bmFsIHNraWxscyBpbiB0aGUgYXJlYXMgb2Ygd2ViIGFwcGxpY2F0aW9uIHNl + Y3VyaXR5LCBzb2Z0d2FyZSBkZXNpZ24sIGFuZCB0ZWFtIGxlYWRlcnNoaXAu + IEV4cGVyaWVuY2VkIGluIGFnaWxlIGRldmVsb3BtZW50IGFuZCBidWlsZGlu + ZyBxdWFsaXR5IHNvZnR3YXJlIHRocm91Z2ggYSBwcm9jZXNzIHRoYXQgaW5j + bHVkZXMgdW5pdCB0ZXN0aW5nIGFuZCBjb250aW51b3VzIGludGVncmF0aW9u + LiBGb3VyLXllYXIgdG91ciBpbiB0aGUgVVMgQXJteSBJbmZhbnRyeSBkZXZl + bG9wZWQgbGVhZGVyc2hpcCBhbmQgdHJhaW5pbmcgc2tpbGxzLlxuXG5JIGFt + IGhlcmUgYmVjYXVzZSBJIHdhcyBhIGdydW50IHRoYXQgbGVhcm5lZCB0byBj + b2RlIDIwIHllYXJzIGFnby4gSSBrbm93IHRoZSB0cmFuc2l0aW9uIGNhbiBi + ZSBkb25lIGFuZCB3b3VsZCBsaWtlIHRvIHRyeSBhbmQgaGVscCBvdGhlcnMu + IEkgYW0gaW4gdGhlIERDIGFyZWEuIiwiQWN0aXZlIjp0cnVlLCJTZXJ2aWNl + cyI6WyJyZWNyeThzMTRxR0poSGVPQyIsInJlY0tMUlVvbEN4c3ZXQnVGIiwi + cmVjM1pRTUNRc0tQS2xFMkMiLCJyZWNOMGxKNDZCWW5zSTh6OSJdLCJFbWFp + bCI6Im1hY2tzb2xkQHlhaG9vLmNvbSJ9LCJjcmVhdGVkVGltZSI6IjIwMTct + MDctMDNUMTQ6MTg6NTguMDAwWiJ9LHsiaWQiOiJyZWNvb1pPQ1BaNW1SNkFS + cCIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoibWlrZW9lcnRsaSIsIkZ1bGwg + TmFtZSI6Ik1pa2UgT2VydGxpIiwiU2tpbGxzZXRzIjpbInJlY29zUnZpTG9C + Q2doNlRxIiwicmVjNUZZWFU2alRuWEtQSGciXSwiV2hhdCB0aW1lIHpvbmUg + YXJlIHlvdSBpbj8iOiJNU1QiLCJCaW8iOiJJJ20gYSBqYXZhIGRldmVsb3Bl + ciB3aXRoIGEgc3Ryb25nIGludGVyZXN0IGluIHNtYWxsIGJ1c2luZXNzIG9w + ZXJhdGlvbnMuIEkgd29yayBmb3IgYSBzbWFsbCBEb0QgY29udHJhY3Qgc2hv + cCBpbiBEZW52ZXIsIGhhcHB5IHRvIGhlbHAgaG93ZXZlciBJIGNhbiEiLCJB + Y3RpdmUiOnRydWUsIlNlcnZpY2VzIjpbInJlY3J5OHMxNHFHSmhIZU9DIiwi + cmVjTjBsSjQ2Qlluc0k4ejkiLCJyZWMzWlFNQ1FzS1BLbEUyQyIsInJlY0tM + UlVvbEN4c3ZXQnVGIiwicmVjdHpnVEdvUXl5MkZWTUMiXSwiRW1haWwiOiJt + aWtlb2VydGxpQGdtYWlsLmNvbSIsIkNvZGUgb2YgQ29uZHVjdCBBY2NlcHRl + ZD8iOnRydWUsIkd1aWRlYm9vayBSZWFkPyI6dHJ1ZX0sImNyZWF0ZWRUaW1l + IjoiMjAxNy0wOC0xN1QyMDowNTowMy4wMDBaIn0seyJpZCI6InJlY3FFOFps + OEZoNGJvNFBHIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJmcmFua3l1Iiwi + RnVsbCBOYW1lIjoiRnJhbmsgWXUiLCJTa2lsbHNldHMiOlsicmVjSW1yb1du + ZDZwMDJhWHUiLCJyZWNVVjlETEVvSzFKcVJWOSJdLCJBY3RpdmUiOnRydWUs + IkVtYWlsIjoiZnJhbmt5dUBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIy + MDE4LTAzLTI0VDE5OjEzOjU5LjAwMFoifSx7ImlkIjoicmVjcWV6Y3ZCcDRp + a2JOQXIiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6InBhdHJpY2sucGllcnNv + biIsIkZ1bGwgTmFtZSI6IlBhdHJpY2sgUGllcnNvbiIsIlNraWxsc2V0cyI6 + WyJyZWNld2YxakxjTzFRbFZmWSIsInJlYzVGWVhVNmpUblhLUEhnIiwicmVj + YW9FeDFxMFFScHZjYVIiLCJyZWNxbXlDV2pQU0FxZ0NvcCIsInJlY1Nqcmxz + SHRXaDlYV09QIiwicmVjajJvbWR1N1duSVhMSmsiLCJyZWNXQkxmWkFiTmZQ + U3BMciIsInJlY2x0YVB3NjlFclJDSG1TIl0sIk1heCBNZW50ZWVzIjoxLCJF + bWFpbCI6InBhdHJpY2sucGllcnNvbkB2ZnczMjg1Lm9yZyJ9LCJjcmVhdGVk + VGltZSI6IjIwMTgtMDUtMDRUMjA6MTY6MDEuMDAwWiJ9LHsiaWQiOiJyZWNx + ckFlRnlsamxXdHNYQyIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoiQXNobGV5 + IiwiRnVsbCBOYW1lIjoiQXNobGV5IFRlbXBsZXQiLCJTa2lsbHNldHMiOlsi + cmVjeUc2c2NFVHR4WnVUTngiXSwiTWVudG9yIFJlcXVlc3QiOlsicmVjTTN4 + OE81TnltMmhBRU0iLCJyZWM1TnVmR0l3NlBMSlhjRCIsInJlY2xXdUFPSXpU + bjFQcnZ5IiwicmVjVkZMSDhvVnhRUDRlRVIiXSwiRW1haWwiOiJhc2hsZXku + dGVtcGxldEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAyLTEz + VDE5OjUyOjA5LjAwMFoifSx7ImlkIjoicmVjc2JsenlTTEZIT1NsMWYiLCJm + aWVsZHMiOnsiU2xhY2sgTmFtZSI6Im9oYWl3YWx0IiwiRnVsbCBOYW1lIjoi + TWF0dGhldyBXYWx0ZXIiLCJTa2lsbHNldHMiOlsicmVjU2pybHNIdFdoOVhX + T1AiLCJyZWNld2YxakxjTzFRbFZmWSIsInJlYzVGWVhVNmpUblhLUEhnIiwi + cmVjZkt4OGNyZ3JqTU12U2siXSwiV2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBp + bj8iOiJVVEMtNCIsIkJpbyI6IkZvcm1lciBOYXZ5IElUMSB0dXJuZWQgTGlu + dXggc3lzYWRtaW4sIG5vdyBTaXRlIFJlbGlhYmlsaXR5IEVuZ2luZWVyIGF0 + IHNvY2lhbGx5IGNvbnNjaW91cyBHb3ZUZWNoIHN0YXJ0dXAgU2VhbWxlc3NE + b2NzLiBBbGwgdGhpbmdzIGNvbnRhaW5lcnMsIG1vbml0b3JpbmcsIGF1dG9t + YXRpb24sIGNsb3VkLCBpbmZyYXN0cnVjdHVyZSwgc2VjdXJpdHksIGFuZCBz + YWZlIHN5c3RlbXMuXG5cbkludGVyZXN0ZWQgaW4gaGVscGluZyBvdXQgZmVs + bG93IHZldGVyYW5zIGFuZCBtYWtpbmcgdGhlIHRyYW5zaXRpb24gZWFzaWVy + LCBzaW5jZSBtaW5lIHdhcyBwcmV0dHkgcm91Z2ggYW5kIEkgYW0gdmVyeSBs + dWNreS9ibGVzc2VkIHRvIGJlIHdoZXJlIEkgYW0gdG9kYXkuIiwiQWN0aXZl + Ijp0cnVlLCJTZXJ2aWNlcyI6WyJyZWN0emdUR29ReXkyRlZNQyIsInJlY3J5 + OHMxNHFHSmhIZU9DIiwicmVjeERycEZMOXc1dE56a1ciLCJyZWNLTFJVb2xD + eHN2V0J1RiIsInJlY04wbEo0NkJZbnNJOHo5Il0sIk1lbnRvciBSZXF1ZXN0 + IjpbInJlY2htUDM2cEtXSThxRExqIl0sIkVtYWlsIjoib2hhaXdhbHRAZ21h + aWwuY29tIiwiQ29kZSBvZiBDb25kdWN0IEFjY2VwdGVkPyI6dHJ1ZSwiR3Vp + ZGVib29rIFJlYWQ/Ijp0cnVlfSwiY3JlYXRlZFRpbWUiOiIyMDE3LTA4LTE4 + VDE2OjA0OjU3LjAwMFoifSx7ImlkIjoicmVjdXhVYnFQZXJMeGdvRmUiLCJm + aWVsZHMiOnsiU2xhY2sgTmFtZSI6InpkaWVobGlvIiwiRnVsbCBOYW1lIjoi + WmFjaGFyeSBMIERpZWhsIiwiU2tpbGxzZXRzIjpbInJlY0JJaERkdUpEM1lM + YUhxIiwicmVjblBIRGRXVzFKMDZldk8iLCJyZWNVVjlETEVvSzFKcVJWOSIs + InJlY2FvRXgxcTBRUnB2Y2FSIiwicmVjazRsa09Ua2ZzTVJQa1IiXSwiTWF4 + IE1lbnRlZXMiOjUsIkVtYWlsIjoiemFjaGFyeS5kaWVobEBnbWFpbC5jb20i + fSwiY3JlYXRlZFRpbWUiOiIyMDE4LTA0LTI2VDE2OjQ1OjU3LjAwMFoifSx7 + ImlkIjoicmVjdlVLeTZKbENUSEdDWmkiLCJmaWVsZHMiOnsiU2xhY2sgTmFt + ZSI6ImF1YnJleSIsIkZ1bGwgTmFtZSI6IkF1YnJleSBBcmNhbmdlbCIsIlNr + aWxsc2V0cyI6WyJyZWNKQkI3WnhUT002d0w1dyIsInJlY2FvRXgxcTBRUnB2 + Y2FSIiwicmVjNUZZWFU2alRuWEtQSGciXSwiQWN0aXZlIjp0cnVlLCJNZW50 + b3IgUmVxdWVzdCI6WyJyZWNNN0JudjZoOWtQMWhBYiJdLCJFbWFpbCI6ImFh + cmNhbmdlbEBnbWFpbC5jb20ifSwiY3JlYXRlZFRpbWUiOiIyMDE4LTAzLTI0 + VDE5OjEzOjUxLjAwMFoifSx7ImlkIjoicmVjd0xQZ0Q5VEZURDQxZFIiLCJm + aWVsZHMiOnsiU2xhY2sgTmFtZSI6ImlPU1RvbSIsIkZ1bGwgTmFtZSI6IlRo + b21hcyIsIlNraWxsc2V0cyI6WyJyZWNvc1J2aUxvQkNnaDZUcSIsInJlY1dC + TGZaQWJOZlBTcExyIiwicmVjWTBHMjhESW5hZkJ4Z1QiLCJyZWN5RzZzY0VU + dHhadVROeCJdLCJNYXggTWVudGVlcyI6MSwiQWN0aXZlIjp0cnVlLCJFbWFp + bCI6InRob21hcy5tYXJsZXJAZ21haWwuY29tIn0sImNyZWF0ZWRUaW1lIjoi + MjAxOC0wMy0yNlQxNDoyNTo1Mi4wMDBaIn0seyJpZCI6InJlY3hZTzFqcUw0 + SFduSmJJIiwiZmllbGRzIjp7IlNsYWNrIE5hbWUiOiJtc2NvdHQiLCJGdWxs + IE5hbWUiOiJNaWNoYWVsIEsgU2NvdHQiLCJTa2lsbHNldHMiOlsicmVjb3NS + dmlMb0JDZ2g2VHEiLCJyZWNmdzc4VmRuRDd0cFpWeiIsInJlY2FvRXgxcTBR + UnB2Y2FSIiwicmVjcW15Q1dqUFNBcWdDb3AiLCJyZWNDVmM3dTNrQ09OaEpm + RiIsInJlYzVGWVhVNmpUblhLUEhnIl0sIkFjdGl2ZSI6dHJ1ZSwiRW1haWwi + OiJtaWNoYWVsLmtlbGx5LnNjb3R0QGdtYWlsLmNvbSJ9LCJjcmVhdGVkVGlt + ZSI6IjIwMTgtMDMtMjZUMDY6MTE6NDYuMDAwWiJ9LHsiaWQiOiJyZWN4YmVU + MURhekxkWjJJOCIsImZpZWxkcyI6eyJTbGFjayBOYW1lIjoianJhbWVzIiwi + Tm90ZXMiOiJJIGFtIGFscmVhZHkgbWVudG9yaW5nIFJvbiBSaWhvby4gIEhv + cGVmdWxseSBJIHdpbGwgaGF2ZSBtb3JlIGJhbmR3aWR0aCBpbiB0aGUgZnV0 + dXJlLCBidXQgY3VycmVudGx5IG15IGhhbmRzIGFyZSBwcmV0dHkgZnVsbCB3 + aXRoIFJvbiBhbmQgc29tZSBvdGhlcnMgSSBzdGFydGVkIGhlbHBpbmcgcmVj + ZW50bHkuIiwiQXNzaWdubWVudHMiOlsicmVjTXFRQjhVUVBZSGVZNzAiXSwi + RnVsbCBOYW1lIjoiSmVmZiBSYW1lcyIsIlNraWxsc2V0cyI6WyJyZWNZMEcy + OERJbmFmQnhnVCIsInJlYzVGWVhVNmpUblhLUEhnIiwicmVjcW15Q1dqUFNB + cWdDb3AiLCJyZWNhb0V4MXEwUVJwdmNhUiJdLCJNYXggTWVudGVlcyI6MSwi + V2hhdCB0aW1lIHpvbmUgYXJlIHlvdSBpbj8iOiJDU1QiLCJIb3cgbWFueSBo + b3VycyB3b3VsZCB5b3UgbGlrZSB0byBtZW50b3IgZm9yLCBwZXIgbW9udGg/ + IjoiNSIsIkJpbyI6IkkgaGF2ZSB3b3JrZWQgYXQgYSBmb3J0dW5lIDUwIGNv + bXBhbnksIGEgMiBwZXJzb24gY29uc3VsdGluZyBmaXJtLCBhbmQgY3VycmVu + dGx5IGEgc21hbGwgYnVzaW5lc3MgYWJvdXQgYWJvdXQgMTAwIGVtcGxveWVl + cy4gIEkgY3VycmVudGx5IHdvcmsgb24gaU9TIG1lZGljYWwgZW50ZXJwcmlz + ZSBzb2Z0d2FyZS4gIEkgYWxzbyBkbyB3cml0aW5nIGFuZCB0ZWNobmljYWwg + ZWRpdGluZyBmb3IgYSB0dXRvcmlhbCBzaXRlLCByYXl3ZW5kZXJsaWNoLmNv + bS5cblxuSSdtIGFsd2F5cyBoYXBweSB0byBoZWxwIHBlb3BsZSB0aGF0IGFy + ZSBzdGFydGluZyBvdXQsIGFuZCBvbmx5IHJlY2VudGx5IHJlYWxpemVkIEkg + c2hvdWxkIGxvb2sgZm9yIG9mZmljaWFsIG1lbnRvcmluZyBvcHBvcnR1bml0 + aWVzLiBTb21lb25lIG1lbnRpb25lZCBPcGVyYXRpb24gQ29kZSwgYW5kIEkg + d2FzIGltbWVkaWF0ZWx5IGludGVyZXN0ZWQuICBJIGxpa2UgdGhlIGlkZWEg + b2YgZ2l2aW5nIGJhY2sgdG8gYSBjb21tdW5pdHkgdGhhdCBoYXMgZ2l2ZW4g + c28gbXVjaCBmb3Igb3VyIGNvdW50cnkuXG5cbkknbSBiZXN0IHBvc2l0aW9u + ZWQgdG8gaGVscCBwZW9wbGUgaW50ZXJlc3RlZCBpbiBtb2JpbGUgYXBwbGlj + YXRpb24gZGV2ZWxvcG1lbnQuICBDYXJlZXIgZ3VpZGFuY2UgaXMgYWxzbyBh + bm90aGVyIGFyZWEgd2hlcmUgSSBjYW4gcHJvdmlkZSBzb21lIGhlbHAsIHBh + cnRpY3VsYXJseSB0byB0aG9zZSBlYXJseSBpbiB0aGVpciBjYXJlZXJzLiAg + IiwiQWN0aXZlIjp0cnVlLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNJSXVaVmYw + UTltUmNoTCJdLCJFbWFpbCI6ImpyYW1lc0BnbWFpbC5jb20ifSwiY3JlYXRl + ZFRpbWUiOiIyMDE2LTEyLTE4VDE4OjU5OjQ0LjAwMFoifSx7ImlkIjoicmVj + eUdHU292VHJ1bDQwMVkiLCJmaWVsZHMiOnsiU2xhY2sgTmFtZSI6Ik1iYWNo + IiwiQXNzaWdubWVudHMiOlsicmVjQ1dGaG1TRndSdlZKb0kiXSwiRnVsbCBO + YW1lIjoiTWF0dGhldyBCYWNoIiwiU2tpbGxzZXRzIjpbInJlY2V3ZjFqTGNP + MVFsVmZZIiwicmVjRTZHR2tMNHcyVDZwbkMiLCJyZWNUdTd0NU0wVmlJTG01 + QSIsInJlY1NqcmxzSHRXaDlYV09QIl0sIk1heCBNZW50ZWVzIjoyLCJXaGF0 + IHRpbWUgem9uZSBhcmUgeW91IGluPyI6IkVhc3Rlcm4iLCJIb3cgbWFueSBo + b3VycyB3b3VsZCB5b3UgbGlrZSB0byBtZW50b3IgZm9yLCBwZXIgbW9udGg/ + IjoiOCIsIkJpbyI6IldvdWxkIHByZWZlciBzb21lb25lIHdobyBpcyBlYWdl + ciB0byBwcm9ibGVtIHNvbHZlIHdpdGggUHl0aG9uIGFzIGFuIGF1dG9tYXRp + b24gbGFuZ3VhZ2UuIFRoaXMgaXMgbGlrZWx5IHdoZXJlIEkgY2FuIGJlIHRo + ZSBtb3N0IGhlbHAsIGJ1dCBJJ20gd2lsbGluZyB0byB0YWtlIG9uIGFueW9u + ZSB3aG8ncyBpbnRlcmVzdGVkLiAiLCJBY3RpdmUiOnRydWUsIlNxdWFkcyI6 + WyJyZWNJNGlIcFVQamtkbnJVZyJdLCJNZW50b3IgUmVxdWVzdCI6WyJyZWNG + ZldvZWxaaktjVE9iMCJdLCJFbWFpbCI6Im1iYWNoMDRAZ21haWwuY29tIn0s + ImNyZWF0ZWRUaW1lIjoiMjAxNy0wMS0wMlQxNjozMDo0Ni4wMDBaIn1dfQ== http_version: - recorded_at: Sun, 29 Apr 2018 23:16:23 GMT + recorded_at: Sun, 06 May 2018 16:27:07 GMT - request: method: get uri: https://api.airtable.com/v0/some_random_id/Services @@ -771,83 +787,49 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Sun, 29 Apr 2018 23:16:23 GMT + - Sun, 06 May 2018 16:27:05 GMT Etag: - - W/"188b-ZKAMD6Yvl9hZgAq+Q/KY5tI7PJU" + - W/"1905-MIKFMHVdDXjLEi25UpV9coUOiKs" Server: - Tengine Vary: - Accept-Encoding Content-Length: - - '6283' + - '6405' Connection: - keep-alive body: encoding: UTF-8 string: '{"records":[{"id":"rec3ZQMCQsKPKlE2C","fields":{"Name":"Mock Interview","Description":"Have one of our mentors conduct a mock coding interview.","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recBM9iaLwaAee4BQ"],"Mentor - Request":["recPM75fIOPfXR51m","recFzUhBO0KY496hy","recpIo6InoCqCKznj","recPRPi6IzrcHPSfR","recJ3q5zTOccP0Wnt","recgvmUOrfbP73wI5"],"Mentor + Request":["recPM75fIOPfXR51m","recFzUhBO0KY496hy","recpIo6InoCqCKznj","recPRPi6IzrcHPSfR","recJ3q5zTOccP0Wnt","recgvmUOrfbP73wI5","recPr5qFiMDGc9624"],"Mentor Skills":["recbn3OVB3DUPWuI0","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor Count":5,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:07.000Z"},{"id":"recKLRUolCxsvWBuF","fields":{"Name":"Code Review","Description":"Have a mentor look over a PR, code exercise or software - architecture","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentor + architecture","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","recQI7eSAFvP5LEhP"],"Mentor Request":["recvhYWculzcAxvi2","recP93VUeYeyhrNVz","recvJu22zZ4xy5FGs","recAF7yKRfpfHjrhK"],"Mentor Skills":["recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor - Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:09:58.000Z"},{"id":"recN0lJ46BYnsI8z9","fields":{"Name":"Resume - Review","Description":"Have one of our mentors look over your resume","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + Count":10,"Mentee Requests":0},"createdTime":"2017-03-05T19:09:58.000Z"},{"id":"recN0lJ46BYnsI8z9","fields":{"Name":"Resume + Review","Description":"Have one of our mentors look over your resume","Mentors":["recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentor Request":["rec0tJIOd8GpmqZ5V","recfwDlYeOARfJoe8","recw5Xw9qkv3VrzE2","reczhwH7rtfs8clc4","recCMQKVmFULiFdAI","recxcgnhlG58HvTmn","recyk8xo77dMdaogb","reclWuAOIzTn1Prvy","rec1CMvTYgcM3c0A5","recufM56SJoHpZP5u","recVNznRKWyKFfQRF","recc1jYPa3GkV1aac","recUAjRcW1Oj3AbNv","rechmP36pKWI8qDLj"],"Mentor Skills":["recXxKHRRiglWGPWt","recIUKKi6ZDfmamqb","recJR4JPYBISWJVGx"],"Mentor - Count":8,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:10.000Z"},{"id":"recry8s14qGJhHeOC","fields":{"Name":"General + Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:10:10.000Z"},{"id":"recry8s14qGJhHeOC","fields":{"Name":"General Guidance - Slack Chat","Description":"Chat 1 on 1 with a mentor via slack - chat","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentees":["recwZDCOVDH3QU3Vq","recQxZqkW2QfrDX7E"],"Mentor + chat","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentees":["recwZDCOVDH3QU3Vq","recQxZqkW2QfrDX7E"],"Mentor Request":["recQlLUpf76DI9uRt","recxTxNKZcYuZPgiV","recWD3SbCvBHCtPEv","reckywOc9xoVAQ4vl","rec7C3aD1Z4WJcGnD","recvEsH0WKwfOIvat","recJf3oHXBNzAdJK8","recUNPVezaf8UNuqi","recMU7Jm7lU8GKSNy","recy9ZOgGCdJ4OjxX","recHVC8HTzXWsZeLg","rec7rx7ilpWb1W88v","rece8pNd1jYbi6Myc","recL3hM3ELIHQjtpD","recISHnxSOMjxKrgi","recYBK56Xp8AVEkYX","recRwfkRluRKOhKM4","recX6K7E4ydO0YjPy","recK1EkZSZCLFA007","recEXEwOmEWnxHdne","recF6AkQMSJaAa7ki","recjMGB93cCTBRAZY","rechii0wYCNIqdw8P","recGuKPSSlzj7mdM1","recBargZbtPOcpotA","rec9aa5x8ZRwA47Zr","recCymG2ALbKUAIXB","rec3aMjN13XEM2cUW","recjnrbWiZEl0brY1","rectLIJFqjVS6WhpM","recIIuZVf0Q9mRchL","recqVu45XffOI48Q5","recLnucDYfq0Mu1cA","recH5papKgKz88dbM","rec5BghMVYJ2KntB9","recYfXnoqFBgxwlDA","recBEPGtjSaA4vyta","recKoXfJZhyCDUFCV","recFekw7gHVMUlndt","rec6H2ZHUVnPU1IhC","recxD9kZnxYjJrut5","recjs0mQjL01oyQgj","recFfWoelZjKcTOb0","recmV1rL9Nfvo6tLx","recTzbQImlYsBi1M6","recSYBMzzdV0Nve8z","recbno9og0y0awr3Z","rechSkc7p41sx5jYq","recQP3XP3MUcpnkE0","recy6qoppSKByp1kH","rec9JNuk4ukpteyIR","recBNrnoQr0LEnBPd","recq4B8aguxGWdcwT","recVFLH8oVxQP4eER","recfV4wkoKGrcrlju","rechCv1ax04rK8kzy","recI0eTHxdoAOsKjQ","rec5jawkKPQKilO7t","recH1uObvhmQw6BBg","recweUyCr42l5ssrN","rec6PmvxU85p59gIK","recUQ2SlgVZmup8jM","rec8g9DWRhfcFhLgl","rec7ufwS4Id3VOke5","rec9T1AP2teWQLtEf","reck20KTFAABo6Be1","recABaMetQGB2Wsr4","reczPcsp85arch31m","recDtkpn4f0HwZgOm","recWg4m7RAN1yuhH4","recYwqjVh4sKOnOCS","recMth82AsU3nngSs","recOLfWE8TwHPzAmd","recRxDOVqyBfSlx9L","recZWgBHqNaWipElw","recb5DnUjyDIS4SRV","recN4ACryNBZj87Mm"],"Mentor Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor - Count":10,"Mentee Requests":2},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"rectzgTGoQyy2FVMC","fields":{"Name":"General + Count":11,"Mentee Requests":2},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"rectzgTGoQyy2FVMC","fields":{"Name":"General Guidance - Voice Chat","Description":"Chat 1 on 1 with a mentor via voice - or video","Mentors":["recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj"],"Mentor + or video","Mentors":["recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","rec8gWUa2agvWe6fj","recQI7eSAFvP5LEhP"],"Mentor Request":["reciES5Dp5sR5UiTD","recPXxsjkxCK30l5w","rec86L1kFMGYOmnGn","rec3Sp9P5gTgMFdub","recWJcrc7yshLW535","recyw52g0meDKcxBS","recTrJNLGZeyZrQso","recle23ZC0KGpzq7f","recI84guIOF7Rm4xN","recFiFgdmv7q8OI0k","recfxAuJUGJZQuyOv","recDsbdLGttUXWmUk","rec2n9fNgVJOvk9N3","recb3rcFjBP66pEsM","recO0gtj5NOox5cvU","rec72rOLM74NmG7mL","recEgw278MbXFPjXV","rec5NufGIw6PLJXcD","recVlscT5IeV7Jy0j","recV2opjArSXUkM85","recoHLGJd46435i6v","rec0WXnwFu0gRnZr6","recTx4fWdyWA5XiAT","recf6fuzdgY4fwgQm","recBVb0ZegUcGmLmn","rechOY0LvnrO5p8uM","recdFALRdOkpObGsO","recaK1RmmTwPbtQch","rechlkZKhQIPebb5X","recM3x8O5Nym2hAEM","recqqkBPcUrpozV8f","reclEsb5Tn63Yz17u","receOS381ThK8L27v","recul4wH0fUXpcku5","rec2CpCt6XTrmKf2I","recF5h7HvxIvPuLJV","recIEqi0xGG12h3q2","recM7Bnv6h9kP1hAb","recWPOb4pbLJLSBBO","recw5yJdWIp6t9Lwg","recd4hW73XpoSgWVq","recuyrOhS8FwT1TdH"],"Mentor Skills":["recCbfP26C9oyF6oZ","recXxKHRRiglWGPWt","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor - Count":9,"Mentee Requests":0},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"recxDrpFL9w5tNzkW","fields":{"Name":"Pair - Programming","Description":"Spend an hour with a mentor programming together","Mentors":["recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ"],"Mentees":["recQxZqkW2QfrDX7E"],"Mentor + Count":10,"Mentee Requests":0},"createdTime":"2017-03-05T19:07:42.000Z"},{"id":"recxDrpFL9w5tNzkW","fields":{"Name":"Pair + Programming","Description":"Spend an hour with a mentor programming together","Mentors":["recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","recBM9iaLwaAee4BQ","recQI7eSAFvP5LEhP"],"Mentees":["recQxZqkW2QfrDX7E"],"Mentor Request":["recoZWLdBba0RtObw","recfuT67S14yMmRsR","recH75YcWSGHzoDgL","recVcYxcQZNhZBz8R","rec8OYu6F8n9O2pbv","recbLo1LZkH78m0tf","recPz02jtI7F5Vw4d","recDFjF5KTByknL2j","recWka1ynPANo5s3X","recBtZ6gFrjpRFYFM","recAwQTvFeITTfXe8","recv5Zgl4WqF9RXqr","recD78YUBEB5C7lDF","recpgngdrEXCHdoZK","recQddCu26j0MGmO5","recdGPicU3AM6jUnt","recz1vIqJnTTzDcBS","recevtA3LaYZMqSI2"],"Mentor Skills":["recCbfP26C9oyF6oZ","recbn3OVB3DUPWuI0","reczS6v9bDXf9G8CV","recJR4JPYBISWJVGx"],"Mentor - Count":5,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' - http_version: - recorded_at: Sun, 29 Apr 2018 23:16:23 GMT -- request: - method: get - uri: http://api.airtable.com/v0/some_random_id/Skillsets - body: - encoding: US-ASCII - string: '' - headers: - Authorization: - - Bearer some_random_key - response: - status: - code: 301 - message: Moved Permanently - headers: - Content-Type: - - text/html - Date: - - Sun, 29 Apr 2018 23:16:24 GMT - Location: - - https://api.airtable.com/v0/some_random_id/Skillsets - Server: - - Tengine - Content-Length: - - '278' - Connection: - - keep-alive - body: - encoding: UTF-8 - string: "\r\n\r\n301 - Moved Permanently\r\n\r\n

301 Moved - Permanently

\r\n

The requested resource has been assigned a new permanent - URI.

\r\n
Powered by Tengine\r\n\r\n" + Count":6,"Mentee Requests":1},"createdTime":"2017-03-05T19:07:42.000Z"}]}' http_version: - recorded_at: Sun, 29 Apr 2018 23:16:24 GMT + recorded_at: Sun, 06 May 2018 16:27:07 GMT - request: method: get uri: https://api.airtable.com/v0/some_random_id/Skillsets @@ -872,41 +854,42 @@ http_interactions: Content-Type: - application/json; charset=utf-8 Date: - - Sun, 29 Apr 2018 23:16:24 GMT + - Sun, 06 May 2018 16:27:05 GMT Etag: - - W/"286b-1vcTHyIdkMCD4HHe4fcXmNd6RBs" + - W/"2a5f-riCl8fpcICS4IRlHlF8n2iJxErg" Server: - Tengine Vary: - Accept-Encoding Content-Length: - - '10347' + - '10847' Connection: - keep-alive body: encoding: UTF-8 - string: '{"records":[{"id":"rec5FYXU6jTnXKPHg","fields":{"Name":"Resume Reviews","Mentors":["recZIExVz7yhKtfa8","recxbeT1DazLdZ2I8","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec6iqhMxHhlRZrhx","fields":{"Name":"Bot + string: '{"records":[{"id":"rec5FYXU6jTnXKPHg","fields":{"Name":"Resume Reviews","Mentors":["recZIExVz7yhKtfa8","recxbeT1DazLdZ2I8","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO","recQI7eSAFvP5LEhP","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec6iqhMxHhlRZrhx","fields":{"Name":"Bot Specialist","Mentors":["recIPKInSvxr30rcF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"rec8IVKeTrwsgUPcg","fields":{"Name":"C#/Net","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"rec9lnHZaDt2CvVrZ","fields":{"Name":"Ruby / Rails","Mentors":["recGp2dytDt32ojl6","recRlKczGAcNKN26G","recJkYfbRbuxOXTLA","recBM9iaLwaAee4BQ","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","recH8e2ZDtftbFqRC","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recBIhDduJD3YLaHq","fields":{"Name":"JavaScript","Mentors":["recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-04-11T20:42:43.000Z"},{"id":"recCKrPnHDqOdlhAg","fields":{"Name":"Cake","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recCVc7u3kCONhJfF","fields":{"Name":"Back - End Development","Mentors":["recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W","rec38psl7zI8p3aiT","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recE6GGkL4w2T6pnC","fields":{"Name":"SQL","Mentors":["recyGGSovTrul401Y","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recFJ9FXE6zxrd9i4","fields":{"Name":"Mobile + End Development","Mentors":["recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W","rec38psl7zI8p3aiT","rec6nA4WIrhCtKW5n","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recE6GGkL4w2T6pnC","fields":{"Name":"SQL","Mentors":["recyGGSovTrul401Y","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recErAVRZsjwjpULL","recBM9iaLwaAee4BQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","recPq1y7NgZfrBe6m","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recFJ9FXE6zxrd9i4","fields":{"Name":"Mobile (Android)","Mentors":["receBeTyuWlLfApHB"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recImroWnd6p02aXu","fields":{"Name":"Design / UX","Mentors":["recErAVRZsjwjpULL","recqE8Zl8Fh4bo4PG","rec7i7HYMRX6AArBS","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJACxkZuHTZSU2j","fields":{"Name":"Data - Science","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJBB7ZxTOM6wL5w","fields":{"Name":"Javascript","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recBM9iaLwaAee4BQ","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recV0qJD28ki2Q8kr","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJHiVQNIC3ONMWs","fields":{"Name":"UNIX - Linux Mac OS and command line operation and scripting","Mentors":["rec7ZSEBrUJU9OwRk"]},"createdTime":"2018-03-27T14:42:54.000Z"},{"id":"recM9kb3SazF466xo","fields":{"Name":"Azure","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recNONJ8S1p1TjfKV","fields":{"Name":"C# + Science","Mentors":["reccKrEc0w88fSs7W","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJBB7ZxTOM6wL5w","fields":{"Name":"Javascript","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recBM9iaLwaAee4BQ","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recV0qJD28ki2Q8kr","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recJHiVQNIC3ONMWs","fields":{"Name":"UNIX + Linux Mac OS and command line operation and scripting","Mentors":["rec7ZSEBrUJU9OwRk","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-27T14:42:54.000Z"},{"id":"recM9kb3SazF466xo","fields":{"Name":"Azure","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recNONJ8S1p1TjfKV","fields":{"Name":"C# / .NET","Mentors":["recftNiD91Hhj9506","recoAB9NcDwlBgHkj","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recOfGy9tMeUwjN78","fields":{"Name":"Android - Development","Mentors":["recF4oBzjE3J6A0wo","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recQ6ex9GF5ijQTod","fields":{"Name":"PHP","Mentors":["recPq1y7NgZfrBe6m"]},"createdTime":"2018-04-07T03:33:18.000Z"},{"id":"recRyPBwN1JBj9D9l","fields":{"Name":"Ethics","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSjrlsHtWh9XWOP","fields":{"Name":"DevOps","Mentors":["recyGGSovTrul401Y","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","rec6nA4WIrhCtKW5n","rec425V9c8DsQKckC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSy4HmIGtILqZRv","fields":{"Name":"Xamarian","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSzicEsYXG4P1A4","fields":{"Name":"Architecture","Mentors":["recftNiD91Hhj9506"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recTu7t5M0ViILm5A","fields":{"Name":"Web - (Backend Development)","Mentors":["recyGGSovTrul401Y","recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recUV9DLEoK1JqRV9","fields":{"Name":"Entrepreneurship","Mentors":["recEoe9Yqs6YMGm1L","reccKrEc0w88fSs7W","recqE8Zl8Fh4bo4PG","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recQrZvfSR4jn3RNO","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recWBLfZAbNfPSpLr","fields":{"Name":"Linux","Mentors":["recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recwLPgD9TFTD41dR","rec7ZSEBrUJU9OwRk","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recXeV4Fm0lHnUt2e","fields":{"Name":"Slack","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recY0G28DInafBxgT","fields":{"Name":"IoS + Development","Mentors":["recF4oBzjE3J6A0wo","reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recQ6ex9GF5ijQTod","fields":{"Name":"PHP","Mentors":["recPq1y7NgZfrBe6m"]},"createdTime":"2018-04-07T03:33:18.000Z"},{"id":"recRyPBwN1JBj9D9l","fields":{"Name":"Ethics","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSjrlsHtWh9XWOP","fields":{"Name":"DevOps","Mentors":["recyGGSovTrul401Y","recF4oBzjE3J6A0wo","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","reccKrEc0w88fSs7W","rec6nA4WIrhCtKW5n","rec425V9c8DsQKckC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","rec8hCvdcwA2tR3vF","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSy4HmIGtILqZRv","fields":{"Name":"Xamarian","Mentors":["reccKrEc0w88fSs7W"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recSzicEsYXG4P1A4","fields":{"Name":"Architecture","Mentors":["recftNiD91Hhj9506"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recTu7t5M0ViILm5A","fields":{"Name":"Web + (Backend Development)","Mentors":["recyGGSovTrul401Y","recBM9iaLwaAee4BQ","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recUV9DLEoK1JqRV9","fields":{"Name":"Entrepreneurship","Mentors":["recEoe9Yqs6YMGm1L","reccKrEc0w88fSs7W","recqE8Zl8Fh4bo4PG","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recQrZvfSR4jn3RNO","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recWBLfZAbNfPSpLr","fields":{"Name":"Linux","Mentors":["recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recwLPgD9TFTD41dR","rec7ZSEBrUJU9OwRk","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recQI7eSAFvP5LEhP","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recXeV4Fm0lHnUt2e","fields":{"Name":"Slack","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recY0G28DInafBxgT","fields":{"Name":"IoS Development","Mentors":["recxbeT1DazLdZ2I8","reccKrEc0w88fSs7W","receGKFRAxZa0ZHNf","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recZG14sS7YYVkV3R","fields":{"Name":"scala","Mentors":["recJ8Wi2LOqlY1gaf"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recaoEx1q0QRpvcaR","fields":{"Name":"General - Career Advice","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recH8e2ZDtftbFqRC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recewf1jLcO1QlVfY","fields":{"Name":"Python","Mentors":["recyGGSovTrul401Y","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recf0UbPWw289LKjw","fields":{"Name":"Dancing","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfINzrFfLKSI0GV","fields":{"Name":"Prolog","Mentors":["rec38psl7zI8p3aiT"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfKx8crgrjMMvSk","fields":{"Name":"Cat + Career Advice","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recvUKy6JlCTHGCZi","reciZI1OmBZCdujC5","rec425V9c8DsQKckC","rec7i7HYMRX6AArBS","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","rec7ZSEBrUJU9OwRk","recH8e2ZDtftbFqRC","rec8gWUa2agvWe6fj","recb6YEKZaBKAyt8y","recjZD8fqugX8c2y3","recQrZvfSR4jn3RNO","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe","recQI7eSAFvP5LEhP","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recewf1jLcO1QlVfY","fields":{"Name":"Python","Mentors":["recyGGSovTrul401Y","recRlWEzlSS7xPcMD","recoAB9NcDwlBgHkj","recsblzySLFHOSl1f","recErAVRZsjwjpULL","rec38psl7zI8p3aiT","recTQo4CbKgdmT9Xv","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec8hCvdcwA2tR3vF","recQI7eSAFvP5LEhP","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recf0UbPWw289LKjw","fields":{"Name":"Dancing","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfINzrFfLKSI0GV","fields":{"Name":"Prolog","Mentors":["rec38psl7zI8p3aiT"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfKx8crgrjMMvSk","fields":{"Name":"Cat Pictures","Mentors":["recftNiD91Hhj9506","recsblzySLFHOSl1f"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recfw78VdnD7tpZVz","fields":{"Name":"Functional - Programming","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recJ8Wi2LOqlY1gaf","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recPq1y7NgZfrBe6m","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recj2omdu7WnIXLJk","fields":{"Name":"Data-Science","Mentors":["recErAVRZsjwjpULL","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reck4lkOTkfsMRPkR","fields":{"Name":"Front + Programming","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","recJ8Wi2LOqlY1gaf","rec425V9c8DsQKckC","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recPq1y7NgZfrBe6m","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recj2omdu7WnIXLJk","fields":{"Name":"Data-Science","Mentors":["recErAVRZsjwjpULL","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","rec8hCvdcwA2tR3vF","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reck4lkOTkfsMRPkR","fields":{"Name":"Front End Development","Mentors":["recZIExVz7yhKtfa8","recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","reclgA4dggm30b2WQ","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recl8Vwo2xuFiErJy","fields":{"Name":"C - / C++","Mentors":["receBeTyuWlLfApHB","rec38psl7zI8p3aiT","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recn4IOqrQ5upCwwY","fields":{"Name":"Cyber-Security","Mentors":["rec425V9c8DsQKckC"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recnPHDdWW1J06evO","fields":{"Name":"React","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recosRviLoBCgh6Tq","fields":{"Name":"Java","Mentors":["receBeTyuWlLfApHB","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recwLPgD9TFTD41dR"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recpdV6vAmtmI5psM","fields":{"Name":"Web + / C++","Mentors":["receBeTyuWlLfApHB","rec38psl7zI8p3aiT","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recltaPw69ErRCHmS","fields":{"Name":"Amazon + Web Services","Mentors":["recqezcvBp4ikbNAr"]},"createdTime":"2018-05-04T20:16:01.000Z"},{"id":"recn4IOqrQ5upCwwY","fields":{"Name":"Cyber-Security","Mentors":["rec425V9c8DsQKckC"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recnPHDdWW1J06evO","fields":{"Name":"React","Mentors":["recftNiD91Hhj9506","recRlWEzlSS7xPcMD","rec0SDZDK2DiW4PY9","rec425V9c8DsQKckC","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recuxUbqPerLxgoFe"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recosRviLoBCgh6Tq","fields":{"Name":"Java","Mentors":["receBeTyuWlLfApHB","recF4oBzjE3J6A0wo","recGp2dytDt32ojl6","recoAB9NcDwlBgHkj","recooZOCPZ5mR6ARp","recErAVRZsjwjpULL","reccKrEc0w88fSs7W","recTQo4CbKgdmT9Xv","receGKFRAxZa0ZHNf","recP0NNDfDq02vl6Y","recxYO1jqL4HWnJbI","recwLPgD9TFTD41dR","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recpdV6vAmtmI5psM","fields":{"Name":"Web (Frontend Development)","Mentors":["recBM9iaLwaAee4BQ"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recqmyCWjPSAqgCop","fields":{"Name":"Code - Review","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","rec38psl7zI8p3aiT","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recvDGhGfPUK5UwG0","fields":{"Name":"product + Review","Mentors":["recxbeT1DazLdZ2I8","recftNiD91Hhj9506","recGp2dytDt32ojl6","recJkYfbRbuxOXTLA","recRlWEzlSS7xPcMD","rec38psl7zI8p3aiT","reclgA4dggm30b2WQ","recTQo4CbKgdmT9Xv","recV0qJD28ki2Q8kr","rec425V9c8DsQKckC","recP0NNDfDq02vl6Y","rec9Mcs5JTFxVoKT1","rec2QLQ76thAVQjH0","recxYO1jqL4HWnJbI","recH8e2ZDtftbFqRC","recjZD8fqugX8c2y3","rec8hCvdcwA2tR3vF","recQI7eSAFvP5LEhP","recqezcvBp4ikbNAr"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recvDGhGfPUK5UwG0","fields":{"Name":"product and program management (transitioning to or growing within the function)","Mentors":["recQrZvfSR4jn3RNO"]},"createdTime":"2018-04-23T18:52:44.000Z"},{"id":"recwFfIrvPeq0qGXG","fields":{"Name":"C/C++","Mentors":["rec8hCvdcwA2tR3vF"]},"createdTime":"2018-04-24T16:51:28.000Z"},{"id":"recyG6scETtxZuTNx","fields":{"Name":"Cyber-security","Mentors":["recWPyxrY2QKAkPVL","recqrAeFyljlWtsXC","recwLPgD9TFTD41dR","rec8hCvdcwA2tR3vF"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"recyGndgUYkkyPCrS","fields":{"Name":"Career - Advice","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reczl5liQJOJCap7L","fields":{"Name":"Resume + Advice","Mentors":["recEoe9Yqs6YMGm1L","recQI7eSAFvP5LEhP"]},"createdTime":"2018-03-26T19:22:16.000Z"},{"id":"reczl5liQJOJCap7L","fields":{"Name":"Resume Review","Mentors":["recEoe9Yqs6YMGm1L"]},"createdTime":"2018-03-26T19:22:16.000Z"}]}' http_version: - recorded_at: Sun, 29 Apr 2018 23:16:24 GMT + recorded_at: Sun, 06 May 2018 16:27:07 GMT recorded_with: VCR 3.0.3 diff --git a/test/requests/airtable/mentorship_test.rb b/test/requests/airtable/mentorship_test.rb index 10249e24..2179175b 100644 --- a/test/requests/airtable/mentorship_test.rb +++ b/test/requests/airtable/mentorship_test.rb @@ -39,4 +39,38 @@ def test_429_raises_airtable_error end end end + + def test_create_mentor_request_creates_the_passed_mentor_request + VCR.use_cassette('airtable/mentorship/post_successful') do + request_body = { + slack_user: "test_case_1", + services: "rec3ZQMCQsKPKlE2C", + skillsets: "Java", + additional_details: "Some test description.", + mentor_requested: "rec0SDZDK2DiW4PY9" + } + + response = Airtable::Mentorship.new.create_mentor_request(request_body) + + assert response['id'].present? + assert response.dig('fields', 'Slack User') == request_body[:slack_user] + assert response.dig('fields', 'Service') == [request_body[:services]] + assert response.dig('fields', 'Skillsets') == [request_body[:skillsets]] + assert response.dig('fields', 'Additional Details') == request_body[:additional_details] + assert response.dig('fields', 'Mentor Requested') == [request_body[:mentor_requested]] + end + end + + def test_format_for_posting_converts_comma_separated_string_into_array_of_strings + instance = Airtable::Mentorship.new + + converted = instance.send(:format_for_posting, 'this , and long ') + assert converted == ['this', 'and long'] + + converted = instance.send(:format_for_posting, 'this,that') + assert converted == ['this', 'that'] + + converted = instance.send(:format_for_posting, 'this') + assert converted == ['this'] + end end From 1498f07294a38e45b1a1ece52939eb5e7d7f99c7 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:10:52 -0600 Subject: [PATCH 15/21] Route and controller action to create new Mentor Requests in Airtable --- .../api/v1/airtable/mentorships_controller.rb | 28 +++++++++++++++++++ config/routes.rb | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/airtable/mentorships_controller.rb b/app/controllers/api/v1/airtable/mentorships_controller.rb index 03824d3a..05e3fe9d 100644 --- a/app/controllers/api/v1/airtable/mentorships_controller.rb +++ b/app/controllers/api/v1/airtable/mentorships_controller.rb @@ -11,6 +11,34 @@ def index rescue ::Airtable::Error => e render json: { error: e.message }, status: :unprocessable_entity end + + def create + verify_user! + + mentor_request = ::Airtable::Mentorship.new.create_mentor_request(mentorship_params) + + render json: mentor_request, status: :ok + rescue ::Airtable::Error => e + render json: { error: e.message }, status: :unprocessable_entity + end + + private + + def mentorship_params + params.permit( + :slack_user, + :services, + :skillsets, + :additional_details, + :mentor_requested + ) + end + + def verify_user! + unless current_user.verified? + raise ::Airtable::Error, 'User must be verified to request mentor services' + end + end end end end diff --git a/config/routes.rb b/config/routes.rb index 9ef6a516..ddd701aa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,7 +53,7 @@ end namespace :airtable do - resources :mentorships, only: :index + resources :mentorships, only: [:index, :create] end end end From 18c9be12915c963794438cccee3d9d67575f4357 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:11:22 -0600 Subject: [PATCH 16/21] Controller test coverage for fetching and creating Airtable data --- .../mentorship/post_multiple_successful.yml | 49 ++++++++ ...erified_it_returns_a_and_error_message.yml | 115 ++++++++++++++++++ .../airtable/mentorships_controller_test.rb | 63 +++++++++- test/factories/users.rb | 4 + 4 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 test/cassettes/airtable/mentorship/post_multiple_successful.yml create mode 100644 test/cassettes/api_v_airtable_mentorships_controller_test/_create_when_user_is_not_verified_it_returns_a_and_error_message.yml diff --git a/test/cassettes/airtable/mentorship/post_multiple_successful.yml b/test/cassettes/airtable/mentorship/post_multiple_successful.yml new file mode 100644 index 00000000..1de6b9df --- /dev/null +++ b/test/cassettes/airtable/mentorship/post_multiple_successful.yml @@ -0,0 +1,49 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.airtable.com/v0/some_random_id/Mentor%20Request + body: + encoding: UTF-8 + string: '{"fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Java","Study + Help","Web (Frontend Development)"],"Additional Details":"Some test description.","Mentor + Requested":["rec0SDZDK2DiW4PY9"]}}' + headers: + Authorization: + - Bearer some_random_key + Content-Type: + - application/json + response: + status: + code: 200 + message: OK + headers: + Access-Control-Allow-Headers: + - content-type, authorization, content-length, x-requested-with, x-api-version, + x-airtable-application-id, user-agent, x-airtable-user-agent + Access-Control-Allow-Methods: + - GET,PUT,POST,PATCH,DELETE,OPTIONS + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Date: + - Sun, 06 May 2018 19:28:15 GMT + Etag: + - W/"147-1wtCT6E5MFLX/1fukH9vFtZ3Ef4" + Server: + - Tengine + Vary: + - Accept-Encoding + Content-Length: + - '327' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"id":"recTvgUmwkGMG2HNc","fields":{"Slack User":"test_case_1","Service":["rec3ZQMCQsKPKlE2C"],"Skillsets":["Web + (Frontend Development)","Java","Study Help"],"Additional Details":"Some test + description.","Mentor Requested":["rec0SDZDK2DiW4PY9"],"Created At":"2018-05-06T19:28:15.000Z"},"createdTime":"2018-05-06T19:28:15.645Z"}' + http_version: + recorded_at: Sun, 06 May 2018 19:28:15 GMT +recorded_with: VCR 3.0.3 diff --git a/test/cassettes/api_v_airtable_mentorships_controller_test/_create_when_user_is_not_verified_it_returns_a_and_error_message.yml b/test/cassettes/api_v_airtable_mentorships_controller_test/_create_when_user_is_not_verified_it_returns_a_and_error_message.yml new file mode 100644 index 00000000..aa0a4730 --- /dev/null +++ b/test/cassettes/api_v_airtable_mentorships_controller_test/_create_when_user_is_not_verified_it_returns_a_and_error_message.yml @@ -0,0 +1,115 @@ +--- +http_interactions: +- request: + method: get + uri: http://maps.googleapis.com/maps/api/geocode/json?address=97201&language=en&sensor=false + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=UTF-8 + Date: + - Sun, 06 May 2018 19:46:13 GMT + Expires: + - Mon, 07 May 2018 19:46:13 GMT + Access-Control-Allow-Origin: + - "*" + Server: + - mafe + Content-Length: + - '495' + X-Xss-Protection: + - 1; mode=block + X-Frame-Options: + - SAMEORIGIN + Cache-Control: + - public, max-age=86400 + Age: + - '1' + body: + encoding: ASCII-8BIT + string: | + { + "results" : [ + { + "address_components" : [ + { + "long_name" : "97201", + "short_name" : "97201", + "types" : [ "postal_code" ] + }, + { + "long_name" : "Southwest Portland", + "short_name" : "Southwest Portland", + "types" : [ "neighborhood", "political" ] + }, + { + "long_name" : "Portland", + "short_name" : "Portland", + "types" : [ "locality", "political" ] + }, + { + "long_name" : "Multnomah County", + "short_name" : "Multnomah County", + "types" : [ "administrative_area_level_2", "political" ] + }, + { + "long_name" : "Oregon", + "short_name" : "OR", + "types" : [ "administrative_area_level_1", "political" ] + }, + { + "long_name" : "United States", + "short_name" : "US", + "types" : [ "country", "political" ] + } + ], + "formatted_address" : "Portland, OR 97201, USA", + "geometry" : { + "bounds" : { + "northeast" : { + "lat" : 45.519965, + "lng" : -122.665103 + }, + "southwest" : { + "lat" : 45.497957, + "lng" : -122.7193571 + } + }, + "location" : { + "lat" : 45.505603, + "lng" : -122.6882145 + }, + "location_type" : "APPROXIMATE", + "viewport" : { + "northeast" : { + "lat" : 45.519965, + "lng" : -122.665103 + }, + "southwest" : { + "lat" : 45.497957, + "lng" : -122.7193571 + } + } + }, + "place_id" : "ChIJi8MjqD8KlVQRsyr5ZtaBLMI", + "types" : [ "postal_code" ] + } + ], + "status" : "OK" + } + http_version: + recorded_at: Sun, 06 May 2018 19:46:14 GMT +recorded_with: VCR 3.0.3 diff --git a/test/controllers/api/v1/airtable/mentorships_controller_test.rb b/test/controllers/api/v1/airtable/mentorships_controller_test.rb index 9d4c3c57..a17956ff 100644 --- a/test/controllers/api/v1/airtable/mentorships_controller_test.rb +++ b/test/controllers/api/v1/airtable/mentorships_controller_test.rb @@ -2,7 +2,7 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::IntegrationTest setup do - user = create(:user) + user = create(:user, :verified) @headers = authorization_headers(user) end @@ -23,4 +23,65 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::Integration assert response.parsed_body['error'].present? end end + + test ':create creates a new mentor request record in Airtable' do + VCR.use_cassette('airtable/mentorship/post_successful') do + params = { + slack_user: "test_case_1", + services: "rec3ZQMCQsKPKlE2C", + skillsets: "Java", + additional_details: "Some test description.", + mentor_requested: "rec0SDZDK2DiW4PY9" + } + + post( + api_v1_airtable_mentorships_url, + params: params, + headers: @headers, + as: :json + ) + + assert response.status == 200 + assert response.parsed_body['id'].present? + assert response.parsed_body['createdTime'].present? + end + end + + test ':create with multiple skillets creates a new mentor request record in Airtable' do + VCR.use_cassette('airtable/mentorship/post_multiple_successful') do + params = { + slack_user: "test_case_1", + services: "rec3ZQMCQsKPKlE2C", + skillsets: "Java, Study Help, Web (Frontend Development)", + additional_details: "Some test description.", + mentor_requested: "rec0SDZDK2DiW4PY9" + } + + post( + api_v1_airtable_mentorships_url, + params: params, + headers: @headers, + as: :json + ) + + assert response.status == 200 + assert response.parsed_body['id'].present? + assert response.parsed_body['createdTime'].present? + end + end + + test ':create when user is not verified it returns a 422 and error message' do + user = create(:user, verified: false) + headers = authorization_headers(user) + + post( + api_v1_airtable_mentorships_url, + params: {}, + headers: headers, + as: :json + ) + + assert response.status == 422 + assert response.parsed_body['error'].present? + end end diff --git a/test/factories/users.rb b/test/factories/users.rb index c7371e2a..447a5078 100644 --- a/test/factories/users.rb +++ b/test/factories/users.rb @@ -22,6 +22,10 @@ trait :dynamic_zip do zip { Faker::Address.postcode } end + + trait :verified do + verified true + end end end From a2cca362ed4af3799b5962187fb7a2a00e37e520 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:39:04 -0600 Subject: [PATCH 17/21] Updates the :create action response to a 201 --- app/controllers/api/v1/airtable/mentorships_controller.rb | 2 +- .../api/v1/airtable/mentorships_controller_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/airtable/mentorships_controller.rb b/app/controllers/api/v1/airtable/mentorships_controller.rb index 05e3fe9d..a5ac39ad 100644 --- a/app/controllers/api/v1/airtable/mentorships_controller.rb +++ b/app/controllers/api/v1/airtable/mentorships_controller.rb @@ -17,7 +17,7 @@ def create mentor_request = ::Airtable::Mentorship.new.create_mentor_request(mentorship_params) - render json: mentor_request, status: :ok + render json: mentor_request, status: :created rescue ::Airtable::Error => e render json: { error: e.message }, status: :unprocessable_entity end diff --git a/test/controllers/api/v1/airtable/mentorships_controller_test.rb b/test/controllers/api/v1/airtable/mentorships_controller_test.rb index a17956ff..d71b5e39 100644 --- a/test/controllers/api/v1/airtable/mentorships_controller_test.rb +++ b/test/controllers/api/v1/airtable/mentorships_controller_test.rb @@ -41,7 +41,7 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::Integration as: :json ) - assert response.status == 200 + assert response.status == 201 assert response.parsed_body['id'].present? assert response.parsed_body['createdTime'].present? end @@ -64,7 +64,7 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::Integration as: :json ) - assert response.status == 200 + assert response.status == 201 assert response.parsed_body['id'].present? assert response.parsed_body['createdTime'].present? end From e9e88d0e8b4d55589403f935cb64cfaef92c4311 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 14:39:16 -0600 Subject: [PATCH 18/21] API docs for new Mentorship endpoints --- apiary.apib | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/apiary.apib b/apiary.apib index 436f7152..21800bca 100644 --- a/apiary.apib +++ b/apiary.apib @@ -633,6 +633,100 @@ API endpoints that Operation Code's Rails backend makes available to its React f "bio": "incentivize vertical e-services" } +## Mentorship | Collection [/api/v1/airtable/mentorships] + +### Fetches all the mentor, services, and skillsets Airtables data [GET] + ++ Response 200 (application/json) + + { + "mentors" => [ + { + "id" => "rec0SDZDK2DiW4PY9", + "name" => "Jack Smith" + }, + ... + ], + "services" => [ + { + "id" => "rec3ZQMCQsKPKlE2C", + "name" => "Mock Interview" + }, + ... + ], + "skillsets" => [ + { + "id" => "rec5FYXU6jTnXKPHg", + "name" => "Javascript" + }, + ... + ] + } + ++ Response 422 (application/json) + + { + error: "Some error message" + } + +## Mentorship | Create [/api/v1/airtable/mentorships{?slack_user,services,skillsets,additional_details,mentor_requested}] + ++ Parameters + + + slack_user (string, required) - The requestee's Slack user handle + + services (string, required) - A comma-separated list of Service ids + + skillsets (string, required) - A comma-separated list of Skillset names + + additional_details (text, optional) - Any additional details the requestee wants to share around their request + + mentor_requested (string, optional) - The id of the mentor being requested + +### Create a Mentor Request in Airtable (verified users only)[POST] + + + Request (application/json) + + + Headers + + Authorization: Bearer Access-Token + + + Body + + { + slack_user: "hpjaj", + services: "rec3ZQMCQsKPKlE2C", + skillsets: "Javascript", + additional_details: "Some additional description.", + mentor_requested: "rec0SDZDK2DiW4PY9" + } + + + Response 201 (application/json) + + + Body + + { + "id" => "recTvgUmwkGMG2HNc", + "fields" => { + "Slack User" => "johnsmith", + "Service" => [ + "rec3ZQMCQsKPKlE2C" + ], + "Skillsets" => [ + "Web (Frontend Development)", + "Java", + "Study Help" + ], + "Additional Details" => "Some test description.", + "Mentor Requested" => [ + "rec0SDZDK2DiW4PY9" + ], + "Created At" => "2018-05-06T19:28:15.000Z" + }, + "createdTime" => "2018-05-06T19:28:15.645Z" + } + + + Response 422 (application/json) + + { + error: "User must be verified to request mentor services" + } ## Request | Request a Mentor [/api/v1/requests{?id,user_id,details,language,service_id,requested_mentor_id,status,assigned_mentor_id}] + Parameters From d2bae06da2cedd7dd8c35743a4f67a42263d93b8 Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sun, 6 May 2018 20:25:31 -0600 Subject: [PATCH 19/21] Removes unneeded instance variable assignment --- app/lib/airtable/client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index b77beb5e..007ab855 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -6,7 +6,7 @@ class Client def initialize api_key = Rails.application.secrets.airtable_api_key - @base_id = Rails.application.secrets.airtable_base_id + base_id = Rails.application.secrets.airtable_base_id @headers = { :Authorization => "Bearer #{api_key}"} @base_url = "https://api.airtable.com/v0/#{base_id}/" end From e25209ea254e63fe991c9e713f533d98a0f950cd Mon Sep 17 00:00:00 2001 From: hpjaj Date: Fri, 11 May 2018 19:31:23 -0600 Subject: [PATCH 20/21] Removes Operationcode::Airtable as it has been stale for 6 months --- app/jobs/add_user_to_airtables_job.rb | 35 --------------------- app/models/user.rb | 5 --- test/jobs/add_user_to_airtables_job_test.rb | 32 ------------------- test/models/user_test.rb | 1 - 4 files changed, 73 deletions(-) delete mode 100644 app/jobs/add_user_to_airtables_job.rb delete mode 100644 test/jobs/add_user_to_airtables_job_test.rb diff --git a/app/jobs/add_user_to_airtables_job.rb b/app/jobs/add_user_to_airtables_job.rb deleted file mode 100644 index b0762039..00000000 --- a/app/jobs/add_user_to_airtables_job.rb +++ /dev/null @@ -1,35 +0,0 @@ -class AddUserToAirtablesJob < ActiveJob::Base - queue_as :default - - def perform(user) - @user = user - @airtable = setup_airtable - - if user_exists? - Rails.logger.info "User with email '#{@user.email}' already exists in airtables" - return - end - - result = @airtable.create( - email: @user.email, - zip: @user.zip, - latitude: @user.latitude, - longitude: @user.longitude, - created_at: @user.created_at, - updated_at: @user.updated_at - ) - Rails.logger.info "User created. Returned: #{result}" - result - end - - def setup_airtable - api_key = OperationCode.fetch_secret_with(name: :airtable_api_key) - base_id = OperationCode.fetch_secret_with(name: :airtable_add_user_base_id) - table_id = OperationCode.fetch_secret_with(name: :airtable_add_user_table_name) - Operationcode::Airtable.new(api_key: api_key, base_id: base_id, table: table_id) - end - - def user_exists? - @airtable.find_by(email: @user.email) - end -end diff --git a/app/models/user.rb b/app/models/user.rb index 461a71f8..841de3e0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -146,7 +146,6 @@ def name def welcome_user invite_to_slack - add_to_airtables add_to_send_grid end @@ -154,10 +153,6 @@ def invite_to_slack SlackJobs::InviterJob.perform_later(email) end - def add_to_airtables - AddUserToAirtablesJob.perform_later(self) - end - def add_to_send_grid AddUserToSendGridJob.perform_later(self) end diff --git a/test/jobs/add_user_to_airtables_job_test.rb b/test/jobs/add_user_to_airtables_job_test.rb deleted file mode 100644 index 917bc3d2..00000000 --- a/test/jobs/add_user_to_airtables_job_test.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'test_helper' - -class AddUserToAirtablesJobTest < ActiveJob::TestCase - test 'it adds a user to airtables' do - user = build(:user, email: 'static@email.com') - Operationcode::Airtable.any_instance.expects(:create).with( - email: user.email, - zip: user.zip, - latitude: user.latitude, - longitude: user.longitude, - created_at: user.created_at, - updated_at: user.updated_at - ) - AddUserToAirtablesJob.perform_now(user) - end - - test 'it doesnt add a user if it exists' do - user = build(:user, email: 'static@email.com') - Operationcode::Airtable.any_instance.expects(:create).once.with( - email: user.email, - zip: user.zip, - latitude: user.latitude, - longitude: user.longitude, - created_at: user.created_at, - updated_at: user.updated_at - ) - AddUserToAirtablesJob.perform_now(user) - - Operationcode::Airtable.any_instance.stubs(:find_by).returns(true) - AddUserToAirtablesJob.perform_now(user) - end -end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index d573770d..8813f123 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -5,7 +5,6 @@ class UserTest < ActiveSupport::TestCase user = build(:user, user_opts) SlackJobs::InviterJob.expects(:perform_later).with(user_opts[:email]) - AddUserToAirtablesJob.expects(:perform_later).with(user) AddUserToSendGridJob.expects(:perform_later).with(user) assert_difference('User.count') { user.save } From 487ee89463a8edeac88b818a5f09a554ff6d239c Mon Sep 17 00:00:00 2001 From: hpjaj Date: Sat, 12 May 2018 17:05:00 -0600 Subject: [PATCH 21/21] Fixes RuboCop offenses --- .../api/v1/airtable/mentorships_controller.rb | 4 +--- app/lib/airtable/client.rb | 4 +++- app/lib/airtable/mentorship.rb | 14 ++++++------- .../airtable/mentorships_controller_test.rb | 20 +++++++++---------- test/requests/airtable/client_test.rb | 18 ++++++++--------- test/requests/airtable/mentorship_test.rb | 12 +++++------ 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/app/controllers/api/v1/airtable/mentorships_controller.rb b/app/controllers/api/v1/airtable/mentorships_controller.rb index a5ac39ad..0eb8d59c 100644 --- a/app/controllers/api/v1/airtable/mentorships_controller.rb +++ b/app/controllers/api/v1/airtable/mentorships_controller.rb @@ -35,9 +35,7 @@ def mentorship_params end def verify_user! - unless current_user.verified? - raise ::Airtable::Error, 'User must be verified to request mentor services' - end + raise ::Airtable::Error, 'User must be verified to request mentor services' unless current_user.verified? end end end diff --git a/app/lib/airtable/client.rb b/app/lib/airtable/client.rb index 007ab855..586ea103 100644 --- a/app/lib/airtable/client.rb +++ b/app/lib/airtable/client.rb @@ -7,7 +7,7 @@ class Client def initialize api_key = Rails.application.secrets.airtable_api_key base_id = Rails.application.secrets.airtable_base_id - @headers = { :Authorization => "Bearer #{api_key}"} + @headers = { 'Authorization' => "Bearer #{api_key}" } @base_url = "https://api.airtable.com/v0/#{base_id}/" end @@ -51,9 +51,11 @@ def url_for(table) # @example escaped('Mentor Request') => 'Mentor%20Request' # @see http://ruby-doc.org/stdlib-2.3.3/libdoc/uri/rdoc/URI/Escape.html # + # rubocop:disable Lint/UriEscapeUnescape def escaped(url_string) URI.escape url_string end + # rubocop:enable Lint/UriEscapeUnescape # If the Airtable rate limit is reached, a 429 status code is returned # @see https://airtable.com/appSqQz7spgg0I1jQ/api/docs#curl/ratelimits diff --git a/app/lib/airtable/mentorship.rb b/app/lib/airtable/mentorship.rb index c86e416b..c8d95f22 100644 --- a/app/lib/airtable/mentorship.rb +++ b/app/lib/airtable/mentorship.rb @@ -26,12 +26,12 @@ def mentor_request_data # def create_mentor_request(body) request_body = { - "fields" => { - "Slack User" => body[:slack_user], - "Service" => format_for_posting(body[:services]), - "Skillsets" => format_for_posting(body[:skillsets]), - "Additional Details" => body[:additional_details], - "Mentor Requested" => format_for_posting(body[:mentor_requested]) + 'fields' => { + 'Slack User' => body[:slack_user], + 'Service' => format_for_posting(body[:services]), + 'Skillsets' => format_for_posting(body[:skillsets]), + 'Additional Details' => body[:additional_details], + 'Mentor Requested' => format_for_posting(body[:mentor_requested]) } }.to_json @@ -57,7 +57,7 @@ def data_for(table, name_key: 'Name') # @return [Array] An array of stripped strings # def format_for_posting(data_string) - data_string.split(",").map(&:strip) + data_string.split(',').map(&:strip) end end end diff --git a/test/controllers/api/v1/airtable/mentorships_controller_test.rb b/test/controllers/api/v1/airtable/mentorships_controller_test.rb index d71b5e39..9b38a5c4 100644 --- a/test/controllers/api/v1/airtable/mentorships_controller_test.rb +++ b/test/controllers/api/v1/airtable/mentorships_controller_test.rb @@ -27,11 +27,11 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::Integration test ':create creates a new mentor request record in Airtable' do VCR.use_cassette('airtable/mentorship/post_successful') do params = { - slack_user: "test_case_1", - services: "rec3ZQMCQsKPKlE2C", - skillsets: "Java", - additional_details: "Some test description.", - mentor_requested: "rec0SDZDK2DiW4PY9" + slack_user: 'test_case_1', + services: 'rec3ZQMCQsKPKlE2C', + skillsets: 'Java', + additional_details: 'Some test description.', + mentor_requested: 'rec0SDZDK2DiW4PY9' } post( @@ -50,11 +50,11 @@ class Api::V1::Airtable::MentorshipsControllerTest < ActionDispatch::Integration test ':create with multiple skillets creates a new mentor request record in Airtable' do VCR.use_cassette('airtable/mentorship/post_multiple_successful') do params = { - slack_user: "test_case_1", - services: "rec3ZQMCQsKPKlE2C", - skillsets: "Java, Study Help, Web (Frontend Development)", - additional_details: "Some test description.", - mentor_requested: "rec0SDZDK2DiW4PY9" + slack_user: 'test_case_1', + services: 'rec3ZQMCQsKPKlE2C', + skillsets: 'Java, Study Help, Web (Frontend Development)', + additional_details: 'Some test description.', + mentor_requested: 'rec0SDZDK2DiW4PY9' } post( diff --git a/test/requests/airtable/client_test.rb b/test/requests/airtable/client_test.rb index 351b5e90..e215e70f 100644 --- a/test/requests/airtable/client_test.rb +++ b/test/requests/airtable/client_test.rb @@ -11,17 +11,17 @@ def test_get_records_for_gets_all_the_records_for_the_passed_table def test_post_record_creates_a_new_record_in_the_passed_table request_body = { - "fields" => { - "Slack User" => "test_case_1", - "Service" => [ - "rec3ZQMCQsKPKlE2C" + 'fields' => { + 'Slack User' => 'test_case_1', + 'Service' => [ + 'rec3ZQMCQsKPKlE2C' ], - "Skillsets" => [ - "Java" + 'Skillsets' => [ + 'Java' ], - "Additional Details" => "Some test description.", - "Mentor Requested" => [ - "rec0SDZDK2DiW4PY9" + 'Additional Details' => 'Some test description.', + 'Mentor Requested' => [ + 'rec0SDZDK2DiW4PY9' ] } }.to_json diff --git a/test/requests/airtable/mentorship_test.rb b/test/requests/airtable/mentorship_test.rb index 2179175b..387eb247 100644 --- a/test/requests/airtable/mentorship_test.rb +++ b/test/requests/airtable/mentorship_test.rb @@ -8,7 +8,7 @@ def setup end def test_mentor_request_data_returns_correct_keys - assert @successful_response.keys.sort == [:mentors, :services, :skillsets] + assert @successful_response.keys.sort == %i[mentors services skillsets] end def test_mentor_request_data_returns_correct_mentor_data @@ -43,11 +43,11 @@ def test_429_raises_airtable_error def test_create_mentor_request_creates_the_passed_mentor_request VCR.use_cassette('airtable/mentorship/post_successful') do request_body = { - slack_user: "test_case_1", - services: "rec3ZQMCQsKPKlE2C", - skillsets: "Java", - additional_details: "Some test description.", - mentor_requested: "rec0SDZDK2DiW4PY9" + slack_user: 'test_case_1', + services: 'rec3ZQMCQsKPKlE2C', + skillsets: 'Java', + additional_details: 'Some test description.', + mentor_requested: 'rec0SDZDK2DiW4PY9' } response = Airtable::Mentorship.new.create_mentor_request(request_body)