diff --git a/draft-diagrams/AAI/AbstractAAI.drawio.svg b/draft-diagrams/AAI/AbstractAAI.drawio.svg deleted file mode 100644 index 67b2770..0000000 --- a/draft-diagrams/AAI/AbstractAAI.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Broker
Broker
Clearinghouse
Clearinghouse
Text is not SVG - cannot display
\ No newline at end of file diff --git a/draft-diagrams/AAI/GA4GH_JWT-only_flow.png b/draft-diagrams/AAI/GA4GH_JWT-only_flow.png deleted file mode 100644 index b1c50b3..0000000 Binary files a/draft-diagrams/AAI/GA4GH_JWT-only_flow.png and /dev/null differ diff --git a/draft-diagrams/AAI/LifeScienceAAI.drawio.svg b/draft-diagrams/AAI/LifeScienceAAI.drawio.svg deleted file mode 100644 index fe6b54d..0000000 --- a/draft-diagrams/AAI/LifeScienceAAI.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
REMS Luxemb.
REMS Luxemb.
eduGAIN IdP
eduGAIN IdP
eduGAIN IdP
eduGAIN IdP
Google
account
Google...
Apple account
Apple accou...
ORCID
account
ORCID...
LS username
+
 password
LS username...
REMS Finland
(Resource Entitlement Management System, )
visa issuer



REMS Finland...
...
...
...
...
ControlledAccessGrants
visas
ControlledAccessGrants...
ControlledAccessGrants
visas
ControlledAccessGrants...
ControlledAccessGrants
visas
ControlledAccessGrants...
proxy SP
proxy SP
internal visa issuer for
AffiliationAndRole
AcceptedTermsAndPolicies
ResearcherStatus
LinkedIdentities
visas




internal visa issuer for...
Passport issuer /
OIDC Provider /
OAuth 2 AS





Passport issuer /...
visas
visas
LifeScience AAI
(ELIXIR, GDI, EJP RD, BBMRI)
LifeScience AAI...
Passport clearinghouse /
 OIDC Relying Party /
OAuth 2 client



Passport clearinghouse /...

user 
attributes
management system
user...
user
attributes
user...
user identity
user identity
user affiliation
user affiliation
Identity Providers
Identity Providers
authentication
authentication
REMS Estonia
REMS Estonia
REMS Sweden
REMS Sweden
REMS Belgium
REMS Belgium
REMS France
REMS France
ControlledAccessGrants
visas
ControlledAccessGrants...
...
...
Visa
Issuers
Visa...
Data Access Committeeresearcherdata access requestdata access requestdata access granted
Text is not SVG - cannot display
\ No newline at end of file diff --git a/draft-diagrams/AAI/README.md b/draft-diagrams/AAI/README.md deleted file mode 100644 index 3881caa..0000000 --- a/draft-diagrams/AAI/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Authentication and Authorization Infrastructure - -## [Link to Specification](https://ga4gh.github.io/data-security/) - -## Introduction - -The Authentication and Authorizations Infrastructure (AAI) specification -leverages OpenID Connect (OIDC) to authenticate researchers -desiring to access clinical and genomic resources from data -holders adhering to GA4GH standards. Beyond standard OIDC authentication, AAI enables -data holders to obtain security-related attributes and authorizations of those -researchers. In parallel, the Data Use and Researcher Identity (DURI) Work Stream has developed a standard -representation for researcher authorizations and attributes known as Researcher-ID. -At its core, the AAI specification defines cryptographically secure tokens for exchanging -these researcher attributes called Visas and how various -participants can interact to authenticate researchers, and obtain and validate Visas. - -This specification also provides for federated multilateral authorization infrastructure for greater -interoperability between biomedical institutions sharing restricted datasets. - -### What is OpenID Connect? - -OpenID Connect is a simple identity layer, on top of the OAuth 2.0 protocol, that supports identity verification and the ability to -obtain basic profile information about end users. The AAI specification extends this to define tokens, -endpoints, and flows that enable an OIDC provider (called a Broker) to -provide Passports and Visas to downstream consumers called Passport Clearinghouses. Passports can then be used for -authorization purposes by downstream systems. - -## Passports specification -The AAI and Passports specifications rely on each other for full functionality and will likely be merged in a future version. The Passports specification from the Data Use and Researcher Identities Work Stream can be found [here](https://ga4gh-duri.github.io/researcher_ids/ga4gh_passport_v1.html). - -## Version history - -[Changelog](https://ga4gh.github.io/data-security/changes-1_2) for v1.2 - -Full version history available [here](https://ga4gh.github.io/data-security/aai-openid-connect-profile#specification-revision-history) - - -## Contributors - -GA4GH is an open community and contribution is not limited to those named below. -Names listed alphabetically by surname. Repository maintainers listed [here](./MAINTAINER.md). - -### Core Developers for v1.2 - -- Max Barkley - DNAstack -- Tom Conner - Broad Institute -- Martin Kuba - ELIXIR Czech Republic -- Andrew Patterson - The University of Melbourne Centre for Cancer Research -- Kurt Rodarmer - National Center for Biotechnology Information - NIH - -### Reviewers for v1.2 - -- Francis Jeanson - Peter Munk Cardiac Centre and Ted Rogers Centre for Heart Research -- David Glazer - Verily Life Sciences -- Timothy Slade - RTI International -- Dylan Spalding - ELIXIR Finland - -### Technical Programme Manager - -- Fabio Liberante - Global Alliance for Genomics and Health - -## Work Stream Leadership - -### Data Security - -- David Bernick - Broad Institute -- Lucila Ohno-Machado - Yale University School of Medicine -- Previously - Jean-Pierre Hubaux - Swiss Federal Institute of Technology Lausanne - -### Data Use and Researcher Identities - -- Jaime Guidry-Auvil - National Cancer Institute - NIH -- Tommi Nyrönen - ELIXIR Finland - - -## Demonstration Implementation - -[Life Science RI](https://lifescience-ri.eu/) have implemented this v1.2 specification from the finalised draft for use across the Life Science RI platforms. -Information on creating an account is available [here](https://lifescience-ri.eu/ls-login/users/how-to-get-and-use-life-science-id.html). -With an account, the test service [here](https://echo.aai.elixir-czech.org/) will return a technical view of the various tokens created and shared in an example flow using Passport/AAI 1.2. \ No newline at end of file diff --git a/draft-diagrams/AAI/aai background fig 1.JPG b/draft-diagrams/AAI/aai background fig 1.JPG deleted file mode 100644 index f1da29f..0000000 Binary files a/draft-diagrams/AAI/aai background fig 1.JPG and /dev/null differ diff --git a/draft-diagrams/AAI/aai background fig 2.png b/draft-diagrams/AAI/aai background fig 2.png deleted file mode 100644 index b90fe23..0000000 Binary files a/draft-diagrams/AAI/aai background fig 2.png and /dev/null differ diff --git a/draft-diagrams/AAI/assets/AAI-compliant.svg b/draft-diagrams/AAI/assets/AAI-compliant.svg deleted file mode 100644 index db406e2..0000000 --- a/draft-diagrams/AAI/assets/AAI-compliant.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/AAI-verified.svg b/draft-diagrams/AAI/assets/AAI-verified.svg deleted file mode 100644 index 64cfbef..0000000 --- a/draft-diagrams/AAI/assets/AAI-verified.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Analyze.svg b/draft-diagrams/AAI/assets/Analyze.svg deleted file mode 100644 index 4688cea..0000000 --- a/draft-diagrams/AAI/assets/Analyze.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Approved.svg b/draft-diagrams/AAI/assets/Approved.svg deleted file mode 100644 index db1cc14..0000000 --- a/draft-diagrams/AAI/assets/Approved.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - APPROVED - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Consents.svg b/draft-diagrams/AAI/assets/Consents.svg deleted file mode 100644 index ddea9d1..0000000 --- a/draft-diagrams/AAI/assets/Consents.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Data-Access-Committee.svg b/draft-diagrams/AAI/assets/Data-Access-Committee.svg deleted file mode 100644 index cd28bce..0000000 --- a/draft-diagrams/AAI/assets/Data-Access-Committee.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Data-Access-Request.svg b/draft-diagrams/AAI/assets/Data-Access-Request.svg deleted file mode 100644 index fa6bbad..0000000 --- a/draft-diagrams/AAI/assets/Data-Access-Request.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Data-Curator.svg b/draft-diagrams/AAI/assets/Data-Curator.svg deleted file mode 100644 index c7ba0f3..0000000 --- a/draft-diagrams/AAI/assets/Data-Curator.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Data-donor.svg b/draft-diagrams/AAI/assets/Data-donor.svg deleted file mode 100644 index 1e08252..0000000 --- a/draft-diagrams/AAI/assets/Data-donor.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Download.svg b/draft-diagrams/AAI/assets/Download.svg deleted file mode 100644 index 15ce5c8..0000000 --- a/draft-diagrams/AAI/assets/Download.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Find-datasets.svg b/draft-diagrams/AAI/assets/Find-datasets.svg deleted file mode 100644 index 7dd5891..0000000 --- a/draft-diagrams/AAI/assets/Find-datasets.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Lock.svg b/draft-diagrams/AAI/assets/Lock.svg deleted file mode 100644 index bdcfa64..0000000 --- a/draft-diagrams/AAI/assets/Lock.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Magnifying-glass.svg b/draft-diagrams/AAI/assets/Magnifying-glass.svg deleted file mode 100644 index fd61d47..0000000 --- a/draft-diagrams/AAI/assets/Magnifying-glass.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Passport-Broker.svg b/draft-diagrams/AAI/assets/Passport-Broker.svg deleted file mode 100644 index 6b63d94..0000000 --- a/draft-diagrams/AAI/assets/Passport-Broker.svg +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Passport-Visa-Issuer.svg b/draft-diagrams/AAI/assets/Passport-Visa-Issuer.svg deleted file mode 100644 index 7464f34..0000000 --- a/draft-diagrams/AAI/assets/Passport-Visa-Issuer.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Passport-clearinghouse.svg b/draft-diagrams/AAI/assets/Passport-clearinghouse.svg deleted file mode 100644 index 540cbe3..0000000 --- a/draft-diagrams/AAI/assets/Passport-clearinghouse.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Passport.svg b/draft-diagrams/AAI/assets/Passport.svg deleted file mode 100644 index 66992b9..0000000 --- a/draft-diagrams/AAI/assets/Passport.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - Passport - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Repository.svg b/draft-diagrams/AAI/assets/Repository.svg deleted file mode 100644 index f5bae6d..0000000 --- a/draft-diagrams/AAI/assets/Repository.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Researcher.svg b/draft-diagrams/AAI/assets/Researcher.svg deleted file mode 100644 index 97acbe9..0000000 --- a/draft-diagrams/AAI/assets/Researcher.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Services.svg b/draft-diagrams/AAI/assets/Services.svg deleted file mode 100644 index 5bcaa45..0000000 --- a/draft-diagrams/AAI/assets/Services.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Visa-assertion-blue.svg b/draft-diagrams/AAI/assets/Visa-assertion-blue.svg deleted file mode 100644 index 92f34f9..0000000 --- a/draft-diagrams/AAI/assets/Visa-assertion-blue.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Visa-assertion-green.svg b/draft-diagrams/AAI/assets/Visa-assertion-green.svg deleted file mode 100644 index 04d4435..0000000 --- a/draft-diagrams/AAI/assets/Visa-assertion-green.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/Visa-assertion-orange.svg b/draft-diagrams/AAI/assets/Visa-assertion-orange.svg deleted file mode 100644 index 8ef4df4..0000000 --- a/draft-diagrams/AAI/assets/Visa-assertion-orange.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/aai-library.xml b/draft-diagrams/AAI/assets/aai-library.xml deleted file mode 100644 index b1bef7c..0000000 --- a/draft-diagrams/AAI/assets/aai-library.xml +++ /dev/null @@ -1,163 +0,0 @@ -[ - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzJlMzE5MjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogI2ZmZjsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxwb2x5Z29uIHBvaW50cz0iMzU4LjAxIDI5MS4yMyAzNTguMDEgMTA4Ljc3IDIwMCAxNy41NCA0MS45OSAxMDguNzcgNDEuOTkgMjkxLjIzIDIwMCAzODIuNDYgMzU4LjAxIDI5MS4yMyIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxwYXRoIGQ9Im04OC4yOCwxNzUuMDhsMTYsNi42MmMtMi40LDEyLjQ2LTIuMjYsMjUuMDIuMTEsMzcuMDZsLTE1Ljk5LDYuNzFjLTIuMjMuOTQtMy4yOCwzLjUtMi4zNCw1LjczbDExLjg0LDI4LjIzYy45NCwyLjIzLDMuNSwzLjI4LDUuNzMsMi4zNGwxNi02LjcxYzYuNzgsOS45MSwxNS40MSwxOC42NiwyNS43LDI1LjYxbC02LjYyLDE2Yy0uOTIsMi4yMy4xNCw0Ljc5LDIuMzcsNS43MmwyOC4yOCwxMS43YzIuMjMuOTIsNC43OS0uMTQsNS43Mi0yLjM3bDYuNjItMTZjMTIuNDYsMi40LDI1LjAyLDIuMjYsMzcuMDYtLjExbDYuNzEsMTUuOTljLjk0LDIuMjMsMy41LDMuMjgsNS43MywyLjM0bDI4LjIzLTExLjg0YzIuMjMtLjk0LDMuMjgtMy41LDIuMzQtNS43M2wtNi43MS0xNmM5LjkxLTYuNzgsMTguNjYtMTUuNDEsMjUuNjEtMjUuN2wxNiw2LjYyYzIuMjMuOTIsNC43OS0uMTQsNS43Mi0yLjM3bDExLjctMjguMjhjLjkyLTIuMjMtLjE0LTQuNzktMi4zNy01LjcybC0xNi02LjYyYzIuNC0xMi40NiwyLjI2LTI1LjAyLS4xMS0zNy4wNmwxNS45OS02LjcxYzIuMjMtLjk0LDMuMjgtMy41LDIuMzQtNS43M2wtMTEuODQtMjguMjNjLS45NC0yLjIzLTMuNS0zLjI4LTUuNzMtMi4zNGwtMTYsNi43MWMtNi43OC05LjkxLTE1LjQxLTE4LjY2LTI1LjctMjUuNjFsNi42Mi0xNmMuOTItMi4yMy0uMTQtNC43OS0yLjM3LTUuNzJsLTI4LjI4LTExLjdjLTIuMjMtLjkyLTQuNzkuMTQtNS43MiwyLjM3bC02LjYyLDE2Yy0xMi40Ni0yLjQtMjUuMDItMi4yNi0zNy4wNi4xMWwtNi43MS0xNS45OWMtLjk0LTIuMjMtMy41LTMuMjgtNS43My0yLjM0bC0yOC4yMywxMS44NGMtMi4yMy45NC0zLjI4LDMuNS0yLjM0LDUuNzNsNi43MSwxNmMtOS45MSw2Ljc4LTE4LjY2LDE1LjQxLTI1LjYxLDI1LjdsLTE2LTYuNjJjLTIuMjMtLjkyLTQuNzkuMTQtNS43MiwyLjM3bC0xMS43LDI4LjI4Yy0uOTIsMi4yMy4xNCw0Ljc5LDIuMzcsNS43MlptNDkuOS0uNjZjMTQuMTItMzQuMTQsNTMuMjUtNTAuMzcsODcuMzktMzYuMjUsMzQuMTQsMTQuMTIsNTAuMzcsNTMuMjUsMzYuMjUsODcuMzktMTQuMTIsMzQuMTQtNTMuMjUsNTAuMzctODcuMzksMzYuMjUtMzQuMTQtMTQuMTItNTAuMzctNTMuMjUtMzYuMjUtODcuMzlaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "AAI-compliant", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzJlMzE5MjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogI2ZmZjsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxwb2x5Z29uIHBvaW50cz0iMzU4LjAxIDI5MS4yMyAzNTguMDEgMTA4Ljc3IDIwMCAxNy41NCA0MS45OSAxMDguNzcgNDEuOTkgMjkxLjIzIDIwMCAzODIuNDYgMzU4LjAxIDI5MS4yMyIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxwYXRoIGQ9Im0yODkuNDYsMTQ1Ljk2djQwLjkxaC0yMy43di00MC45MWgtMjguOHY0MC45MWgtNTIuNjljLTcuMTEtMjEuNTMtMjcuNzQtMzYuOS01MS44NC0zNi4wNi0yNy4xOC45Ni00OS4zOSwyMi45LTUwLjY0LDUwLjA3LTEuNCwzMC4xOSwyMi42Niw1NS4xLDUyLjU0LDU1LjEsMjIuNzYsMCw0Mi4xNC0xNC40Niw0OS40Ny0zNC42OWgxMjEuMjNjNy4zMSwwLDEzLjIzLTUuOTIsMTMuMjMtMTMuMjN2LTYyLjA5aC0yOC44Wm0tMTU1LjEzLDg2LjIxYy0xNS45LDAtMjguNzktMTIuODktMjguNzktMjguNzlzMTIuODktMjguNzksMjguNzktMjguNzksMjguNzksMTIuODksMjguNzksMjguNzktMTIuODksMjguNzktMjguNzksMjguNzlaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "AAI-verified", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzlmNzliMDsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6IG5vbmU7JiN4YTsgICAgICAgIHN0cm9rZTogIzlmNzliMDsmI3hhOyAgICAgICAgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDEwLjU2cHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cGF0aCBkPSJtMzA3LjI2LDI0MS42MWMzNy45LDAsNjguNjItMzAuNzIsNjguNjItNjguNjJzLTMwLjcyLTY4LjYyLTY4LjYyLTY4LjYyYy0xMC4yOCwwLTIwLDIuMzMtMjguNzYsNi4zOC0xMS44LTQ0LjU2LTUyLjM4LTc3LjQxLTEwMC42NS03Ny40MS01Ny41MSwwLTEwNC4xMyw0Ni42Mi0xMDQuMTMsMTA0LjEzLDAsNS4xLjM4LDEwLjEsMS4wOSwxNS0xLjk0LS4yNi0zLjktLjQzLTUuOTEtLjQzLTI0LjczLDAtNDQuNzgsMjAuMDUtNDQuNzgsNDQuNzhzMjAuMDIsNDQuNzUsNDQuNzIsNDQuNzhoMHMyMzYuMjQsMCwyMzYuMjQsMGgyLjE3WiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxwYXRoIGQ9Im0xMzAuNjQsMjAzLjd2OTMuOTFjMCw5LjcyLTcuODgsMTcuNTktMTcuNTksMTcuNTlINDUuMjQiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8bGluZSB5Mj0iMzQ2LjQ3IiB4Mj0iMjAwIiB5MT0iMjAzLjciIHgxPSIyMDAiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8cGF0aCBkPSJtMjcyLjM4LDIyNy44djM4Ljg0YzAsOS43Miw3Ljg4LDE3LjU5LDE3LjU5LDE3LjU5aDUxLjA0IiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgPGNpcmNsZSByPSIxNC44NiIgY3k9IjI4NC4yMyIgY3g9IjM1Mi44IiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPGNpcmNsZSByPSIxNC44NiIgY3k9IjM1MS44IiBjeD0iMjAwIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPGNpcmNsZSByPSIxNC44NiIgY3k9IjMxNS4yIiBjeD0iNDUuMjQiIGNsYXNzPSJjbHMtMSIvPiYjeGE7PC9zdmc+", - "w": 400, - "h": 400, - "title": "Analyze", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIsIC5jbHMtMyB7JiN4YTsgICAgICAgIHN0cm9rZS1taXRlcmxpbWl0OiAxMDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTMgeyYjeGE7ICAgICAgICBzdHJva2U6ICM4Y2M2M2U7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogOS41NXB4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICM4Y2M2M2U7JiN4YTsgICAgICAgIHN0cm9rZTogI2ZmZjsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiA1LjcxcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNSB7JiN4YTsgICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyZW07JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMyB7JiN4YTsgICAgICAgIGZpbGw6IG5vbmU7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIGZvbnQtZmFtaWx5OiBQcm94aW1hTm92YS1Cb2xkLCAnUHJveGltYSBOb3ZhJzsmI3hhOyAgICAgICAgZm9udC1zaXplOiA1NS43M3B4OyYjeGE7ICAgICAgICBmb250LXdlaWdodDogNzAwOyYjeGE7ICAgICAgfSYjeGE7ICAgIDwvc3R5bGU+JiN4YTsgIDwvZGVmcz4mI3hhOyAgPGNpcmNsZSByPSIxNDEuNjIiIGN5PSIyMDAiIGN4PSIyMDAuNzUiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICA8Y2lyY2xlIHI9IjEwOC43IiBjeT0iMjAwIiBjeD0iMjAwLjc1IiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPGc+JiN4YTsgICAgPHBhdGggZD0ibTM4OC4zNCwxODcuMTRMMjkuNzMsMjc2LjA2Yy0yLjgyLjctNS4zMS0yLjg1LTQuMS01Ljg0bDEzLjA2LTMyLjM1Yy43LTEuNzMuMTYtMy44OS0xLjI2LTUuMDlsLTI2LjY2LTIyLjVjLTIuNDYtMi4wOC0xLjkyLTYuMzguOS03LjA4bDM1OC42Mi04OC45M2MyLjgyLS43LDUuMzEsMi44NSw0LjEsNS44NGwtMTMuMDYsMzIuMzVjLS43LDEuNzMtLjE2LDMuODksMS4yNiw1LjA5bDI2LjY2LDIyLjVjMi40NiwyLjA4LDEuOTIsNi4zOC0uOSw3LjA4WiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTYuNTggMjQ5LjUzKSByb3RhdGUoLTEzLjkzKSIgY2xhc3M9ImNscy00Ij48dHNwYW4geT0iMCIgeD0iMCI+QVBQUjwvdHNwYW4+PHRzcGFuIHk9IjAiIHg9IjE0My41IiBjbGFzcz0iY2xzLTUiPk88L3RzcGFuPjx0c3BhbiB5PSIwIiB4PSIxODUuMDIiPlZFRDwvdHNwYW4+PC90ZXh0PiYjeGE7ICA8L2c+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Approved", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgc3Ryb2tlOiAjNGFhY2RkOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDE0LjE2cHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMSwgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogbm9uZTsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtMiwgLmNscy0zIHsmI3hhOyAgICAgICAgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTIgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDE1LjUxcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiwgLmNscy0zIHsmI3hhOyAgICAgICAgc3Ryb2tlOiAjMTE3M2JkOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTQgeyYjeGE7ICAgICAgICBmaWxsOiAjNGFhY2RkOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTQsIC5jbHMtNSB7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMHB4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTUgeyYjeGE7ICAgICAgICBmaWxsOiAjYmZlMGYyOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTMgeyYjeGE7ICAgICAgICBmaWxsOiAjZmZmOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDE0LjU2cHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cmVjdCByeT0iMi41NSIgcng9IjIuNTUiIGhlaWdodD0iMzM5LjgxIiB3aWR0aD0iMjYxLjk0IiB5PSIzMC4wOSIgeD0iMzYuNjkiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICA8bGluZSB5Mj0iMTE1LjA1IiB4Mj0iMjU2LjE1IiB5MT0iMTE1LjA1IiB4MT0iODYuMjUiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8bGluZSB5Mj0iMTU3LjUyIiB4Mj0iMjU2LjE1IiB5MT0iMTU3LjUyIiB4MT0iODYuMjUiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8bGluZSB5Mj0iMjAwIiB4Mj0iMTg4LjE5IiB5MT0iMjAwIiB4MT0iODYuMjUiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8cGF0aCBkPSJtOTMuMzMsMjk5LjExczIxLjI0LDE0LjE2LDI4LjMyLTM1LjRjNy4wOC00OS41NiwwLDM1LjQsNy4wOCwzNS40czEyLjM5LTIxLjI0LDIxLjI0LTIxLjI0YzcuMDgsMCw3LjA4LDIxLjI0LDIxLjI0LDIxLjI0czE2LjIzLTIxLjI0LDIxLjI0LTIxLjI0YzcuNTEsMCw2LjY1LDIxLjI0LDE0LjE2LDIxLjI0LDE0LjE2LDAsMTQuMTYtMTQuMTYsMTQuMTYtMTQuMTYiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICA8Zz4mI3hhOyAgICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5MS45NCAtMTExLjE2KSByb3RhdGUoMjQuMzUpIiByeT0iMi41NSIgcng9IjIuNTUiIGhlaWdodD0iMjI5LjM3IiB3aWR0aD0iMjQuNzkiIHk9IjQyLjc4IiB4PSIyOTEuMTYiIGNsYXNzPSJjbHMtNSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0yNDMuMjUsMjkzLjgzbDIxLjk1LTI0LjE5YzEuMTYtMS4yOC43NC0zLjMyLS44NC00LjA0bC0xNi4zNy03LjQxYy0xLjUzLS42OS0zLjI5LjI1LTMuNTcsMS45MWwtNS4yMiwzMS41OWMtLjIsMS4yLjQ1LDIuNDQsMS42MSwyLjguNDkuMTUsMS4wNC4xNiwxLjU1LS4wMy4zNS0uMTIuNjQtLjM2Ljg5LS42M1oiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgIDxjaXJjbGUgcj0iMTIuMzkiIGN5PSI1Mi44MyIgY3g9IjM1MC45MSIgY2xhc3M9ImNscy01Ii8+JiN4YTsgIDwvZz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Consents", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDIuMDhweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIsIC5jbHMtMywgLmNscy00LCAuY2xzLTUsIC5jbHMtNiB7JiN4YTsgICAgICAgIHN0cm9rZTogIzFiNzViYTsmI3hhOyAgICAgICAgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtNyB7JiN4YTsgICAgICAgIGZpbGw6ICMxYjc1YmE7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiwgLmNscy00IHsmI3hhOyAgICAgICAgZmlsbDogbm9uZTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zLCAuY2xzLTggeyYjeGE7ICAgICAgICBmaWxsOiAjYzBlMGYxOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTMsIC5jbHMtNSwgLmNscy02IHsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDYuNzVweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy00IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiA0Ljc5cHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtOSwgLmNscy03LCAuY2xzLTggeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy05LCAuY2xzLTUgeyYjeGE7ICAgICAgICBmaWxsOiAjNGVhZGRhOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTYgeyYjeGE7ICAgICAgICBmaWxsOiAjZjJmMmYyOyYjeGE7ICAgICAgfSYjeGE7ICAgIDwvc3R5bGU+JiN4YTsgIDwvZGVmcz4mI3hhOyAgPGc+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8Y2lyY2xlIHI9IjMxLjA4IiBjeT0iMTA0LjYyIiBjeD0iMTk5LjI3IiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0xNTQuMDMsMTc4LjAxYzAtMjUuMjEsMjAuNDMtNDIuMzEsNDUuNjQtNDIuMzFzNDUuNjQsMTcuMSw0NS42NCw0Mi4zMSIgY2xhc3M9ImNscy0zIi8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxnPiYjeGE7ICAgICAgPGNpcmNsZSByPSIzMS4wOCIgY3k9IjEwMy44NiIgY3g9IjEwNC40MSIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgICA8cGF0aCBkPSJtNTkuMTYsMTc3LjI2YzAtMjUuMjEsMjAuNDMtNDIuMzEsNDUuNjQtNDIuMzFzNDUuNjQsMTcuMSw0NS42NCw0Mi4zMSIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxwYXRoIGQ9Im0yNDUuMzcsMTgxLjQzYzAtMTYuNTItMi44Mi0zMC45My0xNS4wNy0zNS43MS03LjM1LTIuODctNy40MiwzLjYxLTMwLjk5LDMuNjEtMjIuMjYsMC0yMS43OC04LjY3LTI5LjY4LTQuOTctMTAuODQsNS4wOC0xNi43NywyMS43OC0xNi43NywzNy4wNyIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8Y2lyY2xlIHI9IjMxLjA4IiBjeT0iMTA0LjYyIiBjeD0iMjk0Ljk2IiBjbGFzcz0iY2xzLTUiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0yNDkuNzEsMTc4LjAxYzAtMjUuMjEsMjAuNDMtNDIuMzEsNDUuNjQtNDIuMzFzNDUuNjQsMTcuMSw0NS42NCw0Mi4zMSIgY2xhc3M9ImNscy01Ii8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxwYXRoIGQ9Im0zNDEuMDUsMTgxLjQzYzAtMTYuNTItMi44Mi0zMC45My0xNS4wNy0zNS43MS03LjM1LTIuODctNy40MiwzLjYxLTMwLjk5LDMuNjEtMjIuMjYsMC0yMS43OC04LjY3LTI5LjY4LTQuOTctMTAuODQsNS4wOC0xNi43NywyMS43OC0xNi43NywzNy4wNyIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgPHBhdGggZD0ibTE1MS4wMSwxODAuOTVjMC0xNi42Ni0yLjg1LTMxLjIxLTE1LjItMzYuMDItNy40MS0yLjg5LTcuNDgsMy42NC0zMS4yNiwzLjY0LTIyLjQ1LDAtMjEuOTctOC43NS0yOS45NC01LjAxLTEwLjkzLDUuMTMtMTUuNjcsMjEuNTgtMTUuNjcsMzciIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICA8L2c+JiN4YTsgIDxwYXRoIGQ9Im00MC40NywxODQuMDNoMzE5LjA1djExMC4yYzAsMTguMjEtMTQuNzgsMzIuOTktMzIuOTksMzIuOTlINzMuNDZjLTE4LjIxLDAtMzIuOTktMTQuNzgtMzIuOTktMzIuOTl2LTExMC4yaDBaIiBjbGFzcz0iY2xzLTgiLz4mI3hhOyAgPHJlY3Qgcnk9IjcuMzgiIHJ4PSI3LjM4IiBoZWlnaHQ9IjMwLjI3IiB3aWR0aD0iMzcyLjI1IiB5PSIxNzUuMzYiIHg9IjEzLjg4IiBjbGFzcz0iY2xzLTkiLz4mI3hhOyAgPGc+JiN4YTsgICAgPGxpbmUgeTI9IjI2Ni4xNSIgeDI9IjI1Ny41NyIgeTE9IjIyNS44NiIgeDE9IjIzNy4wMiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPHBhdGggZD0ibTI1Ny40NywyNjYuMjFjMCw3LjYxLTkuMTMsMTMuNzgtMjAuMzgsMTMuNzhzLTIwLjM4LTYuMTctMjAuMzgtMTMuNzhoNDAuNzZaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTgzLjE5LDI2Ni4yMWMwLDcuNjEtOS4xMywxMy43OC0yMC4zOCwxMy43OHMtMjAuMzgtNi4xNy0yMC4zOC0xMy43OGg0MC43NloiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICAgIDxsaW5lIHkyPSIzMDIuNzUiIHgyPSIxOTkuOTUiIHkxPSIyMjUuOTIiIHgxPSIxOTkuOTUiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgIDxsaW5lIHkyPSIyNjYuMTUiIHgyPSIxNDIuNSIgeTE9IjIyNi4wMyIgeDE9IjE2Mi44OCIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPHBhdGggZD0ibTIyNS40NSwzMTAuNTNoLTUwLjgzYy0uMiwwLS4yOC0uMjUtLjEyLS4zN2w5LjgxLTcuMzZzLjA4LS4wNC4xMi0uMDRoMzEuMnMuMDkuMDEuMTIuMDRsOS44MSw3LjM2Yy4xNi4xMi4wNy4zNy0uMTIuMzdaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgICA8Y2lyY2xlIHI9IjIuNDgiIGN5PSIyMjQuOTYiIGN4PSIxOTkuOTUiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgIDxwb2x5Z29uIHBvaW50cz0iMjM3LjYzIDIyNC44MiAxNjIuMjQgMjI1IDE2MS43MiAyMjYuMDMgMTgyLjMxIDI2Ni42MSAxODQuMTYgMjY1LjY4IDE2NC41NyAyMjcuMDcgMjM1LjMzIDIyNi45IDIxNS43NCAyNjUuNjggMjE3LjU5IDI2Ni42MSAyMzguMTcgMjI1Ljg4IDIzNy42MyAyMjQuODIiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICA8L2c+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Data-Access-Committee", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzBmNzRiYTsmI3hhOyAgICAgICAgc3Ryb2tlOiAjZmZmOyYjeGE7ICAgICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7JiN4YTsgICAgICAgIHN0cm9rZS1taXRlcmxpbWl0OiAxMDsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAxNy42N3B4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTIgeyYjeGE7ICAgICAgICBmaWxsOiAjOWU3OWFmOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxwYXRoIGQ9Im0zMTcuODEsMzg0LjA1SDk4Yy0xMS43NCwwLTIxLjk2LTcuOTktMjQuODEtMTkuMzgtNi44MS0yNy4yOC0xNy40NS04Mi45Ny0xNy40NS0xNjQuNjdzMTAuOTktMTM1LjkyLDE3Ljc4LTE2NC40NmMyLjc0LTExLjUsMTMuMDMtMTkuNTksMjQuODYtMTkuNTloMjIwLjMxYzE1LjIxLDAsMjcuMDYsMTMuMTgsMjUuNDIsMjguMy0zLjc4LDM0Ljg0LTkuNzIsOTYuNDktOS43MiwxNTUuNzUsMCw2OS4xNiw1LjA2LDEyNC4xNiw4LjgxLDE1NS40MywxLjgzLDE1LjIzLTEwLjA0LDI4LjYyLTI1LjM4LDI4LjYyWiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgIDxsaW5lIHkyPSI3Ny43OSIgeDI9IjI4OS4wMiIgeTE9Ijc3Ljc5IiB4MT0iMTE4LjIyIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPGxpbmUgeTI9IjEyNC45MSIgeDI9IjI3Ny4yNCIgeTE9IjEyNC45MSIgeDE9IjEwNi40NCIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxsaW5lIHkyPSIxNzIuMDIiIHgyPSIxODguOSIgeTE9IjE3Mi4wMiIgeDE9IjEwNi40NCIgY2xhc3M9ImNscy0xIi8+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Data-Access-Request", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogI2RkZWJjMzsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOS45M3B4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtMiB7JiN4YTsgICAgICAgIHN0cm9rZTogIzhiYzUzZjsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdDogMTA7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6IG5vbmU7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMTkuOTNweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogIzhiYzUzZjsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8Y2lyY2xlIHI9IjEwMi4xMyIgY3k9IjEzMC40OSIgY3g9IjIwMC41MiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxwYXRoIGQ9Im0zNTEuOTcsMzcwLjE0YzAtNTQuMjgtOS4yNy04OC45LTQ5LjUxLTEwNC42LTI0LjE0LTkuNDItMjQuMzYsMTEuODctMTAxLjgxLDExLjg3LTczLjEzLDAtNzEuNTUtMjguNDktOTcuNTEtMTYuMzItMzUuNjEsMTYuNjktNTUuMTEsNTguODItNTUuMTEsMTA5LjA1IiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPHBhdGggZD0ibTUxLjg1LDM3MS42NGMwLTgyLjgyLDY3LjE0LTEzOS4wMSwxNDkuOTYtMTM5LjAxczE0OS45Niw1Ni4xOSwxNDkuOTYsMTM5LjAxSDUxLjg1WiIgY2xhc3M9ImNscy0yIi8+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Data-Curator", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogI2MxZTFmMjsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOS45M3B4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtMiB7JiN4YTsgICAgICAgIHN0cm9rZTogIzRmYWVkYzsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdDogMTA7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6IG5vbmU7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMTkuOTNweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogIzRmYWVkYzsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8Y2lyY2xlIHI9IjEwMi4xMyIgY3k9IjEzMC40OSIgY3g9IjIwMC41MiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxwYXRoIGQ9Im0zNTEuOTcsMzcwLjE0YzAtNTQuMjgtOS4yNy04OC45LTQ5LjUxLTEwNC42LTI0LjE0LTkuNDItMjQuMzYsMTEuODctMTAxLjgxLDExLjg3LTczLjEzLDAtNzEuNTUtMjguNDktOTcuNTEtMTYuMzItMzUuNjEsMTYuNjktNTUuMTEsNTguODItNTUuMTEsMTA5LjA1IiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPHBhdGggZD0ibTUxLjg1LDM3MS42NGMwLTgyLjgyLDY3LjE0LTEzOS4wMSwxNDkuOTYtMTM5LjAxczE0OS45Niw1Ni4xOSwxNDkuOTYsMTM5LjAxSDUxLjg1WiIgY2xhc3M9ImNscy0yIi8+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Data-donor", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6IG5vbmU7JiN4YTsgICAgICAgIHN0cm9rZTogIzlmNzliMDsmI3hhOyAgICAgICAgc3Ryb2tlLW1pdGVybGltaXQ6IDEwOyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDE4cHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8Y2lyY2xlIHI9IjE2OC40OSIgY3k9IjIwMCIgY3g9IjIwMCIgY2xhc3M9ImNscy0yIi8+JiN4YTsgIDxsaW5lIHkyPSIyNzQuOTIiIHgyPSIyMDAiIHkxPSIxMDQuMjciIHgxPSIyMDAiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICA8cG9seWxpbmUgcG9pbnRzPSIxMjIuODcgMjE4LjkxIDE5OC42IDI5NC42NCAyNzMuNDYgMjE5Ljc4IiBjbGFzcz0iY2xzLTEiLz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Download", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogI2MxZTFmMjsmI3hhOyAgICAgICAgb3BhY2l0eTogLjU7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMSwgLmNscy0yLCAuY2xzLTMgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogIzRmYWVkYzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogIzlmNzliMDsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxnPiYjeGE7ICAgIDxwYXRoIGQ9Im0yOTMuNiwyMDguNjljLTcuMyw1LjQ2LTE3LjY0LDEwLjMzLTMwLjc1LDE0LjQ4LTI2LjUyLDguMzktNjEuNzEsMTMuMDEtOTkuMDksMTMuMDFzLTcyLjU3LTQuNjItOTkuMDktMTMuMDFjLTEzLjExLTQuMTUtMjMuNDUtOS4wMi0zMC43NS0xNC40OC0yLjAyLTEuNTEtMy44LTMuMDYtNS4zMi00LjY1djUxLjQ3YzAsOS45MywxMy45MSwyMC4wMywzOC4xOCwyNy43LDI1Ljg2LDguMTgsNjAuMywxMi42OSw5Ni45OSwxMi42OXM3MS4xMy00LjUxLDk2Ljk5LTEyLjY5YzI0LjI2LTcuNjgsMzguMTgtMTcuNzgsMzguMTgtMjcuN3YtNTEuNDdjLTEuNTMsMS41OC0zLjMsMy4xMy01LjMyLDQuNjVaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgICA8cGF0aCBkPSJtMjkzLjYsMTQyYy03LjMsNS40Ni0xNy42NCwxMC4zMy0zMC43NSwxNC40OC0yNi41Miw4LjM5LTYxLjcxLDEzLjAxLTk5LjA5LDEzLjAxcy03Mi41Ny00LjYyLTk5LjA5LTEzLjAxYy0xMy4xMS00LjE1LTIzLjQ1LTkuMDItMzAuNzUtMTQuNDgtMi4wMi0xLjUxLTMuOC0zLjA2LTUuMzItNC42NXY1MS40N2MwLDkuOTMsMTMuOTEsMjAuMDMsMzguMTgsMjcuNywyNS44Niw4LjE4LDYwLjMsMTIuNjksOTYuOTksMTIuNjlzNzEuMTMtNC41MSw5Ni45OS0xMi42OWMyNC4yNi03LjY4LDM4LjE4LTE3Ljc4LDM4LjE4LTI3Ljd2LTUxLjQ3Yy0xLjUzLDEuNTgtMy4zLDMuMTMtNS4zMiw0LjY1WiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8cGF0aCBkPSJtNjYuNzcsODYuNjVjMjUuODYsOC4xOCw2MC4zLDEyLjY5LDk2Ljk5LDEyLjY5czcxLjEzLTQuNTEsOTYuOTktMTIuNjljMjQuMjYtNy42OCwzOC4xOC0xNy43OCwzOC4xOC0yNy43cy0xMy45MS0yMC4wMy0zOC4xOC0yNy43Yy0yNS44Ni04LjE4LTYwLjMtMTIuNjktOTYuOTktMTIuNjlzLTcxLjEzLDQuNTEtOTYuOTksMTIuNjljLTI0LjI2LDcuNjgtMzguMTgsMTcuNzgtMzguMTgsMjcuN3MxMy45MSwyMC4wMywzOC4xOCwyNy43WiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMjkzLjYsNzguODJjLTcuMyw1LjQ2LTE3LjY0LDEwLjMzLTMwLjc1LDE0LjQ4LTI2LjUyLDguMzktNjEuNzEsMTMuMDEtOTkuMDksMTMuMDFzLTcyLjU3LTQuNjItOTkuMDktMTMuMDFjLTEzLjExLTQuMTUtMjMuNDUtOS4wMi0zMC43NS0xNC40OC0yLjAyLTEuNTEtMy44LTMuMDYtNS4zMi00LjY1djQ3Ljk2YzAsOS45MywxMy45MSwyMC4wMywzOC4xOCwyNy43LDI1Ljg2LDguMTgsNjAuMywxMi42OSw5Ni45OSwxMi42OXM3MS4xMy00LjUxLDk2Ljk5LTEyLjY5YzI0LjI2LTcuNjgsMzguMTgtMTcuNzgsMzguMTgtMjcuN3YtNDcuOTZjLTEuNTMsMS41OC0zLjMsMy4xMy01LjMyLDQuNjVaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgICA8L2c+JiN4YTsgIDwvZz4mI3hhOyAgPGc+JiN4YTsgICAgPHBhdGggZD0ibTMyMC40NCwzMDAuOTJsNDguNzksNjMuNTFoLS4wMWMzLjU2LDQuNjQsMi42OSwxMS4yOC0xLjk0LDE0LjgzLTQuNjMsMy41Ni0xMS4yNiwyLjY5LTE0LjgyLTEuOTRoLS4wMXMtNDguNzktNjMuNDktNDguNzktNjMuNDlsMTYuNzktMTIuOVoiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgIDxjaXJjbGUgcj0iNjkuNjEiIGN5PSIyNDcuMTEiIGN4PSIyNzIuNzIiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0yMzcuODgsMzIyLjYxYzQwLjUzLDE4LjAxLDg3Ljk4LS4yNSwxMDUuOTktNDAuNzgsMTguMDEtNDAuNTMtLjI1LTg3Ljk4LTQwLjc4LTEwNS45OS00MC41My0xOC4wMS04Ny45OC4yNS0xMDUuOTksNDAuNzgtMTguMDEsNDAuNTMuMjUsODcuOTgsNDAuNzgsMTA1Ljk5Wm02LjMyLTE0LjIyYy0zMi42Ny0xNC41Mi00Ny4zOS01Mi43Ny0zMi44OC04NS40NSwxNC41Mi0zMi42Nyw1Mi43Ny00Ny40LDg1LjQ1LTMyLjg4LDMyLjY3LDE0LjUyLDQ3LjQsNTIuNzcsMzIuODgsODUuNDUtMTQuNTIsMzIuNjctNTIuNzcsNDcuNC04NS40NSwzMi44OFoiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICA8L2c+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Find-datasets", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogbm9uZTsmI3hhOyAgICAgICAgc3Ryb2tlOiAjNzY3ODdhOyYjeGE7ICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdDogMTA7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMTIuODRweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogIzRlYWRkYTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yLCAuY2xzLTMgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogI2ZmZjsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxlbGxpcHNlIHJ5PSIxMjIuMDIiIHJ4PSI5Mi4wNSIgY3k9IjE0MS42OCIgY3g9IjE5OS4zOSIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxnPiYjeGE7ICAgIDxyZWN0IHJ5PSI1Mi41MyIgcng9IjUyLjUzIiBoZWlnaHQ9IjIzNS45MiIgd2lkdGg9IjI5OC44MyIgeT0iMTQ1LjUyIiB4PSI1MC41OCIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPGNpcmNsZSByPSI0My4yIiBjeT0iMjM3IiBjeD0iMjAwIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTg2LjE4LDIzN2gyOS4zN3Y4Ny41OWMwLDYuMDItNC44OCwxMC45LTEwLjksMTAuOWgtNy41N2MtNi4wMiwwLTEwLjktNC44OC0xMC45LTEwLjl2LTg3LjU5aDBaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPC9nPiYjeGE7PC9zdmc+", - "w": 400, - "h": 400, - "title": "Lock", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogI2MwZTBmMTsmI3hhOyAgICAgICAgb3BhY2l0eTogLjU7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMSwgLmNscy0yIHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICMxYjc1YmE7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cGF0aCBkPSJtMTMzLjksMjQyLjlsLTgxLjMzLDEwNS44NS4wMi4wMmMtNS45Myw3LjcyLTQuNDgsMTguNzgsMy4yNCwyNC43MSw3LjcyLDUuOTMsMTguNzgsNC40OCwyNC43MS0zLjI0bC4wMi4wMiw4MS4zMy0xMDUuODUtMjcuOTktMjEuNTFaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgPGNpcmNsZSByPSIxMTYuMDIiIGN5PSIxNTMuMjIiIGN4PSIyMTMuNDUiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICA8cGF0aCBkPSJtMzM5LjQ5LDEwMi40MUMzMDkuNDgsMzQuODUsMjMwLjM5LDQuNDIsMTYyLjgzLDM0LjQzYy02Ny41NiwzMC4wMS05Ny45OSwxMDkuMTEtNjcuOTgsMTc2LjY2LDMwLjAxLDY3LjU2LDEwOS4xMSw5Ny45OSwxNzYuNjYsNjcuOTgsNjcuNTYtMzAuMDEsOTcuOTktMTA5LjExLDY3Ljk4LTE3Ni42NlptLTIyMC45NCw5OC4xNWMtMjQuMi01NC40Ni4zNC0xMTguMjMsNTQuOC0xNDIuNDMsNTQuNDYtMjQuMiwxMTguMjMuMzQsMTQyLjQzLDU0LjgsMjQuMiw1NC40Ni0uMzQsMTE4LjIzLTU0LjgsMTQyLjQzLTU0LjQ2LDI0LjItMTE4LjIzLS4zNC0xNDIuNDMtNTQuOFoiIGNsYXNzPSJjbHMtMiIvPiYjeGE7PC9zdmc+", - "w": 400, - "h": 400, - "title": "Magnifying-glass", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCIgZGF0YS1uYW1lPSJMYXllciAxIiBpZD0iTGF5ZXJfMSI+JiN4YTsgIDxkZWZzPiYjeGE7ICAgIDxzdHlsZT4mI3hhOyAgICAgIC5jbHMtMSB7JiN4YTsgICAgICAgIGZpbHRlcjogdXJsKCNkcm9wLXNoYWRvdy0yKTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogI2YyZjJmMjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yLCAuY2xzLTMsIC5jbHMtNCwgLmNscy01LCAuY2xzLTYsIC5jbHMtNywgLmNscy04LCAuY2xzLTksIC5jbHMtMTAsIC5jbHMtMTEgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogI2ZhYTYzMzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy00IHsmI3hhOyAgICAgICAgZmlsbDogIzc2Nzg3YTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy01IHsmI3hhOyAgICAgICAgZmlsbDogIzRmYWVkYzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy02IHsmI3hhOyAgICAgICAgZmlsbDogIzFiNzViYjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy03IHsmI3hhOyAgICAgICAgZmlsbDogI2NjYzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy04IHsmI3hhOyAgICAgICAgZmlsbDogI2IzYjNiMzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy05IHsmI3hhOyAgICAgICAgZmlsbDogIzhjYzYzZTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xMCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMTEgeyYjeGE7ICAgICAgICBmaWxsOiAjZTZlNmU2OyYjeGE7ICAgICAgfSYjeGE7ICAgIDwvc3R5bGU+JiN4YTsgICAgPGZpbHRlciBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJkcm9wLXNoYWRvdy0yIj4mI3hhOyAgICAgIDxmZU9mZnNldCBkeT0iMCIgZHg9Ii03LjY2Ii8+JiN4YTsgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI5NS43OSIgcmVzdWx0PSJibHVyIi8+JiN4YTsgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIuMjUiIGZsb29kLWNvbG9yPSIjMDAwIi8+JiN4YTsgICAgICA8ZmVDb21wb3NpdGUgb3BlcmF0b3I9ImluIiBpbjI9ImJsdXIiLz4mI3hhOyAgICAgIDxmZUNvbXBvc2l0ZSBpbj0iU291cmNlR3JhcGhpYyIvPiYjeGE7ICAgIDwvZmlsdGVyPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxnIGNsYXNzPSJjbHMtMSI+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8cGF0aCBkPSJtMjk3Ljg4LDI0LjMxTDY0LjE0LDU2LjM4Yy0zLjYyLjUtNi40NywzLjM1LTYuOTYsNi45N2wtMTguNzIsMTM4LjY4LDI0NC4wNy0zMy40OWMuNy0uMSwxLjI2LS42NCwxLjM4LTEuMzNsMjMuMDktMTMzLjQ1Yy45NC01LjQyLTMuNjctMTAuMTktOS4xMi05LjQ1WiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgICA8cGF0aCBkPSJtMzcuOTQsMjAyLjU2bC4wOC0uNTlMNTYuNzQsNjMuMjljLjUxLTMuODEsMy41My02Ljg0LDcuMzQtNy4zNmwyMzMuNzQtMzIuMDguMDYuNDUtLjA2LS40NWMyLjc0LS4zOCw1LjQyLjU1LDcuMzQsMi41NCwxLjkyLDEuOTksMi43Niw0LjcsMi4yOCw3LjQzbC0yMy4wOSwxMzMuNDVjLS4xNi45LS44NiwxLjU4LTEuNzYsMS43bC0yNDQuNjUsMzMuNTdaTTI5Ny45NCwyNC43NUw2NC4yLDU2LjgzYy0zLjQxLjQ3LTYuMTEsMy4xOC02LjU3LDYuNTlsLTE4LjY0LDEzOC4wOSwyNDMuNDgtMzMuNDFjLjUxLS4wNy45MS0uNDYsMS0uOTdsMjMuMDktMTMzLjQ1Yy40Mi0yLjQ0LS4zMi00Ljg3LTIuMDQtNi42NS0xLjcyLTEuNzgtNC4xMi0yLjYxLTYuNTctMi4yOGgwWiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxnPiYjeGE7ICAgICAgPHJlY3QgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM1LjM4IDI2LjEpIHJvdGF0ZSgtNy44MSkiIHJ5PSI0LjU0IiByeD0iNC41NCIgaGVpZ2h0PSIxNzUuNDkiIHdpZHRoPSIyNDguMzYiIHk9IjE4NC4zMyIgeD0iNDkuMjQiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTY1LjYsMzc2LjIyYy0xLjAxLDAtMS45OS0uMzMtMi44MS0uOTUtLjk5LS43NS0xLjYzLTEuODUtMS44LTMuMDhsLTIzLjI4LTE2OS42N2MtLjA0LS4zMi4wNC0uNjMuMjMtLjg5LjE5LS4yNi40Ny0uNDIuNzktLjQ2bDI0NS4yOS0zMy42NmMuMzItLjA0LjYzLjA0Ljg5LjIzLjI2LjE5LjQyLjQ4LjQ2Ljc5bDIzLjI4LDE2OS42N2MuMTcsMS4yMy0uMTUsMi40Ni0uOSwzLjQ1LS43NS45OS0xLjg1LDEuNjMtMy4wOCwxLjhoMGwtMjM4LjQzLDMyLjcyYy0uMjEuMDMtLjQzLjA0LS42NC4wNFptLTI2LjIyLTE3My41bDIzLjIzLDE2OS4yNWMuMTEuOC41MywxLjUxLDEuMTcsMiwuNjQuNDksMS40NC43LDIuMjUuNTlsMjM4LjQzLTMyLjcyLjExLjgxLS4xMS0uODFjLjgtLjExLDEuNTEtLjUzLDItMS4xNy40OS0uNjUuNy0xLjQ0LjU5LTIuMjVsLTIzLjIzLTE2OS4yNS0yNDQuNDQsMzMuNTVaIiBjbGFzcz0iY2xzLTYiLz4mI3hhOyAgICA8L2c+JiN4YTsgICAgPHBvbHlnb24gcG9pbnRzPSIzMjAuNzcgMzguOSA4NS41OCA3MS4yMiAzOC40NyAyMDAuODggMjg0LjUyIDE2Ny4xMSAzMjAuNzcgMzguOSIgY2xhc3M9ImNscy0xMSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0zMzAuOTQsMzI0LjU5bC0yMzIuMDgsMzAuNzFjLTMuNTQuNDctNi45LTEuNjktNy45NS01LjFsLTUxLjY1LTE0OS40MiwyNDUuMjUtMzMuNjYsNTIuNDQsMTQ4LjAzYzEuMzcsNC4zMy0xLjUxLDguODUtNi4wMSw5LjQ0WiIgY2xhc3M9ImNscy04Ii8+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8cGF0aCBkPSJtMzAwLjI2LDMxOS41MWwtMTcyLjYzLDIxLjY2Yy04LjI1LDEuMDQtMTYuODMtMy4yNy0xOS4xNS05LjYybC0zMC4wMi04Mi4wNWMtMi4zMi02LjM1LDIuNDktMTIuMzMsMTAuNzQtMTMuMzdsMTcyLjYzLTIxLjY2YzguMjUtMS4wNCwxNi44MywzLjI3LDE5LjE1LDkuNjJsMzAuMDIsODIuMDVjMi4zMiw2LjM1LTIuNDksMTIuMzMtMTAuNzQsMTMuMzdaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMzAwLjI2LDMxOS41MWwtMTcyLjYzLDIxLjY2Yy04LjI1LDEuMDQtMTYuODMtMy4yNy0xOS4xNS05LjYybC0uNDktMS4zNCwyMDIuNTItMjUuNDEuNDksMS4zNGMyLjMyLDYuMzUtMi40OSwxMi4zMy0xMC43NCwxMy4zN1oiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTI4My41OSwyMzEuMjJsLTIwMi41MiwyNS40MS0yLjYxLTcuMTNjLTIuMzItNi4zNSwyLjQ5LTEyLjMzLDEwLjc0LTEzLjM3bDE3Mi42My0yMS42NmM4LjI1LTEuMDQsMTYuODMsMy4yNywxOS4xNSw5LjYybDIuNjEsNy4xM1oiIGNsYXNzPSJjbHMtNSIvPiYjeGE7ICAgICAgPGc+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xODQuMjIsMjU1LjYxYy0uOTksMC0xLjg1LS43NC0xLjk4LTEuNzUtLjE0LTEuMDkuNjQtMi4wOSwxLjczLTIuMjNsOTAuMS0xMS4zMWMxLjA5LS4xNCwyLjA5LjY0LDIuMjMsMS43My4xNCwxLjA5LS42NCwyLjA5LTEuNzMsMi4yM2wtOTAuMSwxMS4zMWMtLjA4LjAxLS4xNy4wMi0uMjUuMDJaIiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE5MS44OCwyNzYuNTZjLS45OSwwLTEuODUtLjc0LTEuOTgtMS43NS0uMTQtMS4wOS42NC0yLjA5LDEuNzMtMi4yM2w5MC4xLTExLjMxYzEuMS0uMTQsMi4wOS42NCwyLjIzLDEuNzMuMTQsMS4wOS0uNjQsMi4wOS0xLjczLDIuMjNsLTkwLjEsMTEuMzFjLS4wOC4wMS0uMTcuMDItLjI1LjAyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xOTQuMzksMjgzLjRjLS45OSwwLTEuODUtLjc0LTEuOTgtMS43NS0uMTQtMS4wOS42NC0yLjA5LDEuNzMtMi4yM2w1Mi45OC02LjY1YzEuMDktLjE0LDIuMDkuNjQsMi4yMywxLjczLjE0LDEuMDktLjY0LDIuMDktMS43MywyLjIzbC01Mi45OCw2LjY1Yy0uMDguMDEtLjE3LjAyLS4yNS4wMloiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTk5LjQ0LDI5Ny4yMWMtLjk5LDAtMS44NS0uNzQtMS45OC0xLjc1LS4xNC0xLjA5LjY0LTIuMDksMS43My0yLjIzbDkwLjEtMTEuMzFjMS4wOS0uMTQsMi4wOS42NCwyLjIzLDEuNzMuMTQsMS4wOS0uNjQsMi4wOS0xLjczLDIuMjNsLTkwLjEsMTEuMzFjLS4wOC4wMS0uMTcuMDItLjI1LjAyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0yMDEuOTQsMzA0LjA1Yy0uOTksMC0xLjg1LS43NC0xLjk4LTEuNzUtLjE0LTEuMDkuNjQtMi4wOSwxLjczLTIuMjNsOTAuMS0xMS4zMWMxLjA5LS4xNCwyLjA5LjY0LDIuMjMsMS43My4xNCwxLjA5LS42NCwyLjA5LTEuNzMsMi4yM2wtOTAuMSwxMS4zMWMtLjA4LjAxLS4xNy4wMi0uMjUuMDJaIiBjbGFzcz0iY2xzLTciLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTIwNC40LDMxMC43N2MtLjk5LDAtMS44NS0uNzQtMS45OC0xLjc1LS4xNC0xLjA5LjY0LTIuMDksMS43My0yLjIzbDY3LjgzLTguNTFjMS4wOS0uMTQsMi4wOS42NCwyLjIzLDEuNzMuMTQsMS4wOS0uNjQsMi4wOS0xLjczLDIuMjNsLTY3LjgzLDguNTFjLS4wOC4wMS0uMTcuMDItLjI1LjAyWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xODYuNjEsMjYyLjE0Yy0uOTksMC0xLjg1LS43NC0xLjk4LTEuNzUtLjE0LTEuMDkuNjQtMi4wOSwxLjczLTIuMjNsODIuNjgtMTAuMzdjMS4xLS4xNCwyLjA5LjY0LDIuMjMsMS43My4xNCwxLjA5LS42NCwyLjA5LTEuNzMsMi4yM2wtODIuNjgsMTAuMzdjLS4wOC4wMS0uMTcuMDItLjI1LjAyWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICA8L2c+JiN4YTsgICAgICA8cGF0aCBkPSJtMTIzLjM5LDMzNS41OGMtLjMzLDAtLjYyLS4yNS0uNjYtLjU4LS4wNS0uMzcuMjEtLjcuNTgtLjc0bDQxLjM0LTUuMTljLjM3LS4wNC43LjIxLjc0LjU4LjA1LjM3LS4yMS43LS41OC43NGwtNDEuMzQsNS4xOXMtLjA2LDAtLjA4LDBaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMTcyLjE1LDMyOS40NmMtLjMzLDAtLjYyLS4yNS0uNjYtLjU4LS4wNS0uMzcuMjEtLjcuNTgtLjc0bDg1Ljg5LTEwLjc4Yy4zNy0uMDUuNy4yMS43NC41OC4wNS4zNy0uMjEuNy0uNTguNzRsLTg1Ljg5LDEwLjc4cy0uMDYsMC0uMDgsMFoiIGNsYXNzPSJjbHMtMTAiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0yNjQuODksMzE3LjgyYy0uMzMsMC0uNjItLjI1LS42Ni0uNTgtLjA1LS4zNy4yMS0uNy41OC0uNzRsMzMuOTEtNC4yNmMuMzctLjA1LjcuMjEuNzQuNTguMDUuMzctLjIxLjctLjU4Ljc0bC0zMy45MSw0LjI2cy0uMDYsMC0uMDgsMFoiIGNsYXNzPSJjbHMtMTAiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0xMjUuMTgsMzQyLjU4Yy03LjkzLDAtMTUuNjMtNC40MS0xNy44OS0xMC41OWwtMzAuMDEtODIuMDVjLTEuMS0zLS44MS02LjEuOC04Ljc1LDIuMDctMy4zOSw2LjA2LTUuNjgsMTAuOTctNi4zbDE3Mi42My0yMS42NmM4Ljc5LTEuMSwxNy45OCwzLjU4LDIwLjQ5LDEwLjQzbDMwLjAxLDgyLjA1YzEuMSwzLC44MSw2LjEtLjgsOC43NS0yLjA3LDMuMzktNi4wNiw1LjY4LTEwLjk3LDYuM2gwbC0xNzIuNjMsMjEuNjZjLS44Ni4xMS0xLjczLjE2LTIuNi4xNlptMTM5LjE1LTEyN2MtLjc4LDAtMS41Ni4wNS0yLjM0LjE1bC0xNzIuNjMsMjEuNjZjLTQuMTQuNTItNy40NywyLjM4LTkuMTQsNS4xMi0xLjIyLDItMS40Miw0LjI4LS41OCw2LjU3bDMwLjAxLDgyLjA1YzIuMTMsNS44MiwxMC4xMiw5Ljc3LDE3LjgxLDguOGwxNzIuNjMtMjEuNjZjNC4xNC0uNTIsNy40Ny0yLjM4LDkuMTQtNS4xMiwxLjIyLTIsMS40Mi00LjI4LjU4LTYuNTdsLTMwLjAyLTgyLjA1Yy0xLjkxLTUuMjMtOC41Ni04Ljk1LTE1LjQ3LTguOTVaIiBjbGFzcz0iY2xzLTUiLz4mI3hhOyAgICAgIDxnPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTI0LjczLDI2NS4wM2w1LjIxLTUuNjljLjItLjIyLjYtLjI2LjkyLS4xbDguNTcsNC4xN2MuMi4xLjQ0LjEyLjY1LjA2bDguNTYtMi41NGMuMzItLjEuNzIuMDIuOTIuMjhsNS4yNCw2LjY4Yy4xMi4xNi4zMy4yNy41Ni4zbDkuNjEsMS4yOGMuMzYuMDUuNjYuMy42OC41OGwuNSw3LjRjLjAxLjE4LjEzLjM1LjMyLjQ2bDguMDksNC43NmMuMzEuMTguNDEuNS4yNS43M2wtNC4zNyw2LjE0Yy0uMS4xNS0uMS4zMywwLC41bDQuNCw2Ljk3Yy4xNy4yNi4wNi41Ni0uMjUuNjhsLTguMDcsMy4yM2MtLjE5LjA4LS4zMS4yMi0uMzIuNGwtLjQ3LDcuMzFjLS4wMi4yOC0uMzEuNDctLjY3LjQ1bC05LjYxLS41NGMtLjIzLS4wMS0uNDQuMDYtLjU2LjE5bC01LjIxLDUuNjljLS4yLjIyLS42LjI2LS45Mi4xbC04LjU3LTQuMTdjLS4yLS4xLS40NC0uMTItLjY1LS4wNmwtOC41NiwyLjU0Yy0uMzIuMS0uNzItLjAyLS45Mi0uMjhsLTUuMjQtNi42OGMtLjEyLS4xNi0uMzMtLjI3LS41Ni0uM2wtOS42MS0xLjI4Yy0uMzYtLjA1LS42Ni0uMy0uNjgtLjU4bC0uNS03LjRjLS4wMS0uMTgtLjEzLS4zNS0uMzItLjQ2bC04LjA5LTQuNzZjLS4zMS0uMTgtLjQxLS41LS4yNS0uNzNsNC4zNy02LjE0Yy4xLS4xNS4xLS4zMywwLS41bC00LjQtNi45N2MtLjE3LS4yNi0uMDYtLjU2LjI1LS42OGw4LjA3LTMuMjNjLjE5LS4wOC4zMS0uMjIuMzItLjRsLjQ3LTcuMzFjLjAyLS4yOC4zMS0uNDcuNjctLjQ1bDkuNjEuNTRjLjIzLjAxLjQ0LS4wNi41Ni0uMTlaIiBjbGFzcz0iY2xzLTUiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE0My4xNywzMDMuNDZsLTE3LjkxLTcuNTZjLTEuMjgtLjU0LTEuODgtMi4wMS0xLjM0LTMuMjkuNTQtMS4yOCwyLjAxLTEuODgsMy4yOS0xLjM0bDEzLjMyLDUuNjIsOS42Ni0yMi4yM2MuNTUtMS4yNywyLjAzLTEuODYsMy4zMS0xLjMsMS4yNy41NSwxLjg2LDIuMDMsMS4zLDMuMzFsLTExLjY0LDI2LjhaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8L2c+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxwYXRoIGQ9Im0zNTUuOTUsMjU5LjE5bC0yMzIuMDgsMzAuNzFjLTMuNTQuNDctNi45LTEuNjktNy45NS01LjFsLTc2LjY1LTg0LjAzLDI0NS4yNS0zMy42Niw3Ny40NCw4Mi42NGMxLjM3LDQuMzMtMS41MSw4Ljg1LTYuMDEsOS40NFoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgIDxnPiYjeGE7ICAgICAgPHBhdGggZD0ibTMzMC44MiwyNTYuNzlsLTE3MS43OCwyMS43NmMtOC4yMSwxLjA0LTE4LjY2LTIuMDEtMjMuMzQtNi44MmwtNjAuNDUtNjIuMTNjLTQuNjgtNC44MS0xLjgxLTkuNTUsNi40MS0xMC41OWwxNzEuNzgtMjEuNzZjOC4yMS0xLjA0LDE4LjY2LDIuMDEsMjMuMzQsNi44Mmw2MC40NSw2Mi4xM2M0LjY4LDQuODEsMS44MSw5LjU1LTYuNDEsMTAuNTlaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMzMwLjgyLDI1Ni43OWwtMTcxLjc4LDIxLjc2Yy04LjIxLDEuMDQtMTguNjYtMi4wMS0yMy4zNC02LjgybC0uOTgtMS4wMSwyMDEuNTItMjUuNTMuOTgsMS4wMWM0LjY4LDQuODEsMS44MSw5LjU1LTYuNDEsMTAuNTlaIiBjbGFzcz0iY2xzLTciLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0yODIuMDMsMTg5LjQ3bC0yMDEuNTIsMjUuNTMtNS4yNS01LjRjLTQuNjgtNC44MS0xLjgxLTkuNTUsNi40MS0xMC41OWwxNzEuNzgtMjEuNzZjOC4yMS0xLjA0LDE4LjY2LDIuMDEsMjMuMzQsNi44Mmw1LjI1LDUuNFoiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgICAgPGc+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xODYuNjksMjExLjQxYy0uODksMC0xLjY3LS42Ni0xLjc4LTEuNTctLjEyLS45OC41Ny0xLjg4LDEuNTYtMi4wMWw4OS42Ni0xMS4zNmMuOTktLjEzLDEuODguNTcsMi4wMSwxLjU2LjEyLjk4LS41NywxLjg4LTEuNTYsMi4wMWwtODkuNjYsMTEuMzZjLS4wOCwwLS4xNS4wMS0uMjMuMDFaIiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTIwMi4xMiwyMjcuMjhjLS44OSwwLTEuNjctLjY2LTEuNzgtMS41Ny0uMTItLjk4LjU3LTEuODgsMS41Ni0yLjAxbDg5LjY2LTExLjM2Yy45OS0uMTMsMS44OC41NywyLjAxLDEuNTYuMTIuOTgtLjU3LDEuODgtMS41NiwyLjAxbC04OS42NiwxMS4zNmMtLjA4LDAtLjE1LjAxLS4yMy4wMVoiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMjA3LjE2LDIzMi40NmMtLjg5LDAtMS42Ny0uNjYtMS43OC0xLjU3LS4xMi0uOTguNTctMS44OCwxLjU2LTIuMDFsNTIuNzItNi42OGMuOTgtLjEzLDEuODguNTcsMi4wMSwxLjU2LjEyLjk4LS41NywxLjg4LTEuNTYsMi4wMWwtNTIuNzIsNi42OGMtLjA4LDAtLjE1LjAxLS4yMy4wMVoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMjE3LjM0LDI0Mi45MmMtLjg5LDAtMS42Ny0uNjYtMS43OC0xLjU3LS4xMi0uOTguNTctMS44OCwxLjU2LTIuMDFsODkuNjYtMTEuMzZjLjk4LS4xMywxLjg4LjU3LDIuMDEsMS41Ni4xMi45OC0uNTcsMS44OC0xLjU2LDIuMDFsLTg5LjY2LDExLjM2Yy0uMDgsMC0uMTUuMDEtLjIzLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0yMjIuMzgsMjQ4LjFjLS44OSwwLTEuNjctLjY2LTEuNzgtMS41Ny0uMTItLjk4LjU3LTEuODgsMS41Ni0yLjAxbDg5LjY2LTExLjM2Yy45OS0uMTMsMS44OC41NywyLjAxLDEuNTYuMTIuOTgtLjU3LDEuODgtMS41NiwyLjAxbC04OS42NiwxMS4zNmMtLjA4LDAtLjE1LjAxLS4yMy4wMVoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMjI3LjMzLDI1My4xOGMtLjg5LDAtMS42Ny0uNjYtMS43OC0xLjU3LS4xMi0uOTguNTctMS44OCwxLjU2LTIuMDFsNjcuNDktOC41NWMuOTgtLjEzLDEuODguNTcsMi4wMSwxLjU2LjEyLjk4LS41NywxLjg4LTEuNTYsMi4wMWwtNjcuNDksOC41NWMtLjA4LDAtLjE1LjAxLS4yMy4wMVoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTkxLjUsMjE2LjM2Yy0uODksMC0xLjY3LS42Ni0xLjc4LTEuNTctLjEyLS45OC41Ny0xLjg4LDEuNTYtMi4wMWw4Mi4yNy0xMC40MmMuOTktLjEzLDEuODguNTcsMi4wMSwxLjU2LjEyLjk4LS41NywxLjg4LTEuNTYsMi4wMWwtODIuMjcsMTAuNDJjLS4wOCwwLS4xNS4wMS0uMjMuMDFaIiBjbGFzcz0iY2xzLTciLz4mI3hhOyAgICAgIDwvZz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0xNTIuNDEsMjc0LjQ3Yy0uMywwLS41Ni0uMjItLjU5LS41Mi0uMDQtLjMzLjE5LS42My41Mi0uNjdsNDEuMTQtNS4yMWMuMzMtLjA0LjYzLjE5LjY3LjUyLjA0LjMzLS4xOS42My0uNTIuNjdsLTQxLjE0LDUuMjFzLS4wNSwwLS4wOCwwWiIgY2xhc3M9ImNscy0xMCIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTIwMC45MywyNjguMzJjLS4zLDAtLjU2LS4yMi0uNTktLjUyLS4wNC0uMzMuMTktLjYzLjUyLS42N2w4NS40Ni0xMC44M2MuMzMtLjA0LjYzLjE5LjY3LjUyLjA0LjMzLS4xOS42My0uNTIuNjdsLTg1LjQ2LDEwLjgzcy0uMDUsMC0uMDgsMFoiIGNsYXNzPSJjbHMtMTAiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0yOTMuMjIsMjU2LjYzYy0uMywwLS41Ni0uMjItLjU5LS41Mi0uMDQtLjMzLjE5LS42My41Mi0uNjdsMzMuNzUtNC4yN2MuMzMtLjA0LjYzLjE5LjY3LjUyLjA0LjMzLS4xOS42My0uNTIuNjdsLTMzLjc1LDQuMjdzLS4wNSwwLS4wOCwwWiIgY2xhc3M9ImNscy0xMCIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTE1NS43NSwyNzkuODhjLTcuODIsMC0xNi42MS0yLjk5LTIwLjg1LTcuMzZsLTYwLjQ1LTYyLjEzYy0yLjI1LTIuMzEtMy4wNi00LjgyLTIuMjctNy4wNS45OS0yLjgzLDQuNC00LjgxLDkuMzUtNS40NGwxNzEuNzgtMjEuNzZjOC41MS0xLjA4LDE5LjQxLDIuMTMsMjQuMjksNy4xNWw2MC40NSw2Mi4xM2MyLjI1LDIuMzEsMy4wNiw0LjgyLDIuMjcsNy4wNS0uOTksMi44My00LjQsNC44MS05LjM1LDUuNDRsLTE3MS43OCwyMS43NmMtMS4xMS4xNC0yLjI3LjIxLTMuNDQuMjFabTEwMS4wNy0xMDEuN2MtMS4xMSwwLTIuMTkuMDYtMy4yNC4ybC0xNzEuNzgsMjEuNzZjLTQuMDEuNTEtNi44MSwxLjk4LTcuNSwzLjk1LS42MiwxLjc4LjYxLDMuNTUsMS43Niw0LjczbDYwLjQ1LDYyLjEzYzQuNDUsNC41OCwxNC40OSw3LjQ5LDIyLjM5LDYuNDlsMTcxLjc4LTIxLjc2LjE0LDEuMTItLjE0LTEuMTJjNC4wMS0uNTEsNi44MS0xLjk4LDcuNS0zLjk1LjYyLTEuNzgtLjYxLTMuNTUtMS43Ni00LjczbC02MC40NS02Mi4xM2MtMy44Ni0zLjk3LTExLjkyLTYuNjgtMTkuMTQtNi42OFoiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgICAgPGc+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xMjguODksMjIwLjE1bDMuMzktNC41MmMuMTMtLjE3LjUzLS4yMi45Mi0uMTFsMTAuNCwyLjk1Yy4yNS4wNy41MS4wOC43LjAzbDcuOTktMi4yMWMuMy0uMDguNzYsMCwxLjA2LjE4bDcuODMsNC45N2MuMTkuMTIuNDQuMi42OS4yMWwxMC40NS43Yy40LjAzLjc5LjIxLjkxLjQzbDMuMTYsNS42N2MuMDcuMTMuMjYuMjYuNS4zNGwxMC4xMSwzLjQyYy4zOC4xMy42MS4zNy41Mi41NWwtMi4zNiw0Ljg0Yy0uMDYuMTEuMDEuMjYuMTguMzhsNy4wNiw1LjIyYy4yNy4yLjI2LjQzLS4wMS41M2wtNy4yNCwyLjcyYy0uMTcuMDYtLjI0LjE4LS4xOS4zMmwyLjEyLDUuNjNjLjA4LjIxLS4xNS4zNy0uNTQuMzdsLTEwLjE5LS4xM2MtLjI0LDAtLjQzLjA2LS41MS4xN2wtMy4zOSw0LjUyYy0uMTMuMTctLjUzLjIyLS45Mi4xMWwtMTAuNC0yLjk1Yy0uMjUtLjA3LS41MS0uMDgtLjctLjAzbC03Ljk5LDIuMjFjLS4zLjA4LS43NiwwLTEuMDYtLjE4bC03LjgzLTQuOTdjLS4xOS0uMTItLjQ0LS4yLS42OS0uMjFsLTEwLjQ1LS43Yy0uNC0uMDMtLjc5LS4yMS0uOTEtLjQzbC0zLjE2LTUuNjdjLS4wNy0uMTMtLjI2LS4yNi0uNS0uMzRsLTEwLjExLTMuNDJjLS4zOC0uMTMtLjYxLS4zNy0uNTItLjU1bDIuMzYtNC44NGMuMDYtLjExLS4wMS0uMjYtLjE4LS4zOGwtNy4wNi01LjIyYy0uMjctLjItLjI2LS40My4wMS0uNTNsNy4yNC0yLjcyYy4xNy0uMDYuMjQtLjE4LjE5LS4zMmwtMi4xMi01LjYzYy0uMDgtLjIxLjE1LS4zNy41NC0uMzdsMTAuMTkuMTNjLjI0LDAsLjQzLS4wNi41MS0uMTdaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE2MS4xNywyNDkuNDVsLTIxLjA2LTUuMjFjLTEuMjEtLjMtMS45NS0xLjUzLTEuNjUtMi43NC4zLTEuMjEsMS41My0xLjk1LDIuNzQtMS42NWwxNi4xMSwzLjk5LDIuMDMtMTYuNjFjLjE1LTEuMjQsMS4yOS0yLjEyLDIuNTItMS45NywxLjI0LjE1LDIuMTIsMS4yOCwxLjk3LDIuNTJsLTIuNjQsMjEuNjhaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8L2c+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxnPiYjeGE7ICAgICAgPHBhdGggZD0ibTI1MC41LDE2My44NWwtMTY4LjgxLDIzLjU0Yy04LjA3LDEuMTMtMTIuOTMtMy4zLTEwLjg0LTkuODlsMjYuOTUtODUuMTNjMi4wOS02LjU4LDEwLjMyLTEyLjg0LDE4LjM5LTEzLjk2bDE2OC44MS0yMy41NGM4LjA3LTEuMTMsMTIuOTMsMy4zLDEwLjg0LDkuODlsLTI2Ljk1LDg1LjEzYy0yLjA5LDYuNTgtMTAuMzIsMTIuODQtMTguMzksMTMuOTZaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMjUwLjUsMTYzLjg1bC0xNjguODEsMjMuNTRjLTguMDcsMS4xMy0xMi45My0zLjMtMTAuODQtOS44OWwuNDQtMS4zOSwxOTguMDUtMjcuNjEtLjQ0LDEuMzljLTIuMDksNi41OC0xMC4zMiwxMi44NC0xOC4zOSwxMy45NloiIGNsYXNzPSJjbHMtMTEiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0yOTMuNTEsNzIuMTZsLTE5OC4wNSwyNy42MSwyLjM0LTcuNGMyLjA5LTYuNTgsMTAuMzItMTIuODQsMTguMzktMTMuOTZsMTY4LjgxLTIzLjU0YzguMDctMS4xMywxMi45MywzLjMsMTAuODQsOS44OWwtMi4zNCw3LjRaIiBjbGFzcz0iY2xzLTkiLz4mI3hhOyAgICAgIDxnPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTg5LjgyLDk3Ljk0Yy0uOTQsMC0xLjc3LS43LTEuOS0xLjY2LS4xNS0xLjA1LjU5LTIuMDIsMS42NC0yLjE3bDg4LjExLTEyLjI4YzEuMDYtLjE1LDIuMDIuNTksMi4xNywxLjY0LjE1LDEuMDUtLjU5LDIuMDItMS42NCwyLjE3bC04OC4xMSwxMi4yOGMtLjA5LjAxLS4xOC4wMi0uMjcuMDJaIiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE4Mi45NCwxMTkuNjhjLS45NCwwLTEuNzctLjctMS45LTEuNjYtLjE1LTEuMDUuNTktMi4wMiwxLjY0LTIuMTdsODguMTEtMTIuMjhjMS4wNS0uMTUsMi4wMi41OSwyLjE3LDEuNjQuMTUsMS4wNS0uNTksMi4wMi0xLjY0LDIuMTdsLTg4LjExLDEyLjI4Yy0uMDkuMDEtLjE4LjAyLS4yNy4wMloiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTgwLjcsMTI2Ljc3Yy0uOTQsMC0xLjc3LS43LTEuOS0xLjY2LS4xNS0xLjA1LjU5LTIuMDIsMS42NC0yLjE3bDUxLjgxLTcuMjJjMS4wNS0uMTUsMi4wMi41OSwyLjE3LDEuNjQuMTUsMS4wNS0uNTksMi4wMi0xLjY0LDIuMTdsLTUxLjgxLDcuMjJjLS4wOS4wMS0uMTguMDItLjI3LjAyWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xNzYuMTYsMTQxLjExYy0uOTQsMC0xLjc3LS43LTEuOS0xLjY2LS4xNS0xLjA1LjU5LTIuMDIsMS42NC0yLjE3bDg4LjExLTEyLjI4YzEuMDYtLjE1LDIuMDIuNTksMi4xNywxLjY0LjE1LDEuMDUtLjU5LDIuMDItMS42NCwyLjE3bC04OC4xMSwxMi4yOGMtLjA5LjAxLS4xOC4wMi0uMjcuMDJaIiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE3My45MSwxNDguMmMtLjk0LDAtMS43Ny0uNy0xLjktMS42Ni0uMTUtMS4wNS41OS0yLjAyLDEuNjQtMi4xN2w4OC4xMS0xMi4yOGMxLjA1LS4xNSwyLjAyLjU5LDIuMTcsMS42NC4xNSwxLjA1LS41OSwyLjAyLTEuNjQsMi4xN2wtODguMTEsMTIuMjhjLS4wOS4wMS0uMTguMDItLjI3LjAyWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xNzEuNywxNTUuMTdjLS45NCwwLTEuNzctLjctMS45LTEuNjYtLjE1LTEuMDUuNTktMi4wMiwxLjY0LTIuMTdsNjYuMzMtOS4yNWMxLjA1LS4xNSwyLjAyLjU5LDIuMTcsMS42NC4xNSwxLjA1LS41OSwyLjAyLTEuNjQsMi4xN2wtNjYuMzMsOS4yNWMtLjA5LjAxLS4xOC4wMi0uMjcuMDJaIiBjbGFzcz0iY2xzLTciLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE4Ny42OCwxMDQuNzJjLS45NCwwLTEuNzctLjctMS45LTEuNjYtLjE1LTEuMDUuNTktMi4wMiwxLjY0LTIuMTdsODAuODUtMTEuMjdjMS4wNi0uMTUsMi4wMi41OSwyLjE3LDEuNjQuMTUsMS4wNS0uNTksMi4wMi0xLjY0LDIuMTdsLTgwLjg1LDExLjI3Yy0uMDkuMDEtLjE4LjAyLS4yNy4wMloiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgPC9nPiYjeGE7ICAgICAgPHBhdGggZD0ibTgyLDE4MS41NWMtLjMxLDAtLjU5LS4yMy0uNjMtLjU1LS4wNS0uMzUuMi0uNjcuNTUtLjcybDQwLjQyLTUuNjRjLjM1LS4wNS42Ny4yLjcyLjU1LjA1LjM1LS4yLjY3LS41NS43MmwtNDAuNDIsNS42NHMtLjA2LDAtLjA5LDBaIiBjbGFzcz0iY2xzLTEwIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMTI5LjY4LDE3NC45Yy0uMzEsMC0uNTktLjIzLS42My0uNTUtLjA1LS4zNS4yLS42Ny41NS0uNzJsODMuOTktMTEuNzFjLjM1LS4wNS42Ny4yLjcyLjU1LjA1LjM1LS4yLjY3LS41NS43MmwtODMuOTksMTEuNzFzLS4wNiwwLS4wOSwwWiIgY2xhc3M9ImNscy0xMCIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTIyMC4zOCwxNjIuMjZjLS4zMSwwLS41OS0uMjMtLjYzLS41NS0uMDUtLjM1LjItLjY3LjU1LS43MmwzMy4xNi00LjYyYy4zNi0uMDUuNjguMi43Mi41NS4wNS4zNS0uMi42Ny0uNTUuNzJsLTMzLjE2LDQuNjJzLS4wNiwwLS4wOSwwWiIgY2xhc3M9ImNscy0xMCIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTc5LjI4LDE4OWMtMy42NSwwLTYuNjgtMS4xNy04LjUyLTMuMzUtMS44OC0yLjIzLTIuMzQtNS4yOC0xLjI5LTguNTlsMjYuOTUtODUuMTNjMi4yNy03LjE3LDEwLjg3LTEzLjc0LDE5LjU3LTE0Ljk1bDE2OC44MS0yMy41NGM0LjgtLjY3LDguODYuNDgsMTEuMTIsMy4xNiwxLjg4LDIuMjMsMi4zNCw1LjI4LDEuMjksOC41OWwtMjYuOTUsODUuMTNjLTIuMjcsNy4xNy0xMC44NywxMy43NC0xOS41NywxNC45NWwtLjItMS40My4yLDEuNDMtMTY4LjgxLDIzLjU0Yy0uOS4xMy0xLjc3LjE5LTIuNjEuMTlaTTI4Ny40NCw1Ni4xNGMtLjcxLDAtMS40Ni4wNS0yLjIzLjE2bC0xNjguODEsMjMuNTRjLTcuNTYsMS4wNS0xNS4yOSw2Ljg3LTE3LjIyLDEyLjk3bC0yNi45NSw4NS4xM2MtLjc1LDIuMzYtLjQ5LDQuMzkuNzUsNS44NiwxLjYxLDEuOTEsNC43MiwyLjcsOC41MiwyLjE3bDE2OC44MS0yMy41NGM3LjU2LTEuMDUsMTUuMjgtNi44NywxNy4yMi0xMi45N2wyNi45NS04NS4xM2MuNzUtMi4zNi40OS00LjM5LS43NS01Ljg2LTEuMjgtMS41Mi0zLjUxLTIuMzMtNi4yOC0yLjMzWiIgY2xhc3M9ImNscy05Ii8+JiN4YTsgICAgICA8Zz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTEyOS4wNSwxMDguMjRsOC40LTUuOTRjLjMyLS4yMy43LS4yNy44OS0uMTFsNC45NCw0LjI5Yy4xMi4xLjMyLjEyLjU0LjA2bDkuMzMtMi42OWMuMzUtLjEuNjMuMDIuNjQuMjhsLjMxLDYuOTFjMCwuMTYuMTIuMjguMzEuMzFsNy43NywxLjI4Yy4yOS4wNS4zOS4zMS4yMi42bC00LjQxLDcuNjljLS4xLjE4LS4xMS4zNi0uMDEuNDhsNC4xMiw0LjljLjE2LjE5LjA1LjUxLS4yNi43NmwtNy45NCw2LjRjLS4xOS4xNS0uMzEuMzQtLjMyLjUybC0uNjMsNy4yMmMtLjAyLjI3LS4zMS41OC0uNjcuNzFsLTkuMzUsMy40Yy0uMjIuMDgtLjQzLjI0LS41NS40MmwtNS4yMSw3LjZjLS4yLjI5LS41OS40OS0uOS40N2wtOC4yNS0uNTFjLS4yLS4wMS0uNDMuMDYtLjYzLjIxbC04LjQsNS45NGMtLjMyLjIzLS43LjI3LS44OS4xMWwtNC45NC00LjI5Yy0uMTItLjEtLjMyLS4xMi0uNTQtLjA2bC05LjMzLDIuNjljLS4zNS4xLS42My0uMDItLjY0LS4yOGwtLjMxLTYuOTFjMC0uMTYtLjEyLS4yOC0uMzEtLjMxbC03Ljc3LTEuMjhjLS4yOS0uMDUtLjM5LS4zMS0uMjItLjZsNC40MS03LjY5Yy4xLS4xOC4xMS0uMzYuMDEtLjQ4bC00LjEyLTQuOWMtLjE2LS4xOS0uMDUtLjUxLjI2LS43Nmw3Ljk0LTYuNGMuMTktLjE1LjMxLS4zNC4zMi0uNTJsLjYzLTcuMjJjLjAyLS4yNy4zMS0uNTguNjctLjcxbDkuMzUtMy40Yy4yMi0uMDguNDMtLjI0LjU1LS40Mmw1LjIxLTcuNmMuMi0uMjkuNTktLjQ5LjktLjQ3bDguMjUuNTFjLjIuMDEuNDMtLjA2LjYzLS4yMVoiIGNsYXNzPSJjbHMtOSIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTIxLjYxLDE0Ny44M2wtMTEuMzItNy45MmMtMS4wOS0uNzctMS4zNi0yLjI4LS42LTMuMzcuNzctMS4wOSwyLjI3LTEuMzYsMy4zNy0uNmw4LDUuNiwyNC4xOS0yNC4xMmMuOTUtLjk0LDIuNDgtLjk0LDMuNDIsMCwuOTQuOTUuOTQsMi40OCwwLDMuNDJsLTI3LjA2LDI2Ljk4WiIgY2xhc3M9ImNscy0xMCIvPiYjeGE7ICAgICAgPC9nPiYjeGE7ICAgIDwvZz4mI3hhOyAgPC9nPiYjeGE7PC9zdmc+", - "w": 400, - "h": 400, - "title": "Passport-Broker", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogbm9uZTsmI3hhOyAgICAgICAgc3Ryb2tlOiAjYzFlMWYyOyYjeGE7ICAgICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMSwgLmNscy0yLCAuY2xzLTMgeyYjeGE7ICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdDogMTA7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogNy42OHB4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTIsIC5jbHMtMyB7JiN4YTsgICAgICAgIHN0cm9rZTogIzA2ODdjYjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yLCAuY2xzLTQgeyYjeGE7ICAgICAgICBmaWxsOiAjMDY4N2NiOyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTUgeyYjeGE7ICAgICAgICBmaWxsOiAjYmZkZmYwOyYjeGE7ICAgICAgICBvcGFjaXR5OiAuNTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy01LCAuY2xzLTQgeyYjeGE7ICAgICAgICBzdHJva2Utd2lkdGg6IDBweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0zIHsmI3hhOyAgICAgICAgZmlsbDogI2ZmZjsmI3hhOyAgICAgIH0mI3hhOyAgICA8L3N0eWxlPiYjeGE7ICA8L2RlZnM+JiN4YTsgIDxwYXRoIGQ9Im0zMy4yNywxMzMuNDRoMzMzLjQ2djE2MS4xMmMwLDExLjIzLTkuMTIsMjAuMzQtMjAuMzQsMjAuMzRIMzMuMjd2LTE4MS40NmgwWiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgIDxyZWN0IGhlaWdodD0iNDguMzQiIHdpZHRoPSIzMzMuNDYiIHk9Ijg1LjEiIHg9IjMzLjI3IiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgPGxpbmUgeTI9IjEwOS4yNyIgeDI9IjMxOS4xMSIgeTE9IjEwOS4yNyIgeDE9Ijc2LjUyIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPGc+JiN4YTsgICAgPHBhdGggZD0ibTE3MS43NiwyNDEuN2wtMzUuMDgsNDUuMDhoLjAxYy0yLjU2LDMuMjktMS45Nyw4LjAzLDEuMzIsMTAuNTksMy4yOSwyLjU2LDguMDIsMS45NywxMC41OC0xLjMyaC4wMXMzNS4wOC00NS4wNywzNS4wOC00NS4wN2wtMTEuOTItOS4yOFoiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgIDxjaXJjbGUgcj0iNDkuNjUiIGN5PSIyMDMuNTMiIGN4PSIyMDYuMDMiIGNsYXNzPSJjbHMtNSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0yNjAuMSwxODIuMTNjLTEyLjY2LTI4Ljk5LTQ2LjQzLTQyLjIyLTc1LjQxLTI5LjU2LTI4Ljk5LDEyLjY2LTQyLjIyLDQ2LjQzLTI5LjU2LDc1LjQxLDEyLjY2LDI4Ljk5LDQ2LjQzLDQyLjIyLDc1LjQxLDI5LjU2LDI4Ljk5LTEyLjY2LDQyLjIyLTQ2LjQzLDI5LjU2LTc1LjQxWm0tOTQuOCw0MS40MWMtMTAuMjEtMjMuMzcuNDYtNTAuNTksMjMuODMtNjAuOCwyMy4zNy0xMC4yMSw1MC41OS40Niw2MC44LDIzLjgzLDEwLjIxLDIzLjM3LS40Niw1MC41OS0yMy44Myw2MC44LTIzLjM3LDEwLjIxLTUwLjU5LS40Ni02MC44LTIzLjgzWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDwvZz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Passport-clearinghouse", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCIgZGF0YS1uYW1lPSJMYXllciAxIiBpZD0iTGF5ZXJfMSI+JiN4YTsgIDxkZWZzPiYjeGE7ICAgIDxzdHlsZT4mI3hhOyAgICAgIC5jbHMtMSB7JiN4YTsgICAgICAgIGZpbHRlcjogdXJsKCNkcm9wLXNoYWRvdy0xKTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yIHsmI3hhOyAgICAgICAgZmlsbDogI2YyZjJmMjsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0yLCAuY2xzLTMsIC5jbHMtNCwgLmNscy01LCAuY2xzLTYsIC5jbHMtNywgLmNscy04IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMyB7JiN4YTsgICAgICAgIGZpbGw6ICNmYWE2MzM7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICM3Njc4N2E7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNSB7JiN4YTsgICAgICAgIGZpbGw6ICMxYjc1YmI7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNiB7JiN4YTsgICAgICAgIGZpbGw6ICNjY2M7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNyB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtOCB7JiN4YTsgICAgICAgIGZpbGw6ICNlNmU2ZTY7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgICA8ZmlsdGVyIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImRyb3Atc2hhZG93LTEiPiYjeGE7ICAgICAgPGZlT2Zmc2V0IGR5PSIwIiBkeD0iLTYuNzciLz4mI3hhOyAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249Ijg0LjY1IiByZXN1bHQ9ImJsdXIiLz4mI3hhOyAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9Ii4yNSIgZmxvb2QtY29sb3I9IiMwMDAiLz4mI3hhOyAgICAgIDxmZUNvbXBvc2l0ZSBvcGVyYXRvcj0iaW4iIGluMj0iYmx1ciIvPiYjeGE7ICAgICAgPGZlQ29tcG9zaXRlIGluPSJTb3VyY2VHcmFwaGljIi8+JiN4YTsgICAgPC9maWx0ZXI+JiN4YTsgIDwvZGVmcz4mI3hhOyAgPGcgY2xhc3M9ImNscy0xIj4mI3hhOyAgICA8Zz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0zMTguMjksMjIuMTlMNzkuNjQsNTQuOTRjLTMuNy41MS02LjYsMy40Mi03LjEsNy4xMmwtMTkuMTEsMTQxLjU5LDI0OS4yLTM0LjJjLjcyLS4xLDEuMjktLjY1LDEuNDEtMS4zNmwyMy41Ny0xMzYuMjZjLjk2LTUuNTQtMy43NS0xMC40MS05LjMxLTkuNjVaIiBjbGFzcz0iY2xzLTUiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im01Mi44OSwyMDQuMTlsLjA4LS42LDE5LjExLTE0MS41OWMuNTItMy44OSwzLjYxLTYuOTgsNy40OS03LjUxbDIzOC42NS0zMi43NWMyLjgyLS4zOCw1LjUzLjU2LDcuNTEsMi42LDEuOTYsMi4wMywyLjgxLDQuNzksMi4zMyw3LjU4bC0yMy41NywxMzYuMjZjLS4xNi45MS0uODgsMS42MS0xLjgxLDEuNzRsLTI0OS44LDM0LjI4Wk0zMTguMzYsMjIuNjRMNzkuNyw1NS4zOWMtMy40OC40OC02LjI0LDMuMjQtNi43MSw2LjczbC0xOS4wMywxNDAuOTksMjQ4LjYtMzQuMTJjLjUyLS4wNy45NC0uNDcsMS4wMi0uOTlsMjMuNTctMTM2LjI2Yy40My0yLjQ5LS4zMy00Ljk3LTIuMDgtNi43OS0xLjc2LTEuODItNC4yMy0yLjY4LTYuNzEtMi4zMmgwWiIgY2xhc3M9ImNscy01Ii8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxnPiYjeGE7ICAgICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM1LjY0IDI4LjU1KSByb3RhdGUoLTcuODEpIiBkPSJtNjcuNzMsMTg1LjU4aDI0Ni45N2MxLjgyLDAsMy4zLDEuNDgsMy4zLDMuM3YxNDcuODhjMCwxNS40NS0xMi41NSwyOC0yOCwyOEg5Mi40M2MtMTUuNDUsMC0yOC0xMi41NS0yOC0yOHYtMTQ3Ljg4YzAtMS44MiwxLjQ4LTMuMywzLjMtMy4zWiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgICA8cGF0aCBkPSJtMTA0LjczLDM3OGMtNy4wMywwLTEzLjgzLTIuMjgtMTkuNTMtNi42LTYuOS01LjIzLTExLjM1LTEyLjg0LTEyLjUyLTIxLjQybC0xOS4zMi0xNDAuNzhjLS40Ny0zLjQ1LDEuOTUtNi42NCw1LjQtNy4xMWwyNDAuMzYtMzIuOThjMy40Ni0uNDgsNi42NCwxLjk0LDcuMTIsNS40bDE5LjMyLDE0MC43OGMyLjQzLDE3LjcyLTEwLDM0LjExLTI3LjcyLDM2LjU0bC0xODguNjIsMjUuODhjLTEuNDkuMi0yLjk5LjMxLTQuNDguMzFabTE5NS4yNC0yMDcuM2MtLjIxLDAtLjQyLjAxLS42NC4wNGwtMjQwLjM2LDMyLjk4Yy0xLjIzLjE3LTIuMzIuODEtMy4wNywxLjgtLjc1Ljk5LTEuMDcsMi4yMS0uOSwzLjQ0bDE5LjMyLDE0MC43OGMxLjExLDguMTQsNS4zNCwxNS4zNiwxMS44OCwyMC4zMiw2LjU1LDQuOTcsMTQuNjMsNy4xLDIyLjc4LDUuOTdsMTg4LjYyLTI1Ljg4YzguMTQtMS4xMSwxNS4zNi01LjM0LDIwLjMyLTExLjg5LDQuOTctNi41NSw3LjA5LTE0LjY0LDUuOTctMjIuNzhsLTE5LjMyLTE0MC43OGMtLjMyLTIuMzMtMi4zMi00LjAyLTQuNjEtNC4wMloiIGNsYXNzPSJjbHMtNSIvPiYjeGE7ICAgIDwvZz4mI3hhOyAgICA8cG9seWdvbiBwb2ludHM9IjMzNy43NCAzMy4xNiA5Ny42IDY2LjE2IDUzLjQzIDIwMi40NyAyOTkuMzIgMTY4LjY3IDMzNy43NCAzMy4xNiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgPHBvbHlnb24gcG9pbnRzPSIzNDcuMTIgNDMuNjYgMTA0LjEyIDc3LjAxIDU0LjI1IDIwMi4zNiAzMDQuNjUgMTY4IDM0Ny4xMiA0My42NiIgY2xhc3M9ImNscy04Ii8+JiN4YTsgICAgPGc+JiN4YTsgICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzUuNjMgMjguNjYpIHJvdGF0ZSgtNy44MSkiIGQ9Im0xMTMuMTMsMjAzLjM3aDE1Ny44MmMxNS4xOSwwLDI3LjUyLDEyLjMzLDI3LjUyLDI3LjUydjkzLjEzYzAsMTIuNjYtMTAuMjgsMjIuOTMtMjIuOTMsMjIuOTNIMTA4LjU0Yy0xMi42NiwwLTIyLjkzLTEwLjI4LTIyLjkzLTIyLjkzdi05My4xM2MwLTE1LjE5LDEyLjMzLTI3LjUyLDI3LjUyLTI3LjUyWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICA8cGF0aCBkPSJtMjgzLjkxLDMzNS4xNWwtMTY1Ljc3LDIyLjgzYy05LjU5LDEuMzItMjIuODYtNS0yNC4xOC0xNC41OWgwczIxMC44OS0yOC45NCwyMTAuODktMjguOTRoMGMxLjMyLDkuNTktMTEuMzUsMTkuMzktMjAuOTQsMjAuN1oiIGNsYXNzPSJjbHMtNiIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTI5MS4xOCwyMTQuNzlsLTIxMC44OSwyOC45NGgwYy0xLjkxLTEzLjkzLDIuMS0yOC41MSwyMS43Ni0yOC42OGwxNjAuNDQtMjIuMDJjMTguMjgtNC41OSwyNi43Nyw3LjgzLDI4LjY4LDIxLjc2aDBaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICAgIDxnPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTg1Ljg1LDI0NC42N2MtMS4xNSwwLTIuMTUtLjg1LTIuMzEtMi4wMi0uMTgtMS4yOC43Mi0yLjQ2LDItMi42NGw5My44Mi0xMi44OGMxLjI0LS4xNiwyLjQ2LjcyLDIuNjQsMiwuMTgsMS4yOC0uNzIsMi40Ni0yLDIuNjRsLTkzLjgyLDEyLjg4Yy0uMTEuMDItLjIxLjAyLS4zMi4wMloiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICAgICAgICA8cGF0aCBkPSJtMTg5Ljc1LDI3My4wNGMtMS4xNSwwLTIuMTUtLjg1LTIuMzEtMi4wMi0uMTgtMS4yOC43Mi0yLjQ2LDItMi42NGw5My44Mi0xMi44N2MxLjI1LS4yLDIuNDYuNzIsMi42NCwyLC4xOCwxLjI4LS43MiwyLjQ2LTIsMi42NGwtOTMuODIsMTIuODdjLS4xMS4wMi0uMjEuMDItLjMyLjAyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xOTEuMDIsMjgyLjMxYy0xLjE1LDAtMi4xNS0uODUtMi4zMS0yLjAyLS4xOC0xLjI4LjcyLTIuNDYsMi0yLjY0bDU1LjE3LTcuNTdjMS4yNC0uMiwyLjQ2LjcyLDIuNjQsMiwuMTgsMS4yOC0uNzIsMi40Ni0yLDIuNjRsLTU1LjE3LDcuNTdjLS4xMS4wMi0uMjEuMDItLjMyLjAyWiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xOTMuNTgsMzAxLjAxYy0xLjE1LDAtMi4xNS0uODUtMi4zMS0yLjAyLS4xOC0xLjI4LjcyLTIuNDYsMi0yLjY0bDkzLjgyLTEyLjg4YzEuMjUtLjE5LDIuNDYuNzIsMi42NCwyLC4xOCwxLjI4LS43MiwyLjQ2LTIsMi42NGwtOTMuODIsMTIuODhjLS4xMS4wMi0uMjEuMDItLjMyLjAyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xOTQuODYsMzEwLjI4Yy0xLjE1LDAtMi4xNS0uODUtMi4zMS0yLjAyLS4xOC0xLjI4LjcyLTIuNDYsMi0yLjY0bDkzLjgyLTEyLjg4YzEuMjQtLjIsMi40Ni43MiwyLjY0LDIsLjE4LDEuMjgtLjcyLDIuNDYtMiwyLjY0bC05My44MiwxMi44OGMtLjExLjAyLS4yMS4wMi0uMzIuMDJaIiBjbGFzcz0iY2xzLTYiLz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTE5Ni4xMSwzMTkuMzhjLTEuMTUsMC0yLjE1LS44NS0yLjMxLTIuMDItLjE4LTEuMjguNzItMi40NiwyLTIuNjRsNzAuNjMtOS42OWMxLjI3LS4xOCwyLjQ2LjcyLDIuNjQsMiwuMTgsMS4yOC0uNzIsMi40Ni0yLDIuNjRsLTcwLjYzLDkuNjljLS4xMS4wMi0uMjEuMDItLjMyLjAyWiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xODcuMDcsMjUzLjUyYy0xLjE1LDAtMi4xNS0uODUtMi4zMS0yLjAyLS4xOC0xLjI4LjcyLTIuNDYsMi0yLjY0bDg2LjA5LTExLjgxYzEuMjctLjE1LDIuNDYuNzIsMi42NCwyLC4xOCwxLjI4LS43MiwyLjQ2LTIsMi42NGwtODYuMDksMTEuODFjLS4xMS4wMi0uMjEuMDItLjMyLjAyWiIgY2xhc3M9ImNscy02Ii8+JiN4YTsgICAgICA8L2c+JiN4YTsgICAgICA8cGF0aCBkPSJtMTA4Ljc3LDM1MC44OGMtLjM5LDAtLjcyLS4yOC0uNzctLjY3LS4wNi0uNDMuMjQtLjgyLjY2LS44OGw0My4wNS01LjkxYy40Ny0uMDcuODIuMjQuODguNjYuMDYuNDMtLjI0LjgyLS42Ni44OGwtNDMuMDUsNS45MXMtLjA3LjAxLS4xMS4wMVoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTE1OS41NSwzNDMuOTFjLS4zOSwwLS43Mi0uMjgtLjc3LS42Ny0uMDYtLjQzLjI0LS44Mi42Ni0uODhsODkuNDMtMTIuMjdjLjQ2LS4wNy44Mi4yNC44OC42Ni4wNi40My0uMjQuODItLjY2Ljg4bC04OS40MywxMi4yN3MtLjA3LjAxLS4xMS4wMVoiIGNsYXNzPSJjbHMtNyIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTI1Ni4xMiwzMzAuNjZjLS4zOSwwLS43Mi0uMjgtLjc3LS42Ny0uMDYtLjQzLjI0LS44Mi42Ni0uODhsMzUuMzEtNC44NGMuNDktLjA2LjgyLjI0Ljg4LjY2LjA2LjQzLS4yNC44Mi0uNjYuODhsLTM1LjMxLDQuODRzLS4wNy4wMS0uMTEuMDFaIiBjbGFzcz0iY2xzLTciLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0xMTYuNTYsMzU5LjIzYy01LjQ2LDAtMTAuNzQtMS43Ny0xNS4xNy01LjEyLTUuMzYtNC4wNy04LjgxLTkuOTctOS43Mi0xNi42NGwtMTMuMDgtOTUuMjljLTEuODktMTMuNzUsNy43Ny0yNi40NywyMS41Mi0yOC4zNmwxNjMuOTMtMjIuNWMxMy42OS0xLjksMjYuNDcsNy43NywyOC4zNiwyMS41MmwxMy4wOCw5NS4zYy45Miw2LjY2LS44MiwxMy4yOC00Ljg4LDE4LjY0LTQuMDcsNS4zNi05Ljk3LDguODEtMTYuNjQsOS43MmwtMTYzLjkzLDIyLjVjLTEuMTYuMTYtMi4zMi4yNC0zLjQ3LjI0Wm0xNTAuOTItMTY1LjE5Yy0xLDAtMi4wMS4wNy0zLjA0LjIxbC0xNjMuOTMsMjIuNWMtMTIuMTMsMS42Ny0yMC42NiwxMi45LTE4Ljk5LDI1LjA0bDEzLjA4LDk1LjI5Yy44MSw1Ljg4LDMuODYsMTEuMDksOC41OSwxNC42OCw0LjcyLDMuNTksMTAuNTQsNS4xMSwxNi40NSw0LjMxbDE2My45My0yMi41YzUuODgtLjgxLDExLjA5LTMuODYsMTQuNjgtOC41OCwzLjU4LTQuNzMsNS4xMi0xMC41Nyw0LjMxLTE2LjQ1bC0xMy4wOC05NS4zYy0xLjUzLTExLjEyLTExLjA4LTE5LjIxLTIyLTE5LjIxWiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgICAgICA8Zz4mI3hhOyAgICAgICAgPHBhdGggZD0ibTEyMy4xNywyNTYuMTVsNi4zNi03LjUxYy4yNC0uMjguNjUtLjMzLjk2LS4xMWw3Ljk1LDUuODNjLjE5LjE0LjQzLjE4LjY1LjFsOS4xOC0zLjJjLjM1LS4xMi43My4wNS44OS40bDQuMDksOS4xMmMuMS4yMi4yOS4zNy41Mi40Mmw5LjU1LDEuOTdjLjM2LjA3LjYxLjQyLjU4LjhsLS44Nyw5Ljk2Yy0uMDIuMjQuMDcuNDcuMjQuNjNsNy4zNSw2LjYyYy4yOC4yNS4zMy42OC4xMi45OGwtNS42LDguMTRjLS4xMy4xOS0uMTcuNDQtLjA5LjY3bDMuMTgsOS40OWMuMTIuMzYtLjA0Ljc1LS4zOC45MWwtOC44Miw0LjEzYy0uMjEuMS0uMzYuMjktLjQuNTNsLTEuODQsOS44MWMtLjA3LjM3LS40LjYzLS43Ny41OWwtOS42OC0uOThjLS4yMy0uMDItLjQ2LjA3LS42MS4yNWwtNi4zNiw3LjUxYy0uMjQuMjgtLjY1LjMzLS45Ni4xMWwtNy45NS01LjgzYy0uMTktLjE0LS40My0uMTgtLjY1LS4xbC05LjE4LDMuMmMtLjM1LjEyLS43My0uMDUtLjg5LS40bC00LjA5LTkuMTJjLS4xLS4yMi0uMjktLjM3LS41Mi0uNDJsLTkuNTUtMS45N2MtLjM2LS4wNy0uNjEtLjQyLS41OC0uOGwuODctOS45NmMuMDItLjI0LS4wNy0uNDctLjI0LS42M2wtNy4zNS02LjYyYy0uMjgtLjI1LS4zMy0uNjgtLjEyLS45OGw1LjYtOC4xNGMuMTMtLjE5LjE3LS40NC4wOS0uNjdsLTMuMTgtOS40OWMtLjEyLS4zNi4wNC0uNzUuMzgtLjkxbDguODItNC4xM2MuMjEtLjEuMzYtLjI5LjQtLjUzbDEuODQtOS44MWMuMDctLjM3LjQtLjYzLjc3LS41OWw5LjY4Ljk4Yy4yMy4wMi40Ni0uMDcuNjEtLjI1WiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgICAgICAgIDxwYXRoIGQ9Im0xMzUuMjksMzA4LjEzbC0xNy40OC0xMS4wNWMtMS4zNy0uODctMS43OC0yLjY5LS45Mi00LjA3Ljg3LTEuMzcsMi42OS0xLjc4LDQuMDctLjkybDExLjg0LDcuNDksMTMuOTktMjkuNjhjLjY5LTEuNDcsMi40Ny0yLjA5LDMuOTItMS40MSwxLjQ3LjY5LDIuMTEsMi40NSwxLjQxLDMuOTJsLTE2LjgzLDM1LjcxWiIgY2xhc3M9ImNscy03Ii8+JiN4YTsgICAgICA8L2c+JiN4YTsgICAgPC9nPiYjeGE7ICA8L2c+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Passport-Visa-Issuer", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCIgZGF0YS1uYW1lPSJMYXllciAxIiBpZD0iTGF5ZXJfMSI+JiN4YTsgIDxkZWZzPiYjeGE7ICAgIDxzdHlsZT4mI3hhOyAgICAgIC5jbHMtMSB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICAgIGZvbnQtZmFtaWx5OiBDYXB0YWluQ29taWMsICdDYXB0YWluIENvbWljJzsmI3hhOyAgICAgICAgZm9udC1zaXplOiAzOS45cHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICMxYjc1YmI7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMHB4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTMgeyYjeGE7ICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4xZW07JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjkuMTEgMzQuMTQpIHJvdGF0ZSgtOS4xKSIgaGVpZ2h0PSIzMjMuMzQiIHdpZHRoPSIyNDQuOTIiIHk9IjM4LjMzIiB4PSI3Ny41NCIgY2xhc3M9ImNscy0yIi8+JiN4YTsgIDx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRlKDg2LjI2IDE0OS4zMykgcm90YXRlKC05LjEpIiBjbGFzcz0iY2xzLTEiPjx0c3BhbiB5PSIwIiB4PSIwIiBjbGFzcz0iY2xzLTMiPlA8L3RzcGFuPjx0c3BhbiB5PSIwIiB4PSIyMS4wNyI+YXNzcG9ydDwvdHNwYW4+PC90ZXh0PiYjeGE7ICA8aW1hZ2UgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFXRUFBQUZaQ0FZQUFBQkoxcDRYQUFBQUNYQklXWE1BQUFzU0FBQUxFZ0hTM1g3OEFBQWdBRWxFUVZSNG5HSVlCYU5nRkl5Q1VUQkFnSUdCQVFBQUFQLy9ZaHdOKzFGQUMvRC8vMzhIcUxFS1VJek9CZ0VEQmdZR2ZpcFkvNUdCZ2VFQ0V2OEJGQ096UHpBeU1sN0FvWDhVaklLQkFRd01EQUFBQUFELy94b3RoRWNCVmNELy8vOGJHQmdZUUFXdi9TQU9VVkJocmNESXlQaGhFTGhsRkl3Q0JnWUdCZ1lBQUFBQS8vOGFMWVJIQVY3dy8vOS9BWkE4b1lJTHF1NEFBd09EL2lBTlVWQUI3RUJNYS9qLy8vOEZEQXdNTVA5Y0dDMjBSd0hOQUFNREF3QUFBUC8vR3NXakFBV0FoaEZBaGRELy8vODMvUC8vLzhGL0NEaEFUQ2o5Ly8vZjRQLy8veC8rRDA2UVFLUWZKbUJ4L1FOb2VCUWdEYk9NZ2xGQU9XQmdZQUFBQUFELy94ckZJeHhBQzA1UXdYT0FRTkU1Z2NoQ3pHRVFGc0VOUkxvOWdRUXpGWWd3Y2hTTUF2eUFnWUVCQUFBQS8vOGF4YU9GTUNtRkpyR3RTVklLTTFxREJVUzZtWlJXUEZFOWcxRXdDZ2dDQmdZR0FBQUFBUC8vR3NXakFGUUFMU0N5OEFFVlVnWkVGbXJFbWtsTGNBRTJwazNBclFKSVF5L0VBS0tHSktEbWpyYVlSd0Z1d01EQUFBQUFBUC8vR3NYREVDQU5NUkE3aEtCQVFnSDBnSmlDRFdydWhnRXNnRCtRNEU1Q1F6SElnT2hXTUZJdkExUVpOQkJiZ1kyQ0VRUVlHQmdBQUFBQS8vOGF4Y01FL1AvL1B3RGErbnhBWm9GQlNzdVZxUFcyMEpiZ0JkTEtUcW9BV3JiWWlaNllneGE4Nk9BQnRJSWNMWkJIQVFNREF3TURBQUFBLy84YXhVTVlJTFY0Y1hXbFNTbUVGVWhjMlVEc1dLdkFBS3lZQ0NEU2JhU09YUlBsWnlUenNSWEN5T0FCVk0zb2tNVklCUXdNREFBQUFBRC8veHJGUXd4QUM4c0dJc2N3U1pwQUlxTFFRQWNGUkpwTHo2VnJ4RTRlR3BCaE5rbUZKWW5oZVFGYUtSQTFoRElLaGdsZ1lHQUFBQUFBLy84YXhVTUVRRE1vcVdPc3BCYkM1TFJhaVcxMWtsUG9rUXFJWFlwR1RxVkExUGc2bWoya1Ztb3dzR0IwUGZJSUFRd01EQUFBQUFELy94ckZneGhBVzcwVEtHaEZQaURWZDJSMDBVa1pmNlhsMGpWU2hrZElIYWNtZXBJUHpTNXlDMkVZZUFEZElETGFPaDZ1Z0lHQkFRQUFBUC8vR3NXREVFQm4xYW15c29BYzM5R3lrS0pSUWJ5QkJMK1JzaElDQm9nYWRzRmlGNldGTURKWU1EcVpOd3dCQXdNREFBQUEvLzhheFlNRVFGdG9DU1N1VnlVSXlQRWRtYnZlaUZxVHkwRDl3b2tVZThsWnUweHliNEpHL29TQkE4UU9BWTJDSVFBWUdCZ0FBQUFBLy84YXhRTU1vSVZ2QTYwbXJpZ29RTWdwc0dpMUpBNFhvRWZCVC9iWUxJMEtZUmg0UU93azVDZ1l4SUNCZ1FFQUFBRC8veHJGQXdTb01ONUxGS0NnQUNGM2FSblJ5N2dvTEloSjJUUkM3aEFJMGNNY09PeWxaU0VNQTZQanhrTVpNREF3QUFBQUFQLy9Hc1YwQnREQ2wyNWJlaW54SFRSemt3Tm9YUkNUTWhsSTdvRkNIeWhkdjB1blFoalp2UTJqaGZFUUF3d01EQUFBQUFELy94ckZkQUwwTG54aGdGTGZVYkRqamVpdU1vbDJrRklBVTdJK21hamxiZ1RzcDJjaERBTWZxT0gyVVVBbndNREFBQUFBQVAvL0dzVTBCa2hqdmdNQ0tQVWRoVWRURXJ0eGd0aGxZL1FxZ0luZGxvMTN2SGdnNDMxMHpIaUlBQVlHQmdBQUFBRC8veHJGTkFLMG5uQWpGaER5SFpHbmpHRTc2SnhZUU94bURrSUZNU2tGTUtWblZoQ2NqSU1PMWVCdGNRNXdJUXdERDBaWFV3eGl3TURBQUFBQUFQLy9Hc1UwQUxSWWFrWXVJT1E3WWlhZktEei9nUnFGSnowTFlJSTc0NURDWXlnVXdqQndZSFFYM2lBRURBd01BQUFBQVAvL0dzVlVCTkN1T3ptYkFXZ0dDUGtPYWk4eExiOEFDdHhJU1NGS3p3S1lxRTBuU0dQN1E2a1Fob0VGb3djR0RTTEF3TUFBQUFBQS8vOGF4VlFBME13L0dBNHhSd2ZFWEdyNW45amxYaFR1NGlPbk1DVmFEd04xMWg0VDdMYWpqWkVQeFVMNC8ramszU0FDREF3TUFBQUFBUC8vR3NVVUF1alk0R0M5M0JMdjVnbTB3OXdKWmtvcUhFdEpha0ZNendLWXFEWEJhTU5NUTdVUWhvRUhvME1VQXd3WUdCZ0FBQUFBLy85aUd0Rytwd0JBWjk5QkxjMStCZ1lHL2lIcURlUnVhVDJoUWc5NjlUc2xNKzZnY0RwQVRLc2JaQmN4MTlNelFBdGdCZ2FHZUFyYzlaRVlmMEVMWFhrU3pDVjd5ek9kQU1ndis2RTluTkgxeFFNQkdCZ1lBQUFBQVAvL0dpMkVTUVRRRmhwbzh1WThBd09EL3BCeVBHRkFjSk1GSXlNanFNVzRrUUk3aUM2SWlRRlVLSUJCSUFGYXdlQUUwQXFxbmtSekIzc2hEQVArSUxlT0xta2JBTURBd0FBQUFBRC8veG90aEVrQTBLNGJxSFdXUDJRY1RSclFKM0tzTUFIYWVpVGJIbW9VeEZRcWdEZENLeFpDQU51cWllSFVsUWRWanZPaEU4dWpFM2YwQWd3TURBQUFBQUQvL3hvdGhJa0FTSzNmL1NSMlI0Y2lLQ0NVQ2Frd0xNRkFhVUZNcFFLWTJHRUkwRkdXOWhUYU5WUUF5SjhYeUQyK2N4U1FDQmdZR0FBQUFBRC8veG90aEFtQUlkNzZKYWM3ekUvQ3NNUkM4cHdGQjJRVnhGUXFnRUVnZ0loaENGQ0ZOTkpXRW9EU1FQOW9xNWdPZ0lHQkFRQUFBUC8vR2kyRThZQmgwUG9sVkFqajZrN2JFOWtTQXFsNVNJYTdrSUVBMmdRaHZjQkVSa1pHWW83ZVhFREJ4Q3RSRTR1REdNQmF4YU03N21nRkdCZ1lBQUFBQVAvL0dpMkVzUUNrbFEvRGRleVhHTkJBNUdvSlNqTG9SUVlHQmdOaVYwRWcyUXNhUWtpazBGNWlsdVFSR29ZZ1p0aG1xQU5RQmJSK2RBVUZqUUFEQXdNQUFBRC8veG90aE5FQWRJYjR3REJjK1VBcUlIWllBbFNBTnBKaFBxZ2dkQ0Mzb0dKa1pGeEFRVUZNN0dvSVFnWDFjSjhmUUFiKzBGYng2QlZMMUFRTURBd0FBQUFBLy84YUxZU2hBTGJyRFRSRFBJVFgvYUlEU3BkSUViVmFncEdSRWFUbUlBbm1IcVNrQUVheUZ4UmZnU1N1MUNna3N1Vk55VEFFTXFCa0ZjbGdBNkJLNS96b3BCMFZBUU1EQXdBQUFQLy9Hc1ZJd3crRFl4TVRWUUdob3hhSlBlZUNZT3VIaE4xMFJCLzRUaXdnNGRoS1luZkZrYkxURFc4WGZiQ2RKVUpGTURvOFFRM0F3TUFBQUFBQS8vOGE4UzNoMGVFSG9nREJERWZrK1BCQzZIZ3VVWURZbVhsb3k5WUJPc1NCQ3p3a2NqbWFBNG1iTWtacTkzeDBlSUlhZ0lHQkFRQUFBUC8vR3RHRk1IVDF3M0FhZmtBSDFOcXhKWTlqc3dJS2dLNDJ3RFUrbkVoc0FRdzd3QWVheVluU1EwUkJUTXh5TkFGaXhzRkpCRU5sMXh3NVFCNjZ4SEIwcHgyNWdJR0JBUUFBQVAvL0dwRVltc21IYXpjUkRnakZMUmxHRWx1SUlwKzI5b0hFcTQ2d0hVZEpVaWJIY3BnUE9lNm1TcGdNZ1VOOHFBVUlWdEtqQUF0Z1lHQUFBQUFBLy84YWNSZzZmamdvRGx5bk5TQ2kwQ0VWRUhYNUpiUWdmVURHVVpUNHpnTW1hVElJcWZBanFtVkx3YVdtUS8wa05Xb0NxcDBKTW1JQUF3TURBQUFBLy84YVVSaDZNUGxnUFhhUzJnRHZDZ0MwWXl4SkFjU2ViR1pBeW00cklpZlhTQm9xZ01ZM01lY2swK3hDVUFydjZCdUtZSFNjbUJUQXdNQUFBQUFBLy84YU1XUEMwRzdqK21FOC9vc09DQzMvSW5lWG1qNHhoU0ZvakphUmtaR284VkJvcGoxQVJOekVrMUlRZzdaV2t6QU9URzY2R0QyUEZ4WEF0cUtQRnNURUFBWUdCZ0FBQUFELy94b1JoVERTK3QrUkJHZzVJUlJQcmNrWXBOVXB4QmFDOGREV0ZyVzZ2Uk5vdkRKbXFHOWRKZ2Z3UTljVGowN1lFUUlNREF3QUFBQUEvLzhhOW9Vd0ZROTdHV3FBM0hNamlBVVRLRzN0UURNcE9hdFRxTkxhZ280elU1bzJpTm5hUFZMQi9OR05IUVFBQXdNREFBQUEvLzhhdG9VdzBqS25rVmdBTXhBeEhFRXBBRzlycHVBb3lna1U5azRvS29paCt2b3BzQjhHaUtsQUtEM2thQ2lEZmxwczBCazJnSUdCQVFBQUFQLy9HcGFGTUxSZ0dPa2JNQWgxZzZreGxxbFA2akdQU052RHFYRTRFaVhkWHFKMnp4RURpS2dJaHZOYVlXSUFTV1A1SXdvd01EQUFBQUFBLy84YWRvVXdkRVorcEJmQURIVEsrS0FkY0tSMk56ZlFvSGN5bjR5Q21OQU9PMUlBb2Q3QVNCd1hSZ2NCbzVlS1lnRU1EQXdBQUFBQS8vOGFqaTNoMFhXS2tMRklRb1V3cFRkRkVMMEREZzNRNG9EMGo2UVdkS0R3WVdSa05LREN3ZlFNUkd4ZEhzbmp3Z3pRQTVzTWlEeS9lV1FCQmdZR0FBQUFBUC8vR25hRk1IUnBGQ2hURkE2ekU2eElBWGpISUNsY1dRQXkyeEI2Z2huSkFKb1JLVGtMR0J0d0lQVk1ZaGhBT3B1WWtyUkNLRHhIYXVIekVWcFpPeEM3WEhIRUFRWUdCZ0FBQUFELy94cTJFM09Nakl3VG9DMFVTbTRHSHFxQVVJSW5kMVhCUVhJT1lVY0gwQUtjbkRPSXNZRkVLcm1Ia3VFSlF0M3NrZGdTQnZVd0ZNaXRyRWNNWUdCZ0FBQUFBUC8vR3RaTDFLQmRUdERKWG80amJJYWFVS0ZFemthTlJtaUxoaW9GQ3ZRTVlrcUhBaEtwbGNtUkRnQWl4MDJFVHBnYlNXUENvSXJNRWRUREdPSEw4NGdEREF3TUFBQUFBUC8vR2hHYk5VQmRZRVpHUmdWbzYyc2tERkVRYWdtVFVnaC9oR1lxb3NkeWlSM3VnQTRGa0ZzUUx5U21BQ1psNkFWVWFKQTVQRUhNSlBCd2J3UjhoQjZZUHpyMlN3cGdZR0FBQUFBQS8vOGFjUmkyUkdxWTc5OG5kSmc3c2FlRmtYTVRzZ1AwSEFhaVc2aGtIS2hQaXRrSHlObGhSOFpCLzNpSGVJYjVxWDBUS0psbmdPYkprVG1oenNEQUFBQUFBUC8vR3JFWW1zbUdhOFlnZE5zRE1ZVUx5YXNZc0p4RVJ0VHlOUUtucDZFRFVncGc1TXIyQXpsTHBLQUZEREVBNzRIMncvUTBOYXBjaVE4TjQ1RzVqSStCZ1FFQUFBRC8veHB5R09rc1lLclVuTkNXMjNBNjJwTGdPQndCL1E5STNZVkdvSGRCMGtIdUJOeEdkRWJGVStpUlU3azRFSEhLR3FIVDFBSUk2QjlLNEFLMTF2eWluVEkzOGlieEdCZ1lBQUFBQVAvL0dsSVlMYU5TZGIwcHFMQVlKb1V4M3ZFNGFBOEFGeUI1R3pLUjNYYWlNaXlCZ3Bqb0lRVm9YT0lESk4rUEJuVWJ2bUVjdkR2d0NJVDdVQUVQcUgwb0Q1YjRIbGtGTVFNREF3QUFBUC8vR2pJWVJ3YWwrbkY1MEM3MVVENXpHTzhOQnpoYVpCOElkYWR4bUpWQVpGZ1JmYmc3am5pbVpnRU1BeVMzK0FuNG1XQXJuVWgzRFVaQTB1MG9KSVFscnQ3S3lMbWxnNEdCQVFBQUFQLy9HaklZUjNlWEpyT3cwSUtnWVlnV3huakhZYkVrZkxLR2RrZ1lLNFVCY2d0aVVncGdjZzVuSi9tVUwraUIrQmp6Q1VUb0cycHpFQitnNllYcWsyYlFNTVFYVnlQakdFd0dCZ1lBQUFBQS8vOGFFcGpBYWdhYUhaVTNSQXRqWXErNS8wQm1BVVRxcWdGazhJR0VBbFdBbE9FUkNtL0hJTGNpUXU4MUVRcjdvYklxaDJhRkwxSllFTE5DWi9nWHhBd01EQUFBQUFELy94cjBtSWk3djRqTzJPUUNwTUo0MEk4WkUvSWkxQTlreldxVE1QeUFEMUR6UUhhWXV5Z3BnR0dBM05VVHlLMWlRcjBRY3UreG94ZWdlZUhMUU5xVlQxUTc2VzdRQWdZR0JnQUFBQUQvL3hyVW1JUVpaV0l2YzZTNFpoM2tFM2pFakV1UzAvcWw5dHBxcWhYRVJIUnJTUVZralVkQ0MxaEM0L0dEOWI0NXFreTRrVEFCUzJ6K0dmNHRZUVlHQmdBQUFBRC8veHJVbU1SRVN6QUJRTWN4RDFCamVRMjBNQjVzWTN4VW4xbW00ZTNVRkJmRUpLNHZKdFZ0TkxrampRWnVwUVJjb0ZiaFMyeEJUc0o2NlpHeDVabUJnUUVBQUFELy94cjBtSVFDZ09Ba0hUVFR3bHBOMUZwbzdqQ0l4dnFvT2o1T2h3MEdaQmZFTkN5QVlZQ3NNWE1pM0QwWUt1NE5WR3FJT0NENWgrQXBhV2o1anhBWUdTc2tHQmdZQUFBQUFQLy9HdlNZeEhFMGNtcmlCVlFxakJXZ0xlMkJuTVNqU3VzTjErdy9qUUE1VzRwcFhRQWpBNnBVMWtodUozVlZDYlhBQnlxbmRmU0pOV0o2b3FRMFZxZ1c1b01hTURBd0FBQUFBUC8vR3ZRWW11R0lCUStJeWRBNFd0ZFVTYUFNaUtFS2VoVVNjRUFsdHcvRU9tbFNyMGlpOXhaZ3FxMlRIWUNkY3crZzZaSGlNWGhvNFV2V1VsRVNONnVNbkMzTURBd01BQUFBQVAvL0doS1l4QnFVWUlZbXNLQ2Ztb1d4QWRROGVoUnFGSzJaSm1KSEdLMEFXZVBZQXpRRVJQSk9PeXp1VnFDVFd4ZFFjV3N4cnNJWEJvaHBCWlBTc3hvNUUzSU1EQXdBQUFBQS8vOGFFcGpFMXNNSFlncFJJc2FhcVZrWUM5QmhJby9zYmR6UThCMklZUlNLeHYwR3FHdFAxdTVDTkhmVGFuWE5CV2hQaHBvclR3aFZkc1MwZ2tsZEZVTG9BQ3FRZWNQajFEVUdCZ1lBQUFBQS8vOGFNcGpFaEV2TU9iTkVMMytqNWt3NTB0Z3h0VElpMlJOSUE5ajYvVS9GN2oyeDI1U3BEY2dlSzRhbVBXckcvd1FxcDFFREVub2FCTzJsUWQ0Rm1UYzh6cGhnWUdBQUFBQUEvLzhhRkppWUZoRVpyUjVpV3NPa3RFeXBzclFOelg1S2h5dElQbkFIeVc1cWJMd2dCMUQ5SElJQmJNbFR0SUtDZ3QyWXNFazJpbHJrV056alFHS2VJS2JBSkxXU0pIUWtLSEtyZXVnUFd6QXdNQUFBQUFELy94cHdqTlFpSlJUNHBJNmwwYUtiOUo5YWF5dXh1Q1dBaEFLWjdLTUU2Ynp5QVIwUWZYNEVHZjZpeHE0NWNzRUJjdjFGWkpjZkJqWlFhNUlOelEza1RpUlRZOWdQR1JCekRDdjZHZEUwU1U5MEF3d01EQUFBQUFELy94cFFqTGJiaWVBV1JUSVNDclVuREZBU0RBMFBOOEZWSUZQVWloemdFK0l1a05KOVI5b2tRblFtby9QU05XeUFrbkY1YkszUUR6UXNlQ25kaWsrTFZqQXhQV0wwOUR1MFYxSXdNREFBQUFBQS8vOGFVSXdsd3hBYWtDZDE3ejJ0V3NQb2dHb3owVmpjWndBZGlpRzd3S2Z3MEIxcUFKSU95RUU3UkoyazFzNGd1TDdxQVNWcEFha0NwdXBRQTVMNXBJejM0Z040SzFRU04yYkFBS0Vyb25BVjZrTjNZd2NEQXdNQUFBRC8veG93akdPdEo2RURVRWhaTXd3RHRHd05vd09xcmNta0poamdYVm9rVGFEZ3lXZ2s5UUFHd1hWQ2cyYThFbWwxRHJVcVltSWFONlNHUHpFNzd2Qk5JdE9rRVVSendNREFBQUFBQVAvL0doQ01aK0UyTVFmUWtEcWJUNi9XTURMNFFNdldNYW1BeW40akJaQmFjQkxxdnBKcTNrQk4yUDBmRExQM05GeW5UdWpJVG5KYXdZUU9QeUxVQUtQNWFZbzBBUXdNREFBQUFBRC8vNkk3aGdZbXZuRW9RdDBjY3BZa0VkTWFwdFhhelFmUVlaUUIyWVk1UUNkM2tYd3NKQWxkWkZKYjFnTTFGRE1nQjlEUW9OV0xEbWpSQ2dZQmNvY2lrTUhRTy9xU2dZRUJBQUFBLy8raU95WmlxUm1sTlNJMlFFekNvY2Q2MHdQMEhxNUFtdkNoVjR1UTFBazRjc1p3U2RxNU5nRHJvUS9RZTV3UzJ1cW5oeDlwMGFBaFppaUMyRXFGSm1QcE5BTU1EQXdBQUFBQS8vK2lLeWF5VlVicDJCQXVNSkN0WVd4Z0E3M0hEYUdyVVJLUWp2U2tkc0ZNYWl1Vmt0VU1KQlgyRE9STjdCTHJqZ1ZRcyttNlhBcnBCRCs2VmJCRXVJbWN4Z3lodVNCU2xxY09yV0VKQmdZR0FBQUFBUC8vb2lzbW9aQ2pSdGNFSFF5VzFqQU1VUDNtV25JQU5JRUhRTHVRRzhnc0ZFbGVPa2VsYzRwSlhpZEtnYjJ3RzBrYW9PbGt3TmVua3JqR21CcUFtRk1LeVFsYlF2bWQxTXB6NkF4TE1EQXdBQUFBQVAvL29oc21jWnlJRmtNUy8yazBvVUFxR0JTRkx5RUFMYXdjb1BFR2F6bGp5MkFrMzFwTWd3a3pVaXNBZk1NVEI2QnlzTUoyME0rNjA2a3dKcWFIU2s0amhwcERFY2hnYUF4TE1EQXdBQUFBQVAvL29nc204Umc3WWlPR25DRUpXazBxRUFPR1JPRkxESUJtZWdkeXhyZHBlTThheVdPd3NFSjJ1Q3h2b3ZHWjFzU2NUa2hPSzVoUWc0dmNVK2VJT3RaMndBRURBd01BQUFELy8yS2toeU9naFo4OWlkb01HUmtaY1k1QlFRdTArV1E0aDVDNW9ISEcrMlNZaXdzOFpHQmdhR0JrWktSb3lSTFV2NkFXSnlnc0R6QXlNZzY1NjErZ1lZdGVFUWxBL1VVcUFNVWhlaGhzd0JlM2d4bEFleE9nMXBzQ05MMFFiSWpnQ1dkUW1CWkFNVDhWdlAwUjVDNThhUTVha2UwbncyeEMrUkhraDM0eXpBV0JpWXlNakRTN2paMHFnSUdCQVFBQUFQLy9vam1tWUp5VlZrTVN4R3kzcEViWDdnQ05MeFlkN1c0TkU0QmpNdzNaaHpQQkFOSnlOVXJIM29uSk0rUnNDS0xWVUFReUdOeG5TekF3TUFBQUFBRC8vNklwcG5DTWxWWkRFditKV0l0TTZ2QUpNcURGL1YwaysyRVVEQjJBWjRpR2F1ZVRVSGllTmFHSk0zS0hER2cxRklFTUtMcnNnT2FBZ1lFQkFBQUEvLytpS2FiQ29kdlVualdGQVdMR3QwaXRnYWwxZnhjeHh3bU9IbG95akFBUmhRMDFDMk5TejQ0Z1poNkYzSjRqb1pNVHFiVmFhZkRPeFRBd01BQUFBQUQvLzZJWnByQTFDUU8wcWlrSnJpVWtNZ0U4b0dMbUlPVXMxOUZ4cm1FR2lLejBxVmtZS3hCNWlocmVBb3lDWVVGaWpxMmsxdWFUd2J0Mm1JR0JBUUFBQVAvL29obW0wcUV4dEJ3ekltYk5JNjZoRktxTTl6S1FYdmpDd09oUXhEQURKUGJxcUhxTUtwNmhDbUlLU25KN28zakhtU2tvM0hFQnNvOFpwU2xnWUdBQUFBQUEvLytpQ2FieWpiS0V4bS9KWFZKR1RBR1BQSndDTzVTSFd0ZktrMVA0L2g4ZGloaWVnTXhlSGV4cUkycmRoWWkreEkyWTgzM0puZlFqMU1LbXhhM1VnNi94d3NEQUFBQUFBUC8vb2dtbTh2WmZRbHNhS1JuMklMUjVRd0Yya3dZVld4M2tGcjVFaGNjb0dMcUF3cFVBVkx1WWxnSFJPaWJVQUtLa29DUTBIRWlMelNlRDcxNDZCZ1lHQUFBQUFQLy9vanFtd1dKOFl2YXJrMzFIR3gzRGhWcTNMWThPUlF4VFFLV0pLTG9kb1VyQm1DMHQ4elFoTUxnMjVqQXdNQUFBQUFELy82SXFwdUcyWDFyV21qUXQxS2kwVGhNR1JvY2loakdnOGpqb0FWcXVKYWR3K1JqZThWa3FUZXJqQW9OcnlSb0RBd01BQUFELy8yS2lzbm5VMnFHRERnZ2xKa29DbHVvSkZlbityZy9RWFgzeVZESjY5SnJ2WVF5Z085STJVc21Ib0IycTY1SE9zNmJGNm9DRFpPb2pkTUFPTFRjaTJRK3ExakFEQXdNQUFBRC8vNklhcHZIaE45U2VTWVZOYUZCMU53M1NRU3EwQ29mUm9ZaGhEbWcwSWZXZjJwTjRNQUJOOHdVa2pHY1RzK0tDMW9md0Q1NGVKUU1EQXdBQUFQLy9vaHFtOFoxZTFJaTREN1M2UUJHYWNXaDlqOXZvOFh3akJORGhKTDhOTk1vSHhCVEllTk14RFphbTRRS0RZd01IQXdNREFBQUEvLytpQ3FiUzlrSkNnTkR1T1d5VkFDMExYZ0ZvZ3FQWFFmQWpjOWZQQ0FSVTJHbEtMS0RhWmlOMGdLZEFIb2lsYWRnQTJRY2tVUlV3TURBQUFBQUEvLytpQ3FiVHdkS0VCdk5odDNiUXJPQmxJRy9iSnpYQWtEc3hiUlNRRDJnOE1ZVUwwR3hWQmRLTkxodUlXUFkycUE2cHB6bGdZR0FBQUFBQS8vK2lSZ0RUNHlEMC8wVHVZYWZwaVVrRGRHSGsveEd6dm5FVXdNRUFwclVCUFhXTXpsZU1EWHhybUlHQkFRQUFBUC8vb3NicUNGcXRpRUFIOW9TNlRVUDFMRmtpQUYwdmpSd0Znd0lNUkp3L0hNZzhCRzBsVTJzbEVURkFmc0JYU2pBd01BQUFBQUQvLzZLb0VFWTZQSm9lNENIMHdPdUJCQVBSSXIwNGpDdVhVWUFiYklBZXBrNVBNS0NUdjlDRDdBTkJoN0dEMGoyZHJCM1lNeVVZR0JnQUFBQUEvLytpQ05ONlJRUjBES21BRGhzcVlJZGZFenBhang0VGtPaGdkRUp1aEFJNlR0REJBREVYN0Q2Z3hmSk9IUGFCOGlWb29nNWtIeTJIWndhdU5jekF3QUFBQUFELy82SUlVM2tzR0xuUXBjdTRGTkprQVF6UThpQjVjc05rOVBydUVRcm9YT21Uay9ZdjBLT1JoR1EvY3FGTXpTV2hBOWNEWUdCZ0FBQUFBUC8vSWh0VFlaLzdBK2hNS04wS1hRYkVFaGg4R3lwb2NkMCt1V0IwUW02RUF6cXNQNGNCU3E4VG8ydUJqT1F1MEtvb2tMMmdDb0tTU2IyQkdlcGtZR0FBQUFBQS8vOGlHNVBvNFEvUXhOUUFMUVRwMnJvam91QkZCdlM0Y29WWU1MTHZ4eG9GOUZ3M1MraEVRVklhSHhmb05XU0J4WjJneWdKVU1JUEtHbElLNW9GcDhEQXdNQUFBQUFELy95THJ0bVVDTjZ0K2hONkVDMXBTQnVyaVhLRDN4Qkswa0ErQVlnY1NWMitBWm9nSnJXVUUrVWVmY3BmaUJRY1pHUm1IOTRsUG80QW9BQjBxb09XcWdZK01qSXlFRHNrQ2Rkbjl5VEQ3SWZRVzdBRTdnaFZhSG9BcUJGQitBdVZ0RUVhLy9aM2dqZEkwQVF3TURBQUFBQUQvL3lMWFU3Q3hvUXRRZGdPMDloa1VUWG95V2dIb2dGWjMyeEVMUG96ZXBqd0tZQURhR3FibFdueGEzM0l4S0FzMmFLOFcxbXFtMlFZdnZJQ0JnUUVBQUFELy95SUxEL1p1TWhYRzBRWnFTSUtXSjE2TmdpRU1rRmJ3MEdLVkFLMHYzQnpaTng3akF3d01EQUFBQUFELy94cFNHR243STZIaEFrcVg5dER5Ymp0c2dDWUhxb3lDNFFsb3NIV2UxcmRjRURweUFEYnVEV284MFhXaWZzQUJBd01EQUFBQS8vOGExQmlwOWwrQU5zQk9iS1JTQW1oZTBFTzdRYVBIVTQ0Q3NnQ1ZXc2ZFSEFkQTZWQUlvVWsvYkhtSjdrdFdCd1F3TURBQUFBQUEvLzhhVkJqYTBpVm1jVGJlaEVPbDRRSmEzVzAzMnVvZEJWUUgwUFE0Z1l3Q2sxQTZkeURDREVLQVVFdWIyT0ZEMkFvcmtKdUd4NUFkQXdNREFBQUEvLzhhVUF4Tk9OaGF1b1FBTWVjTFUzb1FDRFh2d2Jvd090WTdDdWdGU0Z5U1NXZ1NtaDVEZStRQ1VMNEMrUk5VaGd6TjFqSURBd01BQUFELy82SWJSdHJ0MGdDdDBTanQ0aEJLUE5UWTJVYkpXQm5kdG5lT2dsR0FJMzBLWU5rVmlwSkdDUVVjRmVZK0NCM2lUdTFqTzBGbEN5amZEWTJDbVlHQkFRQUFBUC8vWXFHRm9kQnhUZ00wVE8xMWpnYlE5Y2k0d0FVeTF6VWlnd0FDaC9hQWhrWGlrZmdQb1llZ0xCZzlkR2NVRERTQXJua0ZwZDhGYUd2bllmbUM0TEFlRmRiREV4cHpwdlphZU5ENlgvZ2E0UC8vLzRNbzBHRkFvUHdJcW5UQSt4ZWdod1VOUEdCZ1lBQUFBQUQvLzZLNEVJWU91cU1YdXZRNDJwSlFMUWNLN0hvSzdYQWdvaEFlTFhoSHdhQUh5QVV5QTNUSWdvR0JnZEN3SGpVS1NFSjVnaDZ0VlZCRkFxdE13R1VDdEhBR1hWUUtLb3hoaGZNSHV1ZGhCZ1lHQUFBQUFQLy9JbXJISE5LT0V3T2tBcGZlWjMraUE3dzd5cUJ1ZmsraEhRUjNFbzJDVVRCY0FRVzc1SkNCSUw1ZGFIVGFmVW9xQURXc1FLMWwydTlZWldCZ0FBQUFBUC8vSXJZUVhvRFc3UjRVZ0pHUkVhLzdxYlRkMDNDMGhUc0tSaUtnUXY0aDVnZ0FjSk4wa0lKQVJrWkcycDZ3eHNEQUFBQUFBUC8vSXZaUTkwRzVwSXFJZ1hkS0NrOVFWNlVSMmxXaEdSaGRyallLeUFYUXlTZWE5ZFNnQmFnaEF3TkRJUU1EdzBZeURwbkhtLytHd01RWjdmTW1Bd01EQUFBQS8vOGlXQWhEQ3dsNmpQR1NBNmhaQ01NS1hVZEdDSEJnWkdSc29NV0JIc2hyT2dkckJUY0toZ1FBSGZqL25wYm5Ib0I2Z1l5TWpCTVlHUmtEb0VOenlJWHlRd0xhQjhONE1DV0E5aWMrTWpBd0FBQUFBUC8vSW9nSDRHWmhVZ0NoTXg1d0xUVC9nSHp3RUozQ0VkY1Y0S003NWtZQldRREw4cTRQdEx3MUdSdEEybUNGYmVrcG9UTXA2SDF6Q0RtQXRvMGtCZ1lHQUFBQUFQLy9Jb2pwZEpNeXVZQ1luWFBvWnhuVHJkQWpZcDNtNktIdG80QWlnS2VSQkZ1blR2ZmpVSkVLWmtMandmUTZzSjRTUU5zOHlzREFBQUFBQVAvL0lqU3hCYW9GMXRQYUVSU0FRYmQ2QWNkNlRGeEFjVEN0Vnh3RlF3OUFDN3I3QkJ6K0VicU1jZ005SnBxSUJWUmFmVUZyUU5zeWhvR0JBUUFBQVAvL0lyUk9lREFlS3Y0UWRsZzhFZXNjNlFhZ0YzSVNVL0RDd01UUkFuZ1VVQXBBYWVqLy8vOExDYXhlNG9mS3gvLy8veDlVSURzTWhoVS9vSEZtRUkyMEJCWjI0RHFNRHdMb2g2L1RHL0NER3FNMHE3d1lHQmdBQUFBQS8vK2l4eEl2VXNCRnBJSVZOdFFBSzJ3SDFTNFhkRUJpV0EydFUveEh3YUFHMEVMc0FRa1Q2RU91QndadDhjT0dONURaSUFBcXNORmJxNVRzWTBBdWgwQUF0QkdMTnNNU0RBd01BQUFBQVAvL0l0UVN4bVV4dmhieUJ3S3pvaWpqdUl5TWpNUGx3T2NMSkVUNmhORUNlQlJRQzREU0VuU1NtcGdkb2g4SkZjRFFYdDJCd1ZSUVE5MHkvSHFPREF3TUFBQUFBUC8vR3NWNEFCcWFwbGtBQUNBQVNVUkJWSFIxQmV4WXpRUUNhb205OHVqQjZHbHFvNERhQURvSlRNekpnYVFjQXd1N3NITndMTlVham9DQmdRR2dVUXdGYUxlMFlwdTFKWFFQRjdIbnJ1SXR6RWZCS0NBWEVIa05FU1VYSWp3WVBUcVN5b0NCZ1FFQUFBRC8veHF4R09tcUpFSUh5TU1BTWVjTEV3S2pkMjJOQXBvQ0lwWjlVWFB0N29BdC94dzJnSUdCQVFBQUFQLy9HaEdZd0lKeW9nR2hzQ0tpTUIrOXduNFUwQlFRMFNPajlkcmRENFEyVVkwQ0pNREF3QUFBQUFELy94b1JtSXE3L2dqZGxZWFBudEdOR2FPQUxnQlBPaVRtUmhwcUFFTGp6Z0tqVnhSQkFRTURBd0FBQVAvL29zbWg3clFHME1JUWVXM2hBUUpMU0tnMXEycEE0SkRxQ3pqV2E0S1dwT0c5eTJzVWpBSXFnZ0xvbW5YMEpXdjBPbENIMExBYnlHM3pHVkFQWFFkVkVFTnFXU3BWQUFNREF3QUFBUC8vR2xTRk1OS2liUVlTRjI0VGlpaHFMVXduOThBZ21od0VOQXBHQVRZQVhiSUdtb0RyUjVNbVZEaFNhMHlYVUZwSHR3ZDJuakJHL2tZYUJRUWRzQVVEeVA3QXRuUU5kT2pRME1odkRBd01BQUFBQVAvL29ub2hqTFNvV2dCSG9ZVXVMa0NGUTUwSmpiVlNLMEx3RnNLZ05jOVlobzR2Z2s2aG9wTDlvMkFVRUFWQWFRNjZFZ2M1YnhGcXJGQ3JKVXlMMDlPUUMyaUN1K2l3NUVQUVRsdlF6amV5R21UUUJpS29oMEhkTmY0TURBd0FBQUFBLy8vQ1psa0JwUk5JMEFrd2VoNzhRNDJWQzBRQkl1eEJuNXdibll3YkJRTUNzSnl5Um1oT2cxb0g2aEM2aEpmZUIvZUF5aU95eHAraDQ5Zkk1UmwxVDFWallHQUFBQUFBLy8vQ1ppbXNFRGxBU1FFQ1haRkF0OEFtd2ozVUFvUVNNdktKYWFNdDRGRXdvQUI1eVJraGR4QzUyWU1hZVpGZURUUlErVVAyRUF0MENTdTZXL0d1c3lZWk1EQXdBQUFBQVAvL1FyZFVnQVllQ2FCVG9OUHIyRHhDTytjYW9PbytqTTcram9LQkJrZzc2WWk1M3A0YWdGNHJNUEFCVU40amV5SWN1bklEVjRWRTNiWCtEQXdNQUFBQUFQLy9RcjlaQTFzM0FqVCtjaCs2N0lYa3doaDYraEJJMzBUeW5Va1VvTmRDY1dJbjV4SkdKK05Hd1VBRGFCb3NJRFFlVE1WaHM0RyswZ2gwNHdmb2NDeVNlNkhRNFJ0UUlic2Z6emt3MUQzVmpZR0JBUUFBQVAvL1FpK0U4VVVFYU9uVkJYTEdWMEFKZ1pHUkVaUVFISW00RW9WY1FLZ1FwbFlOUmlnUmdSTDd4c0YwYnVzb0dOa0FtaFlKdFF6cHRUS0NWcjFEMERKUTBNV2NvTWsza2hvLzBONENhSW5yZVNJbi9haFhrVEF3TUFBQUFBRC8veUtsRUdhQXJqdXNoeGJHSkorQkFEMHh6WUJHcmVKQjBSS0d6cjZPbmc4eENnWVZJR0pWQUxYeXowRGNLd2RyL1pMYzhJRU9XNEFhVHFUY0prKzl5WFlHQmdZQUFBQUEvLzhpWmpnQ0d3QTExZWREeDFsSkNsUWF0b3JwMVJJbWVHYnI2RERFS0JpQ2dGNEg4bEN6SlV4SjZ4YzA3Z3VxTUVCcnFVbTl5Smg2WWNYQXdBQUFBQUQvLzRJWHd0RHhYbElkQTJxNm40Zk93Skk2UkVIdFZqRTk3NDRiWFhZMkNvWWJvRmJoU0s4TklhRE5HeVMzZnBHR0hrRGp2dVR1VDZCZUljekF3QUFBQUFELy8wSnVDVk1TT1BtZ0pqMnBReFJvcmVLUEZOalBRRVFpb3VaMUxxT25SWTJDNFFib2RZMFFOZkpPSVNNakkraUtKbEpidjZEeWlkU2hCMnlBMHMxbENNREF3QUFBQUFELy8wSXVoQ2x0M2ZFakRWR1FGTkRRVnJFQ2RHeUhYSUEzWUtnOFJEQmFDSStDWVFPb3ZKU1MwRkk0U3V3Q25URmhTT3JLQjlpZUJlaDVGYVQyOW5HWlNaM1dNQU1EQXdBQUFQLy9RaTZFcVdVb2JFa2JTWXVhb2ExaTBHNlVSQ3EwaW5FQmFwazdlcUQxS0JoT2dHcnBtWWdEZDhodFJZS0dMVW0rb0JRNjhRYlNRKzJXUG5YQ2pJR0JBUUFBQVAvL290WndCRFpRRDkxOVIrckUzUUpvcS93aXFSWVNNVlpMclNHSjBVMFlvMkE0Z2NHY25tR1Rid1drOUdhUldyL2tUTHdSQTZoVFhqSXdNQUFBQUFELy8wSXVoS2s2em9GazVubFMxeFpEYXpzSE9tendJQmVNdG9SSHdYQUMxRXJQZUJ0T1pHejJBcGxuUU1ia0c2MWF2OGlBT3BQekRBd01BQUFBQVAvL0FoZkNkTmpGQWxwYlROSnlOcVJKTzFLR0orZzFPVWVMbW5VVWpJS0JBdFJxQ1pONmhDVStzSkNSa1JGVUFCTjluakFkV3IvSWdEb3RZUVlHQmdBQUFBRC8vNEsxaE9uUkhZRzNpa25SUk9Md0JLRkNubXFUYzZNWEhZNkNZUVFHMDNBRXFNR1Z5TWpJU05KS0sranBaclJ1L1NJRFhOdWFTUU1NREF3QUFBQUEvLytDRmNMMFhQZEs4bGd4MHZERVF0bzZqV2p3a1pvRitpZ1lCUU1NQ3FpMGNZclNYWGtnTjRBbTM0aStDZ3k2N2hjMFhMR2UzajFVcWpURUdCZ1lBQUFBQVAvL29tZExHQm5vUTRjbmlEN3BDRG84QWFvZEMvRW9JeFRKMUJxT0tCZ0oxNjZNZ3BFQm9CTmUxRGdubDVMaENORG1DOUR3QTlGNUZGb0lndFQ3RSs5RXFnTEt5MDBHQmdZQUFBQUEvLytDRmNJRDBiVUcxVnI5MFBOM1NabTBtNEJuY3dlaFFwZ2FyZGVGcE5UVW8yQVVEQVVBTGZ6d05YQm9DU2FTdXZrQ09xd0pPbkNIYXNNQ1pBREtSeEFZR0JnQUFBQUEvLzhhcUpZd012Q0g3cllqMmtOSVc1NUpYc1pHSWJnNGVtSG5LQml1QU5yQW9XVERGRGtiTlVEanYwVG5LZWp3QXlqL2d5YjdoejVnWUdBQUFBQUEvLytDZVd5d0FKSW03V0RqUVVodUozU1dxUUtGQjBXUDdwUWJCY01hUVBNVStoVmR4QUpTcmsvNlFPcVlLdlM4WDZyYy9rRWxRUG1oWUF3TURBQUFBQUQvLzBJL1JXMmdRVDAwb29ocW1TUHRzb090SnlhMGRabVNjZHlFMFhIZ1VURGNBWFJJSUlHR3UxWVprTmIva2pMK0Myb3REL1R3QS9VQkF3TURBQUFBLy8rQ0hlazIyQUE1dFNUb1BpaGEzVFZIMjN1bFJzRW9HR1FBZWkwWnFZQ1lsdkFGVXVhQVlLZWVEY0l5Q2dRb24yTmlZR0FBQUFBQS8vOGFySVV3REpDNlZwQmd3VTJHRzZoK3A5UW9HQVZEQVNEZGwwZ3NJSFRMTXFuNUdUUjhTTzdRQ0YwQXhkSEl3TUFBQUFBQS8vK0NYWEUvbUFGVlZ5S1FPS1pFVXEwOUNrYkJjQU9rdEVLcG5FOUJqVU42M2NwTUNhQ3NmR0JnWUFBQUFBRC8vMklhQW9mUnhGTzVNQ1IyWFBmajZHV2RvMkFVZ0ZjRDBYVVZFclRGRERwMGZTZ2NEMERaOGw0R0JnWUFBQUFBLy84YWJCTnp1SUErZEJrYlBkY3pKNUI2Yk40b0dBWEREVUFiSVE0MG5xaURBMmpQRjNUdTc4Z0FEQXdNQUFBQUFQLy9ZaHBDSjRMeFEzZlowZU1TemNMUjI1Skh3U2lBQUhvVXhFanJmeW05OVlMZWdMSmxxd3dNREFBQUFBRC8veG9Ld3hISUFIWjdCeTFYS3l3azllVCtVVEFLaGp1QTlncXBzYlVaQTBEWDM0TUtZSG9kdmtOTlFGa2h6TURBQUFBQUFQLy9HaXJERWVpZ25vSUpPM3hqdkFkSlBiMXBGSXlDa1FLZ08xVVRjWGlYckFPQWtNNS9vTVY1NW9NZk1EQXdBQUFBQVAvL0dxcUZNQU1GRTNhNHhua3YwcXFtSHdXallMZ0E2TGtwalZpOFEvSkdKdWk2WWxEQlBuTFA1MlpnWUFBQUFBRC8vMklhb2wwQUdJQ2R4a1pLUVl5dEVQNElQVUp2ZENYRUtCZ0ZCQUFqSTJNRHBjZktEckVWRVBnQVpYTnFEQXdNQUFBQUFQLy9Hc290WVJnZ2FlVUVkTUlOdVVzMVdnQ1BnbEZBSW9BTzI4RUs0bytrSEd3RkxZQ0h5d29JeXViVUdCZ1lBQUFBQVAvL0dreUg5MUFLU05ycUROM21UUEwyNkZFd0NrWUJTajdhUUdLK0c2eGJrTWtGbE8yb1pXQmdBQUFBQVAvL1l2eFA1WjB1QXd4QU5YSUFkQUtCSUFETnlvNGV5ak1LUmdGOUFIUXlmYWd0UVNNRVFKUDU1Sjhyek1EQUFBQUFBUC8vR2c3REVjaUFuNVNEbGtjTDRGRXdDdWdEb0pOd3c2MEFwaHd3TURBQUFBQUEvLzhhYm9Yd0tCZ0ZvMkFVREIzQXdNQUFBQUFBLy84YUxZUkh3U2dZQmFOZ29BQURBd01BQUFELy94b3RoRWZCS0JnRm8yQ2dBQU1EQXdBQUFQLy9HaTJFUjhFb0dBV2pZS0FBQXdNREFBQUEvLzhhTFlSSHdTZ1lCYU5nb0FBREF3TUFBQUQvL3hvdGhFZkJLQmdGbzJDZ0FBTURBd0FBQVAvL0dpMkVSOEVvR0FXallLQUFBd01EQUFBQS8vOGFMWVJId1NnWUJhTmdvQUFEQXdNQUFBRC8veG90aEVmQktCZ0Y5QUFYNkgxTjBwQUFEQXdNQUFBQUFQLy9HbzZGOE9pVlJLTmdGTkFKUUMva0pIaUlEZEx0SEtNRk1USmdZR0FBQUFBQS8vOGFib1Z3SXJIWEVvMGU0RE1LUmdGbEFPazRTcUtPazBVcWlEZU9CajBVTURBd0FBQUFBUC8vR2k2bnFKRnpnaHBaZWtmQktCZ0ZHSGtJQkVpNmszRVluYVpHMlNscURBd01BQUFBQVAvL0dnNHRZZGg1d0VRTlEvei8vejhBN1N4VDBLRS9HNmg0cGY0b0dBWERHa0FiTGVqM01KS1VmNkRuRVU4YzhTbUZnWUVCQUFBQS8vOWlJdmR1cUVFQ0xwSlNBRU1CdGxhdlBCazNkSXlDVVREaUFMUUF4bllsRWNtOVNVWkdSdEJCOExqdXJCc3FnTExMSUJnWUdBQUFBQUQvLzJJaTUyNm9RUUxJS1lEeEFkQU5IYVBYM0krQ1VZQURRQnNwQzNCY1NVVFdOVVhRTytzQ2FYbWRQbzBCWmVVUEF3TURBQUFBLy84YXFzTVJDMmwwSlpFOUJiYzRqNEpSTU56QkFWcmNpZ3lkVEFkTjJBM2xYamw1Z0lHQkFRQUFBUC8vR29xRjhFVFFlQklGQlRDaFE5OUJ0emdUZlYvV0tCZ0ZJd0ZBR3ljMHU1WWUycU1GRFdtTXJDVnNEQXdNQUFBQUFQLy9ZaHBpNjJvVG9lTkl0QWI5ME9VM28yQVVqSGdBYlpUUS9GWU1wQ1ZzRk4za1RHZEEyWEF1QXdNREFBQUEvLzlpb3NiQU1oMEFhTHpJRURwK1JDOHdZWFRwMmlnWTZRQzZtcWlmWHNFQUtvaWhLeWNLaDBqUVUxWUlNekF3QUFBQUFQLy9HZ3JERWFEdWlRSVZKK0NJQmZ5akt5Wkd3VWdHMEVZSTBRMGY2RDF5Wk1zakEwWkdSdEFTT01jaFBHRkhIR0JnWUFBQUFBRC8veHJzd3hFa1RjQ0JiayttY3FISkQ1Mk1HQVdqWUVRQkFpc2h5QVVOcEV4OFEyOU5IK3pqeEpTMWhCa1lHQUFBQUFELy94ck13eEdGcEV6QVFXdnRDMFNvVnlEUkhmcWpLeVpHd1FnRXRKcUlBMDE4RTkzRGhONklQbWpIaVNtK3NaMkJnUUVBQUFELy94cU1oVEJzL0JkOVJ3NU9BQjIzd3JhQUhCdVFKOE5OOGFNVGRhTmdwQURvUkp3L0Rid0xLMnZzb1VOOVJEV0lrTWFKUVJzN0J0UHdCT1Z1WVdCZ0FBQUFBUC8vQXVOQnNQOGFCa2dlZ3dVbEdHUURhT3pYMFltNlVUQ3NBZlJVTkhKQkE3NndBY21qbVFzNnQ0WG9jV0tvR1FiLy8vKy9RR0UrcGhhZ2ZLaVNnWUVCQUFBQS8vK0NUY3dOaHRxbGtaR1JrYVFOR05CaEFyck4zSTVPMUkyQzRReWdhWnVldTBaQlBkZjlwUFF5b1JQMFEyMFpHMjdBd01BQUFBQUEvLytDRmNJRE9Ua0hxZ0FjR1JrWjhkYWl5QUNVV0VDMUlaYTFpd2NKNkNOMVBCZ2Q4STl1YlI0Rnd4aHNvUEpFSExGZ1Bva1Rkb05sZUlMeWxqQURBd01BQUFELy80SVZ3Z00xTHJ3UnV2eU1hTTlBaHdRZWtEbHBRR2toekFEZDJreDBoVEVLUnNGUUFOQTBiVStoVXdubEwzejVIRFR2QWhwbUlMcW5DZDAzTUxSMzJURXdNQUFBQUFELy94cW9sdkJINk9xSEFCS0hIMEMxMy9rQnFxMlJRZjNvK1BBb0dDNEFPaTViVHdYdlVOcklBVFdzSHBDNG52Z0JJeU1qS0M4MlVtZzNPWUR5bGpBREF3TUFBQUQvLzRJVnd2UThTUTEyK2huUnF4OFlFT08vOHdrb0kxU1pVSE04ZDNSc2VCUU1GeEF3aVB3Qkd5Y202WGdDNkhDbUlaMFBBYUo4QklHQmdRRUFBQUQvLzZKM0lReWFmRE1nWmZjYmRBTUd0dkZmYklCUW9GQ3o5VG9VdG51UGdsRkFES0JXV3NiYkVpWmwyQkY2Zmd0Smx5MGdIUUpFbDhQaXFiS0xsNEdCQVFBQUFQLy9vdGR3eEVQbzJsK1N4bEtoNjM4djBQTDBKbkxCQUd5akhnV2pnRmFBV21tWm5EWDQrQUJvclRKb25Kam94aE4wMGc3VWlnWnRlYVpscTVnNlpqTXdNQUFBQUFELy93SVh3dEJ4V1ZyTk1vSnFKWkphdnd5UUFoZzBYTEdleFBGZmVnMUhEUHY5N0tOZ1JBRjY5dXBJTGJ4QUJmdDVVaWZEa2JZODA2cFZUSjNSQXdZR0JnQUFBQUQvLzBJK3dJZmFMYnVMMEtWbkJTUk92c0dHSC9MSnNKTmV3eEdqcmVCUk1Kd0ExZEl6RVpOcTVCWmVvTWx3a3RicEk3V0tRV1BGMUY1QlFaMHpaUmdZR0FBQUFBRC8vNkpWSVF3Yit5WEpvZERWRDROeStBRU5qSTRIajRKaEEyaHdRdzJ0QUdnSkhXajFCRWtUaWFCZU9OSUtDbXIxWXFuVEVtWmdZQUFBQUFELy8wSXVoS2xoS0dpemhDSVpZNzhDMEN1ejUxT3kvSXlJUW4rMEpUd0tSZ0YyZ0hlakV3bUFrclhDeEFCUStiQWVlbVUrcVRjOGc4b2xVQmxBRGI5U3B3eGdZR0FBQUFBQS8vK2lWa3Y0SS9UV0N3ZFNUeFdDZGw4dTBPakFFSFJBcmZYRlEvVnkxRkV3Q25BQnVxeVFvQ0lBclpZQ1RkcVJkUFlFZEYweFNBL29jbEd5Sjllb05qSFB3TUFBQUFBQS8vK0NGOEtrRGgwZ2dZblFYVzhrSGZjSWJmMkNKdC8yVTJsV0ZlK1lENVhQZkJndGhFZkJjQVBVS2xRSTVUTnE5aUpCNVFab1RUSG9GaHhTVzhXZ25qZTVReFRVRzE5bVlHQUFBQUFBLy85Q3YxbURGTU1QUXBlZGtUVHh4b0RhK2lWbjhnMFhvT2NhWWJ3SmlRcG5WSXlDVVVCdlFLM0NrVkErbzhYNE02Z2NJYWRWREpxNGd3MVJnSTVRSUJaUXJ5SmhZR0FBQUFBQS8vOUNMNFNKTWZ3aDB0QURxY3ZPcU4zNlJRWjBhNTBTVWVtTW5yWTJDZ1lWSUdLSkY3WHlEejFid3NpQWtsWXhhSWdDTk5rSFdsdE16SGd4OWZ6QXdNQUFBQUFBLy85Q3dlaG44Mkk1KzdPQjNNSUZlazdwQXhxZTdVbnFXYWJrQXJ6RE50QWxkditobGMwb0dBVUREcUJwbjJEQlFhMk1TQzk3OEFDU1YxQ2d1UytCUUZsRnZWNDFBd01EQUFBQS8vOUN0OXdBaDZVTHlPMWl3MXEvZEFoNHZHZVNVckVReGp2MmpYWW9Oa25kbzFFd0NxZ05vSTBDVUFPS21NS1JXb2VsNDIybzBmRlFkdEMyWjdLSEJxRmxCampza0FGVm80aUJnUUVBQUFELy8wSVpqc0F5dkFCYmNwWkF6bDFLME5yb0FaWEhmbkVCUXU2alZvRklpajJqcmVGUk1OQUFmbGtuRVMwNGFnMUpETVM0TURZQTIvWk0wbUZBTUFBZEx3WVY0c2lUZDlSYXlnY0JEQXdNQUFBQUFQLy93bmJsL1VFb2RpUm55UmtEb3ZZOVFNYTJZMG9BdmNhRUNhMGlRYTU1OVVmUEhoNEZBd1dndlVQa000SUpGWTVEY1lVRUlRQXFmMENIQVpFOGNRY0NTSk4zc01LWXVwYzZNREF3QUFBQUFQLy9Zc0VpUnRJWnYrZ0FXdWhRNDJ4U2tnQVJsUVdsQjFiREFLRUVoTjc5QVkyekw2REdyYXlqWUJRUUM2QkRBdWc5TVVLRjhBRXE1VjBEQW9VVk5WdkNvSVVDNkhrTFYwTUpORlJJekkzc0dBQ3FoL29OS2dZR0JnQUFBQUQvLzJLa2hhRU0rUGVRQzZBbEJuUStPWVhsUmVpMlJIenVvY1pZemtkR1JrWkM0MTNZN0RrSVhTQStDa1lCWFFCMFloaDlHQkJ2T29RVzNPK3A0TDZGME91SGNObmpBRjBoaFF2QUNsWlF3UWRyOUlCb1dPRkpWa0U2S0FFREF3TUFBQUQvLzhMV0VxWUtJTEQ1ZzJDVEhwb2dZQVdyQVZKaERhT1Joem53UmdnVko4Z0lyUS9HVlJHQXJrUUtnQzRRSHdXamdLWUFtZzZ4emNQZ2JhaUFDcmIvLy84L3BNTHlVVUtUWVErZ1E1NndRaGJFQitNUjEyTmtZR0FBQUFBQS8vOGEwaGk2bXNPQlVDRUxLZ0NwTk50S2FCa2NQbnNlaks0ZEhnWDBBTkRUeG5BQnZBVWtkRVVCcFdEMGdDdGlBUU1EQXdBQUFQLy9vbGxMbUI2QWhNMGkxQ3I4Q05tSHI2VUJhbDBVMEdwY2FSU01BZ2JzazNIb3dJREFKRGE1NTdoOGhPbzlNTHF0bndUQXdNQUFBQUFBLy84YVVSamFjazZBcmx2RzExb2d0eFZCeU13UG8xdWFSd0d0QUhSTlBxRU5VWGlYVGFLdGM4Y0hMa0R6VWNMb3BiY1VBQVlHQmdBQUFBRC8veHJ4R0Zvd0YwQTNwT0JMd0FTN1dOZ1dkbU1CSkIxME5BcEdBYkdBeUExSmhIWjhDdURTQnpWL2RJS1ptb0NCZ1FFQUFBRC8veHJGYUFDNnhqa0JTNkdNZDFJTmFic3lNV0EwSVk4Q3FnSm80VWxNSTREWW5YT2poUzQ5QUFNREF3QUFBUC8vb3RrU3RlRUNvTU1IRHRDWlc1eXRDT2p1d1BWRWVudDB5ZG9vb0NxQTlyQ0l1WkdjQWJvUmkyclg4d3cwZ09aUjlHRSs5S1d2cEFMWWlnMHdvRmw0TVRBd0FBQUFBUC8vd2pzeEJ4MC9vdVo0endNQ0M2c0gzZm8vNkpJWllvWVFTQ2xVUVV2V0hJWlRSaGdGQXdlZ2hSQ3hCVEFETkU4UDZyU0gxQUpITG1DUjh4aTFObDhSQTBETDltZ3psOFBBd0FBQUFBRC8veUswT3NLQnl2ZTlZUXM0bEIwNlNMMGwyQjd0QjJnTHR6OE0wdXZtU2Eyc0Z0RHhGb0pSTUx3QnNmTU1INkZyOUFkRi9vRk82SUhLR09ROUFQUXNYSWtGdEZ2Zno4REFBQUFBQVAvL3dvc0pIRzA1ME9BRGROeHEwTXpNUXRjSkx5QjJiSTdReVcrallCUVFrZVlJcldiNEFFMlRaQi90U0N0QXBUWEo5QUMwSzJNWUdCZ0FBQUFBLy8vQ2kvRWNiVG1ZQUtGbFl3WURzVWtDYXU4RUFpc3VSdGRUamdLS0FKNWxrWFF2ZUtHVDB3SFFDYjBEZER4ZWxwYUF0c09qREF3TUFBQUFBUC8vSW9ocGZCQTdwWUNZWldNdzhBRjV4cGVlQlRPMFFNYlZRaDV0RFk4Q3NnQ1dWdkFHNk1vZXVxUnRxUDBOVUh1eGxSUFVXcE04a0lDMlMwb1pHQmdBQUFBQS8vOGlpT2wwSUR1NWdOaGJMbkNCQjlEQ3NZQmVYUTRzUXhhanJlRlJRQmFBTmlvZVFOTXZUZWNYb0V2Z2tGdTV4QUJLOCtkZ0FMVHRUVEF3TUFBQUFBRC8veUtJQi9tUUJLR2FsdFF6SXo1QWEzV2FGOHJRUkowQVRkQmtIVG85Q2tZMm9FTWFOU0N4ME1VQVJOaEI3UHpKUUFEYUQwVXdNREFBQUFBQS8vOGlDZy9pSVFsYWp6bDlHQjB1R0FVakZVQjdiSlFDUWtmTWtsM0Ewd0hRZmlpQ2dZRUJBQUFBLy8vQ2RyTUdOakJZcittaDVFQWRZZ0QvNkdFa28yQUVBMnFzSlNibUlQbkJBRUJMWWhkQ2I4OEloRzVvb1gwRGpJR0JBUUFBQVAvL0luckhISFR4Tkd3OTM2QlkwOGZJeUlqWC9kRHhWb3JPUmlYQ0RnUG9icnJSNC90R3daQUEwSEhPQU9pYWU1eERZVlE2NUgwaUFUdEkyV2xLRFFBcWJHRjdEOEFudmczb0djWU1EQXdBQUFBQS8vK2llTnN5MHBaQkJ5aHRRT1VOSHJnQVBXNEoyTWpJeUloM1lQNC9ZdHhySTNSUjk0YlJBbmtVRERhQVZQQUdJRjJJUU14Tk1SY296TS8wdXMwREhTQWZyUWsrT0g1UWJ2SmlZR0FBQUFBQS8vK2lHYWJDc1pHRUFEMld2K0NkTU1NejhVZlhwVUtqWUJUZ1NKOE9SR3dlSWpSbVMvRmFYa0tSUTZVNUo5anlVMUNlSERvN1VSa1lHQUFBQUFELy82SXJwbkxCVEtpRlNvMkY0SVEyZ2hDemZHL0RZTnl0TkFxR0o0QXUreUswU1FnWkVMb3RoaHFyb3dnVjlLVHVuS1A3MGxLYUFRWUdCZ0FBQUFELy94cHdESzJ0Qy9BcytNWUZhSDFOQzhGeEloTGRDOXMrT3Bwb1JnRlZBZEp5eHd0a3BIT0NYWFFxTENNanRJcUowUEVJc0FQa2gxOHJsNEdCQVFBQUFQLy9HblFZejNtK3lJQmFCNnpqQTRTR095aFphRTZYQmZhallIZ0RBanN4U1FHRXhvVXBYYXFHZDZrWGx0WTJLSC9BQ3QzaFBhVEh3TUFBQUFBQS8vOGE5QmhIb1V6TkE5WnhBVUxESGRRNjNHaDB1R0lVRUEwb2JQWGlBb1JhcXBSZWxFdE1heHVVdjBIK0dsa05Fd1lHQmdBQUFBRC8veHB5R0ZyQUVocUtvRFRSRU5QU3B2WUpVQStnNDlpak5mOG93QUJJWTcyMDJHRkc4S2hHV3JlMkJ4cEFLemY2WDdUQXdNQUFBQUFBLy84aUMwTzdENE8yeHFMQ2VSZUV1ays0N3VHaUZoZ2RPeDRGY0VDRlJnVWhRSTlHeDZBbzRHQ0ZMYlFuQzFzZ0FLdGc2TDl4aElHQkFRQUFBUC8vSXZmS2U5RFNyWGpvNmhQMHhjK0Q3bllNTWdDaHlLQjFnb3FIaHEvaVFDOGtId1dEQXRCNnh5by9xS0JuWkdURTF5TGVRTVpWK0IrUjFzN1R2WUNETmhSaG04dGcreGp3YmQ2aS80bHBEQXdNQUFBQUFQLy9JZ3NUTWViNllhRFg3U0dOblpFemNVSHJpUXBpQWQ3bFE2TmcrQU02SHZkSXJkNGZiRktOcmowNXBCWXU3TUFoVXZQOHdEUjJHQmdZQUFBQUFQLy9JaHVUc2M1M3dNN3paU0R0MWd0NmpJOFJIV2IwQ1oxUk1GZ0JIVytmb0dSSWd1NEZMM1JJRkRTa2dHOFZGU2xnWUJvOERBd01BQUFBQVAvL0lodFRhWnpxd2tETWloSW9rR2s5VTB3cUdEM0ZiWVNDQVRodmw5Q0tvQVFrdFhSZDk0NVU2SUlxQW1vM2drRG1EY3pFSVFNREF3QUFBUC8vb2dqVDRJaEx1cDNuQ3dOSUJUSU1ESmFoQ0JnWVdmdmRSd0VjRE1EMVB3VEhST2wxYlJLTkMxMlMvVTB6d01EQUFBQUFBUC8vb3VnQUgyZ3JiVDROSFFnYjJBY042aCtnNVNRVnRQQlZJSFRJQjdUYnhvOVBEUTJBNFlnN2ZHUVVVT1VVUUJJQndRTjlhQTJnQlNKb0VvMmUvaDY0Q1hBR0JnWUFBQUFBLy8raUdOUDV3UGNCSGJjWmdLRUlHQmc2czdhamdDcGdBTlBhZ0c0Y0dvQkQzZ2MyYnpFd01BQUFBQUQvL3lMMlVIZDhnSjRIdmcvMEFkQURsVUJIdDIrT1BEQlFjd0UwVFdkRXpQMFFuQmluTWhqWUNUa0dCZ1lBQUFBQS8vK2lSaUc4QURwc1FITkFhSzBoZE9LQWxtdDRRUW5rSWozOGlnYjRCN0FDR0FWMEJ0QUtsOVExdVpTQWg5QWJKVURkY3FxMkRKR1dpbTZBRHVVUnVrK1JuZzJ0aFFNK0RNSEF3QUFBQUFELy82SUtwdE1FQXNISVFWTDdnWllUQ0ZROE9JVVVNRG9tUEVJQUZjOGxJUVFPMENLUG9CVzg2SUFlcDdZUkN3WisxeThEQXdNQUFBRC8vNklLaGdZNnJRT08wQUhydUJhMTA2eEFodnE3Z0k3ajRxT0htNHdBUU9YRGVkREJCK2lhWHFxbUpRSUZMem9ZREN1UUJzYzhDd01EQXdBQUFQLy9vaHFtUTJ1WTBNSFF4SndYUWNzQzJZRU9DK3NINjRXcm80QktnSVpyZ3gvUTRyWVg2QVFpcWVtZTBGcDg1UFhJdEFLRG8wSER3TUFBQUFBQS8vK2lHcVp4YTVpWUE5WkpiVDNBQ21TcWppSFQrTFNyMFhNa2hqbWd3dUZUNklBbVF3NE1sSzJNR3ZBRHNnWk5LbUpnWUFBQUFBRC8vNklxcG1FTlJpalNLR2s5MEdRMmxvWkRGVVBudUwxUlFES2dZbnFoZWdNREhWQXdiRURNRm1sYURza01ubFl3QXdNREFBQUEvLytpT3FiUitDZ3AyeW1wYWpZMUFKVVA0UjVkTXp4TUFaWHVjMXRBcjBLR1F2Y1NHbDZrMWVUazRNby9EQXdNQUFBQUFQLy9vanFtVVd1WTBFQSt1V094eEF4elVDMUJROGVOS1YyTVBucW96ekFGRkF4RmZJRE95VkFsclNJTnFSRmNRMHRCZXFiSEJhUG9ZUENkRWNIQXdBQUFBQUQvLzZJSnB2S3VGMXFlYWtab3pTTE03QXZRbXBrcUVZaDBGVG01WUhUTjhEQUVaUFFpUDFEek5oWm9Bd285N3hKcUFKSGI2Q0ptcVJxMWU5V0Q3NlEwQmdZR0FBQUFBUC8vb2dtbThobW81QzVOSXdhUW1zQ29lbklVdE1WQlRtRThPaVF4ekFDSkxUK3FGYjdRdVlzR1BBVWVNUTBWY2d0TFF0ZVVVWE9TRXVUR3dkY0tabUJnQUFBQUFQLy9vaG1tNGxvL1drVVVNU2RHNFd2Ulg2RFdNWk5rRk1halF4TERESkN3eEpKYWhhOEJrV21PbUNFN2NwZW5FbHFxUnMwaGljRjVKQ3dEQXdNQUFBRC8vNklaaGhZc2xDN1RvbVdYaGRERUFMRXJMcWcySGtkaVlUdzZKREdNQUlGMFRNM0NGOXVRQTBWcGpZSWxaZlM2UUdHZ3o1ekJEUmdZR0FBQUFBRC8vNklwcHNJR0RrSkRFZVRXbE1Sc2dTWnJtSUFhUXhWRUZzYWpReExEQkJCSXh4TW9MWHlSZHJPUjIyQ2hWWDRCQVhyc25odTh5em9aR0JnQUFBQUEvLytpT2Fad2NKMVd5MWlJcWRrcHFZR3Bza0FlV2hqamFyWFErN1NwVVVBakFOMTFocjZFa2VLbFpramp2ZFJvVFJJYUZpUjNyVDZ0YjdJWjNJMFZCZ1lHQUFBQUFQLy9vdWhRZDJJQXRCYmFUNGJXaDR5TWpJUWlIalJjb1U4RGMwRXQ4SDRTemNWcUYraW9QRXBQcG9LR1lRSHNSbXNDdCtJT1dnQnQ5VXlBRHdRRUJ3QUFGUU5KUkVGVTNucUxEZ1JJak11RFdNUStNREl5RHRsaEdtajRCRkI2Z1FHMHdDeUFIb2RKclFzSVFDZU9FU293UVMxbWV4cVlTKzVGQ3FEVEhVRVhOUXplT1JRR0JnYUE2SUxKWE1lTDk1d0VXdFc4RExSWkd2T0Fta3ZjQmhKQXc5MEI2aCtTL1FUdEZ0TmtTemVwUTBGSXQvUENiZ1duK3dXMDFBUVVyTFloQmhCY1kwdm1TaVZpZHMrUjY2ZkJQeG5Id01BQUFBQUEvLytpQ3lhemUwK0xvUWhpSXB5V2g0ZFFkVjBuclFCYVFUc0JPaVNDcTJJaXAvQXpvSEpGZDRDTXlvRFFmTVVGYU9PaGdRN25WRk1FYUZ6NElnTmFiZDRnTkR4SXpwREUwSmlNWTJCZ0FBQUFBUC8vb2hzbXNkQ2t4WUU5LzJtOEE0Z1VNR2dLWXl5RkxjMDJ2cURaSzBDbHJkd2tEZlZBN2FYa3RMc0gwSENDdFo3cGRzMDdEdi9ROCtKWll2SWxPYTFoWXBhTGtwb3VoOGI1RUF3TURBQUFBQUQvLzZJckpxR0FvOFZRQksyNlUrUUNtcDF1aGNkL3NCdHNGOURvZ0pRRlpMUklLU2xFU0MzNHFkMENSd1lIb0JWWkFqMExabWhlS0tEeGdUZklnQmJEZWRRZWtoZzZPK01ZR0JnQUFBQUEvLytpS3laaDdUREJpVE1TSTVtb2lLSERlY0N3c1dHNjF0SjB2anp4QWhuREU2VEc1d2RTeC90b09CYU56NDMwcm1SaFp6N1E4cElCWWxyRDVBenBFUnFTSUhZNTZ0QzZnWWFCZ1FFQUFBRC8vNkk3SmlMREViTkJnNXl6Z3dtMWdtbDFtRFpWdHpxVEEraFF1V0R6TTBrRkVBbUY1QWN5Q25scW45RkxMQmpJT0llZFQwS0xpb2RnM0pKUkVSQXpKRUdNbVFNNlBFUXlZR0JnQUFBQUFQLy9HaEJNb0dWR2FJTUdPWVVsTWExZ2FvK3RIUmdzczdOMHZMTU1IWkRVTFlTMmR2QVZHaVMxc3FIanYvUytRaDBHQnNXeUtLU05HdFFjcmlCbTh3WTVyV0ZDRFNWQ2xlblFHNFpnWUdBQUFBQUEvLzhhRUV4Z1dJTGFReEgwYkFWL29NWWllMm9ER2gwTFNDellRTW80TWRTdDJBcU1DMVF5aDI3K0hneHhqd3lvZkVFdHdkVWlaTFNHQ2EwWHhwZFBoK1l3QkFNREF3QUFBUC8vR2pDTVk5a0pNVFVzcVJtTEhxMWdtdHpmeFlESU9BMlVMcEdpNDJXazJBQTVMVmprZUNacENScTBLMDdQOFY5azhJR1NGaG5VN1JlUWprK2xlb1ZPcFZ0ZmFORWFKdVlzQ1d6NUh4VG1RM00xQkFNREF3QUFBUC8vR2xDTVpheVMycWNxMGJvVnZJRVc2MGVoL3NRMndVSjJLeHVhOFFacWJQUS9OQzZJRGl1a29RUlNsNkRSNDVKSVhPQUFCZkdqZ0dmcy9nSTA3cWcrM2tuaFJRUEV0SVpKTlp1Yzg0dUg3cVlNQmdZR0FBQUFBUC8vR2xBTXpXZ1BTSWdBVWdzUldyV0NxVDdrZ0tmZ1JRY1VyVEZHYW1rTkZLQlpoaG5BU29iazFScEliaFlnOGFDckJ6UzZzcDZjRFIvRXRJWkpYZlpKYUU0SS9jUzJvWDJHQ2dNREF3QUFBUC8vR25DTTFMcWwxdXdvREZDN0ZVejFEUllVTGlsNlFFbUJSb1VUN2lnQlZMKzZuODZiRnBBQlNXUGVhRzRPb0hCSWdPcERGbVFjK2tQdDFqQXhxNk5nY1QzMEQycG5ZR0FBQUFBQS8vOGFGQmlha1BCR0pobGJGNGxaVkU1TXhxWDJGVExVbnEwK1FHNDNkWUFucjZoeXVoVVZkOTZSQ3NoZUIwemdkRHh5d1FacXprdVFNRzVNaTlZd29TTUxZR1hCMEYrT3hzREFBQUFBQVAvL0dqS1l4SllPVVJkNEVqS0RtbDFuS3R3clJ3aVFmZTRzTkxNTnhFUVdTU3Nlc0xoN29BcGdzbHUvRExRZk5xSDZ1blFpemlJbVp0MHdLV21mWUU5cDJGeHF3TURBQUFBQUFQLy9HaEtZakpQN0tVa1VWQ3Q4cVRRTFRWVi80M0VyTFZwbnhBQ3lDbUlpMWhUVEFsQmxGeHdkSzQ0TFZHNGQ0eXFNcWRIb1FRWWo1K2hKQmdZR0FBQUFBUC8vR2hLWXhCbHZZcnBIMkZaWmZDRDFMQUlDNWcvRUdDWEZpOVVIYUdNSFNXTjdWTG82aTFSQVVlc1h6ZjMwQnRTK29CWmJZVXpNOEI4cDh4QWpvNlhMd01BQUFBQUEvLzhhRXBqRWxnUEJoSWJXNGh2bys3dW9DYWh5Zk44QWpCV1QzUE9nWXlWSHRjcVpnZjZIUkdFRFZOdkppYmJWbkpqV01DbEgybzZNVlE4TURBd0FBQUFBLy84YTlKakV0Y0hFckxCQXpnUVVGNzVFWEJsT1YwRE4rS1RUQ2dxeUN6ZzZGTVFYYUxBVWJLQzJrS09EQjFSTy8wUnRVaUd4Vnp2OE4yQXdNREFBQUFBQS8vOGE5SmlFU1F5Q1M5SVlFSzFxYXR6ZkJWdGVObEE3czNBQnFzNFlReXN0V2xVd0ZLK1FvR0ZCVEpOekNBYmdNQ1ZDNEFNMTFoM0RDbU1pMVJMYnl4citaMEV3TURBQUFBQUEvLzhhOUppRVFvNllXbGlCQ3R0LzZYV0xBYm1BNnBzaG9CbU0ybjZtMmdXTVZIYmJBM0xTQ0d3SWh3aDFnNkxIaEFQUTVkd1RFb1preUw1bmI4Z0FCZ1lHQUFBQUFQLy9HdFNZaEFrWW1rZldFQ2g4WVlEUWdmZ081RTR5UWRkblVxUGxUL1ViY0trVU4rU0dDMnpZQm04aFRNWXFuNEVDQzJoOW5STUo4VFc4SitnWUdCZ0FBQUFBLy84YTlKaklNV0dhSlpnaFZQakNBREdyUS82VHU5d0tHaDZVVE5vUlhRQkR4dytKYnRuVDg1WU9IR0dCZHpKcEVFektrUW9PMENwdkVUbEpOL3gzeERFd01BQUFBQUQvL3hvU21NQmdQazFtVVlkZzRRc0hSUGdOcGVBZ3MvVkh6b1lEb2xkdm9NVTVLUVV4cVJVRXlSZVZNdURlNElKM1NHd1FUY3FSQ21oU0dCTUlENUlQN3grU2dJR0JBUUFBQVAvL0dqSVlSMEZNMUdRY2lRbGp5QmErU0lEUXRrLzB5U0Z5VzhXa0RFOFF2U2tEUjF3VDVUNFNkOUdSWEFFUk9DaWUwTmI3b1o2dWFIRndGYmF3SERrRk1BTURBd0FBQVAvL0dsSVlTeUttNXZyTmdUN3FrWnFBMEgxZHVKYWVrWE5SSnpIREU2UVV3TGpPQ0NFNll4SlpFSk16L0VDbzBpRjBJY0ZBcmlHbkpxQmFZWXhqdUhIa0hFM0p3TUFBQUFBQS8vOGFjaGlwSUtiV3hnUlNUNDBhQ29CUXR4amZZVWprZHM5eFZXQ2tGSjZFdGlLVFloYXVTVjF5N3FnamFuVUlFZVlNTjBDdFRVN0lqWUtSVlFBek1EQUFBQUFBLy84YWtwaGFXekNKT0poa3FBSzhGUlNSazUwa3I5SEUwbEtrWmdGTURUTkp1cUVEeVF4aWhqY0loVG10THBJZGFFQ1ZIWVhVUGpCcnlBQUdCZ1lBQUFBQS8vOGFrWmpDMndTR0FpQm1DeWt4Z09TYkl0QUtMYUl5RlJtSDhaQlNFTU5hL1NTZllVemlSQnJlVlI5RGNHVUVxWUNzOWRWSTRUTXlkOGN4TURBQUFBQUEvLzhhVVpoR213NEdKU0FVcnlSTVhwRnpmYjBBaVJOcDVBd0ZFVDBwUzBaRklrREd6alpDUTBBRGVZZytQUUhaVnp5TlNNREF3QUFBQUFELy8ySWFLUjZIZHBsQUxjVDRRZUFjbWdNaVdvckVIaGZJejhEQXNKNlVsaVFqSStNSFJrWkdZaTV0QkJXaUI2QjJrQXBBZW9nYVhtQmtaQ1I2TXc4MDNFQ2JMdnhKZEEraDNYSWpaYjJyUFFNRHczMXEzMEl6YkFFREF3TUFBQUQvL3hyMmhURHNUalVHQm9aK01qUDdVQVdFV2lPa1Rtem0wK0JBRzVBYjlDblFyMDlzUVV3TWdGYlU1eGtZR09USjBFNm9VaHRwUzY3cVFSWFQ2STQzQW9DQmdRRUFBQUQvL3hxMmhUQnN5UmtEQThOK0NqUDZVQVhVYWdrakEzMXFaU3pvR0NvMTRnVmtCa1hib0dIRFZOQ0ttaXpBeU1oSXFGSWJpZXRlNWFHOXFORWhDbHlBZ1lFQkFBQUEvLzhhbG9Vd3RKQUFkVUh6QjRGekJnb1FTdlFFRDV2QkFXRERFMlNmY0FXdEhLazVMT1JQN25rVTBPR0hBeFM2NXlNUmFrWlNMd3dkMkVNcmI2cXQ2eDgyZ0lHQkFRQUFBUC8vR25hRk1EU2kxNC93Uk05QVJDRk02YUZIOWVRdSthSlI1UmhBeGdSY0FCV0dSQmdJVldpanU3L0FBSlFmKzBlWG9hRUJCZ1lHQUFBQUFQLy9HbmFGTUNNakk2aVZ0WEFRT0dXZ0FkNENpWlRKS2p3QTFzSWh1dkJqWkdRRUZWaUpWQTRiVUV2VWdjUUpPQVVxVnRhRWhuWkdKNmdnSUpHUmtaSHFKK2dOYWNEQXdBQUFBQUQvL3hxV3d4R01qSXdKb3dVeFVaTkxENmxnendOU0MzUm9SblFrc2h0UENGd0VWVGpRd3AwVU56eWdZaG9oWlBkb1MzaTBBTVlPR0JnWUFBQUFBUC8vR3JZVGM5Q0NlT0lnY01xQUFTSzZ3WlMyaGtHRk9GbVRkTkNKTEFjS0s0S0QwQll3V2JmelF0UElSUXJzSnhhTTVKYnd4OUVDR0E5Z1lHQUFBQUFBLy84YTFrdlVHQmtaQzJqUTlSMUtnRkRtcC9ScThRQnlDMEFHeE5DRUFaa0Y0VUpHUmtheUMyQWs0RUNGRnZub3lnanNBRFpNTkZvQTR3SU1EQXdBQUFBQS8vOGE5dXVFb1FrZ2tFcGQzNkVHYUxWQ0FnUUtTUjBDd0FhZ2hTaW9JTnhJZ3JhSjBGWXN4UUJxUDYzWHNvN0VsdkJEYUFGTWNSb1oxb0NCZ1FFQUFBRC8veG9STythZ3U3ZW8wZUlaYW9CV2F6TTNRaWRBOFFKaVYwNUFkOWdGRURsR213anQ0UkFGaURuUEFEbzAwa2lzbVZnQW9ZSm1wSzJSQmZWc0RFWUxZQ0lBQXdNREFBQUEvLzhhTWR1V29RbENnVTVqZ0VNRmtKTkpRQzBjZ3ExUTZIajBBMUxXaGtKYnQvZ0tRNkxIRm1IblA0QTI2eEJaRURkQXg1aEpCa1FNaVpDekEyK29nb1dVak5PUE9NREF3QUFBQUFELy94cHhlQ1FkNGtQRThZcmtuT3hGY0h3VHk2SHFKSTBKWXJsWjR3TXBKM1Joc2Y4RE1jdm95RDFNaUFoelJ3b1l2YUtlVk1EQXdBQUFBQUQvL3hxeGVJU2Nha1h0UXBpb1RJYWpraU5wWXdkU1FVelNJZXg0anNVa3F0VlA0TUI3Y3NLWW1MT2Joem9nNjNxc1VjREF3TURBd0FBQUFBRC8veHJSbUlwWHVBOVdRSzF6aGY4VGU1TUpnVE40aWI3bWlBRlJTVkNqQUlZQm9rNkNJL0dhSzFyME5vWVN1REM2STVBQ3dNREFBQUFBQVAvL0d2R1lDbGU0RDJwQUtINkpkRHV4M1hsaVduMDB1Y1NSd0kzY3lJRFljNDZKVFJNanVSQW02NmJ1VVlBRUdCZ1lBQUFBQVAvL0dqRVRjN2dBZE9lVXcrZ09PN3dnZ2RDdU9HaG1KR2JzRjNZT01OVUtZdWg1QlBPSlZFN3NKWlhFTG9FYnFXdUVRVXNVS1ZvblBnb1lHQmdZR0JnQUFBQUEvLzhhOFlVd0EyS0pWQUowWThld1dzWkdSRXVGMEdxUmpjUWMwTTdBd0RDQmhJTndRQVh4ZVdvYzVnSWRweWEyQUliWlRkQS8wTlUwaFpTNURneUdXMHNSdERyR2tKZ2xpcU9BQ01EQXdBQUFBQUQvL3hvdGhKRUFkUG1Ud3pCYnhrYkp1Y0lmaVZ5T0ZrRG1VWkR6S1NtSW9hc3U2c25RcWsvTStEQzBvQ0ZyMmRvd0JSdEgxLzlTR1RBd01BQUFBQUQvL3hvdGhORUFLSUV4TWpJYWpQUnpKNkNBWUhjVDJyV25aRnZxZkRKdmRsNUE0Um5BK1VRdWUwc2cwRHNhQ2QzeGo2UEREelFDREF3TUFBQUFBUC8vR2kyRWNRRG9yaXhIS3AwME5oVEJSQ0p1aTJDQUZzQ1VIZ2RKOGtXaVZCcHJYVUJvdUFZNkZvNnZraGp1SjZoZGhHNitHQjErb0FWZ1lHQUFBQUFBLy84YUxZVHhBR2doWkVEaXVRYUREUkFhazhSV2lEd2tVUENBQWJRRmEwK2hmeTlDaDRDSUJram5UVkE2YkNSUFRDdWV3bUdKb1R3bTNBanFGWTRPUDlBUU1EQXdBQUFBQVAvL0dpMkVDUUNrY3cyRzZpRkE1SXdKRnhBeERHRkE1bmdzTXJoSTdoWlhLaGJFL2tRdVd5TTBMREdjd0VYbzVOdm9EamhhQXdZR0JnQUFBQUQvL3hvdGhJa0UwQlVDQ2tPOFZVd01JSFkxQktYSEU1SmRBTU1BVWtGTTZaQVJOWVlsaGdzWWJmM1NFekF3TUFBQUFBRC8veG90aEVrQVNLM2k0VHBXVE94cWlBWUs3MldqdUFDR0FhU2pLQ2xwcGZLVE1Dd3hYQStBR20zOURnUmdZR0FBQUFBQS8vOGFMWVRKQUVoanhaUWNmemdZQVQyR0lUNFNleGc4OUVBZGdtT3EwRllicFVlVmtqSXNnUXlvY1ZmZlFBTFl5b2ZSMXU5QUFBWUdCZ0FBQUFELy94ckZGQUxvVnQwRGcyQUxLUzZBdDJXRGRKQVJzV2REVUxMRm0rZ3R5MGdub1JGOTNnUVJaMGNRNHo2Q2RpRWYva1NFMnNGOE5zbm90dU9CQmd3TURBQUFBQUQvL3hyRlZBTFFzd3NlRElLTWhRNklMWVNKT2FLU2twUG55Q21BWVlDZUJUSEI4WENvKzhCeFRZVGF3UWd1a0hJMDZDaWdJV0JnWUFBQUFBRC8veHJGVkFUUXpOa3d5Rm8vaEFyaEFHSTJTMEFQT2lMWFg1UVV3REJBejRLWTRMQUU3TWhMSXRRTkp2Q0JsRVAyUndFZEFBTURBd0FBQVAvL0dzVTBBTkFDYTdBY0hFL29sQzhGSXJ2Z2xBeTVFTFUxR1U4QkRBT2tGTVNrbmd1TURCNFFHeVpFcUJrc29HRjA2R0VRQWdZR0JnQUFBQUQvL3hyRk5BVFFZd3dIZXJ5WXFMRmVmSURDQW8xYUJUQU1rRklRRTN1OEpUWkFsVHYwS0xDZldvRFlVK05Hd1VBQUJnWUdBQUFBQVAvL0dzVjBBQU5jR0ZOVUNKTjc1UThVa0hJaEp5a1Rma1N2VWFhd0lLWjR5ekVGZGxNS3FIcGM2Q2lnRVdCZ1lBQUFBQUQvL3hyRmRBVFFGaVc5Sis4b0xZUkp1V1VDR1pCU1VKSXpkRU9LK2VUNmdScTlDSHFEQTZPVGJrTUlNREF3QUFBQUFQLy9Hc1VEQU9pOGtvTHNnb1NDKzlGb1hRRFQweDZLemp5bXdHK2tndEhDZHlnQ0JnWUdBQUFBQVAvL0dzVURDT2cwVEVGSklVeU8yMGdaczZYRzVDVXBCZkVHTXN3bmF1MHdIanRwRFJhTUZyNURHREF3TUFBQUFBRC8veHJGZ3dCQUMyTnlDZ2hpQUZtRk1KbGpxYVFVd1BndUJDVVZFRFgyVE1Ma0h6b2creGhIS3ZvUkhZeE91QTBId01EQUFBQUFBUC8vR3NXRENDQXRiYVBtT21PU0MySGt6UWdrQUZMV0FsTXlXWVlMa0xJS2c1eWhJTElLUENyNzhjUG9Vck5oQmhnWUdBQUFBQUQvL3hyRmd4QkFDNG9DS28wYmszTnJCVGs3NDRndGdDbFo3a1lJRUZzUWs3T1pnOXdlQlRYQUJXcmN4emNLQmlGZ1lHQUFBQUFBLy84YXhZTWNRQXN0U29ZcVNDcUV5ZHdaUjh2Q2p4UkFTbXVjbkt2b1NSNTdwV0RNL3dPMFZ6UzZ6R3c0QXdZR0JnQUFBQUQvL3hyRlF3UkFDOGNHTWxySHBCYkNwRTZXRVRWZVNvY0NHQVpvT1N4QzhvbHBaQlRDRjZEdUdoMXlHQW1BZ1lFQkFBQUEvLzhheFVNUVFGdHh4STRkRTEwSWs3RWtqWmpEM3ltWkVDTVhFTFh0bUlHOE5jUWtEUXNRV1FnL2dMcGpkS0p0cEFFR0JnWUFBQUFBLy84YXhVTWNRRnROK0lZclNDbUVTV20xa2JJU2dwNEZNRG51STJXNGgrZ0Nua0NZZmhoZFhqWUtHQmdZR0FBQUFBRC8veHJGd3dSQVc1dllDbVNpQ21FU3gwZy9FTnRxRytDRGpHalZVaWUzWW9NVnZDVGRMajBLaGpGZ1lHQUFBQUFBLy84YXhjTVFRQXVWQUdpR0ozYlNqSlJXTUZHdE53clBINllXSUdvekI0bGoxa1J2NElBT00wd1luV0FiQlZnQkF3TURBQUFBLy84YXhhT0ExR1ZqeEc2TW9NVmFZSElCc1JVUktiMkIwYnZZUmdIbGdJR0JBUUFBQVAvL0dzV2pnSUdFRlJlMGFGWFNDeERiZWlkMkp4OUYyNWxId1NnQUF3WUdCZ0FBQUFELy94ckZvd0RXYXAxQWpRUFZLVHo2a3BhQWxLVnIrTWF4UDBDSGJrWjNybzBDeWdFREF3TUFBQUQvLzJJY0RjWlJnQTZnclVZSDZJM1NDbEFNdW8wWDd6cFphS0YwZ01McjhHa0ppTHBxSDgwZkJ4a1lHQzdBOE9pTnhLT0Fxb0NCZ1FFQUFBRC8veG90aEVjQjFRQjB1Q0ora0lmb1FVWkd4dEZsWWFOZ2NBQUdCZ1lBQUFBQS8vOWlHbzJLVVVBTmdMUms3U0MweFRrWUFjaHRES01yRlViQm9BRU1EQXdBQUFBQS8vOGFiUW1QQXBvQ3RBa3haTFlBZExnREd3QVY2UEpZeEEvaWNTdnlBVHNmb01NSElQQ0EwRERLS0JnRkF3WVlHQmdBQUFBQS8vOGF4YU5nRkl5Q1VUQlFnSUdCQVFBQUFQLy9Hc1dqWUJTTWdsRXdVSUNCZ1FFQUFBRC8veHJGbzJBVWpJSlJNRkNBZ1lFQkFBQUEvLzhheGFOZ0ZJeUNVVEJRZ0lHQkFRQUFBUC8vR3NXallCU01nbEV3VUlDQmdRRUFBQUQvL3hyRm8yQVVqSUpSTUZDQWdZRUJBQUFBLy84YXhhTmdGSXlDVVRCUWdJR0JBUUFBQVAvL0F3QjRsMkZucXVPaGNBQUFBQUJKUlU1RXJrSmdnZz09IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjcuMTcgMTc2LjM3KSByb3RhdGUoLTkuMSkgc2NhbGUoLjM5KSIgaGVpZ2h0PSIzNDUiIHdpZHRoPSIzNTMiLz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Passport", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzA2ODdjYjsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cGF0aCBkPSJtODQuNDcsMTI5LjU2YzMwLjgsMTMuMTYsNzEuODMsMjAuNDEsMTE1LjUzLDIwLjQxczg0LjczLTcuMjUsMTE1LjUzLTIwLjQxYzI4LjktMTIuMzUsNDUuNDgtMjguNTksNDUuNDgtNDQuNTVzLTE2LjU4LTMyLjIxLTQ1LjQ4LTQ0LjU1Yy0zMC44LTEzLjE2LTcxLjgzLTIwLjQxLTExNS41My0yMC40MXMtODQuNzMsNy4yNS0xMTUuNTMsMjAuNDFjLTI4LjksMTIuMzUtNDUuNDgsMjguNTktNDUuNDgsNDQuNTVzMTYuNTgsMzIuMjEsNDUuNDgsNDQuNTVaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPHBhdGggZD0ibTM1NC42NywxMTYuOTZjLTguNjksOC43OC0yMS4wMiwxNi42Mi0zNi42MywyMy4yOS0zMS41OSwxMy41LTczLjUxLDIwLjkzLTExOC4wNCwyMC45M3MtODYuNDUtNy40My0xMTguMDQtMjAuOTNjLTE1LjYxLTYuNjctMjcuOTQtMTQuNTEtMzYuNjMtMjMuMjktMi40MS0yLjQzLTQuNTItNC45My02LjM0LTcuNDd2MjA1LjUxYzAsMTUuOTcsMTYuNTgsMzIuMjEsNDUuNDgsNDQuNTUsMzAuOCwxMy4xNiw3MS44MywyMC40MSwxMTUuNTMsMjAuNDFzODQuNzMtNy4yNSwxMTUuNTMtMjAuNDFjMjguOS0xMi4zNSw0NS40OC0yOC41OSw0NS40OC00NC41NVYxMDkuNDljLTEuODIsMi41NS0zLjkzLDUuMDQtNi4zNCw3LjQ3WiIgY2xhc3M9ImNscy0xIi8+JiN4YTs8L3N2Zz4=", - "w": 400, - "h": 400, - "title": "Repository", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAxNy4wN3B4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTEsIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICNkYWNlZTE7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMSwgLmNscy0yLCAuY2xzLTMsIC5jbHMtNCB7JiN4YTsgICAgICAgIHN0cm9rZTogIzllNzlhZjsmI3hhOyAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOyYjeGE7ICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdDogMTA7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiwgLmNscy0zIHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAxNy4wN3B4OyYjeGE7ICAgICAgfSYjeGE7JiN4YTsgICAgICAuY2xzLTMsIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIHN0cm9rZS13aWR0aDogMTAuMjRweDsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy01IHsmI3hhOyAgICAgICAgZmlsbDogI2MwZTBmMTsmI3hhOyAgICAgICAgb3BhY2l0eTogLjU7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNSwgLmNscy02IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNiB7JiN4YTsgICAgICAgIGZpbGw6ICMxYjc1YmE7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8Zz4mI3hhOyAgICA8Zz4mI3hhOyAgICAgIDxjaXJjbGUgcj0iOTguMTQiIGN5PSIxMTkuODQiIGN4PSIxODIuMzkiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICAgICAgPHBhdGggZD0ibTM5LjUyLDM2Mi4wOWMwLTc5LjU5LDY0LjUyLTE0NC4xLDE0NC4xLTE0NC4xczE0NC4xLDY0LjUyLDE0NC4xLDE0NC4xIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgICAgIDxwYXRoIGQ9Im0zNDEuOTUsMzc4LjNjLTIuOTMtNTEuOTgtMTYuNTctODAuNi01Ni42Ni0xMTkuODEtMTkuODctMTkuNDQtMTguNzcsMTIuMTItOTcuODUsMTIuMTItNzQuNjgsMC03Mi4zMi00MC40Mi05OS41Ny0xNi42Ny0zMC4yNywyNi4zOS01Ni4yNyw3My4wNy01Ni4yNywxMjQuMzZoMzEwLjM1WiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgICAgPC9nPiYjeGE7ICAgIDxsaW5lIHkyPSIzNzEuOTgiIHgyPSIxODcuNDMiIHkxPSIyNzAuNjEiIHgxPSIxODcuNDMiIGNsYXNzPSJjbHMtNCIvPiYjeGE7ICA8L2c+JiN4YTsgIDxnPiYjeGE7ICAgIDxwYXRoIGQ9Im0yNTEuMTksMjg5LjYzbC00My45LDU3LjE0aC4wMWMtMy4yLDQuMTgtMi40MiwxMC4xNSwxLjc1LDEzLjM1LDQuMTcsMy4yLDEwLjE0LDIuNDIsMTMuMzQtMS43NWguMDFzNDMuOS01Ny4xMyw0My45LTU3LjEzbC0xNS4xMS0xMS42MVoiIGNsYXNzPSJjbHMtNiIvPiYjeGE7ICAgIDxjaXJjbGUgcj0iNjIuNjMiIGN5PSIyNDEuMjIiIGN4PSIyOTQuMTMiIGNsYXNzPSJjbHMtNSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0zNjIuMTcsMjEzLjc5Yy0xNi4yLTM2LjQ3LTU4Ljg5LTUyLjg5LTk1LjM2LTM2LjY5LTM2LjQ3LDE2LjItNTIuODksNTguODktMzYuNjksOTUuMzYsMTYuMiwzNi40Nyw1OC44OSw1Mi44OSw5NS4zNiwzNi42OSwzNi40Ny0xNi4yLDUyLjg5LTU4Ljg5LDM2LjY5LTk1LjM2Wm0tMTE5LjI2LDUyLjk4Yy0xMy4wNi0yOS40LjE4LTYzLjgyLDI5LjU4LTc2Ljg4LDI5LjQtMTMuMDYsNjMuODIuMTgsNzYuODgsMjkuNTgsMTMuMDYsMjkuNC0uMTgsNjMuODItMjkuNTgsNzYuODgtMjkuNCwxMy4wNi02My44Mi0uMTgtNzYuODgtMjkuNThaIiBjbGFzcz0iY2xzLTYiLz4mI3hhOyAgPC9nPiYjeGE7PC9zdmc+", - "w": 400, - "h": 400, - "title": "Researcher", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzlmNzliMDsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cGF0aCBkPSJtMjcuNTMsMjAwLjA2bDE3LjkyLDcuNzhjLTIuOTQsMTQtMy4wMywyOC4xOC0uNTksNDEuNzlsLTE4LjE2LDcuMjVjLTIuNTMsMS4wMS0zLjc2LDMuODgtMi43NSw2LjQybDEyLjgsMzIuMDZjMS4wMSwyLjUzLDMuODgsMy43Niw2LjQyLDIuNzVsMTguMTctNy4yNmM3LjQ1LDExLjMxLDE3LjAyLDIxLjM0LDI4LjQ4LDI5LjM4bC03Ljc4LDE3LjkyYy0xLjA5LDIuNS4wNiw1LjQxLDIuNTYsNi40OWwzMS42NywxMy43NGMyLjUsMS4wOSw1LjQxLS4wNiw2LjQ5LTIuNTZsNy43OC0xNy45MmMxNCwyLjk0LDI4LjE4LDMuMDMsNDEuNzkuNTlsNy4yNSwxOC4xNmMxLjAxLDIuNTMsMy44OCwzLjc2LDYuNDIsMi43NWwzMi4wNi0xMi44YzIuNTMtMS4wMSwzLjc2LTMuODgsMi43NS02LjQybC03LjI2LTE4LjE3YzExLjMxLTcuNDUsMjEuMzQtMTcuMDIsMjkuMzgtMjguNDhsMTcuOTIsNy43OGMyLjUsMS4wOSw1LjQxLS4wNiw2LjQ5LTIuNTZsMTMuNzQtMzEuNjdjMS4wOS0yLjUtLjA2LTUuNDEtMi41Ni02LjQ5bC0xNy45Mi03Ljc4YzIuOTQtMTQsMy4wMy0yOC4xOC41OS00MS43OWwxOC4xNi03LjI1YzIuNTMtMS4wMSwzLjc2LTMuODgsMi43NS02LjQybC0xMi44LTMyLjA2Yy0xLjAxLTIuNTMtMy44OC0zLjc2LTYuNDItMi43NWwtMTguMTcsNy4yNmMtNy40NS0xMS4zMS0xNy4wMi0yMS4zNC0yOC40OC0yOS4zOGw3Ljc4LTE3LjkyYzEuMDktMi41LS4wNi01LjQxLTIuNTYtNi40OWwtMzEuNjctMTMuNzRjLTIuNS0xLjA5LTUuNDEuMDYtNi40OSwyLjU2bC03Ljc4LDE3LjkyYy0xNC0yLjk0LTI4LjE4LTMuMDMtNDEuNzktLjU5bC03LjI1LTE4LjE2Yy0xLjAxLTIuNTMtMy44OC0zLjc2LTYuNDItMi43NWwtMzIuMDYsMTIuOGMtMi41MywxLjAxLTMuNzYsMy44OC0yLjc1LDYuNDJsNy4yNiwxOC4xN2MtMTEuMzEsNy40NS0yMS4zNCwxNy4wMi0yOS4zOCwyOC40OGwtMTcuOTItNy43OGMtMi41LTEuMDktNS40MS4wNi02LjQ5LDIuNTZsLTEzLjc0LDMxLjY3Yy0xLjA5LDIuNS4wNiw1LjQxLDIuNTYsNi40OVptNDcuMTQtMy43NGMxOC43OC00My4yOCw2OS4wOS02My4xMywxMTIuMzYtNDQuMzUsNDMuMjgsMTguNzgsNjMuMTMsNjkuMDksNDQuMzUsMTEyLjM2LTE4Ljc4LDQzLjI4LTY5LjA5LDYzLjEzLTExMi4zNiw0NC4zNS00My4yOC0xOC43OC02My4xMy02OS4wOS00NC4zNS0xMTIuMzZaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPGc+JiN4YTsgICAgPHJlY3QgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjE5LjU0IDIxMy43NCkgcm90YXRlKC0xODApIiBoZWlnaHQ9IjIyLjYiIHdpZHRoPSIyMi42IiB5PSI5NS41NyIgeD0iMjk4LjQ3IiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgICA8cGF0aCBkPSJtMjQ0Ljk0LDEwMi4zOWw5LjU1LDIuMzVjLS4yOCw3LjIuODYsMTQuMjQsMy4yMiwyMC43OWwtOC40MSw1LjEzYy0xLjE3LjcxLTEuNTQsMi4yNC0uODMsMy40Mmw5LjA1LDE0Ljg0Yy43MSwxLjE3LDIuMjQsMS41NCwzLjQyLjgzbDguNDEtNS4xM2M0LjY1LDQuOTksMTAuMjQsOS4xNiwxNi42MSwxMi4xOWwtMi4zNSw5LjU1Yy0uMzMsMS4zMy40OSwyLjY4LDEuODIsMy4wMWwxNi44Nyw0LjE2YzEuMzMuMzMsMi42OC0uNDksMy4wMS0xLjgybDIuMzUtOS41NWM3LjIuMjgsMTQuMjQtLjg2LDIwLjc5LTMuMjJsNS4xMyw4LjQxYy43MSwxLjE3LDIuMjQsMS41NCwzLjQyLjgzbDE0Ljg0LTkuMDVjMS4xNy0uNzEsMS41NC0yLjI0LjgzLTMuNDJsLTUuMTMtOC40MWM0Ljk5LTQuNjUsOS4xNi0xMC4yNCwxMi4xOS0xNi42MWw5LjU1LDIuMzVjMS4zMy4zMywyLjY4LS40OSwzLjAxLTEuODJsNC4xNi0xNi44N2MuMzMtMS4zMy0uNDktMi42OC0xLjgyLTMuMDFsLTkuNTUtMi4zNWMuMjgtNy4yLS44Ni0xNC4yNC0zLjIyLTIwLjc5bDguNDEtNS4xM2MxLjE3LS43MSwxLjU0LTIuMjQuODMtMy40MmwtOS4wNS0xNC44NGMtLjcxLTEuMTctMi4yNC0xLjU0LTMuNDItLjgzbC04LjQxLDUuMTNjLTQuNjUtNC45OS0xMC4yNC05LjE2LTE2LjYxLTEyLjE5bDIuMzUtOS41NWMuMzMtMS4zMy0uNDktMi42OC0xLjgyLTMuMDFsLTE2Ljg3LTQuMTZjLTEuMzMtLjMzLTIuNjguNDktMy4wMSwxLjgybC0yLjM1LDkuNTVjLTcuMi0uMjgtMTQuMjQuODYtMjAuNzksMy4yMmwtNS4xMy04LjQxYy0uNzEtMS4xNy0yLjI0LTEuNTQtMy40Mi0uODNsLTE0Ljg0LDkuMDVjLTEuMTcuNzEtMS41NCwyLjI0LS44MywzLjQybDUuMTMsOC40MWMtNC45OSw0LjY1LTkuMTYsMTAuMjQtMTIuMTksMTYuNjFsLTkuNTUtMi4zNWMtMS4zMy0uMzMtMi42OC40OS0zLjAxLDEuODJsLTQuMTYsMTYuODdjLS4zMywxLjMzLjQ5LDIuNjgsMS44MiwzLjAxWm0yMy4wOS01LjgyYzUuNjktMjMuMDYsMjguOTktMzcuMTQsNTIuMDUtMzEuNDYsMjMuMDYsNS42OSwzNy4xNCwyOC45OSwzMS40Niw1Mi4wNS01LjY5LDIzLjA2LTI4Ljk5LDM3LjE0LTUyLjA1LDMxLjQ2LTIzLjA2LTUuNjktMzcuMTQtMjguOTktMzEuNDYtNTIuMDVaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgPC9nPiYjeGE7ICA8Y2lyY2xlIHI9IjQzLjczIiBjeT0iMjMwLjMzIiBjeD0iMTUzLjAzIiBjbGFzcz0iY2xzLTEiLz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Services", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzc2Nzg3YTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIsIC5jbHMtMywgLmNscy00IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICM0ZmFlZGM7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMyB7JiN4YTsgICAgICAgIGZpbGw6ICNjY2M7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSguOTUgLS45NCkgcm90YXRlKC4yNykiIHJ5PSIxOC43MiIgcng9IjE4LjcyIiBoZWlnaHQ9IjI0Ny4zMyIgd2lkdGg9IjM2Ni42NiIgeT0iNzYuMzQiIHg9IjE2LjY3IiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgPHBhdGggZD0ibTM2MS4xMywzMjQuNDdsLTMxNS4xMy0xLjYxYy02Ljc2LS4wMy0yOS44Ni0xMi4wMi0yOS44My0xOC43OGwuMDUtMTEuNDgsMzY2LjY2LDEuNzMtLjA4LDguNjVjLS4wMyw2Ljc2LTE0LjkxLDIxLjUzLTIxLjY3LDIxLjVaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPHBhdGggZD0ibTM4My43MSwxMjEuMDZsLTM2Ni42Ni0xLjczaDBjLjExLTI0LjIyLDEuNzEtNDYuMjYsNDQuMDYtNDMuNjVsMjc4Ljk1LDEuMzJjNDMuNjUtMS44Niw0My43NiwxOS44NCw0My42NSw0NC4wNmgwWiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgIDxnPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMzcsMTQ2LjU0Yy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LjAxLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTMtLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk3LjE0LDE5NS44N2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNSwwLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTYzLjEzLS43N2gtLjAzWiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgICAgPHBhdGggZD0ibTE5Ny4wNywyMTEuOThjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsOTUuOTEuNDVoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC05NS45MS0uNDVoLS4wM1oiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuOTEsMjQ0LjVjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUuMDEtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMy43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LS4wMSwyLjIzLTEuODIsNC4wMy00LjA1LDQuMDFsLTE2My4xMy0uNzdoLS4wM1oiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuODQsMjYwLjYyYy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LDAtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMi43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LDAsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTItLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk2Ljc1LDI3Ni40M2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNS4wMS0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTIyLjguNThoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xMjIuOC0uNThoLS4wM1oiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMywxNjEuOTNjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTQ5LjY3LjdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTQ5LjY3LS43aC0uMDNaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPC9nPiYjeGE7ICA8cGF0aCBkPSJtMzkuODQsMzA4Ljk4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw3NC44NC4zNmguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTc0Ljg0LS4zNmgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0xMjguMTIsMzA5LjM5Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGwxNTUuNS43NGguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTE1NS41LS43NGgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0yOTYuMDIsMzEwLjE4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw2MS4zOS4yOWguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTYxLjM5LS4yOWgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im00My43OCwzMjUuNDdjLTE2LjY5LS4yMS0zMC4xNy0xMy45LTMwLjEtMzAuNjNsLjkxLTE5MS40M2MuMDQtOC4xNCwzLjI0LTE1Ljc4LDkuMDItMjEuNTIsNS43OC01LjczLDEzLjQ2LTguODYsMjEuNi04LjgzbDMxMC43NiwxLjQ3Yy4wOSwwLC4xNiwwLC4yNSwwLDguMDUuMSwxNS42LDMuMywyMS4yOCw5LjAzLDUuNzMsNS43OSw4Ljg2LDEzLjQ2LDguODIsMjEuNmwtLjksMTkxLjQzYy0uMDgsMTYuODItMTMuODIsMzAuNDMtMzAuNjQsMzAuMzRoLjAxcy0zMTAuNzctMS40Ny0zMTAuNzctMS40N2MtLjA5LDAtLjE2LDAtLjI1LDBaTTM1Ni4xNiw3OS42MWgtLjJzLTMxMC43Ni0xLjQ3LTMxMC43Ni0xLjQ3Yy02LjgtLjAzLTEzLjE5LDIuNTktMTguMDEsNy4zNi00LjgyLDQuNzctNy40OSwxMS4xNC03LjUyLDE3LjkzbC0uOTEsMTkxLjQzYy0uMDYsMTMuOTQsMTEuMTksMjUuMzUsMjUuMSwyNS41MmguMTlzMzEwLjc4LDEuNDcsMzEwLjc4LDEuNDdjMTQsLjA2LDI1LjQ1LTExLjI3LDI1LjUyLTI1LjI5bC45LTE5MS40M2MuMDMtNi43OC0yLjU4LTEzLjE4LTcuMzYtMTgtNC43My00Ljc3LTExLjAyLTcuNDQtMTcuNzItNy41MloiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICA8Zz4mI3hhOyAgICA8cGF0aCBkPSJtODcuMTYsMTUwLjlsMTIuNjctMTEuMjdjLjQ4LS40MywxLjItLjQxLDEuNjYuMDRsMTIuMTQsMTEuODdjLjI5LjI4LjY5LjQsMS4wOC4zM2wxNi40NC0zLjIzYy42Mi0uMTIsMS4yMy4yNiwxLjQyLjg5bDQuNzYsMTYuNTRjLjExLjM5LjQuNzEuNzguODRsMTUuOCw1LjY4Yy42LjIyLjk0Ljg2Ljc5LDEuNWwtMy45LDE2Ljc4Yy0uMDkuNCwwLC44Mi4yNywxLjEzbDEwLjkzLDEzLjA2Yy40MS41LjQsMS4yMy0uMDQsMS43MWwtMTEuNTEsMTIuNTJjLS4yNy4zLS4zOS43MS0uMzIsMS4xMWwzLjEzLDE2Ljk1Yy4xMi42NC0uMjUsMS4yNy0uODYsMS40NmwtMTYuMDQsNC45MWMtLjM4LjEyLS42OC40Mi0uODIuOGwtNS41MSwxNi4yOWMtLjIxLjYyLS44NC45Ny0xLjQ1LjgybC0xNi4yNy00LjAyYy0uMzktLjEtLjc5LDAtMS4wOS4yN2wtMTIuNjcsMTEuMjdjLS40OC40My0xLjIuNDEtMS42Ni0uMDRsLTEyLjE0LTExLjg3Yy0uMjktLjI4LS42OS0uNC0xLjA4LS4zM2wtMTYuNDQsMy4yM2MtLjYyLjEyLTEuMjMtLjI2LTEuNDItLjg5bC00Ljc2LTE2LjU0Yy0uMTEtLjM5LS40LS43MS0uNzgtLjg0bC0xNS44LTUuNjhjLS42LS4yMi0uOTQtLjg2LS43OS0xLjVsMy45LTE2Ljc4Yy4wOS0uNCwwLS44Mi0uMjctMS4xM2wtMTAuOTMtMTMuMDZjLS40MS0uNS0uNC0xLjIzLjA0LTEuNzFsMTEuNTEtMTIuNTJjLjI3LS4zLjM5LS43MS4zMi0xLjExbC0zLjEzLTE2Ljk1Yy0uMTItLjY0LjI1LTEuMjcuODYtMS40NmwxNi4wNC00LjkxYy4zOC0uMTIuNjgtLjQyLjgyLS44bDUuNTEtMTYuMjljLjIxLS42Mi44NC0uOTcsMS40NS0uODJsMTYuMjcsNC4wMmMuMzkuMS43OSwwLDEuMDktLjI3WiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPHBhdGggZD0ibTk1LjI0LDI0Mi40N2wtMjcuMTItMjMuMDdjLTIuMTQtMS44MS0yLjQtNS4wMS0uNTgtNy4xNSwxLjgxLTIuMTQsNS4wMS0yLjQsNy4xNS0uNThsMTguMzksMTUuNjQsMzEuMDQtNDcuMjNjMS41My0yLjMzLDQuNjktMi45OSw3LjAyLTEuNDUsMi4zNCwxLjU0LDMsNC42OCwxLjQ2LDcuMDJsLTM3LjM1LDU2LjgyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDwvZz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Visa-assertion-blue", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogIzc2Nzg3YTsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIsIC5jbHMtMywgLmNscy00IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICNjY2M7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMyB7JiN4YTsgICAgICAgIGZpbGw6ICM4Y2M2M2U7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSguOTUgLS45NCkgcm90YXRlKC4yNykiIHJ5PSIxOC43MiIgcng9IjE4LjcyIiBoZWlnaHQ9IjI0Ny4zMyIgd2lkdGg9IjM2Ni42NiIgeT0iNzYuMzQiIHg9IjE2LjY3IiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgPHBhdGggZD0ibTM2MS4xMywzMjQuNDdsLTMxNS4xMy0xLjYxYy02Ljc2LS4wMy0yOS44Ni0xMi4wMi0yOS44My0xOC43OGwuMDUtMTEuNDgsMzY2LjY2LDEuNzMtLjA4LDguNjVjLS4wMyw2Ljc2LTE0LjkxLDIxLjUzLTIxLjY3LDIxLjVaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgPHBhdGggZD0ibTM4My43MSwxMjEuMDZsLTM2Ni42Ni0xLjczaDBjLjExLTI0LjIyLDEuNzEtNDYuMjYsNDQuMDYtNDMuNjVsMjc4Ljk1LDEuMzJjNDMuNjUtMS44Niw0My43NiwxOS44NCw0My42NSw0NC4wNmgwWiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgIDxnPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMzcsMTQ2LjU0Yy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LjAxLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTMtLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTEiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk3LjE0LDE5NS44N2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNSwwLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTYzLjEzLS43N2gtLjAzWiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgICAgPHBhdGggZD0ibTE5Ny4wNywyMTEuOThjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsOTUuOTEuNDVoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC05NS45MS0uNDVoLS4wM1oiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuOTEsMjQ0LjVjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUuMDEtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMy43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LS4wMSwyLjIzLTEuODIsNC4wMy00LjA1LDQuMDFsLTE2My4xMy0uNzdoLS4wM1oiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuODQsMjYwLjYyYy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LDAtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMi43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LDAsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTItLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk2Ljc1LDI3Ni40M2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNS4wMS0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTIyLjguNThoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xMjIuOC0uNThoLS4wM1oiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMywxNjEuOTNjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTQ5LjY3LjdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTQ5LjY3LS43aC0uMDNaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgPC9nPiYjeGE7ICA8cGF0aCBkPSJtMzkuODQsMzA4Ljk4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw3NC44NC4zNmguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTc0Ljg0LS4zNmgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0xMjguMTIsMzA5LjM5Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGwxNTUuNS43NGguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTE1NS41LS43NGgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0yOTYuMDIsMzEwLjE4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw2MS4zOS4yOWguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTYxLjM5LS4yOWgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im00My43OCwzMjUuNDdjLTE2LjY5LS4yMS0zMC4xNy0xMy45LTMwLjEtMzAuNjNsLjkxLTE5MS40M2MuMDQtOC4xNCwzLjI0LTE1Ljc4LDkuMDItMjEuNTIsNS43OC01LjczLDEzLjQ2LTguODYsMjEuNi04LjgzbDMxMC43NiwxLjQ3Yy4wOSwwLC4xNiwwLC4yNSwwLDguMDUuMSwxNS42LDMuMywyMS4yOCw5LjAzLDUuNzMsNS43OSw4Ljg2LDEzLjQ2LDguODIsMjEuNmwtLjksMTkxLjQzYy0uMDgsMTYuODItMTMuODIsMzAuNDMtMzAuNjQsMzAuMzRoLjAxcy0zMTAuNzctMS40Ny0zMTAuNzctMS40N2MtLjA5LDAtLjE2LDAtLjI1LDBaTTM1Ni4xNiw3OS42MWgtLjJzLTMxMC43Ni0xLjQ3LTMxMC43Ni0xLjQ3Yy02LjgtLjAzLTEzLjE5LDIuNTktMTguMDEsNy4zNi00LjgyLDQuNzctNy40OSwxMS4xNC03LjUyLDE3LjkzbC0uOTEsMTkxLjQzYy0uMDYsMTMuOTQsMTEuMTksMjUuMzUsMjUuMSwyNS41MmguMTlzMzEwLjc4LDEuNDcsMzEwLjc4LDEuNDdjMTQsLjA2LDI1LjQ1LTExLjI3LDI1LjUyLTI1LjI5bC45LTE5MS40M2MuMDMtNi43OC0yLjU4LTEzLjE4LTcuMzYtMTgtNC43My00Ljc3LTExLjAyLTcuNDQtMTcuNzItNy41MloiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICA8Zz4mI3hhOyAgICA8cGF0aCBkPSJtODcuMTYsMTUwLjlsMTIuNjctMTEuMjdjLjQ4LS40MywxLjItLjQxLDEuNjYuMDRsMTIuMTQsMTEuODdjLjI5LjI4LjY5LjQsMS4wOC4zM2wxNi40NC0zLjIzYy42Mi0uMTIsMS4yMy4yNiwxLjQyLjg5bDQuNzYsMTYuNTRjLjExLjM5LjQuNzEuNzguODRsMTUuOCw1LjY4Yy42LjIyLjk0Ljg2Ljc5LDEuNWwtMy45LDE2Ljc4Yy0uMDkuNCwwLC44Mi4yNywxLjEzbDEwLjkzLDEzLjA2Yy40MS41LjQsMS4yMy0uMDQsMS43MWwtMTEuNTEsMTIuNTJjLS4yNy4zLS4zOS43MS0uMzIsMS4xMWwzLjEzLDE2Ljk1Yy4xMi42NC0uMjUsMS4yNy0uODYsMS40NmwtMTYuMDQsNC45MWMtLjM4LjEyLS42OC40Mi0uODIuOGwtNS41MSwxNi4yOWMtLjIxLjYyLS44NC45Ny0xLjQ1LjgybC0xNi4yNy00LjAyYy0uMzktLjEtLjc5LDAtMS4wOS4yN2wtMTIuNjcsMTEuMjdjLS40OC40My0xLjIuNDEtMS42Ni0uMDRsLTEyLjE0LTExLjg3Yy0uMjktLjI4LS42OS0uNC0xLjA4LS4zM2wtMTYuNDQsMy4yM2MtLjYyLjEyLTEuMjMtLjI2LTEuNDItLjg5bC00Ljc2LTE2LjU0Yy0uMTEtLjM5LS40LS43MS0uNzgtLjg0bC0xNS44LTUuNjhjLS42LS4yMi0uOTQtLjg2LS43OS0xLjVsMy45LTE2Ljc4Yy4wOS0uNCwwLS44Mi0uMjctMS4xM2wtMTAuOTMtMTMuMDZjLS40MS0uNS0uNC0xLjIzLjA0LTEuNzFsMTEuNTEtMTIuNTJjLjI3LS4zLjM5LS43MS4zMi0xLjExbC0zLjEzLTE2Ljk1Yy0uMTItLjY0LjI1LTEuMjcuODYtMS40NmwxNi4wNC00LjkxYy4zOC0uMTIuNjgtLjQyLjgyLS44bDUuNTEtMTYuMjljLjIxLS42Mi44NC0uOTcsMS40NS0uODJsMTYuMjcsNC4wMmMuMzkuMS43OSwwLDEuMDktLjI3WiIgY2xhc3M9ImNscy0zIi8+JiN4YTsgICAgPHBhdGggZD0ibTk1LjI0LDI0Mi40N2wtMjcuMTItMjMuMDdjLTIuMTQtMS44MS0yLjQtNS4wMS0uNTgtNy4xNSwxLjgxLTIuMTQsNS4wMS0yLjQsNy4xNS0uNThsMTguMzksMTUuNjQsMzEuMDQtNDcuMjNjMS41My0yLjMzLDQuNjktMi45OSw3LjAyLTEuNDUsMi4zNCwxLjU0LDMsNC42OCwxLjQ2LDcuMDJsLTM3LjM1LDU2LjgyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDwvZz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Visa-assertion-green", - "aspect": "fixed" - }, - { - "data": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIGlkPSJMYXllcl8xIj4mI3hhOyAgPGRlZnM+JiN4YTsgICAgPHN0eWxlPiYjeGE7ICAgICAgLmNscy0xIHsmI3hhOyAgICAgICAgZmlsbDogI2ZhYTYzMzsmI3hhOyAgICAgIH0mI3hhOyYjeGE7ICAgICAgLmNscy0xLCAuY2xzLTIsIC5jbHMtMywgLmNscy00IHsmI3hhOyAgICAgICAgc3Ryb2tlLXdpZHRoOiAwcHg7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMiB7JiN4YTsgICAgICAgIGZpbGw6ICM3Njc4N2E7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtMyB7JiN4YTsgICAgICAgIGZpbGw6ICNjY2M7JiN4YTsgICAgICB9JiN4YTsmI3hhOyAgICAgIC5jbHMtNCB7JiN4YTsgICAgICAgIGZpbGw6ICNmZmY7JiN4YTsgICAgICB9JiN4YTsgICAgPC9zdHlsZT4mI3hhOyAgPC9kZWZzPiYjeGE7ICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSguOTUgLS45NCkgcm90YXRlKC4yNykiIHJ5PSIxOC43MiIgcng9IjE4LjcyIiBoZWlnaHQ9IjI0Ny4zMyIgd2lkdGg9IjM2Ni42NiIgeT0iNzYuMzQiIHg9IjE2LjY3IiBjbGFzcz0iY2xzLTQiLz4mI3hhOyAgPHBhdGggZD0ibTM2MS4xMywzMjQuNDdsLTMxNS4xMy0xLjYxYy02Ljc2LS4wMy0yOS44Ni0xMi4wMi0yOS44My0xOC43OGwuMDUtMTEuNDgsMzY2LjY2LDEuNzMtLjA4LDguNjVjLS4wMyw2Ljc2LTE0LjkxLDIxLjUzLTIxLjY3LDIxLjVaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPHBhdGggZD0ibTM4My43MSwxMjEuMDZsLTM2Ni42Ni0xLjczaDBjLjExLTI0LjIyLDEuNzEtNDYuMjYsNDQuMDYtNDMuNjVsMjc4Ljk1LDEuMzJjNDMuNjUtMS44Niw0My43NiwxOS44NCw0My42NSw0NC4wNmgwWiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgIDxnPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMzcsMTQ2LjU0Yy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LjAxLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTMtLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTIiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk3LjE0LDE5NS44N2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNSwwLTIuMjMsMS44Mi00LjAzLDQuMDUtNC4wMWwxNjMuMTMuNzdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTYzLjEzLS43N2gtLjAzWiIgY2xhc3M9ImNscy0yIi8+JiN4YTsgICAgPHBhdGggZD0ibTE5Ny4wNywyMTEuOThjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsOTUuOTEuNDVoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC05NS45MS0uNDVoLS4wM1oiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuOTEsMjQ0LjVjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUuMDEtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMy43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LS4wMSwyLjIzLTEuODIsNC4wMy00LjA1LDQuMDFsLTE2My4xMy0uNzdoLS4wM1oiIGNsYXNzPSJjbHMtMiIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTYuODQsMjYwLjYyYy0yLjIxLS4wMy00LTEuODMtMy45OC00LjA1LDAtMi4yMywxLjgyLTQuMDMsNC4wNS00LjAxbDE2My4xMi43N2guMDNjMi4yMS4wMyw0LDEuODMsMy45OCw0LjA1LDAsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xNjMuMTItLjc3aC0uMDNaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgICA8cGF0aCBkPSJtMTk2Ljc1LDI3Ni40M2MtMi4yMS0uMDMtNC0xLjgzLTMuOTgtNC4wNS4wMS0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTIyLjguNThoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNS0uMDEsMi4yMy0xLjgyLDQuMDMtNC4wNSw0LjAxbC0xMjIuOC0uNThoLS4wM1oiIGNsYXNzPSJjbHMtMyIvPiYjeGE7ICAgIDxwYXRoIGQ9Im0xOTcuMywxNjEuOTNjLTIuMjEtLjAzLTQtMS44My0zLjk4LTQuMDUsMC0yLjIzLDEuODItNC4wMyw0LjA1LTQuMDFsMTQ5LjY3LjdoLjAzYzIuMjEuMDMsNCwxLjgzLDMuOTgsNC4wNSwwLDIuMjMtMS44Miw0LjAzLTQuMDUsNC4wMWwtMTQ5LjY3LS43aC0uMDNaIiBjbGFzcz0iY2xzLTMiLz4mI3hhOyAgPC9nPiYjeGE7ICA8cGF0aCBkPSJtMzkuODQsMzA4Ljk4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw3NC44NC4zNmguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTc0Ljg0LS4zNmgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0xMjguMTIsMzA5LjM5Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGwxNTUuNS43NGguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTE1NS41LS43NGgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im0yOTYuMDIsMzEwLjE4Yy0uNzMsMC0xLjMzLS42MS0xLjMyLTEuMzUsMC0uNzUuNi0xLjM0LDEuMzQtMS4zNGw2MS4zOS4yOWguMDFjLjczLDAsMS4zMy42MSwxLjMyLDEuMzUsMCwuNzUtLjYsMS4zNC0xLjM0LDEuMzRsLTYxLjM5LS4yOWgtLjAxWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDxwYXRoIGQ9Im00My43OCwzMjUuNDdjLTE2LjY5LS4yMS0zMC4xNy0xMy45LTMwLjEtMzAuNjNsLjkxLTE5MS40M2MuMDQtOC4xNCwzLjI0LTE1Ljc4LDkuMDItMjEuNTIsNS43OC01LjczLDEzLjQ2LTguODYsMjEuNi04LjgzbDMxMC43NiwxLjQ3Yy4wOSwwLC4xNiwwLC4yNSwwLDguMDUuMSwxNS42LDMuMywyMS4yOCw5LjAzLDUuNzMsNS43OSw4Ljg2LDEzLjQ2LDguODIsMjEuNmwtLjksMTkxLjQzYy0uMDgsMTYuODItMTMuODIsMzAuNDMtMzAuNjQsMzAuMzRoLjAxcy0zMTAuNzctMS40Ny0zMTAuNzctMS40N2MtLjA5LDAtLjE2LDAtLjI1LDBaTTM1Ni4xNiw3OS42MWgtLjJzLTMxMC43Ni0xLjQ3LTMxMC43Ni0xLjQ3Yy02LjgtLjAzLTEzLjE5LDIuNTktMTguMDEsNy4zNi00LjgyLDQuNzctNy40OSwxMS4xNC03LjUyLDE3LjkzbC0uOTEsMTkxLjQzYy0uMDYsMTMuOTQsMTEuMTksMjUuMzUsMjUuMSwyNS41MmguMTlzMzEwLjc4LDEuNDcsMzEwLjc4LDEuNDdjMTQsLjA2LDI1LjQ1LTExLjI3LDI1LjUyLTI1LjI5bC45LTE5MS40M2MuMDMtNi43OC0yLjU4LTEzLjE4LTcuMzYtMTgtNC43My00Ljc3LTExLjAyLTcuNDQtMTcuNzItNy41MloiIGNsYXNzPSJjbHMtMSIvPiYjeGE7ICA8Zz4mI3hhOyAgICA8cGF0aCBkPSJtODcuMTYsMTUwLjlsMTIuNjctMTEuMjdjLjQ4LS40MywxLjItLjQxLDEuNjYuMDRsMTIuMTQsMTEuODdjLjI5LjI4LjY5LjQsMS4wOC4zM2wxNi40NC0zLjIzYy42Mi0uMTIsMS4yMy4yNiwxLjQyLjg5bDQuNzYsMTYuNTRjLjExLjM5LjQuNzEuNzguODRsMTUuOCw1LjY4Yy42LjIyLjk0Ljg2Ljc5LDEuNWwtMy45LDE2Ljc4Yy0uMDkuNCwwLC44Mi4yNywxLjEzbDEwLjkzLDEzLjA2Yy40MS41LjQsMS4yMy0uMDQsMS43MWwtMTEuNTEsMTIuNTJjLS4yNy4zLS4zOS43MS0uMzIsMS4xMWwzLjEzLDE2Ljk1Yy4xMi42NC0uMjUsMS4yNy0uODYsMS40NmwtMTYuMDQsNC45MWMtLjM4LjEyLS42OC40Mi0uODIuOGwtNS41MSwxNi4yOWMtLjIxLjYyLS44NC45Ny0xLjQ1LjgybC0xNi4yNy00LjAyYy0uMzktLjEtLjc5LDAtMS4wOS4yN2wtMTIuNjcsMTEuMjdjLS40OC40My0xLjIuNDEtMS42Ni0uMDRsLTEyLjE0LTExLjg3Yy0uMjktLjI4LS42OS0uNC0xLjA4LS4zM2wtMTYuNDQsMy4yM2MtLjYyLjEyLTEuMjMtLjI2LTEuNDItLjg5bC00Ljc2LTE2LjU0Yy0uMTEtLjM5LS40LS43MS0uNzgtLjg0bC0xNS44LTUuNjhjLS42LS4yMi0uOTQtLjg2LS43OS0xLjVsMy45LTE2Ljc4Yy4wOS0uNCwwLS44Mi0uMjctMS4xM2wtMTAuOTMtMTMuMDZjLS40MS0uNS0uNC0xLjIzLjA0LTEuNzFsMTEuNTEtMTIuNTJjLjI3LS4zLjM5LS43MS4zMi0xLjExbC0zLjEzLTE2Ljk1Yy0uMTItLjY0LjI1LTEuMjcuODYtMS40NmwxNi4wNC00LjkxYy4zOC0uMTIuNjgtLjQyLjgyLS44bDUuNTEtMTYuMjljLjIxLS42Mi44NC0uOTcsMS40NS0uODJsMTYuMjcsNC4wMmMuMzkuMS43OSwwLDEuMDktLjI3WiIgY2xhc3M9ImNscy0xIi8+JiN4YTsgICAgPHBhdGggZD0ibTk1LjI0LDI0Mi40N2wtMjcuMTItMjMuMDdjLTIuMTQtMS44MS0yLjQtNS4wMS0uNTgtNy4xNSwxLjgxLTIuMTQsNS4wMS0yLjQsNy4xNS0uNThsMTguMzksMTUuNjQsMzEuMDQtNDcuMjNjMS41My0yLjMzLDQuNjktMi45OSw3LjAyLTEuNDUsMi4zNCwxLjU0LDMsNC42OCwxLjQ2LDcuMDJsLTM3LjM1LDU2LjgyWiIgY2xhc3M9ImNscy00Ii8+JiN4YTsgIDwvZz4mI3hhOzwvc3ZnPg==", - "w": 400, - "h": 400, - "title": "Visa-assertion-orange", - "aspect": "fixed" - } -] \ No newline at end of file diff --git a/draft-diagrams/AAI/assets/nih-ras.drawio b/draft-diagrams/AAI/assets/nih-ras.drawio deleted file mode 100644 index b519a8e..0000000 --- a/draft-diagrams/AAI/assets/nih-ras.drawio +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/draft-diagrams/AAI/claim_flow_of_data_basic.svg b/draft-diagrams/AAI/claim_flow_of_data_basic.svg deleted file mode 100644 index 73b5c2b..0000000 --- a/draft-diagrams/AAI/claim_flow_of_data_basic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/draft-diagrams/AAI/embedded_Claims_flow.png b/draft-diagrams/AAI/embedded_Claims_flow.png deleted file mode 100644 index 407aaa4..0000000 Binary files a/draft-diagrams/AAI/embedded_Claims_flow.png and /dev/null differ diff --git a/draft-diagrams/AAI/flow.png b/draft-diagrams/AAI/flow.png deleted file mode 100644 index 904f685..0000000 Binary files a/draft-diagrams/AAI/flow.png and /dev/null differ diff --git a/draft-diagrams/AAI/nih-ras.drawio.svg b/draft-diagrams/AAI/nih-ras.drawio.svg deleted file mode 100644 index 7240360..0000000 --- a/draft-diagrams/AAI/nih-ras.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
perform
analysis
perform...
search
 for data
search...
ResearcherData RepositoryGA4GH DRSAAI ClearinghouseNIH RASPassport BrokerVisa IssuerAnalysis ServicesDiscovery Services
authorize
authorize
validate
validate
Data Access CommitteeRAS Identity ProvidersResearcher Identities
login
login
login
login
authenticate
authenticate
authenticate
authenticate
AAI VerifiedPassportand Visas
data and consent
data and consent
data donor
consent
consent
data custodianConsents
data
data
Text is not SVG - cannot display
\ No newline at end of file diff --git a/draft-diagrams/aai-faq.html b/draft-diagrams/aai-faq.html deleted file mode 100644 index 64ac847..0000000 --- a/draft-diagrams/aai-faq.html +++ /dev/null @@ -1,607 +0,0 @@ - - - - - - - - -AAI FAQ | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI FAQ

-
- -
-

A collection of questions (and hopefully useful answers).

- -
- -

Background

- -

Why Brokers?

- -

We have found that there are widely used Identity Providers (IdP). -These authentication mechanisms provide no authorization -information (custom claims or scopes) but are ubiquitous for authentication at the institution level. -The use of a Broker and Clearinghouse -enables attaching information to the usual OIDC flow so that IdPs -can be used with customized claims and scopes.

- -

Here is a diagram of a single broker. This is one possible way to use this spec.

- -

- -

In this diagram, the Broker relies on a separate service for fetching visas, which -stores assertions from multiple sources. The visa assertions are obtained by the -Clearinghouse after a successful login, and used to determine a researcher’s -access in the Clearinghouse system.

- -

The Broker, Clearinghouse, and Visa Issuer may be separate services (as shown -in this diagram), but in other configurations they may be run as parts of a single -service, or as separate services run by single organization. Data holders and data -controllers should explore their options to decide what best fits their needs.

- -

Flows

- -

The following sequence diagrams are included to help explain the intended flows -documented in the accompanying specification.

- -

What is the complete end to end flow using token exchange?

- -

(last updated June 2022)

- -

This flow is the preferred flow for v1.2+ of the specification.

- -

The exchange flow does not ever distribute the initial Passport-Scoped Access Token beyond -the client application. A token exchange operation is executed by the client, in -exchange for a Passport JWT that may be used downstream to access resources. In this example flow, the -Passport is included as authorization in the POST to a DRS server. The token -exchange has also specified known resources that will limit the audience -of the Passport.

- - - - - - Researcher - - AAI - - Data Controller - - Data Holder - - - - - - - - - User Agent - - - - Client - - Broker - - - IdP - - - Visa Issuer(s) - - Clearing House - - Data - - - - - OIDC - - - ref - OIDC flow results in the client holding a *Passport-Scoped Access Token*. - - - - - Exchange - - - Token exchange - - - (note: for clarity these form values have not actually been URL encoded) - Content-Type: application/x-www-form-urlencoded -   - grant_type=urn:ietf:params:oauth:grant-type:token-exchange - &requested_token_type=urn:ga4gh:params:oauth:token-type:passport - &subject_token_type=urn:ietf:params:oauth:token-type:access_token - &subject_token=<Passport-Scoped Access Token> - &resource=https://drs.example.com/dataset1 - &resource=https://drs.example.com/dataset2 - - - Informative Only (not defined in the specification) - - - Fetch signed visa(s) for user - - - Return signed visa(s) for user - - - [ - "<visa1>", - "<visa2>" - ] - - - Token exchange return - - - { - "access_token": "<Passport>", - "issued_token_type": "urn:ga4gh:params:oauth:token-type:passport", - "token_type": "Bearer" - } -   - ▼ Passport content as example (decoded from the base64 of the JWT Passport) ▼ -   - { - "typ": "vnd.ga4gh.passport+jwt", - "alg": "<algorithm-identifier>", - "kid": "<key-identifier>" - } . - { - "iss": "https://<issuer-website>", - "sub": "<subject-identifier>", - "aud": [ - "https://drs.example.com" - ], - "iat": <seconds-since-epoch>, - "exp": <seconds-since-epoch>, - "jti": "<token-identifier>", - "ga4gh_passport_v1": [ - "<visa1>", - "<visa2>", - ... - ] - } . <signature> - - - - - Use - - - Client requests data - - - POST /ga4gh/drs/v1/objects/dataset1/access/s3 HTTP/1.1 - Host: drs.example.com - Content-Type: application/json -   - { - "passports": [ - "<Passport>" - ] - } - - - Decision is made to release data using information contained in the - passport token - and this decision is coordinated with the data system to - facilitate that actual data release. - - - Client is given data - - - - -
- -

What is the complete end to end flow using /userinfo?

- -

(last updated June 2022)

- -

This flow is the flow for v1.0 implementations of the specification.

- -

The flow as used by Elixir uses the initial Passport-Scoped Access Token as -a token handed to downstream resource servers. These servers can use this token, in conjunction -with a callback to the broker’s Userinfo Endpoint, to obtain the Passport content in -JSON format.

- - - - - - Researcher - - AAI - - Data Controller - - Data Holder - - - - - - - - - User Agent - - - - Client - - Broker - - - IdP - - - Visa Issuer(s) - - Clearing House - - Data - - - - - OIDC - - - ref - OIDC flow results in the client holding a *Passport-Scoped Access Token*. - - - - - Use - - - Client requests data - - - { - Authorization: Bearer <Passport-Scoped Access Token> - } - - - Clearing house asks for list of signed visa(s) - - - { - Authorization: Bearer <Passport-Scoped Access Token> - } - - - Informative Only (not defined in the specification) - - - Fetch signed visa(s) for user - - - Return signed visa(s) for user - - - [ - "<visa1>", - "<visa2>" - ] - - - UserInfo endpoint returns list of signed visa(s) - - - { - "iss": "https://<issuer-website>/", - "sub": "<subject-identifier>", - "ga4gh_passport_v1": [ - "<visa1>", - "<visa2>", - ... - ] - } - - - Decision is made to release data using information contained in the - passport - and this decision is coordinated with the data system to - facilitate that actual data release. - - - Client is given data - - - - -
- -

Trust

- -

What’s with all the signed passports and visas etc? Why so complex?

- -

(last updated July 2022)

- -

The practical operation of a loosely coupled -federated ecosystem like GA4GH Passports requires establishing trust -relationships between the participating entities (see -OpenID Connect Federation -for an interesting discussion of the properties of multilateral federations).

- -

Any entity that is asked to make a decision about sharing data needs to have a priori -made the decision “which other entities do I trust?”. In genomics, a single decision -to allow data sharing might involve simultaneous trusting of -multiple entities - human genomics is complex!

- -

When presented with a -Passport and Visas from entities that they trust - they can rely on the information (claims) provided -to make data sharing decisions. If presented with information from entities that are -untrusted - the content of the message is irrelevant as there is no basis on which to believe -the content.

- -

So we can see that trust is a crucial element of a working federation. How do we establish -these trust relationships?

- -

GA4GH Passports and Visas leverage the mechanisms -present in JWT as used -by the OIDC standards -to cryptographically “sign” tokens containing claims. Signed tokens can be -“verified” using public/private keys.

- -

Why are the Visa claims formatted as JWTs inside the Passport?

- -

(last updated August 2022)

- -

If visas were not signed separately from a Passport, then Clearinghouses would require a high degree of confidence that -the signing Passport Issuer or Broker was accurately representing the contents of Visas from the original Visa Issuer; -there would be no mechanisms to prevent a malicious or defective Passport Issuer from misrepresenting Visa contents. -By signing Visas separately from Passports, we prevent intermediate parties from tampering with Visa contents, -allowing Clearinghouses to safely rely on Visa contents based on their trust relationship with the Visa Issuer.

- -

What are the ways that key management is done in practice?

- -

(last updated July 2022)

- -

There are a variety of approaches that can be used for key -management for Passports and Visas. We will first detail those that can be used for Passports -and then discuss some extra wrinkles for Visas.

- -

For this discussion we assume there is a concrete JWT from issuer https://issuer.example.org -(possibly a Broker or a Visa Issuer).

- -

My clearinghouse service ‘trusts’ the above issuer to help make data -access decisions - and that trust is stated probably through some sort of explicit -configuration. For our example, let’s imagine it has a hypothetical YAML configuration file

- -
trusted_brokers:
-  - https://issuer.example.org
-  - https://login.broker.com
-
-trusted_visa_issuers:
-  - https://dac.gov.world
-
- -

The service now wants to verify a Passport or Visa -JWT purporting to be from that issuer.

- -
- -

Use jku in the header of the JWT

- -

The JKU is the URL of a JSON file containing the issuers’ public keys.

- -
{
-  "iss": "https://issuer.example.org",
-  "jku": "https://issuer.example.org/public-keys.json",
-  "kid": "key-october-1"
-}
-
- -

For our concrete example we say that it is a JSON file residing -at https://issuer.example.org/public-keys.json (see -RFC 7517 “JSON Web Key”).

- -

IMPORTANTLY, for the secure use of this key management technique - the JKU -MUST also be allow-listed as part of the configuration of OUR service. -For example:

- -
trusted_brokers:
-  - issuer: https://issuer.example.org
-    jku: https://issuer.example.org/public-keys.json
-
-  - issuer: https://login.broker.com
-    jku: https://keys.broker.com/set
-
- -

It is NEVER valid to even attempt to access a JKU from a JWT header - unless the URL -is already known to belong to the given issuer. See -“JWT Forgery via unvalidated jku parameter”.

- -

To verify a JWT, the content of the JKU file is loaded and the kid is -looked up in key set. The signature is validated using the public key found.

- -

Although this configuration requires explicit registration of JKUs, the content -of the key sets can allow the best practice of key rotation.

- -

The content of the JKU file is designed to be cached aggressively, but as long as -the file is fetched every few days/weeks, the set of keys -can evolve/rotate.

- -
- -

Use the kid in the header of the JWT along with OIDC Discovery

- -

The OpenID Connect Discovery -protocol allows the use of the JWT issuer URL - in conjunction with a fetch -of a /.well-known/openid-configuration - to look up the location of the public key set file. See -OpenID Provider Metadata specification -and the jwks_uri entry.

- -

As with JKU - it is important that OIDC discovery is limited only to JWT issuer URLs that are -in some way allow-listed. It is NEVER valid to perform discovery on an arbitrary issuer -encountered in a JWT. Luckily, the concept of allow-listing issuers is already in some way -inherent to the way trust relationships are established, and hence this allow list should -already be present in the system.

- -

Also as with JKU, the content of the discovery protocol and key sets can be cached -aggressively. This means that the double step of the discovery protocol is not -required on every JWT verification.

- -
- -

Exchange public keys beforehand with each trusted entity

- -

This is an approach used by the NIH - and is appropriate if the number -of trusted entities is small - such that the public keys of each trusted entity can be exchanged -out of band (and their rotation/updating can also be managed out of band).

- -

Configuration may be

- -
trusted_brokers:
-  - issuer: https://issuer.example.org
-    keys:
-      key-october-1: "ABCDTRTFDSFSDFSF...."
-
-  - issuer: https://login.broker.com
-    keys:
-      kid123456: "ABCDTRTFDSFSDFSF...."
-
- -

For any kid -encountered in a JWT, the corresponding public key is already available for signature validation.

- -

An even safer version of this approach is to perform -the key verification across every public key you hold before even decoding the JWT JSON -and then confirm the kid. This avoids ever even needing to JSON decode -data from untrusted entities.

- -
- -

Requirement for JKU in Visas

- -

When it comes to Visas, there is an extra wrinkle - unlike Brokers, Visa Issuers do not -need to have been part of an OIDC flow. It is possible that the visa issuer URI is not -even a locatable reference -(e.g. urn:example.com:dac-world-visa-issuer).

- -

Therefore the OIDC Discovery technique is not appropriate and hence the requirements -of the AAI standard regarding the presence of JKUs.

- -
- -

Client Software

- -

Use of GA4GH passport/visas in Single Page Apps (SPAs)

- -

It is currently recommended that single page apps (SPA) such as a React/VueJS websites -are NOT used for scenarios where the single page app code is solely responsible for the handling of -genomic passports and tokens.

- -

A SPA contains all the source of the application in public - and hence cannot -possess a ‘client secret’ in an OIDC flow (the ‘client secret’ is used to prove the identity of the -client software and is an important risk mitigation that prevents unconstrained -use of an accidentally leaked/stolen token).

- -

Techniques such as PKCE can be used to allow a SPA to participate in an OIDC flow - and this is not -forbidden by the specification - but there -are still unresolved questions about how SPAs can prove client identity in things like the token -exchange that retrieves passports or other tokens.

- -

Therefore if writing SPA websites for genomic data handling, it is recommended to use -a backend set of services to execute OIDC flows and token exchanges (even if the rest of the SPA -can operate purely on the front end). These -backend service can hold secrets and hence can prove client identity - and the backend -service can then securely participate in token exchange and retain tokens/passports.

- -

There is an emerging standard DPoP that may remove some of these limitations - -(OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer)

-
    -
  • and it will be considered for future versions of the AAI specification.
  • -
- -
- - -
- -
- -
-
- - - diff --git a/draft-diagrams/aai-implementations.html b/draft-diagrams/aai-implementations.html deleted file mode 100644 index aa8ce20..0000000 --- a/draft-diagrams/aai-implementations.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - -AAI Implementations | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI Implementations

-
- -
-

ELIXIR / Life Sciences AAI

- -

this

- -

NIH RAS

- -

this

- -

GA4GH driver projects implementing AAI and Passports

- -

As of November 2023, the following driver projects implement AAI / Passports:

- -
    -
  • Biomedical Research Hub
  • -
  • EJP RD (using LifeScience AAI)
  • -
  • ELIXIR (using LifeScience AAI)
  • -
  • GDI (using LifeScience AAI)
  • -
  • Human Cell Atlas
  • -
- -

These driver projects are planning or developing an implementation of AAI / Passports:

- -
    -
  • All of Us
  • -
  • Australian Genomics
  • -
  • Autism Sharing Initiative
  • -
  • Genomics England
  • -
  • H3Africa
  • -
  • ICGC ARGO
  • -
  • IPCHiP
  • -
  • Monarch Initiative
  • -
  • NCI CRDC
  • -
  • NCPI
  • -
  • NHLBI BioData Catalyst
  • -
- -

Source

- -
- -
- -
-
- - - diff --git a/draft-diagrams/aai-openid-connect-profile.html b/draft-diagrams/aai-openid-connect-profile.html deleted file mode 100644 index e7b1c3c..0000000 --- a/draft-diagrams/aai-openid-connect-profile.html +++ /dev/null @@ -1,1335 +0,0 @@ - - - - - - - - -AAI OIDC Profile | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI OIDC Profile

-
- -
-

Abstract

- -

This specification defines a profile for using the OpenID Connect protocol -[OIDC-Core] to provide federated multilateral authorization infrastructure for greater -interoperability between biomedical institutions sharing restricted datasets. (OpenID Connect is a simple -identity layer, on top of the OAuth 2.0 protocol, that supports identity verification and the ability to -obtain basic profile information about end users.) In particular, this specification defines tokens, -endpoints, and flows that enable an OIDC provider (called a Broker) to -provide Passports and Visas to downstream consumers called -Passport Clearinghouses. Passports can then be used for -authorization purposes by downstream systems.

- -

Table of Contents

- - - -
- -

Introduction

- -

This specification -leverages OpenID Connect (OIDC) to authenticate researchers -desiring to access clinical and genomic resources from data -holders -adhering to GA4GH standards. Beyond standard OIDC authentication, AAI enables -data holders to obtain security-related attributes and authorizations of those -researchers. The Data Use and Researcher Identity (DURI) Work Stream has developed a standard -representation for researcher authorizations and attributes [Researcher-ID].

- -

Technical Summary

- -

At its core, the AAI specification defines cryptographically secure tokens for exchanging -researcher attributes called Visas, and how various -participants can interact to authenticate researchers, and obtain and validate Visas.

- -

The main components identified in the specification are:

-
    -
  • -Visa Issuers, that cryptographically sign researcher attributes in the -form of Visas.
  • -
  • -Brokers, that authenticate researchers and provide Visas.
  • -
  • -Clients, that perform actions that may require data access on behalf of researchers, -relying on tokens issued by Brokers and Visa Issuers.
  • -
  • -Passport Clearinghouses, that accept tokens containing or -otherwise availing researcher visas for the purposes of enforcing access control.
  • -
- -

Visa Tokens

- -

Visas are used -for securely transmitting authorizations or attributes of a researcher. -Visas are tokens [JWT] signed by Visa Issuers and -validated by Passport Clearinghouses.

- -

Separation of Data Holders and Data Access Committees

- -

It is a fairly common situation that, for a single dataset, the Data Access Committee (DAC) (the authority managing -who has access to a dataset) is not the same party as the -Data Holder (the organization -that hosts the data, while respecting the DAC’s access policies).

- -

For these situations, AAI is a standard mechanism for data holders to obtain -and validate existing authorizations from DACs, by specifying the interactions -between Visa Issuers, Brokers, and -Passport Clearinghouses.

- -

The AAI standard enables Data Holders and Visa Issuers to recognize -and accept identities from multiple Brokers — allowing for a more federated -approach. An organization can still use this specification with a single -Broker and Visa Issuer, -though they may find in that case that there are few benefits beyond standard OIDC.

- -
- -

Notation and Conventions

- -

Terms defined in Terminology appear as capitalized -links, e.g. Passport.

- -

References to Relevant Specifications appear -as bracket-enclosed links, e.g. [OIDC-Core].

- -

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this specification are to -be interpreted as described in [RFC2119].

- -
- -

Terminology

- -

This specification inherits terminology from the OpenID -Connect [OIDC-Core] -and OAuth 2.0 Authorization Framework [RFC6749] specifications.

- -

Broker – An OIDC Provider service that -authenticates a user (potentially by relying on an Identity Provider), -collects user’s Visas from internal and/or external Visa Issuers, -and provides them to Passport Clearinghouses.

- -

Claim – as defined -by the JWT specification [RFC7519] – A piece of information asserted about a subject, -represented as a name/value pair consisting of -a claim name (a string) and a claim value (any JSON value).

- -

Client – as discussed in the OAuth 2.0 Authorization Framework [RFC6749] specification

- -

Data Holder – An organization that -holds a specific set of data (or its copy) and respects -and enforces the Data Access Committee’s (DAC’s) decisions on who can access it.

- -

-GA4GH Claim – A Claim as defined by a GA4GH -documented technical standard that is making use of this AAI specification. Typically -this is the ga4gh_passport_v1 or ga4gh_visa_v1 Claim for Passports v1.x. -A GA4GH Claim is asserted by the entity that signed the token in which it is contained (not by GA4GH).

- -

Identity Provider (IdP) – A -service that provides to users an identity, authenticates it, and provides -assertions to a Broker using standard protocols, such as OpenID Connect, SAML or -other federation protocols. Examples: eduGAIN, Facebook, NIH -eRA Commons. IdPs MAY be Visa Assertion Sources.

- -

JWT – JSON Web Token as defined in [RFC7519]. -A JWT contains a set of Claims.

- -

Passport Clearinghouse – -A service that consumes Visas and uses them to make an -authorization decision based on inspecting them and -allows access to a specific set of underlying resources in the target -environment or platform. This abstraction allows for a variety of models for -how systems consume these Visas in order to provide access to resources. -Access can be granted by either issuing new access tokens for downstream -services (i.e. the Passport Clearinghouse may act like an authorization server) -or by providing access to the underlying resources directly (i.e. the Passport -Clearinghouse may act like a resource server). Some Passport Clearinghouses may -issue Passports that contain a new set or subset of Visas for downstream consumption.

- -

Passport-Scoped Access Token – -An OIDC access token with scope -including the identifier ga4gh_passport_v1.

- -

The access token MUST be a JWS-encoded JWT token containing openid and ga4gh_passport_v1 -entries in the value of its scope Claim. -It is RECOMMENDED that Passport-Scoped Access Tokens follow the JWT Profile for OAuth 2.0 Access Tokens specification [RFC9068].

- -

Passport – A signed and verifiable JWT that contains Visas.

- -

Passport Issuer – -A service that creates and signs Passports.

- -

Token Endpoint – a Broker’s implementation of the [OIDC-Core] Token Endpoint.

- -

Token Exchange – -The protocol defined in [RFC 8693] as an extension of OAuth 2.0 -for exchanging access tokens for other tokens. A token exchange is performed by calling the Token Endpoint.

- -

UserInfo Endpoint – a Broker’s implementation of the [OIDC-Core] UserInfo Endpoint.

- -

-Visa – A -Visa encodes a Visa Assertion in compact and digitally signed -format that can be passed as a URL-safe string value.

- -

A Visa MUST be signed by a Visa Issuer. A Visa MAY be passed -through various Brokers as needed while retaining the -signature of the original Visa Issuer.

- -

-Visa Assertion – a piece of information about a user that is asserted by a Visa Assertion Source. It is then encoded by a Visa Issuer into a Visa.

- -

Visa Assertion Source – the source organization of -a Visa Assertion, which SHOULD include the organization associated with making the assertion, although it MAY optionally identify a sub-organization or a -specific assignment within the organization that made the assertion.

- -
    -
  • This is NOT necessarily the organization that signs the Visa; it is the -organization that has the authority to make the assertion on behalf of the -user and is responsible for making and maintaining the assertion.
  • -
- -

-Visa Issuer – A service that signs Visas. This service:

- - -
- -

Relevant Specifications

- -

-[IANA-JWT] – Standard JWT Claim name assignments, -Internet Assigned Numbers Authority

- -

-[OIDC-Core] – OpenID Connect Core 1.0 (OIDC) – - Authorization Code Flow - will generate id_tokens and access_tokens from the Broker.

- -

-[OIDC-Client] – OpenID Connect Basic Client Implementer’s Guide 1.0

- -

-[OIDC-Discovery] – OpenID Connect Discovery 1.0

- -

-[Passport] – GA4GH Passport Specification, Data Use and Researcher Identity (DURI) Work Stream – Defines Passport and Visa formats.

- -

-[Researcher-ID] – GA4GH Passport Specification, Data Use and Researcher Identity (DURI) Work Stream – Defines researcher identities for GA4GH Passports and Visas.

- -

-[RFC2119] - Key words for use in RFCs to Indicate Requirement Levels

- -

-[RFC5246] - Transport Layer Security (TLS). - Information passed among clients, applications, resource servers, - Brokers, and Passport Clearinghouses - MUST be protected using TLS.

- -

-[RFC6749] – The OAuth 2.0 Authorization Framework

- -

-[RFC6819] - - Lodderstedt, T, McGloin, M., and P. Hunt, - “OAuth 2.0 Threat Model and Security Considerations”, - RFC 6819, January 2013.

- -

-[RFC7515] – JSON Web Signature (JWS) is the - specific JWT to use for this spec.

- -

-[RFC7519] – JSON Web Token (JWT) – Specific implementations MAY extend - this structure with their own service-specific JWT Claim names as top-level - members of this JSON object. The JWTs specified here follow the JWS - specification [RFC7515].

- -

-[RFC7636] – Proof Key for Code Exchange by OAuth Public Clients (PKCE)

- -

-[RFC7662] – J. Richer, Ed., “OAuth 2.0 Token Introspection”, October 2015

- -

-[RFC8693] - Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J., - and C. Mortimore, “OAuth 2.0 Token Exchange”, RFC 8693, - DOI 10.17487/RFC8693, January 2020.

- -

-[RFC8725] - Sheffer, Y., Hardt, D., and M. Jones, “JSON Web Token Best - Current Practices”, BCP 225, RFC 8725, - DOI 10.17487/RFC8725, February 2020.

- -

-[RFC9068] – JWT Profile for OAuth 2.0 Access Tokens

- -
- -

Overview of Interactions

- -

Full Login and Token Exchange Interaction

- -

In the full token exchange flow recommended in this document, the client does not ever distribute the initial -Passport-Scoped Access Token to other services. A token exchange operation is executed by the client, in -exchange for a Passport JWT that may be used downstream to access resources. In this example flow, the -Passport is included as authorization in the POST to a Clearinghouse that holds data.

- - - - - - Researcher - - AAI - - Data Access Committee - - Data Holder - - - - - - User Agent - - - - Client - - Broker and Passport Issuer - - Visa Issuer - - Passport Clearinghouse - - - - - OIDC - - - Initiates login - - - Send redirect to Broker - - - Follow redirects - - - ref - Broker authenticates user (potentially with external IdP) - - - Send redirect to client with authorization code - - - Follow redirect with code - - - Request Passport-Scoped Access Token with code and client credentials - - - Respond with Passport-Scoped Access Token - - - - - Exchange - - - Request to exchange Passport-Scoped Access Token for Passport - - - - Exchange of visas, if needed (protocol unspecified) - - - Response with Passport - - - - - Use - - - User initiates action requiring data - - - Client requests data with Passport - - - Request public keys - - - Respond with public keys - - - Clearinghouse responds with data - - - - -

Notable differences between this diagram and interaction specified in AAI/Passport v1.0:

-
    -
  • The Passport Clearinghouse is no longer required to be a Client of the Broker
  • -
  • The Passport-Scoped Access Token is only ever shared between the Client and the Broker
  • -
  • An additional Token Exchange request is used to exchange the Passport-Scoped Access Token for a Passport Token, -which can be sent to a Passport Clearinghouse. The Passport Token carries only the authorization in a user’s -Visas, whereas the Passport-Scoped Access Token contains authorizations above and beyond the Visas.
  • -
- -

Flow of Assertions

- -

- -

The above diagram shows how Visa Assertions flow from a Visa Assertion Source -to a Passport Clearinghouse that uses them.

- -

Implementations may introduce clients, services, and protocols -to provide the mechanisms to move the data between the -Visa Assertion Sources and the Broker. These mechanisms are unspecified by the scope of this specification except that -they MUST adhere to security and privacy best practices, such as those outlined -in this specification, in their handling of protocols, claims, tokens and -related data. The flow between these components -MAY be indirect or conversely services shown as being separate MAY be -combined into one service. For example, some implementations MAY deploy one -service that handles the responsibilities of both the Visa Issuer and -the Broker.

- -

Here are two non-normative examples illustrating two of many possible mechanisms:

- -

- -

- -
- -

Profile Requirements

- -

Conformance for Clients/Applications

- -

Clients are applications which want to access data on behalf of users, and are responsible for using the standard described here to do so securely.

- -
    -
  1. OAuth defines two client types in section 2.1 of [RFC6749]. -
      -
    1. -

      Confidential clients (which are able to keep the client secret secure, typically server-side web-applications) - MUST implement OAuth2 Authorization Code - Flow (see OIDC Basic Client Implementer’s Guide 1.0 [OIDC-Client]).

      -
    2. -
    3. -

      Public clients (single pages apps or mobile apps) SHOULD implement Authorization Code Flow - with [PKCE].

      -
    4. -
    -
  2. -
  3. -

    Protection of Confidential Information

    - -
      -
    1. -

      Sensitive information (e.g., including client secrets, -authorization codes, id_tokens, access_tokens) MUST be passed over -encrypted channels as per [OIDC-Client].

      -
    2. -
    3. -

      All responses that contain tokens, secrets, or other sensitive -information MUST include the following HTTP response header fields and -values as per [OIDC-Client].

      - -
        -
      1. -

        Cache-Control: no-cache, no-store

        -
      2. -
      3. -

        Pragma: no-cache

        -
      4. -
      -
    4. -
    -
  4. -
  5. Clients MUST provide protection against client attacks as outlined in -[RFC6819].
  6. -
- -
- -

Conformance for Brokers

-

Brokers operate downstream from IdPs or provide their own IdP service. They issue id_tokens -and access_tokens (and potentially refresh tokens) for consumption within the GA4GH compliant environment.

- -
    -
  1. -

    Broker MUST be an OpenID Provider

    - -
      -
    1. -

      Broker MUST conform to the OIDC Core specification [OIDC-Core].

      -
    2. -
    3. -

      Broker MUST support the OIDC Discovery specification [OIDC-Discovery] -and provide proper metadata -(i.e. must have a jwks_uri as required that’s reachable by a Passport Clearinghouse)

      -
    4. -
    5. -

      A Broker MUST issue Passport-Scoped Access Tokens -(access_tokens).

      - -
        -
      1. This document makes no specifications beyond those in [OIDC-Core].
      2. -
      -
    6. -
    7. -

      Access tokens MUST be in JWS format

      - -
        -
      1. -

        Access tokens for GA4GH use MUST be a GA4GH JWT using -Passport-Scoped Access Token format.

        -
      2. -
      3. -

        Access tokens MUST NOT contain GA4GH Claims directly in the access token.

        -
      4. -
      5. -

        Access tokens MAY contain additional non-GA4GH Claims directly in the access token.

        -
      6. -
      -
    8. -
    -
  2. -
  3. -

    Broker MUST support a Token Endpoint and UserInfo Endpoint.

    - -
      -
    1. -

      Token Exchange at the Token Endpoint SHOULD be used for Visas in -preference to the UserInfo Endpoint.

      -
    2. -
    3. -

      When presented with a valid Passport-scoped Access Token, -the UserInfo endpoint MUST provide Visas as described in the section -Visas provided by a Broker via UserInfo Endpoint.

      -
    4. -
    -
  4. -
  5. -

    Brokers operate downstream from IdPs or provide their own IdP service. They -issue id_tokens and access_tokens (and potentially refresh tokens) for -consumption within the GA4GH compliant environment.

    -
  6. -
  7. -

    Broker MAY support Token Exchange. If implemented, it MUST behave as described -for passport issuance in Conformance For Passport Issuers.

    -
  8. -
  9. -

    Broker MUST provide protection against attacks as outlined in -[RFC6819].

    -
  10. -
  11. -

    The user represented by the identity of the access token MUST have agreed to -release claims related to the requested scopes as part of generating tokens. -Brokers MUST adhere to -section 3.1.2.4 -of [OIDC-Core].

    - -
      -
    1. -

      The user represented by a researcher identity MUST approve the release -of these claims to relying parties with sufficient granularity to -allow for responsible disclosure of information best practices as well -as to meet privacy regulations that may be applicable within or between -jurisdictions where the user’s identity will be used (e.g. GDPR for -a European Union user).

      -
    2. -
    3. -

      If the user’s release agreement has been remembered as part of a user’s -settings such that the user no longer needs to be prompted, then the -user MUST have the ability to remove this setting (i.e. be prompted -again in the future). If a feature is to bypass prompts by remembering -settings is available, it MUST only be used as an opt-in feature with -explicit controls available to the user.

      -
    4. -
    5. -

      A user’s withdrawal of this agreement does not need to apply to -previously generated access tokens.

      -
    6. -
    -
  12. -
  13. -

    When a Broker acts as a Visa Issuer then it MUST adhere to the Conformance -for Visa Issuers section of this -specification.

    - -

    When a Broker provides Visas from other Visa Issuers, it is providing -them “as is” (i.e. it provides no additional assurance as to the quality, -authenticity, or trustworthiness of the Claims from such tokens and any such -assurances are made by the issuer of the Visa, i.e. the Visa Issuer).

    -
  14. -
- -
- -

-

Conformance for Visa Issuers

- -

Visa Issuers issue signed JWTs (Visas) asserting facts about researchers, which may be used by Passport Clearinghouses -to justify granting access to data. This specification defines the format of the Visas and endpoints Visa Issuers -should have in order for Passport Clearinghouses to validate those Visas. This document does not specify how a Broker -obtains Visas contained in a Passport or returned from the Userinfo Endpoint.

- -
    -
  1. -

    A Visa Issuer MUST provide one or more of the following - types of Visas:

    - -
      -
    1. -

      - - - -Visa Document Token – The Visa Issuer does not need to -be an OIDC provider, and MAY provide tokens of this type without any -revocation process.

      - -
        -
      1. The token MUST conform with JWS format [RFC7515] requirements
      2. -
      3. The token MUST be signed by a Visa Issuer.
      4. -
      5. The JWS header MUST contain jku as specified by section -4.1.2 of [RFC7515], and -MUST provide the corresponding endpoint to fetch -the public key used to sign the Visa Document Token.
      6. -
      7. The token is not treated as an access token, but validity -checks outlined elsewhere in this specification still apply.
      8. -
      9. -Visas MUST be signed with a conformant signing algorithm.
      10. -
      11. The scope Claim, if included, MUST NOT contain “openid” as -a space-delimited substring of the scope JWT Claim.
      12. -
      13. Payload Claims are specified in -Visa Format in [Passport].
      14. -
      -
    2. -
    3. -

      -Visa Access Token – The Visa Issuer is providing an OIDC provider -service and issues OIDC-compliant access tokens in a specific format that can -be used as a Visa. Details are specified in the AAI Profile 1.0 specification.

      -
    4. -
    - -

    The Visa Access Token is proposed for removal in a future - version of the specification. Current and future specifications emphasize use of Visas embedded in a Passport, which are not access tokens. New implementations should issue Visas - as Visa Document Tokens.

    -
  2. -
  3. -

    By signing a Visa, a Visa Issuer asserts that - the Visa Assertions made available by the Visa were legitimately derived - from their Visa Assertion Sources, and the content is - presented and/or transformed without misrepresenting the original intent.

    -
  4. -
- -
- -

Conformance for Passport Issuers

- -

Passport Issuers are used to package Visas into signed Passports. Passports are signed JWTs -that use this format to contain Visas.

- -
    -
  1. -

    Passport Issuers MUST be Brokers.

    -
  2. -
  3. -

    Passports MUST be signed with a conformant signing algorithm.

    -
  4. -
  5. -

    Passports MAY be issued from a Token Endpoint using Token Exchange, with the following clarifications:

    - -
      -
    1. -

      The Token Endpoint MAY also support other OAuth2 grant types.

      -
    2. -
    3. -

      Client authentication is REQUIRED (using OAuth2 client authentication in [RFC6749] is RECOMMENDED).

      -
    4. -
    5. -

      The requested_token_type parameter MUST be present with the value urn:ga4gh:params:oauth:token-type:passport.

      -
    6. -
    7. -

      The subject_token parameter value MUST be a valid Passport-Scoped Access Token.

      -
    8. -
    9. -

      The subject_token_type parameter value MUST be urn:ietf:params:oauth:token-type:access_token.

      -
    10. -
    11. -

      The Token Endpoint MAY accept or require any other optional parameters defined in [RFC8693].

      -
    12. -
    -
  6. -
- -


-Passport Issuing via Token Exchange (non-normative example)

- - - - - - Researcher - - AAI - - Data Access Committee (1) - - Data Access Committee (2) - - - - - - User Agent - - - - Client - - Broker and Passport Issuer - - Visa Issuer (1) - - Visa Issuer (2) - - - - - OIDC - - - Initiates login - - - Send redirect to Broker - - - Follow redirects - - - ref - Broker authenticates user - (potentially with external IdP) - - - Send redirect to client with authorization code - - - Follow redirect with code - - - Request Passport-Scoped Access Token - - - Respond with Passport-Scoped Access Token - - - - - Token Exchange - - - Request to exchange Passport-Scoped - Access Token for Passport - - - ref - Signed visas can be sourced from multiple visa issuers - either on demand or via batch transfer/cached - - - - Obtain Visa A - - - - Obtain Visa B - - - - Obtain Visa C - - - Response with Passport containing Visas A, B, C - - - - -
- -

Conformance for Passport Clearinghouses

- -

Passport Clearinghouses consume Passports containing Visas in order to grant access to data.

- -
    -
  1. -

    Passport Clearinghouses MUST trust at least one Broker.

    - -
      -
    1. -

      Passport Clearinghouses MAY trust more than one Broker

      -
    2. -
    3. -

      The Passport Clearinghouse is responsible for assessing the risk in choosing to trust a token from a Broker.

      -
    4. -
    -
  2. -
  3. -

    Passport Clearinghouses MUST process access tokens to access a Broker’s Token or UserInfo Endpoint to get access to Visas OR MUST process Passports directly.

    - -
      -
    1. -

      For access token flows, Passport Clearinghouses MUST either check the validity of the access token or treat the access -token as opaque.

      -
    2. -
    3. -

      For Passport flows, Passport Clearinghouses MUST check the validity of the Passport.

      -
    4. -
    -
  4. -
  5. -

    A Passport Clearinghouse service can be a Broker itself and would follow the -Conformance For Brokers.

    -
  6. -
  7. -

    Passport Clearinghouses MUST provide protection against attacks as outlined in -[RFC6819].

    - -
      -
    1. -Section 5.1.6 of [RFC6819] states Ensure that client applications do not share tokens with 3rd parties. This profile provides a mechanism for Clearinghouses to consume access tokens from multiple brokers in a manner that does not involve 3rd parties. Client applications SHOULD take care to not spread the tokens to any other services that would be considered 3rd parties.
    2. -
    -
  8. -
  9. -

    If making use of Visas:

    - -
      -
    1. -

      The Passport Clearinghouse MUST validate that all JWT checks pass (such as -the JWT hasn’t expired) as described elsewhere in this specification and -the underlying OIDC specifications.

      -
    2. -
    3. -

      If making use of Visa Access Tokens:

      - -
        -
      1. -

        Token checks MUST be performed to ensure it complies with the access -token specification.

        -
      2. -
      3. -

        In addition to other validation checks, a Visa is considered -invalid if it is more than 1 hour old (as per the iat Claim) AND -Access Token Polling does not confirm that the token is still -valid (e.g. provide a success status code).

        -
      4. -
      -
    4. -
    5. -

      If making use of Visa Document Tokens:

      - -
        -
      1. -

        Fetching the public keys using the jku is not required if a Passport -Clearinghouse has received the keys for the given iss via a trusted, -out-of-band process.

        -
      2. -
      3. -

        If a Passport Clearinghouse is to use the jku URL to fetch the public -keys to verify the signature, then it MUST verify that the jku is -trusted for the given iss as part of the Passport Clearinghouse’s -trusted issuer configuration. This check MUST be performed before -calling the jku endpoint.

        -
      4. -
      -
    6. -
    -
  10. -
  11. -

    Access Token Polling: Clients MAY use access tokens, -including Visas, to occasionally check which Visas are still valid -at the associated Token or UserInfo Endpoint in order to establish -whether the user still meets the access requirements.

    - -

    This MUST NOT be done more than once per hour (excluding any optional retries) -per Passport Clearinghouse. Any request retries MUST include exponential backoff -delays based on best practices (e.g. include appropriate jitter). At a -minimum, the client MUST stop checking once any of the following occurs:

    - -
      -
    1. -

      The system can reasonably determine that authorization related to these -Claims is no longer needed by the user. For example, all downstream cloud -tasks have terminated and the related systems will no longer be using the -access token nor any downstream tokens that were authorized by evaluating -access requirements against Claims in the token.

      -
    2. -
    3. -

      The JWT access token has expired as per the exp field.

      -
    4. -
    5. -

      The client has detected that the user owning the identity or a system -administrator has revoked the access token or a refresh token related to -minting the access token.

      -
    6. -
    7. -

      The endpoint returns an HTTP status that is not retryable, e.g. HTTP status 400.

      -
    8. -
    9. -

      If the endpoint returns an updated set of Visas (this is -an OPTIONAL feature of a Visa Issuer), then the Passport -Clearinghouse MUST use the updated Visas and ignore the original -GA4GH Claim values in the Visa Access Token. If the Passport -Clearinghouse is unable to adjust for the updated Visas, then -it MUST act as though the token was revoked.

      -
    10. -
    -
  12. -
- -
- -

-

GA4GH JWT Formats

- -

This specification builds on the JWT format defined in [RFC7519]. -A well-formed JWS-Encoded JSON Web Token (JWT) consists of three concatenated -Base64url-encoded strings, separated by dots (.) The three sections are: header, -payload and signature. These JWTs follow JWS [RFC7515] -and utilize a number of standard JWT Claim names [IANA-JWT] -as per the registration process. -This profile is agnostic to the format of the id_token.

- -
- -

-

-

Passport-Scoped Access Token

- -

This is the format for the token that is issued by Brokers, extending the definition of -the [OIDC-Core] access token.

- -

Header

- -
{
- "typ": "<jwt-type-identifier>",
- "alg": "<algorithm-identifier>",
- "kid": "<key-identifier>"
-}
-
- - -

Payload

- -
{
- "iss": "https://<issuer-website>/",
- "sub": "<subject-identifier>",
- "idp": "<short-idp-identifier>",
- "aud": [
-  "<client-id1>",
-  "<client-id2>" ...
- ],
- "iat": <seconds-since-epoch>,
- "exp": <seconds-since-epoch>,
- "jti": <token-identifier>,
- "scope": "openid ga4gh_passport_v1 <additional-scopes>",
- <additional claims>
-}
-
-
    -
  • -

    iss: REQUIRED. MUST be able to be appended with -.well-known/openid-configuration to get spec of Broker.

    -
  • -
  • -

    sub: REQUIRED. Authenticated user unique identifier.

    -
  • -
  • -

    idp: OPTIONAL. SHOULD contain the IDP the user used to auth with. -This does not have to be unique and -can be used just to help inform if that is what a Visa Issuer -or Data Holder needs.

    -
  • -
  • -

    aud: OPTIONAL. If provided, it MUST contain the OAuth Client ID of the -relying party.

    -
  • -
  • -

    iat: REQUIRED. Time issued.

    -
  • -
  • -

    exp: REQUIRED. Time expired.

    -
  • -
  • -

    jti: RECOMMENDED. a unique identifier for the token as per -section 4.1.7 of [RFC7519]

    -
  • -
  • -

    scope: REQUIRED. Includes verified scopes. MUST include openid and ga4gh_passport_v1. -The scope Claim is defined by section 4.2 -of [RFC8693].

    -
  • -
  • -

    GA4GH Claims (ga4gh_passport_v1 or ga4gh_visa_v1): MUST NOT be included.

    -
  • -
  • -

    additional Claims: OPTIONAL. Any other additional non-GA4GH Claims are allowed. This specification does not dictate the format of other Claims.

    -
  • -
- -
- -

Visas provided by a Broker via UserInfo Endpoint

- -

The UserInfo Endpoint MAY use application/json -or application/jwt response content type. It is RECOMMENDED that if desiring to return a JWT, a Token Endpoint supporting -Token Exchange exists to do that and that the UserInfo Endpoint returns an application/json response. -Only the GA4GH claims must be as prescribed here. Refer to [OIDC-Core] for more information.

- -

The UserInfo response MUST include a ga4gh_passport_v1 Claim with a list of Visas -if a Passport-Scoped Access Token was used for accessing it.

- -
- -

Passport Format

- -

Passport Issuers MUST issue a Passport conforming to the requirements in this section when a Token Exchange -with the requested_token_type=urn:ga4gh:params:oauth:token-type:passport is successfully performed -(as described in the Conformance for Passport Issuers section).

- -

Passports are defined as signed JWTs. The JWT specification [RFC7519] -states that JWTs can be either signed and encoded using JWS Compact Serialization, -or encrypted and encoded using JWE Compact Serialization. -Passports are signed JWTs, which implies that they must be encoded using JWS Compact Serialization [RFC7515].

- -

Header

- -

This spec prescribes the following JWS headers for Passports -in addition to the guidelines established in [RFC7515]:

- -
    -
  • -typ: REQUIRED where the value must be vnd.ga4gh.passport+jwt for Passports.
  • -
- -

Payload

- -

Only the GA4GH claims must be as prescribed here. See the -JWT specification [RFC7519] for more details.

- -
{
- "iss": "https://<issuer-website>/",
- "sub": "<subject-identifier>",
- "aud": [
-  "<client-id1>",
-  "<client-id2>" ...
- ],
- "iat": <seconds-since-epoch>,
- "exp": <seconds-since-epoch>,
- "ga4gh_passport_v1": [
-    <Passport Visa>,
-    <Passport Visa (if more than one)>,
-    ...
- ]
-}
-
- -
    -
  • -

    iss: REQUIRED.

    -
  • -
  • -

    sub: REQUIRED. Please note that [OIDC-Core] in its section - Subject Identifier Types - allows the use of PPIDs (Pairwise Pseudonymous Identifiers) providing different sub value to each client - to preclude correlation of user’s activities at different clients. Even if a public identifier is used (same for all clients), - the value of the sub claim of a Passports may be different from the values of sub claims of its Visas, - and the values may need to be linked using LinkedIdentities - visas.

    -
  • -
  • -

    aud: OPTIONAL.

    -
  • -
  • -

    iat: REQUIRED.

    -
  • -
  • -

    exp: REQUIRED.

    -
  • -
  • -

    jti: RECOMMENDED.

    -
  • -
  • -

    ga4gh_passport_v1: REQUIRED. An array of GA4GH Visas. May be empty if a - user has no visas. See the [Passport] specification - for more details on types of visas.

    -
  • -
- -
- -

Signing Algorithms

- -

JWTs MUST be issued with signatures using the ES256 or RS256 algorithm.

- -
- -

Security Considerations

- -

The confidentiality and integrity of tokens must be secured, taking -JSON Web Token Best Current Practices in [RFC8725] -into consideration. Of special concern are:

-
    -
  • Revoking access tokens and Visa Assertions
  • -
  • Limiting damage of leaked tokens
  • -
- -
- -

Specification Revision History

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VersionDateEditorNotes
1.2.02023-01Andrew Patterson, Martin Kuba, Kurt Rodarmer, Tom Conner, Max BarkleyIntroduce token exchange and Passport format, incorporate Visas, update diagrams
1.1.02021-07Craig Voisin -abandoned version now reserved, new concepts moved to v1.2
1.0.42021-07Craig VoisinImprove existing terminology and define Passport and Visa JWTs
1.0.32021-06Craig VoisinLinks for “scope” claim
1.0.22020-02David BernickClarify risk scenarios
1.0.12019-10David BernickClarify that non-GA4GH claims are allowed in tokens
1.0.02019-10Approved by GA4GH Steering Committee 
0.9.92019-10David Bernick, Craig Voisin, Mikael LindenApproved standard
0.9.52019-09Craig VoisinUpdate claim flow diagram and definitions
0.9.42019-08Craig VoisinEmbedded tokens for signed RI Claim Objects
0.9.32019-08Craig VoisinSupport for RI’s embedded tokens
0.9.22019-07David BernickMade changes based on feedback from review
0.9.12019-06Craig VoisinAdded terminology links
0.9.02017-Mikael Linden, Craig Voisin, David BernickInitial working version
- -
- -
- -
-
- - - diff --git a/draft-diagrams/assets/main.css b/draft-diagrams/assets/main.css deleted file mode 100644 index fbb59e6..0000000 --- a/draft-diagrams/assets/main.css +++ /dev/null @@ -1,701 +0,0 @@ -/** - * Reset some basic elements - */ -body, h1, h2, h3, h4, h5, h6, -p, blockquote, pre, hr, -dl, dd, ol, ul, figure { - margin: 0; - padding: 0; -} - -/** - * Basic styling - */ -body { - font: 400 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - color: #111; - background-color: #fdfdfd; - -webkit-text-size-adjust: 100%; - -webkit-font-feature-settings: "kern" 1; - -moz-font-feature-settings: "kern" 1; - -o-font-feature-settings: "kern" 1; - font-feature-settings: "kern" 1; - font-kerning: normal; - display: flex; - min-height: 100vh; - flex-direction: column; -} - -/** - * Set `margin-bottom` to maintain vertical rhythm - */ -h1, h2, h3, h4, h5, h6, -p, blockquote, pre, -ul, ol, dl, figure, -.highlight { - margin-bottom: 15px; -} - -/** - * `main` element - */ -main { - display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ -} - -/** - * Images - */ -img { - max-width: 100%; - vertical-align: middle; -} - -/** - * Figures - */ -figure > img { - display: block; -} - -figcaption { - font-size: 14px; -} - -/** - * Lists - */ -ul, ol { - margin-left: 30px; -} - -li > ul, -li > ol { - margin-bottom: 0; -} - -/** - * Headings - */ -h1, h2, h3, h4, h5, h6 { - font-weight: 400; -} - -/** - * Links - */ -a { - color: #2a7ae2; - text-decoration: none; -} -a:visited { - color: #1756a9; -} -a:hover { - color: #111; - text-decoration: underline; -} -.social-media-list a:hover { - text-decoration: none; -} -.social-media-list a:hover .username { - text-decoration: underline; -} - -/** - * Blockquotes - */ -blockquote { - color: #828282; - border-left: 4px solid #e8e8e8; - padding-left: 15px; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; -} -blockquote > :last-child { - margin-bottom: 0; -} - -/** - * Code formatting - */ -pre, -code { - font-size: 15px; - border: 1px solid #e8e8e8; - border-radius: 3px; - background-color: #eef; -} - -code { - padding: 1px 5px; -} - -pre { - padding: 8px 12px; - overflow-x: auto; -} -pre > code { - border: 0; - padding-right: 0; - padding-left: 0; -} - -/** - * Wrapper - */ -.wrapper { - max-width: -webkit-calc(1200px - (30px * 2)); - max-width: calc(1200px - (30px * 2)); - margin-right: auto; - margin-left: auto; - padding-right: 30px; - padding-left: 30px; -} -@media screen and (max-width: 800px) { - .wrapper { - max-width: -webkit-calc(1200px - (30px)); - max-width: calc(1200px - (30px)); - padding-right: 15px; - padding-left: 15px; - } -} - -/** - * Clearfix - */ -.footer-col-wrapper:after, .wrapper:after { - content: ""; - display: table; - clear: both; -} - -/** - * Icons - */ -.svg-icon { - width: 16px; - height: 16px; - display: inline-block; - fill: #828282; - padding-right: 5px; - vertical-align: text-top; -} - -.social-media-list li + li { - padding-top: 5px; -} - -/** - * Tables - */ -table { - margin-bottom: 30px; - width: 100%; - text-align: left; - color: #3f3f3f; - border-collapse: collapse; - border: 1px solid #e8e8e8; -} -table tr:nth-child(even) { - background-color: #f7f7f7; -} -table th, table td { - padding: 10px 15px; -} -table th { - background-color: #f0f0f0; - border: 1px solid #dedede; - border-bottom-color: #c9c9c9; -} -table td { - border: 1px solid #e8e8e8; -} - -/** - * Site header - */ -.site-header { - border-top: 5px solid #424242; - border-bottom: 1px solid #e8e8e8; - min-height: 55.95px; - position: relative; -} - -.site-title { - font-size: 26px; - font-weight: 300; - line-height: 54px; - letter-spacing: -1px; - margin-bottom: 0; - float: left; -} -.site-title, .site-title:visited { - color: #424242; -} - -.site-nav { - float: right; - line-height: 54px; -} -.site-nav .nav-trigger { - display: none; -} -.site-nav .menu-icon { - display: none; -} -.site-nav .page-link { - color: #111; - line-height: 1.5; -} -.site-nav .page-link:not(:last-child) { - margin-right: 20px; -} -@media screen and (max-width: 600px) { - .site-nav { - position: absolute; - top: 9px; - right: 15px; - background-color: #fdfdfd; - border: 1px solid #e8e8e8; - border-radius: 5px; - text-align: right; - } - .site-nav label[for=nav-trigger] { - display: block; - float: right; - width: 36px; - height: 36px; - z-index: 2; - cursor: pointer; - } - .site-nav .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - } - .site-nav .menu-icon > svg { - fill: #424242; - } - .site-nav input ~ .trigger { - clear: both; - display: none; - } - .site-nav input:checked ~ .trigger { - display: block; - padding-bottom: 5px; - } - .site-nav .page-link { - display: block; - padding: 5px 10px; - margin-left: 20px; - } - .site-nav .page-link:not(:last-child) { - margin-right: 0; - } -} - -/** - * Site footer - */ -.site-footer { - border-top: 1px solid #e8e8e8; - padding: 30px 0; -} - -.footer-heading { - font-size: 18px; - margin-bottom: 15px; -} - -.contact-list, -.social-media-list { - list-style: none; - margin-left: 0; -} - -.footer-col-wrapper { - font-size: 15px; - color: #828282; - margin-left: -15px; -} - -.footer-col { - float: left; - margin-bottom: 15px; - padding-left: 15px; -} - -.footer-col-1 { - width: -webkit-calc(35% - (30px / 2)); - width: calc(35% - (30px / 2)); -} - -.footer-col-2 { - width: -webkit-calc(20% - (30px / 2)); - width: calc(20% - (30px / 2)); -} - -.footer-col-3 { - width: -webkit-calc(45% - (30px / 2)); - width: calc(45% - (30px / 2)); -} - -@media screen and (max-width: 800px) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (30px / 2)); - width: calc(50% - (30px / 2)); - } - .footer-col-3 { - width: -webkit-calc(100% - (30px / 2)); - width: calc(100% - (30px / 2)); - } -} -@media screen and (max-width: 600px) { - .footer-col { - float: none; - width: -webkit-calc(100% - (30px / 2)); - width: calc(100% - (30px / 2)); - } -} -/** - * Page content - */ -.page-content { - padding: 30px 0; - flex: 1; -} - -.page-heading { - font-size: 32px; -} - -.post-list-heading { - font-size: 28px; -} - -.post-list { - margin-left: 0; - list-style: none; -} -.post-list > li { - margin-bottom: 30px; -} - -.post-meta { - font-size: 14px; - color: #828282; -} - -.post-link { - display: block; - font-size: 24px; -} - -/** - * Posts - */ -.post-header { - margin-bottom: 30px; -} - -.post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; -} -@media screen and (max-width: 800px) { - .post-title { - font-size: 36px; - } -} - -.post-content { - margin-bottom: 30px; -} -.post-content h2 { - font-size: 32px; -} -@media screen and (max-width: 800px) { - .post-content h2 { - font-size: 28px; - } -} -.post-content h3 { - font-size: 26px; -} -@media screen and (max-width: 800px) { - .post-content h3 { - font-size: 22px; - } -} -.post-content h4 { - font-size: 20px; -} -@media screen and (max-width: 800px) { - .post-content h4 { - font-size: 18px; - } -} - -/** - * Syntax highlighting styles - */ -.highlight { - background: #fff; -} -.highlighter-rouge .highlight { - background: #eef; -} -.highlight .c { - color: #998; - font-style: italic; -} -.highlight .err { - color: #a61717; - background-color: #e3d2d2; -} -.highlight .k { - font-weight: bold; -} -.highlight .o { - font-weight: bold; -} -.highlight .cm { - color: #998; - font-style: italic; -} -.highlight .cp { - color: #999; - font-weight: bold; -} -.highlight .c1 { - color: #998; - font-style: italic; -} -.highlight .cs { - color: #999; - font-weight: bold; - font-style: italic; -} -.highlight .gd { - color: #000; - background-color: #fdd; -} -.highlight .gd .x { - color: #000; - background-color: #faa; -} -.highlight .ge { - font-style: italic; -} -.highlight .gr { - color: #a00; -} -.highlight .gh { - color: #999; -} -.highlight .gi { - color: #000; - background-color: #dfd; -} -.highlight .gi .x { - color: #000; - background-color: #afa; -} -.highlight .go { - color: #888; -} -.highlight .gp { - color: #555; -} -.highlight .gs { - font-weight: bold; -} -.highlight .gu { - color: #aaa; -} -.highlight .gt { - color: #a00; -} -.highlight .kc { - font-weight: bold; -} -.highlight .kd { - font-weight: bold; -} -.highlight .kp { - font-weight: bold; -} -.highlight .kr { - font-weight: bold; -} -.highlight .kt { - color: #458; - font-weight: bold; -} -.highlight .m { - color: #099; -} -.highlight .s { - color: #d14; -} -.highlight .na { - color: #008080; -} -.highlight .nb { - color: #0086B3; -} -.highlight .nc { - color: #458; - font-weight: bold; -} -.highlight .no { - color: #008080; -} -.highlight .ni { - color: #800080; -} -.highlight .ne { - color: #900; - font-weight: bold; -} -.highlight .nf { - color: #900; - font-weight: bold; -} -.highlight .nn { - color: #555; -} -.highlight .nt { - color: #000080; -} -.highlight .nv { - color: #008080; -} -.highlight .ow { - font-weight: bold; -} -.highlight .w { - color: #bbb; -} -.highlight .mf { - color: #099; -} -.highlight .mh { - color: #099; -} -.highlight .mi { - color: #099; -} -.highlight .mo { - color: #099; -} -.highlight .sb { - color: #d14; -} -.highlight .sc { - color: #d14; -} -.highlight .sd { - color: #d14; -} -.highlight .s2 { - color: #d14; -} -.highlight .se { - color: #d14; -} -.highlight .sh { - color: #d14; -} -.highlight .si { - color: #d14; -} -.highlight .sx { - color: #d14; -} -.highlight .sr { - color: #009926; -} -.highlight .s1 { - color: #d14; -} -.highlight .ss { - color: #990073; -} -.highlight .bp { - color: #999; -} -.highlight .vc { - color: #008080; -} -.highlight .vg { - color: #008080; -} -.highlight .vi { - color: #008080; -} -.highlight .il { - color: #099; -} - -ol ol { - list-style-type: lower-alpha; -} - -ol ol ol { - list-style-type: lower-roman; -} - -ol ol ol ol { - list-style-type: circle; -} - -ol ol ol ol ol { - list-style-type: disc; -} - -li:only-child { - margin-bottom: 1em; -} - -.rationale { - background: rgba(170, 170, 170, 0.2); - border-left: 5px solid #008; - border-radius: 5px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); - padding: 0.8rem; -} -.rationale::before { - color: #008; - content: "RATIONALE"; - display: block; - font-weight: bold; - font-size: 0.75em; - padding-bottom: 0.125rem; -} - -.deprecation { - background: rgba(221, 221, 221, 0.2); - border-left: 5px solid #FFA500; - border-radius: 5px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); - padding: 0.8rem; -} -.deprecation::before { - color: #FFA500; - content: "DEPRECATION WARNING"; - display: block; - font-weight: bold; - font-size: 0.75em; - padding-bottom: 0.125rem; -} - -/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/draft-diagrams/assets/main.css.map b/draft-diagrams/assets/main.css.map deleted file mode 100644 index 8f17265..0000000 --- a/draft-diagrams/assets/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_base.scss","../_sass/minima.scss","../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_layout.scss","../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;EAGE;EACA;;;AAKF;AAAA;AAAA;AAGA;EACE;EACA,OCLiB;EDMjB,kBCLiB;EDMjB;EACA;EACG;EACE;EACG;EACR;EACA;EACA;EACA;;;AAKF;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;EAIE;;;AAKF;AAAA;AAAA;AAGA;EACE;;;AAKF;AAAA;AAAA;AAGA;EACE;EACA;;;AAKF;AAAA;AAAA;AAGA;EACE;;;AAGF;EACE,WChEiB;;;ADqEnB;AAAA;AAAA;AAGA;EACE,aCtEiB;;;AD0EjB;AAAA;EAEE;;;AAMJ;AAAA;AAAA;AAGA;EACE,aC1FiB;;;AD+FnB;AAAA;AAAA;AAGA;EACE,OC3FiB;ED4FjB;;AAEA;EACE;;AAGF;EACE,OCrGe;EDsGf;;AAGF;EACE;;AAEA;EACE;;;AAMN;AAAA;AAAA;AAGA;EACE,OCnHiB;EDoHjB;EACA;EC1FA;ED4FA;EACA;;AAEA;EACE;;;AAMJ;AAAA;AAAA;AAGA;AAAA;ECzGE;ED4GA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;EACA;EACA,eC3KiB;ED4KjB,cC5KiB;;AA2BjB;ED2IF;IAUI;IACA;IACA;IACA;;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;;;AAKF;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;;;AAMJ;AAAA;AAAA;AAGA;EACE,eC7NiB;ED8NjB;EACA,YCrNiB;EDsNjB;EACA;EACA;;AAEE;EACE;;AAGJ;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;;;AE3PJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;EAGA;;;AAGF;ED+BE;EC7BA;EACA;EACA;EACA;EACA;;AAEA;EAEE,ODJe;;;ACQnB;EACE;EACA;;AAEA;EACI;;AAGJ;EACE;;AAGF;EACE,OD3Be;EC4Bf,aDhCe;;ACmCf;EACE;;ADPJ;ECXF;IAuBI;IACA;IACA;IACA,kBDvCe;ICwCf;IACA;IACA;;EAEA;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IACE,MD1DW;;EC8Df;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IAKA;;EAHA;IACE;;;;AASR;AAAA;AAAA;AAGA;EACE;EACA;;;AAGF;EDrEE;ECuEA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EDhFE;ECkFA,OD7GiB;EC8GjB;;;AAIF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AD/GA;ECmHA;AAAA;IAEE;IACA;;EAGF;IACE;IACA;;;AD3HF;ECgIA;IACE;IACA;IACA;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;;;AAGF;ED3IE;;;AC+IF;ED/IE;;;ACmJF;EACE;EACA;;AAEA;EACE,eDzLe;;;AC6LnB;EACE,WDjMiB;ECkMjB,ODzLiB;;;AC4LnB;EACE;EDlKA;;;ACwKF;AAAA;AAAA;AAGA;EACE,eD7MiB;;;ACgNnB;ED/KE;ECiLA;EACA;;ADxLA;ECqLF;ID/KE;;;;ACyLF;EACE,eD3NiB;;AC6NjB;ED5LA;;AANA;ECkMA;ID5LA;;;ACoMA;EDpMA;;AANA;EC0MA;IDpMA;;;AC4MA;ED5MA;;AANA;ECkNA;ID5MA;;;;AE3CF;AAAA;AAAA;AAGA;EACE;;AAGA;EACE;;AAGF;EAAS;EAAa;;AACtB;EAAS;EAAgB;;AACzB;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;EAAa;EAAmB;;AACzC;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;;AFdX;EAAQ;;;AACR;EAAW;;;AACX;EAAc;;;AACd;EAAiB;;;AAIjB;EACE;;;AAeA;EACE;EACA;EACA,eAbY;EAcZ;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAbJ;EACE;EACA;EACA,eAbY;EAcZ;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA","sourcesContent":["/**\n * Reset some basic elements\n */\nbody, h1, h2, h3, h4, h5, h6,\np, blockquote, pre, hr,\ndl, dd, ol, ul, figure {\n margin: 0;\n padding: 0;\n}\n\n\n\n/**\n * Basic styling\n */\nbody {\n font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;\n color: $text-color;\n background-color: $background-color;\n -webkit-text-size-adjust: 100%;\n -webkit-font-feature-settings: \"kern\" 1;\n -moz-font-feature-settings: \"kern\" 1;\n -o-font-feature-settings: \"kern\" 1;\n font-feature-settings: \"kern\" 1;\n font-kerning: normal;\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n}\n\n\n\n/**\n * Set `margin-bottom` to maintain vertical rhythm\n */\nh1, h2, h3, h4, h5, h6,\np, blockquote, pre,\nul, ol, dl, figure,\n%vertical-rhythm {\n margin-bottom: $spacing-unit / 2;\n}\n\n\n\n/**\n * `main` element\n */\nmain {\n display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */\n}\n\n\n\n/**\n * Images\n */\nimg {\n max-width: 100%;\n vertical-align: middle;\n}\n\n\n\n/**\n * Figures\n */\nfigure > img {\n display: block;\n}\n\nfigcaption {\n font-size: $small-font-size;\n}\n\n\n\n/**\n * Lists\n */\nul, ol {\n margin-left: $spacing-unit;\n}\n\nli {\n > ul,\n > ol {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Headings\n */\nh1, h2, h3, h4, h5, h6 {\n font-weight: $base-font-weight;\n}\n\n\n\n/**\n * Links\n */\na {\n color: $brand-color;\n text-decoration: none;\n\n &:visited {\n color: darken($brand-color, 15%);\n }\n\n &:hover {\n color: $text-color;\n text-decoration: underline;\n }\n\n .social-media-list &:hover {\n text-decoration: none;\n\n .username {\n text-decoration: underline;\n }\n }\n}\n\n\n/**\n * Blockquotes\n */\nblockquote {\n color: $grey-color;\n border-left: 4px solid $grey-color-light;\n padding-left: $spacing-unit / 2;\n @include relative-font-size(1.125);\n letter-spacing: -1px;\n font-style: italic;\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Code formatting\n */\npre,\ncode {\n @include relative-font-size(0.9375);\n border: 1px solid $grey-color-light;\n border-radius: 3px;\n background-color: #eef;\n}\n\ncode {\n padding: 1px 5px;\n}\n\npre {\n padding: 8px 12px;\n overflow-x: auto;\n\n > code {\n border: 0;\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n\n/**\n * Wrapper\n */\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));\n margin-right: auto;\n margin-left: auto;\n padding-right: $spacing-unit;\n padding-left: $spacing-unit;\n @extend %clearfix;\n\n @include media-query($on-laptop) {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));\n max-width: calc(#{$content-width} - (#{$spacing-unit}));\n padding-right: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n }\n}\n\n\n\n/**\n * Clearfix\n */\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n\n\n/**\n * Icons\n */\n\n.svg-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n fill: #{$grey-color};\n padding-right: 5px;\n vertical-align: text-top;\n}\n\n.social-media-list {\n li + li {\n padding-top: 5px;\n }\n}\n\n\n\n/**\n * Tables\n */\ntable {\n margin-bottom: $spacing-unit;\n width: 100%;\n text-align: $table-text-align;\n color: lighten($text-color, 18%);\n border-collapse: collapse;\n border: 1px solid $grey-color-light;\n tr {\n &:nth-child(even) {\n background-color: lighten($grey-color-light, 6%);\n }\n }\n th, td {\n padding: ($spacing-unit / 3) ($spacing-unit / 2);\n }\n th {\n background-color: lighten($grey-color-light, 3%);\n border: 1px solid darken($grey-color-light, 4%);\n border-bottom-color: darken($grey-color-light, 12%);\n }\n td {\n border: 1px solid $grey-color-light;\n }\n}\n","@charset \"utf-8\";\n\n// Define defaults for each variable.\n\n$base-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\" !default;\n$base-font-size: 16px !default;\n$base-font-weight: 400 !default;\n$small-font-size: $base-font-size * 0.875 !default;\n$base-line-height: 1.5 !default;\n\n$spacing-unit: 30px !default;\n\n$text-color: #111 !default;\n$background-color: #fdfdfd !default;\n$brand-color: #2a7ae2 !default;\n\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 40%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$table-text-align: left !default;\n\n// Width of the content area\n// changed from minima default (GA4GH)\n$content-width: 1200px !default;\n\n$on-palm: 600px !default;\n$on-laptop: 800px !default;\n\n// Use media queries like this:\n// @include media-query($on-palm) {\n// .wrapper {\n// padding-right: $spacing-unit / 2;\n// padding-left: $spacing-unit / 2;\n// }\n// }\n@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n@mixin relative-font-size($ratio) {\n font-size: $base-font-size * $ratio;\n}\n\n// Import partials.\n@import\n\"minima/base\",\n\"minima/layout\",\n\"minima/syntax-highlighting\"\n;\n\n// due to estensive nested lists we set styling (GA4GH added)\n\nol ol { list-style-type: lower-alpha; }\nol ol ol { list-style-type: lower-roman; }\nol ol ol ol { list-style-type: circle; }\nol ol ol ol ol { list-style-type: disc; }\n\n// a fix for Kramdowns markup/css that doesn't leave enough space at the end of single item lists (GA4GH added)\n\nli:only-child {\n margin-bottom: 1em;\n}\n\n// custom CSS for callouts (GA4GH added)\n\n$border-radius: 5px;\n\n$callouts: (\n // rationale example callout\n rationale: (#008, rgba(#aaa, .2), 'RATIONALE'),\n // deprecation warning callout\n deprecation: (#FFA500, rgba(#ddd, .2), 'DEPRECATION WARNING'),\n);\n\n@each $class, $props in $callouts {\n .#{$class} {\n background: nth($props, 2);\n border-left: $border-radius solid nth($props, 1);\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n\n &::before {\n color: nth($props, 1);\n content: nth($props, 3);\n display: block;\n font-weight: bold;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n }\n}\n","/**\n * Site header\n */\n.site-header {\n border-top: 5px solid $grey-color-dark;\n border-bottom: 1px solid $grey-color-light;\n min-height: $spacing-unit * 1.865;\n\n // Positioning context for the mobile navigation icon\n position: relative;\n}\n\n.site-title {\n @include relative-font-size(1.625);\n font-weight: 300;\n line-height: $base-line-height * $base-font-size * 2.25;\n letter-spacing: -1px;\n margin-bottom: 0;\n float: left;\n\n &,\n &:visited {\n color: $grey-color-dark;\n }\n}\n\n.site-nav {\n float: right;\n line-height: $base-line-height * $base-font-size * 2.25;\n\n .nav-trigger {\n display: none;\n }\n\n .menu-icon {\n display: none;\n }\n\n .page-link {\n color: $text-color;\n line-height: $base-line-height;\n\n // Gaps between nav items, but not on the last one\n &:not(:last-child) {\n margin-right: 20px;\n }\n }\n\n @include media-query($on-palm) {\n position: absolute;\n top: 9px;\n right: $spacing-unit / 2;\n background-color: $background-color;\n border: 1px solid $grey-color-light;\n border-radius: 5px;\n text-align: right;\n\n label[for=\"nav-trigger\"] {\n display: block;\n float: right;\n width: 36px;\n height: 36px;\n z-index: 2;\n cursor: pointer;\n }\n\n .menu-icon {\n display: block;\n float: right;\n width: 36px;\n height: 26px;\n line-height: 0;\n padding-top: 10px;\n text-align: center;\n\n > svg {\n fill: $grey-color-dark;\n }\n }\n\n input ~ .trigger {\n clear: both;\n display: none;\n }\n\n input:checked ~ .trigger {\n display: block;\n padding-bottom: 5px;\n }\n\n .page-link {\n display: block;\n padding: 5px 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n margin-left: 20px;\n }\n }\n}\n\n\n\n/**\n * Site footer\n */\n.site-footer {\n border-top: 1px solid $grey-color-light;\n padding: $spacing-unit 0;\n}\n\n.footer-heading {\n @include relative-font-size(1.125);\n margin-bottom: $spacing-unit / 2;\n}\n\n.contact-list,\n.social-media-list {\n list-style: none;\n margin-left: 0;\n}\n\n.footer-col-wrapper {\n @include relative-font-size(0.9375);\n color: $grey-color;\n margin-left: -$spacing-unit / 2;\n @extend %clearfix;\n}\n\n.footer-col {\n float: left;\n margin-bottom: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n}\n\n.footer-col-1 {\n width: -webkit-calc(35% - (#{$spacing-unit} / 2));\n width: calc(35% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-2 {\n width: -webkit-calc(20% - (#{$spacing-unit} / 2));\n width: calc(20% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-3 {\n width: -webkit-calc(45% - (#{$spacing-unit} / 2));\n width: calc(45% - (#{$spacing-unit} / 2));\n}\n\n@include media-query($on-laptop) {\n .footer-col-1,\n .footer-col-2 {\n width: -webkit-calc(50% - (#{$spacing-unit} / 2));\n width: calc(50% - (#{$spacing-unit} / 2));\n }\n\n .footer-col-3 {\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n@include media-query($on-palm) {\n .footer-col {\n float: none;\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n\n\n/**\n * Page content\n */\n.page-content {\n padding: $spacing-unit 0;\n flex: 1;\n}\n\n.page-heading {\n @include relative-font-size(2);\n}\n\n.post-list-heading {\n @include relative-font-size(1.75);\n}\n\n.post-list {\n margin-left: 0;\n list-style: none;\n\n > li {\n margin-bottom: $spacing-unit;\n }\n}\n\n.post-meta {\n font-size: $small-font-size;\n color: $grey-color;\n}\n\n.post-link {\n display: block;\n @include relative-font-size(1.5);\n}\n\n\n\n/**\n * Posts\n */\n.post-header {\n margin-bottom: $spacing-unit;\n}\n\n.post-title {\n @include relative-font-size(2.625);\n letter-spacing: -1px;\n line-height: 1;\n\n @include media-query($on-laptop) {\n @include relative-font-size(2.25);\n }\n}\n\n.post-content {\n margin-bottom: $spacing-unit;\n\n h2 {\n @include relative-font-size(2);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.75);\n }\n }\n\n h3 {\n @include relative-font-size(1.625);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.375);\n }\n }\n\n h4 {\n @include relative-font-size(1.25);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.125);\n }\n }\n}\n","/**\n * Syntax highlighting styles\n */\n.highlight {\n background: #fff;\n @extend %vertical-rhythm;\n\n .highlighter-rouge & {\n background: #eef;\n }\n\n .c { color: #998; font-style: italic } // Comment\n .err { color: #a61717; background-color: #e3d2d2 } // Error\n .k { font-weight: bold } // Keyword\n .o { font-weight: bold } // Operator\n .cm { color: #998; font-style: italic } // Comment.Multiline\n .cp { color: #999; font-weight: bold } // Comment.Preproc\n .c1 { color: #998; font-style: italic } // Comment.Single\n .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special\n .gd { color: #000; background-color: #fdd } // Generic.Deleted\n .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific\n .ge { font-style: italic } // Generic.Emph\n .gr { color: #a00 } // Generic.Error\n .gh { color: #999 } // Generic.Heading\n .gi { color: #000; background-color: #dfd } // Generic.Inserted\n .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific\n .go { color: #888 } // Generic.Output\n .gp { color: #555 } // Generic.Prompt\n .gs { font-weight: bold } // Generic.Strong\n .gu { color: #aaa } // Generic.Subheading\n .gt { color: #a00 } // Generic.Traceback\n .kc { font-weight: bold } // Keyword.Constant\n .kd { font-weight: bold } // Keyword.Declaration\n .kp { font-weight: bold } // Keyword.Pseudo\n .kr { font-weight: bold } // Keyword.Reserved\n .kt { color: #458; font-weight: bold } // Keyword.Type\n .m { color: #099 } // Literal.Number\n .s { color: #d14 } // Literal.String\n .na { color: #008080 } // Name.Attribute\n .nb { color: #0086B3 } // Name.Builtin\n .nc { color: #458; font-weight: bold } // Name.Class\n .no { color: #008080 } // Name.Constant\n .ni { color: #800080 } // Name.Entity\n .ne { color: #900; font-weight: bold } // Name.Exception\n .nf { color: #900; font-weight: bold } // Name.Function\n .nn { color: #555 } // Name.Namespace\n .nt { color: #000080 } // Name.Tag\n .nv { color: #008080 } // Name.Variable\n .ow { font-weight: bold } // Operator.Word\n .w { color: #bbb } // Text.Whitespace\n .mf { color: #099 } // Literal.Number.Float\n .mh { color: #099 } // Literal.Number.Hex\n .mi { color: #099 } // Literal.Number.Integer\n .mo { color: #099 } // Literal.Number.Oct\n .sb { color: #d14 } // Literal.String.Backtick\n .sc { color: #d14 } // Literal.String.Char\n .sd { color: #d14 } // Literal.String.Doc\n .s2 { color: #d14 } // Literal.String.Double\n .se { color: #d14 } // Literal.String.Escape\n .sh { color: #d14 } // Literal.String.Heredoc\n .si { color: #d14 } // Literal.String.Interpol\n .sx { color: #d14 } // Literal.String.Other\n .sr { color: #009926 } // Literal.String.Regex\n .s1 { color: #d14 } // Literal.String.Single\n .ss { color: #990073 } // Literal.String.Symbol\n .bp { color: #999 } // Name.Builtin.Pseudo\n .vc { color: #008080 } // Name.Variable.Class\n .vg { color: #008080 } // Name.Variable.Global\n .vi { color: #008080 } // Name.Variable.Instance\n .il { color: #099 } // Literal.Number.Integer.Long\n}\n"],"file":"main.css"} \ No newline at end of file diff --git a/draft-diagrams/assets/minima-social-icons.svg b/draft-diagrams/assets/minima-social-icons.svg deleted file mode 100644 index fa7399f..0000000 --- a/draft-diagrams/assets/minima-social-icons.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/draft-diagrams/changes-1_2.html b/draft-diagrams/changes-1_2.html deleted file mode 100644 index b7340d0..0000000 --- a/draft-diagrams/changes-1_2.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - -Changes Between Versions 1.0 and 1.2 | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

Changes Between Versions 1.0 and 1.2

-
- -
-

This document lists changes between

-
    -
  • GA4GH AAI OIDC Profile 1.0.0 and 1.2 -
  • -
  • GA4GH Passport 1.0.0 and 1.2
  • -
- -

Table of Contents

- - - -

Terminology changes

- -
    -
  • Removed double definitions of same concepts like “Claim Source” in AAI and “Passport Visa Assertion Source” in Passport.
  • -
  • Made distinction between claim as an abstract assertion and a JWT/OIDC claim as a pair of a string key and a JSON value.
  • -
  • Renamed “Data Owner” to “Data Controller” to be compatible with European GDPR
  • -
- -

Changed terms

- -
    -
  • -Claim Management System removed, the term was not used
  • -
  • claim → Visa Assertion -
  • -
  • -Claim RepositoryVisa Assertion Repository -
  • -
  • -Claim SourceVisa Assertion Source -
  • -
  • -Claim ClearinghousePassport Clearinghouse -
  • -
  • -Embedded TokenVisa -
  • -
  • -Embedded Token IssuerVisa Issuer -
  • -
  • -Embedded Access TokenVisa Access Token -
  • -
  • -Embedded Document TokenVisa Document Token -
  • -
  • -Flow of ClaimsFlow of Assertions -
  • -
  • -Passport Bearer TokenPassport-Scoped Access Token -
  • -
  • -Data OwnerData Controller -
  • -
- -

New terms

- -
    -
  • -Passport - A signed and verifiable JWT container for holding Visas.
  • -
  • -Passport Issuer - a service that creates and signs Passports.
  • -
  • -Token Endpoint – as defined by OIDC
  • -
  • -UserInfo Endpoint - as defined by OIDC
  • -
- -

Introduced Token Exchange mechanism

- -

The standardized mechanism for exchanging access tokens for other tokens defined in RFC 8693 OAuth 2.0 Token Exchange -was added and used for releasing Passports.

- -

Redefined Passport as a JWT containing Visas

- -

In version 1.0, Passport was defined as ”GA4GH-compatible access token along with the Passport Claim that is returned from Passport Broker service endpoints using such an access token“, -thus as a tuple of an access token and a list of Visas that can be obtained from UserInfo endpoint using the access token.

- -

In version 1.2, Passport is defined as “a signed and verifiable JWT container for holding Visas“, thus as a token that can be passed among systems.

- -

For backward compatibility with version 1.0, list of Visas is still provided as a claim value from UserInfo endpoint.

- -

Defined Passport Issuer

- -

A Passport Issuer is a service that creates and signs Passports. -A Broker is an OIDC Provider service that collects Visas from Visa Issuers and provides them to Passport Clearinghouses.

- -

Broker may optionally become a Passport Issuer by supporting Token Exchange for issuance of Passports.

- -

Brokers conforming to version 1.0 are still compatible with version 1.2, because Token Exchange support is optional.

- -

Added more signing algorithms

- -

The version 1.0 allowed only RS256 algorithm for JWT signing. -It is RSA-based algorithm using keys of size 2048 bits or larger and SHA-256 hash function.

- -

The AAI specification version 1.2 allows also the ES256 algorithm which is -ECDSA-based using P-256 elliptic curve and SHA-256 hash function.

- -

Elliptic Curve Cryptography allows much shorter keys and signatures than RSA. -A short Elliptic Curve key of around 256 bits provides the same security as a 3072 bit RSA key.

- -

For a detailed discussion of signing algorithms, see the article -JWTs: Which Signing Algorithm Should I Use?

- -

Media types for JWTs

- -

In version 1.0, all the mentioned JWTs (access tokens, visas) used in their typ (media type) header parameter -the generic value JWT that marks a generic JWT.

- -

In version 1.2, the typ header parameter is used to distinguish the various types of JWTs:

- -
    -
  • access tokens conforming to RFC9038 -use the value at+jwt -
  • -
  • Passports use the value vnd.ga4gh.passport+jwt -
  • -
  • Visas are recommended to use the value vnd.ga4gh.visa+jwt but allowed to use JWT -for backward compatibility with version 1.0
  • -
- -

Proposed Deprecations

- -

Visa Access Tokens (also referred to as Embedded Access Tokens)

- -

It is proposed that the 1.x versions of this specification will be the last to support -Visa Access Tokens. New implementations should issue Visas -as Visa Document Tokens.

- -
- -
- -
-
- - - diff --git a/draft-diagrams/changes-1_2_1.html b/draft-diagrams/changes-1_2_1.html deleted file mode 100644 index 1f8b16b..0000000 --- a/draft-diagrams/changes-1_2_1.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - -Changes in v1.2.1 | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

Changes in v1.2.1

-
- -
-

This document lists changes between 1.2 and 1.2.1

- -
    -
  • Added DURI Passport specs to AAI repository
  • -
  • Added table of versions
  • -
- - -
- -
- -
-
- - - diff --git a/draft-diagrams/check-links.py b/draft-diagrams/check-links.py deleted file mode 100644 index 502aea8..0000000 --- a/draft-diagrams/check-links.py +++ /dev/null @@ -1,92 +0,0 @@ -from bs4 import BeautifulSoup -import os -from pprint import pprint -import re - -anchors = set() -local_hrefs = set() -external_hrefs = set() - -for root, dirs, files in os.walk('build'): - for relpath in files: - if 'htm' in relpath: - with open(os.path.join(root, relpath)) as fh: - content = fh.read() - - if relpath == 'index.html': - base = '' - - base = relpath.replace('.html','') - - soup = BeautifulSoup(content, 'html.parser') - for link in soup.find_all('a'): - href = link.get('href') - name = link.get('name') - if href is None: - anchors.add(f"{base}#{name}") - #print("No href: "+str(link)) - else: - if href in ['/local/', - '/local/aai-openid-connect-profile', - '/local/aai-faq', - '/local/changes-1_2']: - pass - elif href.startswith('#'): - local_hrefs.add(f"{base}{href}") - else: - external_hrefs.add(href) - - for heading in ['h1','h2','h3', 'strong']: - for link in soup.find_all(heading): - id = link.get('id') - if id is not None: - anchors.add(f"{base}#{id}") - #print("No href: "+str(link)) - - - -line_links_from_duri_passport = """ -[GA4GH AAI OIDC Profile](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#terminology) -* **[Passport](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport)** -* **[Passport-Scoped Access Token](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport-scoped-access-token)** -* **[Passport Clearinghouse](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport-clearinghouse)** -* **[Visa Assertion](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-assertion)** -* **[Visa Assertion Source](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-assertion-source)** -* **[Visa Issuer](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-issuer)** -* **[Visa](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa)** -* **[JWT](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-jwt)** -* **[GA4GH Claim](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-ga4gh-claim)** -* **[Broker](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-broker)** -Please see the [Flow of Assertions](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#flow-of-assertions) - [GA4GH AAI Specification Visa formats](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-issued-by-visa-issuer) - [GA4GH AAI Specification](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md) -[Conformance for Visa Issuers](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#conformance-for-visa-issuers) - for [Visa Document Token Format](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-document-token-format) -- For [Visa Access Token Format](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-access-token-format) -- REQUIRED.The section [Signing Algorithms](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#signing-algorithms) -if the Visa is encoded as a [Visa Access Token](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-access-token-format). -""" - -print ("\n\nChecking anchors to which DURI passport links\n") -for line_from_duri in line_links_from_duri_passport.split('\n'): - #print(line_from_duri) - m = re.search(r'AAIConnectProfile.md#([^)]*)', line_from_duri) - if m: - target = f"aai-openid-connect-profile#{m.group(1)}" - if target in anchors: - print (f"valid {target}") - else: - print (f"INVALID ------ {target}") - -#pprint(anchors) - -print ("\n\nChecking links within AAI\n") -for local_href in local_hrefs: - if local_href in anchors: - print(f"valid {local_href}") - else: - print(f"INVALID ---- {local_href}") - -print ("\n\nListing links from AAI to external hrefs\n") -pprint(external_hrefs) - diff --git a/draft-diagrams/feed.xml b/draft-diagrams/feed.xml deleted file mode 100644 index 309f60c..0000000 --- a/draft-diagrams/feed.xml +++ /dev/null @@ -1 +0,0 @@ -Jekyll2023-12-21T14:16:31+00:00/data-security/draft-diagrams/feed.xmlGA4GH Data SecurityAAI \ No newline at end of file diff --git a/draft-diagrams/ga4gh-custom-visas.html b/draft-diagrams/ga4gh-custom-visas.html deleted file mode 100644 index ee2e7c0..0000000 --- a/draft-diagrams/ga4gh-custom-visas.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - -GA4GH Passport Custom Visa Registry | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

GA4GH Passport Custom Visa Registry

-
- -
-

GA4GH Passport Custom Visa Registry

- -

Introduction

- -

This document captures Passport Custom Visa -Types that have gone -through the GA4GH Passport custom visa proposal -process.

- -

For more information about this process, please refer to the Passport -Custom Visa Types -section of the Passport specification or reach out to maintainers -on the Update Procedure page.

- -

Custom Visa Registry

- - - - - - - - - - - - - - - - - - - - -
DateVisa NameVisa Type StringShort DescriptionDocumentation Links
2020-06-30NIH RAS Controlled Accesshttps://ras.nih.gov/visas/v1.1Multiple controlled access authorizations encoded into a single visa with a more detailed list of attributes per authorization. Currently encodes a detailed list of attribrutes that come from NIH’s dbGaP visa source repository.RAS Service Offerings
- -
- -
- -
-
- - - diff --git a/draft-diagrams/ga4gh-passport.html b/draft-diagrams/ga4gh-passport.html deleted file mode 100644 index 069fe4e..0000000 --- a/draft-diagrams/ga4gh-passport.html +++ /dev/null @@ -1,1669 +0,0 @@ - - - - - - - - -GA4GH Passport | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

GA4GH Passport

-
- -
-

GA4GH Passport

- -

Version: 1.2.1

- -

Work Stream Name: Data Use and Researcher Identity (DURI)

- -

Product Name: GA4GH Passport

- -

Product Description: This document provides the GA4GH technical -specification for a GA4GH Passport to be -consumed by Passport Clearinghouses in a -standardized approach to determine whether or not data access should be -granted. Additionally, the specification provides guidance on encoding -specific use cases, including -Visas for Registered Access as -described in the “Registered access: authorizing data -access” publication. -Refer to the Overview for an introduction to how data -objects and services defined in this specification fit together.

- -

Table of Contents

- -
    -
  • toc
  • -
- -

Terminology

- -

Inherited Definitions

- -

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be -interpreted as described in RFC 2119.

- -

This specification inherits terminology from the -GA4GH AAI OIDC Profile -specification, namely these terms:

- - - -

Term Definitions

- -

Passport Claim

- -
    -
  • -

    The ga4gh_passport_v1 claim. It is a GA4GH Claim -with a claim value being a list of Visas.

    -
  • -
  • -

    Visas from multiple Visa Issuers can be bundled together in the -same ga4gh_passport_v1 claim.

    -
  • -
  • -

    For example, the following structure encodes a Passport Claim:

    - -
    -
    "ga4gh_passport_v1" : [
    -    <Visa>,
    -    <Visa (if more than one)>,
    -    ...
    -]
    -
    -

    Visa Claim

    -
  • -
  • -

    The ga4gh_visa_v1 claim. It is a GA4GH Claim -with a claim value being a Visa Object.

    -
  • -
  • -

    For example, the following structure encodes a Visa Claim:

    - -
    -
    "ga4gh_visa_v1" : {
    -    "type": "<visa-type>",
    -    "asserted": <seconds-since-epoch>,
    -    "value": "<value-string>",
    -    "source": "<source-URL>",
    -}
    -
    -
  • -
- -

Visa Identity

- -
    -
  • The {sub, iss} pair of JWT standard claims (RFC7519 section -4.1.1) that are -included within a Visa that represents a -given user (sub for subject) within the issuer’s (iss) system.
  • -
- -

Visa Object

- -
    -
  • -

    A claim value for - the ga4gh_visa_v1 claim name. The claim value is a JSON object - that provides claims that describe Visa’s - properties that cannot be described by the standard JWT claims like sub or exp.

    -
  • -
  • -

    The ga4gh_visa_v1 claim is required to define a GA4GH v1 visa and - contains controlled vocabulary as defined in this document. This object - is not the entire visa, and there are other important claims within - Visa JWTs that MAY be specific to its visa type as well as other - JWT claims that are required as per this specification and the GA4GH - AAI OIDC specification.

    -
  • -
  • -

    For claim definitions, refer to the Visa Object Claims section of this specification.

    -
  • -
- -

Visa Type

- -
    -
  • -

    The “type” claim value of a Visa Object -that represents the semantics of the assertion and informs all parties -involved in the authoring or handling the assertion how to interpret -other Visa Object Claims.

    -
  • -
  • -

    For example, a Visa Type of “AffiliationAndRole” per the -Standard Visa Type Definitions -specifies the semantics of the Visa as well as the -expected encoding of the “value” claim value for this purpose.

    -
  • -
  • -

    In addition to Standard Visa Type Definitions, there -MAY also be Visas with Custom Visa Types.

    -
  • -
- -

Overview

- -

Please see the Flow of Assertions -section in the GA4GH AAI OIDC Profile specification for an overview of interaction among the specified parties.

- -

General Requirements

- -
    -
  1. -

    Each Visa may have a different expiry.

    -
  2. -
  3. -

    Visas MUST have an indication of -which organization made the Visa Assertion (i.e. the -“source” claim), but Visas do not generally indicate -individual persons involved in making the assertion (i.e. who assigned/signed -the assertion) as detailed identity information is not needed to make an -access decision.

    -
  4. -
  5. -

    Additional information about identity -that is not needed to make an access decision SHOULD not be included in the -Visas. Identity description, encoding audit details, other data -for non-access purposes are not the intent of these Visas, -and must be handled via other means beyond the scope of this specification -should they be needed for entities and systems with sufficient authority to -process such information.

    -
  6. -
  7. -

    The Passport Claim -MUST only be present in a response when Passport-Scoped Access Token is provided.

    -
  8. -
  9. -

    If the Broker is the Visa Issuer, -it MUST set the iss to itself and sign such Visas with an -appropriate private key as described in the GA4GH AAI OIDC specification.

    -
  10. -
  11. -

    Visas are designed for machine -interpretation only in order to make an access decision and is a non-goal to -support rich user interface requirements nor do these claims fully encode the -audit trail.

    -
  12. -
  13. -

    A Visa Object MAY -contain the “conditions” claim to restrict the Visa -to only be valid when the conditions are met.

    - -
      -
    • For example, an identity can have several affiliations and a -Visa with type “ControlledAccessGrants” MAY establish a -dependency on one of them being present in the Passport by using the -conditions claim.
    • -
    -
  14. -
  15. -

    Processing a Passport within a Passport Clearinghouse MUST abide by the following:

    - -
      -
    1. -

      Passport Clearinghouses MUST reject all requests that include Passports -that fail the necessary checks as described in the GA4GH AAI OIDC specification.

      -
    2. -
    3. -

      A Passport Clearinghouse MUST ignore all Visas it does not -need to process a particular request.

      -
    4. -
    5. -

      Passport Clearinghouses MUST ignore Passports and Visas -unless:

      - -
        -
      1. -

        The Passport Clearinghouse has sufficient trust relationships -with all of: the Broker, Visa Assertion Source, -Visa Issuer; or

        -
      2. -
      3. -

        The Passport Clearinghouse can rely on a trusted service that -provides sufficient trust of any of the Broker, -Visa Assertion Source and/or Visa Issuer -such that the Passport Clearinghouse can establish trust of all -three such parties.

        -
      4. -
      -
    6. -
    7. -

      When combining Visas with multiple Visa Identities for the purposes of evaluating -authorization, a Passport Clearinghouse MUST check the -LinkedIdentities Visas by trusted issuers -and ensure that trusted sources have asserted that these -Visa Identities represent the same end user.

      -
    8. -
    -
  16. -
- -

Support for User Interfaces

- -

(e.g. mapping a URI string to a human-readable description for a user -interface.)

- -

For example, a user interface mapping of -“https://doi.org/10.1038/s41431-018-0219-y” to a human readable description -such as “this person is a bona fide researcher as described by the ‘Registered -access: authorizing data access’ publication”.

- -

It is a non-goal for this specification to consider the processes and data for -the purpose of supporting user interfaces.

- -

Passport Claim Format

- -

The Passport Claim name maps to an array of Visas.

- -

Non-normative example of a set of Visas, encoded as JWS Compact Serialization strings:

- -
{
-  "ga4gh_passport_v1": [
-    "<eyJhbGciOiJI...aaa>",
-    "<eyJhbGciOiJI...bbb>"
-  ]
-}
-
- -

For a more reader-friendly example, see the Example Passport -Claim section of the specification.

- -

Visa Requirements

- -
    -
  • -

    Visas MUST conform to one of the -GA4GH AAI Specification Visa formats -as JWS Compact Serialization strings as defined by RFC7515 section -7.1.

    -
  • -
  • -

    Visa Issuers, Brokers, and Passport Clearinghouses -MUST conform to the -GA4GH AAI Specification -requirements for Visas in their use of Visas.

    -
  • -
  • -

    Validation, as outlined elsewhere in this specification and the -GA4GH AAI Specification, MUST be performed before Visas are -used for identity or authorization.

    -
  • -
- -

Visa Format

- -

Visas are signed JWTs encoded into strings using JWS Compact Serialization. -When decoded, their structure is:

- -
{
-  ["typ": "vnd.ga4gh.visa+jwt | at+jwt | JWT",]
-  "alg": "<signing-algorithm>",
-  ["jku": "<json-web-keys-set-URL>",]
-  "kid": "<signing-key-identifier>"
-}.
-{
-  "iss": "<issuer-URL>",
-  "sub": "<subject-identifier>",
-  ["scope": "openid ...",]
-  "jti": "<token-identifier>",
-  "iat": <seconds-since-epoch>,
-  "exp": <seconds-since-epoch>,
-  "ga4gh_visa_v1": {
-    "type": "<visa-type>",
-    "asserted": <seconds-since-epoch>,
-    "value": "<value-string>",
-    "source": "<source-URL>",
-    ["conditions": [...],]
-    ["by": "<by-identifier>"]
-  }
-}.<signature>
-
-

The standard JWT payload claims iss, sub, iat, exp are all REQUIRED.

- -

One of scope or jku MUST be present as described in -Conformance for Visa Issuers -within the AAI specification.

- -

Claims within the ga4gh_visa_v1 Visa Object are as described -in the Visa Object Claims section of this specification.

- -

typ

- -
    -
  • OPTIONAL. The value of the typ header claim is RECOMMENDED to be vnd.ga4gh.visa+jwt -for Visa Document Token Format -visas. The value JWT marking general JWTs MAY also be used.
  • -
  • For Visa Access Token Format -visas the value is unspecified, but it would likely be at+jwt as required by section 2.1 of RFC 9068 -for JWT access tokens.
  • -
  • The typ header claim is specified by section 5.1 of JWT RFC -to contain media type of the JWT for disambiguation. -The full recommended media type for GA4GH Visas is application/vnd.ga4gh.visa+jwt where the subtype consist of -the “vendor tree” prefix vnd, the “producer name” ga4gh, and the “product designation” visa -followed by the +jwt structured syntax suffix (specified in section 3.2 -and section 4.2.8 of RFC 6838). -Then section 4.1.9 of JWS RFC recommends to omit the prefix -application/ to keep messages compact.
  • -
- -

alg

- -
    -
  • REQUIRED.The section Signing Algorithms -in the AAI specification lists possible algorithms used in the alg header claim.
  • -
- -

exp

- -
    -
  • -

    REQUIRED. Generally, it is seconds since unix epoch of when the -Visa Assertion Source -requires such an assertion to be no longer valid. A Visa -Assertion Source MAY choose to make an assertion very long lived. -However, a Visa Issuer MAY -choose an earlier timestamp in order to limit the assertion’s duration -within downstream Passport Clearinghouses.

    -
  • -
  • -

    Access is NOT necessarily removed by the exp timestamp. Instead, -this timestamp may be viewed as a cut-off after which no new access -will be granted and action to remove any existing access may -commence anytime shortly after this cut-off period.

    -
  • -
  • -

    Its use by a Passport Clearinghouse is described in the -Visa Expiry section and -Token Revocation section.

    -
  • -
- -

Visa Object Claims

- -

Although standard claims within a Visa Object -are defined in this section, other claims MAY exist within the object -and should be ignored by any Passport Clearinghouse that is not familiar -with the use of such claims. Claim names are reserved for definition by -GA4GH (or a body it elects).

- -

type

- - - -

asserted

- -
    -
  • -

    REQUIRED. Seconds since unix epoch that represents when the - Visa Assertion Source made the claim.

    -
  • -
  • -

    Note that the standard iat JWT claim on the Visa reflects the timestamp - of when the Visa was minted whereas the asserted claim - reflects when the Visa Assertion Source made the assertion.

    -
  • -
  • -

    asserted MAY be used by a Passport Clearinghouse as described in the - Visa Expiry section.

    -
  • -
  • -

    If a Visa Assertion repository does not include enough - information to construct an asserted timestamp, a Visa Issuer MAY use a recent timestamp (for - example, the current timestamp) if the Visa Assertion repository - is kept up to date such that the Visa Issuer can ensure that - the assertion is valid at or near the time of minting the Visa. - However, generally it is RECOMMENDED to have the - Visa Assertion repository provide more accurate asserted information.

    -
  • -
- -

value

- -
    -
  • -

    REQUIRED. A string that represents any of the scope, process, identifier and - version of the assertion. The format of the string can vary by the - Visa Type.

    -
  • -
  • -

    For example, value: "https://doi.org/10.1038/s41431-018-0219-y" when type: "ResearcherStatus" - represents a version of Registered Access Bona Fide - researcher status. Note that Registered Access requires more than one - Visa as outlined in the Registered - Access section.

    -
  • -
  • -

    For the purposes of enforcing its policies for access, a Passport - Clearinghouse evaluating the value claim MUST:

    - -
      -
    • -

      Validate URL strings as per the URL Claim -requirements if the Visa Type definition indicates the value -is a URL (as indicated by the type claim).

      -
    • -
    • -

      Value strings MUST be full string case-sensitive matches -unless the Visa Type defines a safe and reliable format for -partitioning the value into substrings and matching on the various -substrings. For example, the standard -AffiliationAndRole Visa Type can be -reliably partitioned by splitting the string at the first “@” sign if such -exists, or otherwise producing an error (i.e. denying permission).

      -
    • -
    -
  • -
- -

source

- -
    -
  • -

    REQUIRED. A URL Claim that provides at a minimum the -organization that made the assertion. If there is no organization -making the assertion, the source claim value MUST be set to -“https://no.organization”.

    -
  • -
  • -

    For complex organizations that may require more specific information -regarding which part of the organization made the assertion, this claim MAY -also encode some substructure to the organization that represents the -origin of the authority of the assertion. When this approach is chosen, then:

    - -
      -
    • -

      The additional substructure MUST only encode the sub-organization or -department but no other details or variables that would make it -difficult to enumerate the full set of possible values or cause Passport -Clearinghouses confusion about which URLs to whitelist.

      -
    • -
    • -

      The additional information SHOULD be encoded into the subdomain or path -whenever possible and SHOULD generally avoid the use of query parameters -or anchors to represent the sub-organization.

      -
    • -
    • -

      Some organizations MAY wish to attribute the source to a particular -Data Access Committee (DAC), especially for -ControlledAccessGrants Visa Types. -For example:

      - -

      source: "https://www.ebi.ac.uk/ega/dacs/EGAC00000000001"

      - -

      could represent one particular logical “DAC” organization as referred -to by the EBI organization, and could be maintained by the EBI as a -permanent identifier for this DAC.

      -
    • -
    -
  • -
- -

conditions

- -
    -
  • -

    OPTIONAL. A set of conditions on a -Visa Object indicates that the Visa is -only valid if the clauses of the conditions match other Visas -elsewhere in the Passport and such content is both valid -(e.g. hasn’t expired; signature of Visa has been verified against -the public key; etc.) and if such content is accepted by the Passport -Clearinghouse (e.g. the issuer is trusted; the source claim meets any -policy criteria that has been established, etc.).

    -
  • -
  • -

    A Passport Clearinghouse MUST always check for the presence of -the conditions claim and if present it MUST only accept the -Visa if it can confirm that the conditions have been met.

    -
  • -
  • -

    Although it is RECOMMENDED to always implement full condition checking -capabilities as described in this section, if a Passport Clearinghouse will be -deployed for a more limited purpose where it is not expected to ever receive -Visas with conditions, then such a Passport Clearinghouse MAY choose to -not implement full condition checking. However, even in this case it MUST -still check for the presence of the conditions claim on Visa -Objects and reject (ignore) any Visas that contain a non-empty -conditions claim value. Likewise if not all condition matching algorithms -are implemented, it MUST reject any Visas that contain patterns -that are not supported.

    -
  • -
  • -

    Format:

    - -
    -
    "conditions": [
    -  [
    -    { // Condition clause 1
    -      "type": "<visa-type>",
    -      "<visa-object-claim-name-1>": "<match-type>:<match-value>",
    -      "<visa-object-claim-name-2>": "<match-type>:<match-value>",
    -      ...
    -    }, // AND
    -    { // Condition clause 2
    -      ...
    -    }
    -  ], // OR
    -  [
    -    { // Condition clause 3
    -      "type": "<visa-type>",
    -      "<visa-object-claim-name>": "<match-type>:<match-value>",
    -      ...
    -    }
    -  ],
    -  ...
    -]
    -
    -
  • -
  • -

    The conditions value is a two-nested-lists structure in Disjunctive -Normal Form:

    - -
      -
    • -

      The outer level list is a set of OR clauses

      -
    • -
    • -

      The inner level list is a set of AND clauses that contain “Condition -Clauses”

      -
    • -
    • -

      A Condition Clause MUST specify a “type” claim with a value as a -Visa Type plus it MUST include at least one other claim with a -name that matches a valid Visa Object claim name.

      -
    • -
    • -

      The values of Condition Clause claims MUST have a string prefix followed -by a colon and then string suffix, except for type where it MUST be -assumed to be “const” and is not specified.

      - -
        -
      • -

        If prefix is “const”, then suffix MUST use case sensitive full string -matching.

        -
      • -
      • -

        If prefix is “pattern”, then suffix MUST use full string Pattern -Matching to match input.

        -
      • -
      • -

        If prefix is “split_pattern”, then the full suffix MUST use full -string Pattern Matching on each full -substring from splitting the corresponding Visa Object -claim value that is being compared by the “;” character. If any one -full substring matches, then the Condition Clause claim has found a -match. “split_pattern” SHOULD only be used on claims where the -Visa Type has been specified in a format that makes splitting -on this character to be reliable, such as URI-encoded substrings with -semicolon separators (see LinkedIdentities as an -example).

        - -
          -
        • For example: a Condition Clause claim value of -“split_pattern:123,https:%2F%2Fexample?.org” will match a -Visa Object claim value of -“001,https::%2F%2Fexample1.org;123,https::%2F%2Fexample2.org;456,https::%2F%2Fexample3.org” -because this comparison value will be split into: -
          -
          [
          -  "001,https::%2F%2Fexample1.org",
          -  "123,https::%2F%2Fexample2.org",
          -  "456,https::%2F%2Fexample3.org"
          -]
          -
          -

          and the second entry in that list is a match using the Pattern -Matching definition with 123,https:%2F%2Fexample?.org as the -pattern to use.

          -
        • -
        -
      • -
      • -

        If prefix is unknown or unsupported, then the Condition Clause must -fail to match.

        -
      • -
      -
    • -
    -
  • -
  • -

    Condition Clause claims are restricted to only Visa Object Claims -(e.g. value, source, etc.) with string value -definitions.

    - -
      -
    • -

      It MUST NOT include conditions (i.e. a condition cannot be placed on -another condition)

      -
    • -
    • -

      It MUST NOT contain a timestamp claim such as asserted.

      -
    • -
    -
  • -
  • -

    The Passport Clearinghouse MUST verify that for each Condition Clause -present, there exists a valid single corresponding -Visa Object such that:

    - -
      -
    • -

      Checking the correctness of the Condition Clause MUST be performed first. -For example, a type claim MUST be present.

      -
    • -
    • -

      Ignore Visa Objects that have the conditions claim present. -This will avoid deep nesting of condition evaluation (i.e. avoid condition -loops, stack overflows, etc).

      -
    • -
    • -

      A Condition Clause claim matches when the <match-type> algorithm -matches a corresponding Visa Object’s claim in the Passport.

      -
    • -
    • -

      Visa Object Claims that are not specified -in the Condition Clause are not required to match (i.e. any value will be -accepted within that claim, including if the claim is not present in the -Visa Object).

      -
    • -
    • -

      All Condition Clause claims that are specified within one Condition -Clause MUST match the same Visa Object in the Passport.

      -
    • -
    -
  • -
  • -

    Non-normative example:

    - -
    -
    "conditions": [
    -  [
    -    {
    -      "type": "AffiliationAndRole",
    -      "value": "const:faculty@uni-heidelberg.de",
    -      "by": "const:so"
    -    }, // AND
    -    {
    -      "type": "ResearcherStatus",
    -      "value": "const:https://doi.org/10.1038/s41431-018-0219-y",
    -    }
    -  ], // OR
    -  [
    -    {
    -      "type": "AffiliationAndRole",
    -      "value": "pattern:faculty@*",
    -      "source": "const:https://visas.elixir.org"
    -      "by": "const:system"
    -    }
    -  ]
    -]
    -
    - -

    Would match a corresponding AffiliationAndRole assertion within the same -Visa Object that has any of the following:

    - -
      -
    • -

      On “Visa match 1”:

      - -
        -
      • -

        type = “AffilationAndRole”; AND

        -
      • -
      • -

        value = “faculty\@uni-heidelberg.de”; AND

        -
      • -
      • -

        by = “so”

        -
      • -
      - -

      AND on any other Visa as well as checking “Visa match 1”:

      - - -
    • -
    • -

      OR, alternative acceptance is matching just one Visa:

      - -
        -
      • -

        type = “AffilationAndRole”; AND

        -
      • -
      • -

        value starts with “faculty\@”; AND

        -
      • -
      • -

        source = “https://visas.elixir.org”; AND

        -
      • -
      • -

        by = “system”

        -
      • -
      -
    • -
    -
  • -
- -
Pattern Matching
- -
    -
  • -

    Pattern Matching is only for use as specified by -“conditions”.

    -
  • -
  • -

    MUST Use full string case-sensitive character pattern comparison.

    -
  • -
  • -

    MUST support special meaning characters as the specification of patterns:

    - -
      -
    • -

      ? : A <question-mark> is a pattern that SHALL match any single -character.

      -
    • -
    • -

      * : An <asterisk> is a pattern that SHALL match multiple characters:

      - -
        -
      • -

        Match any string, including the empty string and null string.

        -
      • -
      • -

        Match the greatest possible number of characters that still allows -the remainder of the pattern to match the string.

        -
      • -
      -
    • -
    -
  • -
  • -

    There is no escape character for special characters such as patterns. -? is always treated as the <question-mark> pattern and * is always -treated as the <asterisk> pattern.

    -
  • -
  • -

    A method evaluating a pattern on a string of input SHALL return a true if -the input has found one or more possible ways to match or false if it does -not.

    -
  • -
- -

by

- -
    -
  • -

    OPTIONAL. The level or type of authority within the “source” organization -of the assertion.

    -
  • -
  • -

    A Passport Clearinghouse MAY use this claim as part of an authorization -decision based on the policies that it enforces.

    -
  • -
  • -

    Fixed vocabulary values for this claim are:

    - -
      -
    • -

      self: The Visa Identity for which the assertion is being made -and the person who made the assertion is the same person.

      -
    • -
    • -

      peer: A person at the source organization has made this assertion on -behalf of the Visa Identity’s person, and the person who is making -the assertion has the same Visa Type and value in that source -organization. The source claim represents the peer’s -organization that is making the assertion, which is not necessarily -the same organization as the Visa Identity’s organization.

      -
    • -
    • -

      system: The source organization’s information system has made the -assertion based on system data or metadata that it stores.

      -
    • -
    • -

      so: The person (also known as “signing official”) making the assertion -within the source organization possesses direct authority (as part of -their formal duties) to bind the organization to their assertion that the -Visa Identity did possess such authority at the time the -assertion was made.

      -
    • -
    • -

      dac: A Data Access Committee or other authority that is responsible -as a grantee decision-maker for the given value and source claims -pair.

      -
    • -
    -
  • -
  • -

    If this claim is not provided, then none of the above values can be assumed -as the level or type of authority and the authority MUST be assumed to be -“unknown”. Any policy expecting a specific value as per the list above MUST -fail to accept an “unknown” value.

    -
  • -
- -

URL Claims

- -

A Visa Object Claim that is defined as being of URL -format (see RFC3986 section -1.1.3) with the following -limitations:

- -
    -
  1. -

    For the purposes of evaluating access, the URL MUST be treated as a simple -unique persistent string identifier.

    -
  2. -
  3. -

    The URL is a canonical identifier and as such it is important that Passport -Clearinghouses MUST match this identifier consistently using a -case-sensitive full string comparison.

    - -
      -
    • -

      If TLS is available on the resource, then its persistent identifier URL -SHOULD use the “https” scheme even if the resource will also resolve using -the “http” scheme.

      -
    • -
    • -

      When the URL is being used to represent an organization or a well defined -child organization within a “source” claim, it is RECOMMENDED -to use a URL as a persistent organizational ontology identifier, whether -managed directly or by a third-party service such as -GRID when reasonable to do so.

      -
    • -
    -
  4. -
  5. -

    The URL SHOULD also be as short as reasonably possible while avoiding -collisions, and MUST NOT exceed 255 characters.

    -
  6. -
  7. -

    The URL MUST NOT be fetched as part of policy evaluation when making an -access decision. For policy evaluation, it is considered an opaque string.

    -
  8. -
  9. -

    URLs SHOULD resolve to a human readable document for a policy maker to -reason about.

    -
  10. -
- -

GA4GH Standard Visa Type Definitions

- -

Note: in addition to these GA4GH standard Visa Types, there is also -the ability to for a Visa Issuer to encode Custom Visa Types.

- -

AffiliationAndRole

- -
    -
  • -

    The Visa Identity’s role within the identity’s affiliated institution -as specified by one of the following:

    - -
      -
    • -

      eduPersonScopedAffiliation -attributed value of: faculty, student, or member.
      -This term is defined by eduPerson by the affiliated organization -(organization after the \@-sign).

      - -
        -
      • -

        Example: “faculty\@cam.ac.uk”

        -
      • -
      • -

        Note: based on the eduPerson specification, it is possible that -institutions use a different definition for the meaning of “faculty” -ranging from “someone who does research”, to “someone who teaches”, -to “someone in education that works with students”.

        -
      • -
      -
    • -
    • -

      A custom role that includes a namespace prefix followed by a dot (“.”) -where implementers introducing a new custom role MUST coordinate -with GA4GH (or a body it elects) to align custom role use cases in order -to maximize interoperability and avoid fragmentation across -implementations.

      - -
        -
      • -

        Non-normative example: “ega.researcher\@med.stanford.edu” where “ega” -is the namespace and “researcher” is the custom role within that -namespace.

        -
      • -
      • -

        Custom roles and their prefixes MUST be limited to characters: a-z, -dash (“-“), underscore (“_”), digits (0-9). Custom roles and prefixes -MUST start with characters a-z.

        -
      • -
      -
    • -
    -
  • -
  • -

    If there is no affiliated institution associated with a given assertion, the -affiliation portion of AffliationAndRole MUST be set to “no.organization”.

    - -
      -
    • Example: “public.citizen-scientist\@no.organization”
    • -
    -
  • -
  • -

    AffiliationAndRole can be safely partitioned into a {role, affiliation} pair -by splitting the value string at the first “@” sign.

    -
  • -
- -

AcceptedTermsAndPolicies

- -
    -
  • -

    The Visa Identity or the - “source” organization has acknowledged the specific terms, - policies, and conditions (or meet particular criteria) as indicated by the - value claim.

    -
  • -
  • -

    The value claim value conforms to URL Claim format.

    -
  • -
  • -

    The URL SHOULD resolve to a public-facing, human readable web page that - describe the terms and policies.

    -
  • -
  • -

    Example value: "https://doi.org/10.1038/s41431-018-0219-y" - acknowledges ethics compliance for a particular version of Registered - Access. Note that more - Visas are needed to meet the requirements for Registered - Access status.

    -
  • -
  • -

    MUST include the “by” claim.

    -
  • -
- -

ResearcherStatus

- -
    -
  • -

    The person has been acknowledged to be a researcher of a particular type or -standard.

    -
  • -
  • -

    The value claim conforms to URL Claim format, and it -indicates the minimum standard and/or type of researcher that describes -the person represented by the given Visa Identity.

    -
  • -
  • -

    The URL SHOULD resolve to a human readable web page that describes the -process that has been followed and the qualifications this person has met.

    -
  • -
  • -

    Example value: "https://doi.org/10.1038/s41431-018-0219-y" -acknowledges a particular version of the registration process as needed -for Registered Access Bona Fide researcher -status. Note that more Visas are needed to meet -the requirements for Registered Access status.

    -
  • -
- -

ControlledAccessGrants

- -
    -
  • -

    A dataset or other object for which controlled access has been granted to -this Visa Identity.

    -
  • -
  • -

    The value claim conforms to URL Claim format.

    -
  • -
  • -

    The source claim contains the access grantee organization.

    -
  • -
  • -

    MUST include the “by” claim.

    -
  • -
- -

LinkedIdentities

- -
    -
  • -

    The identity as indicated by the {“sub”, “iss”} pair (aka -Visa Identity) of the -Visa is the same as the identity or identities listed -in the “value” claim.

    -
  • -
  • -

    The “value” claim format is a semicolon-delimited list of -“<uri-encoded-sub>,<uri-encoded-iss>” entries with no added whitespace -between entries.

    - -
      -
    • -

      The “sub” and “iss” that are used to encode the “value” claim do -not need to conform to URL Claim -requirements since they must match the corresponding Visa -“sub” and “iss” claims that may be issued.

      -
    • -
    • -

      By URI encoding (RFC 3986) the -“iss”, special characters (such as “,” and “;”) are encoded within the URL -without causing parsing conflicts.

      -
    • -
    • -

      Example: -“123456,https%3A%2F%2Fexample.org%2Fa%7Cb%2Cc;7890,https%3A%2F%2Fexample2.org”.

      -
    • -
    -
  • -
  • -

    The “source” claim refers to the Visa Assertion -Source that is making the assertion. This is -typically the same organization as the Visa -Issuer (iss) that signs the Visa, but the -source MAY also refer to another Visa Assertion Source depending -on which organization collected the information.

    -
  • -
  • -

    As a non-normative example, if a policy needs 3 Visas and -there are three Visas that meet the criteria on one Passport -but they use 3 different sub values (“1234”, “567”, “890123”), then -any of the following, if from a trusted issuers and sources, may -allow these Visas to be combined (shown with JSON payload only -and without the REQUIRED URI-encoding in order to improve readability of -the example).

    - -
      -
    1. -

      One Visa that links 3 Visa Identities together.

      - -
      -
      {
      -  "iss": "https://example1.org/oidc",
      -  "sub": "1234",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "567,https://example2.org/oidc;890123,https://example3.org/oidc",
      -    "source": "https://example1.org/oidc"
      -    ...
      -  }
      -}
      -
      - -

      or

      -
    2. -
    3. -

      One Visa that links a superset of Visa -Identities together.

      - -
      -
      {
      -  "iss": "https://example0.org/oidc",
      -  "sub": "00001",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value":
      -      "1234,http://example1.org/oidc;567,http://example2.org/oidc;890123,http://example3.org/oidc;sub4,http://example4.org/oidc"
      -    "source": "https://example0.org/oidc"
      -    ...
      -  }
      -}
      -
      - -

      or

      -
    4. -
    5. -

      Multiple Visas that chain together a set or superset -of Visa Identities.

      - -
      -
      {
      -  "iss": "https://example1.org/oidc",
      -  "sub": "1234",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "567,https://example2.org/oidc",
      -    "source": "https://example1.org/oidc"
      -    ...
      -  }
      -},
      -{
      -  "iss": "https://example2.org/oidc",
      -  "sub": "567",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "890123,https://example3.org/oidc",
      -    "source": "https://example2.org/oidc"
      -    ...
      -  }
      -}
      -
      -
    6. -
    -
  • -
- -

Custom Visa Types

- -
    -
  • -

    In addition to the -GA4GH Standard Visa Type Definitions, -Visas MAY be added using custom type names so long as the -encoding of these Visas will abide by the requirements described -elsewhere in this specification.

    -
  • -
  • -

    Custom Visa Types MUST limit personally identifiable information -to only that which is necessary to provide authorization.

    -
  • -
  • -

    The custom type name MUST follow the format prescribed in the -URL Claims section of the specification.

    -
  • -
  • -

    Implementers introducing a new custom type name MUST coordinate with the -GA4GH (or a body it elects) to align custom type use cases to maximize -interoperability and avoid unnecessary fragmentation across implementations.

    - -
      -
    • -

      To review the custom visa registry, including any visa descriptions, -examples and links that have been provided through proposals using this -process, visit the Custom Visa Type Registry -page.

      -
    • -
    • -

      Documentation on encoding and interpreting the claims SHOULD -be provided as part of the proposal and for inclusion in a public custom -visa type registry maintained by GA4GH. This documentation SHOULD also include -examples and links to relevant documentation and/or open source software -that MAY be available.

      -
    • -
    -
  • -
  • -

    Passport Clearinghouses MUST ignore all Visas containing a custom -type name that they do not support.

    -
  • -
  • -

    Non-normative example custom type name:
    -type: "https://example.org/passportVisaTypes/researcherStudies".

    -
  • -
- -

Encoding Use Cases

- -

Use cases include, but are not limited to the following:

- -

Registered Access

- -
    -
  • -

    To meet the requirements of Registered Access to data as defined by -publication https://doi.org/10.1038/s41431-018-0219-y as a specific -version of Registered Access, a user needs to have all of the following -Visas:

    - -
      -
    1. -

      Meeting the ethics requirements is represented by:

      - -
        -
      • -

        type: "AcceptedTermsAndPolicies"; and

        -
      • -
      • -

        value: "https://doi.org/10.1038/s41431-018-0219-y"

        -
      • -
      -
    2. -
    3. -

      Meeting the bona fide status is represented by:

      - -
        -
      • -

        type: "ResearcherStatus"; and

        -
      • -
      • -

        value: "https://doi.org/10.1038/s41431-018-0219-y"

        -
      • -
      -
    4. -
    -
  • -
  • -

    If other versions of Registered Access are introduced, then the value -claims for AcceptedTermsAndPolicies as well as ResearcherStatus MAY -refer to the document or publication or sections thereof to act as the -permanent identifiers for such versions of Registered Access.

    -
  • -
  • -

    The Passport Clearinghouse (e.g. to -authorize a registered access beacon) needs to evaluate the -multiple Visas listed above to ensure their values match -before granting access.

    - - -
  • -
- -

Controlled Access

- -
    -
  • -

    Controlled Access to data utilizes the following Visa Types:

    - -
      -
    • -

      MUST utilize one or more -ControlledAccessGrants and/or custom -controlled access visa type(s) for permissions associated with specific -data or datasets. There MAY be more standard visa types introduced for -encoding controlled access in future revisions of the Passport -specification.

      -
    • -
    • -

      MAY utilize the conditions claim on -“ControlledAccessGrants” to cause such a grant to require -a Visa from a trusted Visa Assertion Source to -assert that the identity has a role within a specific organization. -This can be achieved by using the -AffiliationAndRole Visa Type on -the conditions.

      -
    • -
    • -

      MAY utilize any other valid Visa Type or conditions claim -that may be required to meet controlled access policies.

      -
    • -
    -
  • -
- -

Visa Expiry

- -

In addition to any other policy restrictions that a Passport Clearinghouse -may enforce, Passport Clearinghouses that provide access for a given -duration provided by the user (excluding any revocation policies) MUST -enforce one of the following algorithm options to ensure that Visa -expiry is accounted for:

- -

Option A: use the following algorithm to determine if the Visa -is valid for the entire duration of the requested duration:

- -
now()+requestedTTL < min(token.exp, token.ga4gh_visa_v1.asserted+maxAuthzTTL)
-
- -

Where:

- -
    -
  • -

    requestedTTL represents the duration for which access is being requested. -Alternatively a solution may choose to have a stronger revocation policy -instead of requiring such a duration.

    -
  • -
  • -

    maxAuthzTTL represents any additional expiry policy that the Passport -Clearinghouse may choose to enforce. If this is not needed, it can -effectively ignored by using a large number of years or otherwise have -token.ga4gh_visa_v1.asserted+maxAuthzTTL removed and simplify the right -hand side expression accordingly.

    -
  • -
- -

Option B: if tokens are sufficiently short lived and/or the authorization -system has an advanced revocation scheme that does not need to specify a -maxAuthzTTL as per Option A, then the check can be simplified:

- -
now()+accessTokenTTL < token.exp
-
- -

Where:

- -
    -
  • -

    accessTokenTTL represents the duration for which an access token will be -accepted and is bounded by the next refresh token cycle or Access Token -Polling -cycle or any larger propagation delay before access is revoked, which -needs to be assessed based on the revocation model.

    - -
      -
    • For example, accessTokenTTL may be set to one hour, after which time -more access tokens may be minted using a corresponding refresh token if -it has not yet been revoked.
    • -
    -
  • -
- -

Expiry when using multiple Visas: if multiple Visas are -required as part of an access policy evaluation, then the expiry to be used MUST -be the minimum expiry timestamp, as calculated by the appropriate option above, -across all Visas (token set) that were accepted as part of evaluating -the access policy.

- -

Token Revocation

- -

As per the GA4GH AAI Specification on Token -Revocation, -the following mechanisms are available within Visa:

- -
    -
  1. -

    Visa Objects have an “asserted” claim to allow -downstream policies to limit the life, if needed, of how long assertions -will be accepted for use with access and refresh tokens.

    -
  2. -
  3. -

    Visas have an “exp” claim to allow Brokers and -Passport Clearinghouses to limit the duration of access.

    -
  4. -
- -

At a minimum, these Visa Claims MUST be checked by all Passport -Clearinghouses and systems MUST be in place to begin to take action to remove access -by the expiry timestamp or shortly thereafter. Propagation of these permission -changes may also require some reasonable delay.

- -

Systems employing Visas MUST provide mechanisms to -limit the life of access, and specifically MUST conform to the GA4GH AAI -Specification requirements in this regard. Systems utilizing Visas MAY also -employ other mechanisms outlined in the GA4GH AAI Specification, such as Access -Token Polling -if the Visa is encoded as a Visa Access Token.

- -

Example Passport Claim

- -

This non-normative example illustrates a Passport Claim -that has Visas representing Registered Access bona fide researcher -status along with other Visas for access to specific Controlled Access -data. The Visa Types for this example are:

- -
    -
  • -

    AffiliationAndRole: The person is a member of faculty at Stanford -University as asserted by a Signing Official at Stanford.

    -
  • -
  • -

    ControlledAccessGrants: The person has approved access by the DAC at the -Example Institute for datasets 710 and approval for dataset 432 for a dataset -from EGA.

    - -
      -
    • -

      In this example, assume dataset 710 does not have any -“conditions” based on the -AffiliationAndRole because the system that is asserting the assertion has an -out of band process to check the researcher’s affiliation and role and -withdraw the dataset 710 claim automatically, hence it does not need the -conditions claim to accomplish this.

      -
    • -
    • -

      In this example, assume that dataset 432 does not use an out of band -mechanism to check affiliation and role, so it makes use of the -“conditions” claim mechanism to -enforce the affiliation and role. The dataset 432 assertion is only valid if -accompanied with a valid AffiliationAndRole claim for -“faculty\@med.stanford.edu”.

      -
    • -
    -
  • -
  • -

    AcceptedTermsAndPolicies: The person has accepted the Ethics terms and -conditions as defined by Registered Access. They took this action -themselves.

    -
  • -
  • -

    ResearcherStatus: A Signing Official at Stanford Medicine has asserted -that this person is a bona fide researcher as defined by the Registered -Access model.

    -
  • -
  • -

    LinkedIdentities: A Broker at example3.org has provided -software functionality to allow a user to link their own accounts together. -After the user has successfully logged into the two accounts and passed all -auth challenges, the Broker added the -LinkedIdentities Visa for those two accounts: -(1) “10001” from example1.org, and (2) “abcd” from example2.org. -Since the Broker is signing the “LinkedIdentities” -Visa, it is acting as the Visa Issuer.

    -
  • -
- -

Normally a Passport like this would include Visa -Format entries as JWS Compact Serialization strings, -however this example shows the result after the Visas have been -unencoded into JSON (and reduced to include only the payload) to be more -reader-friendly.

- -
"ga4gh_passport_v1": [
-    {
-        "iat": 1580000000,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "AffiliationAndRole",
-            "asserted": 1549680000,
-            "value": "faculty@med.stanford.edu",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "so"
-        }
-    },
-    {
-        "iat": 1580000100,
-        "exp": 1581168872,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ControlledAccessGrants",
-            "asserted": 1549632872,
-            "value": "https://example-institute.org/datasets/710",
-            "source": "https://grid.ac/institutes/grid.0000.0a",
-            "by": "dac"
-        }
-    },
-    {
-        "iat": 1580000200,
-        "exp": 1581168000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ControlledAccessGrants",
-            "asserted": 1549640000,
-            "value": "https://ega-archive.org/datasets/EGAD00000000432",
-            "source": "https://ega-archive.org/dacs/EGAC00001000205",
-            "by": "dac"
-            "conditions": [
-                [
-                    {
-                        "type": "AffiliationAndRole",
-                        "value": "const:faculty@med.stanford.edu",
-                        "source": "const:https://grid.ac/institutes/grid.240952.8",
-                        "by": "const:so"
-                    }
-                ],
-                [
-                    {
-                        "type": "AffiliationAndRole",
-                        "value": "const:faculty@med.stanford.edu",
-                        "source": "const:https://grid.ac/institutes/grid.240952.8",
-                        "by": "const:system"
-                    }
-                ]
-            ],
-        }
-    },
-    {
-        "iss": "https://issuer.example1.org/oidc",
-        "sub": "10001",
-        "iat": 1580000300,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "AcceptedTermsAndPolicies",
-            "asserted": 1549680000,
-            "value": "https://doi.org/10.1038/s41431-018-0219-y",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "self"
-        }
-    },
-    {
-        "iss": "https://other.example2.org/oidc",
-        "sub": "abcd",
-        "iat": 1580000400,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ResearcherStatus",
-            "asserted": 1549680000,
-            "value": "https://doi.org/10.1038/s41431-018-0219-y",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "so"
-        }
-    },
-    {
-        "iss": "https://broker.example3.org/oidc",
-        "sub": "999999",
-        "iat": 1580000500,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "LinkedIdentities",
-            "asserted": 1549680000,
-            "value": "10001,https:%2F%2Fissuer.example1.org%2Foidc;abcd,https:%2F%2Fother.example2.org%2Foidc",
-            "source": "https://broker.example3.org/oidc",
-            "by": "system"
-        }
-    }
-]
-
- -
- -
- -
-
- - - diff --git a/draft-diagrams/index.html b/draft-diagrams/index.html deleted file mode 100644 index 2bcf0b2..0000000 --- a/draft-diagrams/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - -GA4GH Data Security | AAI - - - - - - - - - - - - - - - - - - -
-
-
-

Authentication and Authorization Infrastructure (AAI)

- - -
- -
-
- - - diff --git a/draft-diagrams/install-and-serve b/draft-diagrams/install-and-serve deleted file mode 100755 index 3cc18d1..0000000 --- a/draft-diagrams/install-and-serve +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/ash -bundle install -bundle exec jekyll serve --host "0.0.0.0" \ No newline at end of file diff --git a/draft-diagrams/versions.html b/draft-diagrams/versions.html deleted file mode 100644 index 58e16ee..0000000 --- a/draft-diagrams/versions.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - -Version History | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
- - -
-
- - - diff --git a/driver-project-usage/AAI/AbstractAAI.drawio.svg b/driver-project-usage/AAI/AbstractAAI.drawio.svg deleted file mode 100644 index 67b2770..0000000 --- a/driver-project-usage/AAI/AbstractAAI.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Broker
Broker
Clearinghouse
Clearinghouse
Text is not SVG - cannot display
\ No newline at end of file diff --git a/driver-project-usage/AAI/GA4GH_JWT-only_flow.png b/driver-project-usage/AAI/GA4GH_JWT-only_flow.png deleted file mode 100644 index b1c50b3..0000000 Binary files a/driver-project-usage/AAI/GA4GH_JWT-only_flow.png and /dev/null differ diff --git a/driver-project-usage/AAI/LifeScienceAAI.drawio.svg b/driver-project-usage/AAI/LifeScienceAAI.drawio.svg deleted file mode 100644 index efcd988..0000000 --- a/driver-project-usage/AAI/LifeScienceAAI.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
eduGAIN IdP
eduGAIN IdP
eduGAIN IdP
eduGAIN IdP

Google
Google

ORCID
ORCID
LS username
+
 password
LS username...
REMS Finland
(Resource Entitlement Management System, )
visa issuer
REMS Finland...
...
...
...
...
ControlledAccessGrants
visas
ControlledAccessGrants...
ControlledAccessGrants
visas
ControlledAccessGrants...
ControlledAccessGrants
visas
ControlledAccessGrants...
proxy SP
proxy SP
internal visa issuer 
for
AffiliationAndRole
AcceptedTermsAndPolicies
ResearcherStatus
LinkedIdentities
visas
internal visa issuer...
Passport issuer /
OIDC Provider /
OAuth 2 AS
Passport issuer /...
visas
visas
LifeScience AAI
(ELIXIR, GDI, EJP RD, BBMRI)
LifeScience AAI...
Passport clearinghouse /
 OIDC Relying Party /
OAuth 2 client
Passport clearinghouse /...
Passport
Passport
user 
attributes
management system
user...
user
attributes
user...
user identity
user identity
user affiliation
user affiliation
Identity Providers
Identity Providers
authentication
authentication
REMS Estonia
REMS Estonia
EGA
(European Genom-phenom Archive)
visa issuer
EGA...
REMS Sweden
REMS Sweden
REMS Luxembourg
REMS Luxembourg
REMS Belgium
REMS Belgium
REMS France
REMS France
ControlledAccessGrants
visas
ControlledAccessGrants...
ControlledAccessGrants
visas
ControlledAccessGrants...
...
...
Visa
Issuers
Visa...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/driver-project-usage/AAI/README.md b/driver-project-usage/AAI/README.md deleted file mode 100644 index 3881caa..0000000 --- a/driver-project-usage/AAI/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Authentication and Authorization Infrastructure - -## [Link to Specification](https://ga4gh.github.io/data-security/) - -## Introduction - -The Authentication and Authorizations Infrastructure (AAI) specification -leverages OpenID Connect (OIDC) to authenticate researchers -desiring to access clinical and genomic resources from data -holders adhering to GA4GH standards. Beyond standard OIDC authentication, AAI enables -data holders to obtain security-related attributes and authorizations of those -researchers. In parallel, the Data Use and Researcher Identity (DURI) Work Stream has developed a standard -representation for researcher authorizations and attributes known as Researcher-ID. -At its core, the AAI specification defines cryptographically secure tokens for exchanging -these researcher attributes called Visas and how various -participants can interact to authenticate researchers, and obtain and validate Visas. - -This specification also provides for federated multilateral authorization infrastructure for greater -interoperability between biomedical institutions sharing restricted datasets. - -### What is OpenID Connect? - -OpenID Connect is a simple identity layer, on top of the OAuth 2.0 protocol, that supports identity verification and the ability to -obtain basic profile information about end users. The AAI specification extends this to define tokens, -endpoints, and flows that enable an OIDC provider (called a Broker) to -provide Passports and Visas to downstream consumers called Passport Clearinghouses. Passports can then be used for -authorization purposes by downstream systems. - -## Passports specification -The AAI and Passports specifications rely on each other for full functionality and will likely be merged in a future version. The Passports specification from the Data Use and Researcher Identities Work Stream can be found [here](https://ga4gh-duri.github.io/researcher_ids/ga4gh_passport_v1.html). - -## Version history - -[Changelog](https://ga4gh.github.io/data-security/changes-1_2) for v1.2 - -Full version history available [here](https://ga4gh.github.io/data-security/aai-openid-connect-profile#specification-revision-history) - - -## Contributors - -GA4GH is an open community and contribution is not limited to those named below. -Names listed alphabetically by surname. Repository maintainers listed [here](./MAINTAINER.md). - -### Core Developers for v1.2 - -- Max Barkley - DNAstack -- Tom Conner - Broad Institute -- Martin Kuba - ELIXIR Czech Republic -- Andrew Patterson - The University of Melbourne Centre for Cancer Research -- Kurt Rodarmer - National Center for Biotechnology Information - NIH - -### Reviewers for v1.2 - -- Francis Jeanson - Peter Munk Cardiac Centre and Ted Rogers Centre for Heart Research -- David Glazer - Verily Life Sciences -- Timothy Slade - RTI International -- Dylan Spalding - ELIXIR Finland - -### Technical Programme Manager - -- Fabio Liberante - Global Alliance for Genomics and Health - -## Work Stream Leadership - -### Data Security - -- David Bernick - Broad Institute -- Lucila Ohno-Machado - Yale University School of Medicine -- Previously - Jean-Pierre Hubaux - Swiss Federal Institute of Technology Lausanne - -### Data Use and Researcher Identities - -- Jaime Guidry-Auvil - National Cancer Institute - NIH -- Tommi Nyrönen - ELIXIR Finland - - -## Demonstration Implementation - -[Life Science RI](https://lifescience-ri.eu/) have implemented this v1.2 specification from the finalised draft for use across the Life Science RI platforms. -Information on creating an account is available [here](https://lifescience-ri.eu/ls-login/users/how-to-get-and-use-life-science-id.html). -With an account, the test service [here](https://echo.aai.elixir-czech.org/) will return a technical view of the various tokens created and shared in an example flow using Passport/AAI 1.2. \ No newline at end of file diff --git a/driver-project-usage/AAI/aai background fig 1.JPG b/driver-project-usage/AAI/aai background fig 1.JPG deleted file mode 100644 index f1da29f..0000000 Binary files a/driver-project-usage/AAI/aai background fig 1.JPG and /dev/null differ diff --git a/driver-project-usage/AAI/aai background fig 2.png b/driver-project-usage/AAI/aai background fig 2.png deleted file mode 100644 index b90fe23..0000000 Binary files a/driver-project-usage/AAI/aai background fig 2.png and /dev/null differ diff --git a/driver-project-usage/AAI/claim_flow_of_data_basic.svg b/driver-project-usage/AAI/claim_flow_of_data_basic.svg deleted file mode 100644 index 73b5c2b..0000000 --- a/driver-project-usage/AAI/claim_flow_of_data_basic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/driver-project-usage/AAI/embedded_Claims_flow.png b/driver-project-usage/AAI/embedded_Claims_flow.png deleted file mode 100644 index 407aaa4..0000000 Binary files a/driver-project-usage/AAI/embedded_Claims_flow.png and /dev/null differ diff --git a/driver-project-usage/AAI/flow.png b/driver-project-usage/AAI/flow.png deleted file mode 100644 index 904f685..0000000 Binary files a/driver-project-usage/AAI/flow.png and /dev/null differ diff --git a/driver-project-usage/AAI/implementations.md b/driver-project-usage/AAI/implementations.md deleted file mode 100644 index 93d07d7..0000000 --- a/driver-project-usage/AAI/implementations.md +++ /dev/null @@ -1,35 +0,0 @@ -# Implementations - -## What would a 300,000 foot view of AAI look like? - -![this](AbstractAAI.drawio.svg) - -## How bout ELIXIR / Life Sciences AAI? - -![this](LifeScienceAAI.drawio.svg) - -## Which GA4GH driver projects implement AAI and Passports? - -As of November 2023, the following driver projects implement AAI / Passports: - -- Biomedical Research Hub -- EJP RD -- ELIXIR -- Human Cell Atlas - -These driver projects are planning or developing an implementation of AAI / Passports: - -- All of Us -- Australian Genomics -- Autism Sharing Initiative -- GDI -- Genomics England -- H3Africa -- ICGC ARGO -- IPCHiP -- Monarch Initiative -- NCI CRDC -- NCPI -- NHLBI BioData Catalyst - -[Source](https://docs.google.com/spreadsheets/d/11pPTKVW3j3_WHigWw4UOvlkQbPkM_z-ICgksE5L1vEY) diff --git a/driver-project-usage/aai-faq.html b/driver-project-usage/aai-faq.html deleted file mode 100644 index 8930786..0000000 --- a/driver-project-usage/aai-faq.html +++ /dev/null @@ -1,607 +0,0 @@ - - - - - - - - -AAI FAQ | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI FAQ

-
- -
-

A collection of questions (and hopefully useful answers).

- -
- -

Background

- -

Why Brokers?

- -

We have found that there are widely used Identity Providers (IdP). -These authentication mechanisms provide no authorization -information (custom claims or scopes) but are ubiquitous for authentication at the institution level. -The use of a Broker and Clearinghouse -enables attaching information to the usual OIDC flow so that IdPs -can be used with customized claims and scopes.

- -

Here is a diagram of a single broker. This is one possible way to use this spec.

- -

- -

In this diagram, the Broker relies on a separate service for fetching visas, which -stores assertions from multiple sources. The visa assertions are obtained by the -Clearinghouse after a successful login, and used to determine a researcher’s -access in the Clearinghouse system.

- -

The Broker, Clearinghouse, and Visa Issuer may be separate services (as shown -in this diagram), but in other configurations they may be run as parts of a single -service, or as separate services run by single organization. Data holders and data -controllers should explore their options to decide what best fits their needs.

- -

Flows

- -

The following sequence diagrams are included to help explain the intended flows -documented in the accompanying specification.

- -

What is the complete end to end flow using token exchange?

- -

(last updated June 2022)

- -

This flow is the preferred flow for v1.2+ of the specification.

- -

The exchange flow does not ever distribute the initial Passport-Scoped Access Token beyond -the client application. A token exchange operation is executed by the client, in -exchange for a Passport JWT that may be used downstream to access resources. In this example flow, the -Passport is included as authorization in the POST to a DRS server. The token -exchange has also specified known resources that will limit the audience -of the Passport.

- - - - - - Researcher - - AAI - - Data Controller - - Data Holder - - - - - - - - - User Agent - - - - Client - - Broker - - - IdP - - - Visa Issuer(s) - - Clearing House - - Data - - - - - OIDC - - - ref - OIDC flow results in the client holding a *Passport-Scoped Access Token*. - - - - - Exchange - - - Token exchange - - - (note: for clarity these form values have not actually been URL encoded) - Content-Type: application/x-www-form-urlencoded -   - grant_type=urn:ietf:params:oauth:grant-type:token-exchange - &requested_token_type=urn:ga4gh:params:oauth:token-type:passport - &subject_token_type=urn:ietf:params:oauth:token-type:access_token - &subject_token=<Passport-Scoped Access Token> - &resource=https://drs.example.com/dataset1 - &resource=https://drs.example.com/dataset2 - - - Informative Only (not defined in the specification) - - - Fetch signed visa(s) for user - - - Return signed visa(s) for user - - - [ - "<visa1>", - "<visa2>" - ] - - - Token exchange return - - - { - "access_token": "<Passport>", - "issued_token_type": "urn:ga4gh:params:oauth:token-type:passport", - "token_type": "Bearer" - } -   - ▼ Passport content as example (decoded from the base64 of the JWT Passport) ▼ -   - { - "typ": "vnd.ga4gh.passport+jwt", - "alg": "<algorithm-identifier>", - "kid": "<key-identifier>" - } . - { - "iss": "https://<issuer-website>", - "sub": "<subject-identifier>", - "aud": [ - "https://drs.example.com" - ], - "iat": <seconds-since-epoch>, - "exp": <seconds-since-epoch>, - "jti": "<token-identifier>", - "ga4gh_passport_v1": [ - "<visa1>", - "<visa2>", - ... - ] - } . <signature> - - - - - Use - - - Client requests data - - - POST /ga4gh/drs/v1/objects/dataset1/access/s3 HTTP/1.1 - Host: drs.example.com - Content-Type: application/json -   - { - "passports": [ - "<Passport>" - ] - } - - - Decision is made to release data using information contained in the - passport token - and this decision is coordinated with the data system to - facilitate that actual data release. - - - Client is given data - - - - -
- -

What is the complete end to end flow using /userinfo?

- -

(last updated June 2022)

- -

This flow is the flow for v1.0 implementations of the specification.

- -

The flow as used by Elixir uses the initial Passport-Scoped Access Token as -a token handed to downstream resource servers. These servers can use this token, in conjunction -with a callback to the broker’s Userinfo Endpoint, to obtain the Passport content in -JSON format.

- - - - - - Researcher - - AAI - - Data Controller - - Data Holder - - - - - - - - - User Agent - - - - Client - - Broker - - - IdP - - - Visa Issuer(s) - - Clearing House - - Data - - - - - OIDC - - - ref - OIDC flow results in the client holding a *Passport-Scoped Access Token*. - - - - - Use - - - Client requests data - - - { - Authorization: Bearer <Passport-Scoped Access Token> - } - - - Clearing house asks for list of signed visa(s) - - - { - Authorization: Bearer <Passport-Scoped Access Token> - } - - - Informative Only (not defined in the specification) - - - Fetch signed visa(s) for user - - - Return signed visa(s) for user - - - [ - "<visa1>", - "<visa2>" - ] - - - UserInfo endpoint returns list of signed visa(s) - - - { - "iss": "https://<issuer-website>/", - "sub": "<subject-identifier>", - "ga4gh_passport_v1": [ - "<visa1>", - "<visa2>", - ... - ] - } - - - Decision is made to release data using information contained in the - passport - and this decision is coordinated with the data system to - facilitate that actual data release. - - - Client is given data - - - - -
- -

Trust

- -

What’s with all the signed passports and visas etc? Why so complex?

- -

(last updated July 2022)

- -

The practical operation of a loosely coupled -federated ecosystem like GA4GH Passports requires establishing trust -relationships between the participating entities (see -OpenID Connect Federation -for an interesting discussion of the properties of multilateral federations).

- -

Any entity that is asked to make a decision about sharing data needs to have a priori -made the decision “which other entities do I trust?”. In genomics, a single decision -to allow data sharing might involve simultaneous trusting of -multiple entities - human genomics is complex!

- -

When presented with a -Passport and Visas from entities that they trust - they can rely on the information (claims) provided -to make data sharing decisions. If presented with information from entities that are -untrusted - the content of the message is irrelevant as there is no basis on which to believe -the content.

- -

So we can see that trust is a crucial element of a working federation. How do we establish -these trust relationships?

- -

GA4GH Passports and Visas leverage the mechanisms -present in JWT as used -by the OIDC standards -to cryptographically “sign” tokens containing claims. Signed tokens can be -“verified” using public/private keys.

- -

Why are the Visa claims formatted as JWTs inside the Passport?

- -

(last updated August 2022)

- -

If visas were not signed separately from a Passport, then Clearinghouses would require a high degree of confidence that -the signing Passport Issuer or Broker was accurately representing the contents of Visas from the original Visa Issuer; -there would be no mechanisms to prevent a malicious or defective Passport Issuer from misrepresenting Visa contents. -By signing Visas separately from Passports, we prevent intermediate parties from tampering with Visa contents, -allowing Clearinghouses to safely rely on Visa contents based on their trust relationship with the Visa Issuer.

- -

What are the ways that key management is done in practice?

- -

(last updated July 2022)

- -

There are a variety of approaches that can be used for key -management for Passports and Visas. We will first detail those that can be used for Passports -and then discuss some extra wrinkles for Visas.

- -

For this discussion we assume there is a concrete JWT from issuer https://issuer.example.org -(possibly a Broker or a Visa Issuer).

- -

My clearinghouse service ‘trusts’ the above issuer to help make data -access decisions - and that trust is stated probably through some sort of explicit -configuration. For our example, let’s imagine it has a hypothetical YAML configuration file

- -
trusted_brokers:
-  - https://issuer.example.org
-  - https://login.broker.com
-
-trusted_visa_issuers:
-  - https://dac.gov.world
-
- -

The service now wants to verify a Passport or Visa -JWT purporting to be from that issuer.

- -
- -

Use jku in the header of the JWT

- -

The JKU is the URL of a JSON file containing the issuers’ public keys.

- -
{
-  "iss": "https://issuer.example.org",
-  "jku": "https://issuer.example.org/public-keys.json",
-  "kid": "key-october-1"
-}
-
- -

For our concrete example we say that it is a JSON file residing -at https://issuer.example.org/public-keys.json (see -RFC 7517 “JSON Web Key”).

- -

IMPORTANTLY, for the secure use of this key management technique - the JKU -MUST also be allow-listed as part of the configuration of OUR service. -For example:

- -
trusted_brokers:
-  - issuer: https://issuer.example.org
-    jku: https://issuer.example.org/public-keys.json
-
-  - issuer: https://login.broker.com
-    jku: https://keys.broker.com/set
-
- -

It is NEVER valid to even attempt to access a JKU from a JWT header - unless the URL -is already known to belong to the given issuer. See -“JWT Forgery via unvalidated jku parameter”.

- -

To verify a JWT, the content of the JKU file is loaded and the kid is -looked up in key set. The signature is validated using the public key found.

- -

Although this configuration requires explicit registration of JKUs, the content -of the key sets can allow the best practice of key rotation.

- -

The content of the JKU file is designed to be cached aggressively, but as long as -the file is fetched every few days/weeks, the set of keys -can evolve/rotate.

- -
- -

Use the kid in the header of the JWT along with OIDC Discovery

- -

The OpenID Connect Discovery -protocol allows the use of the JWT issuer URL - in conjunction with a fetch -of a /.well-known/openid-configuration - to look up the location of the public key set file. See -OpenID Provider Metadata specification -and the jwks_uri entry.

- -

As with JKU - it is important that OIDC discovery is limited only to JWT issuer URLs that are -in some way allow-listed. It is NEVER valid to perform discovery on an arbitrary issuer -encountered in a JWT. Luckily, the concept of allow-listing issuers is already in some way -inherent to the way trust relationships are established, and hence this allow list should -already be present in the system.

- -

Also as with JKU, the content of the discovery protocol and key sets can be cached -aggressively. This means that the double step of the discovery protocol is not -required on every JWT verification.

- -
- -

Exchange public keys beforehand with each trusted entity

- -

This is an approach used by the NIH - and is appropriate if the number -of trusted entities is small - such that the public keys of each trusted entity can be exchanged -out of band (and their rotation/updating can also be managed out of band).

- -

Configuration may be

- -
trusted_brokers:
-  - issuer: https://issuer.example.org
-    keys:
-      key-october-1: "ABCDTRTFDSFSDFSF...."
-
-  - issuer: https://login.broker.com
-    keys:
-      kid123456: "ABCDTRTFDSFSDFSF...."
-
- -

For any kid -encountered in a JWT, the corresponding public key is already available for signature validation.

- -

An even safer version of this approach is to perform -the key verification across every public key you hold before even decoding the JWT JSON -and then confirm the kid. This avoids ever even needing to JSON decode -data from untrusted entities.

- -
- -

Requirement for JKU in Visas

- -

When it comes to Visas, there is an extra wrinkle - unlike Brokers, Visa Issuers do not -need to have been part of an OIDC flow. It is possible that the visa issuer URI is not -even a locatable reference -(e.g. urn:example.com:dac-world-visa-issuer).

- -

Therefore the OIDC Discovery technique is not appropriate and hence the requirements -of the AAI standard regarding the presence of JKUs.

- -
- -

Client Software

- -

Use of GA4GH passport/visas in Single Page Apps (SPAs)

- -

It is currently recommended that single page apps (SPA) such as a React/VueJS websites -are NOT used for scenarios where the single page app code is solely responsible for the handling of -genomic passports and tokens.

- -

A SPA contains all the source of the application in public - and hence cannot -possess a ‘client secret’ in an OIDC flow (the ‘client secret’ is used to prove the identity of the -client software and is an important risk mitigation that prevents unconstrained -use of an accidentally leaked/stolen token).

- -

Techniques such as PKCE can be used to allow a SPA to participate in an OIDC flow - and this is not -forbidden by the specification - but there -are still unresolved questions about how SPAs can prove client identity in things like the token -exchange that retrieves passports or other tokens.

- -

Therefore if writing SPA websites for genomic data handling, it is recommended to use -a backend set of services to execute OIDC flows and token exchanges (even if the rest of the SPA -can operate purely on the front end). These -backend service can hold secrets and hence can prove client identity - and the backend -service can then securely participate in token exchange and retain tokens/passports.

- -

There is an emerging standard DPoP that may remove some of these limitations - -(OAuth 2.0 Demonstrating Proof-of-Possession at the Application Layer)

-
    -
  • and it will be considered for future versions of the AAI specification.
  • -
- -
- - -
- -
- -
-
- - - diff --git a/driver-project-usage/aai-implementations.html b/driver-project-usage/aai-implementations.html deleted file mode 100644 index 11284bf..0000000 --- a/driver-project-usage/aai-implementations.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - -AAI Implementations | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI Implementations

-
- -
-

What would a 300,000 foot view of AAI look like?

- -

this

- -

How bout ELIXIR / Life Sciences AAI?

- -

this

- -

Which GA4GH driver projects implement AAI and Passports?

- -

As of November 2023, the following driver projects implement AAI / Passports:

- -
    -
  • Biomedical Research Hub
  • -
  • EJP RD (using LifeScience AAI)
  • -
  • ELIXIR (using LifeScience AAI)
  • -
  • GDI (using LifeScience AAI)
  • -
  • Human Cell Atlas
  • -
- -

These driver projects are planning or developing an implementation of AAI / Passports:

- -
    -
  • All of Us
  • -
  • Australian Genomics
  • -
  • Autism Sharing Initiative
  • -
  • Genomics England
  • -
  • H3Africa
  • -
  • ICGC ARGO
  • -
  • IPCHiP
  • -
  • Monarch Initiative
  • -
  • NCI CRDC
  • -
  • NCPI
  • -
  • NHLBI BioData Catalyst
  • -
- -

Source

- -
- -
- -
-
- - - diff --git a/driver-project-usage/aai-openid-connect-profile.html b/driver-project-usage/aai-openid-connect-profile.html deleted file mode 100644 index 374c9fb..0000000 --- a/driver-project-usage/aai-openid-connect-profile.html +++ /dev/null @@ -1,1335 +0,0 @@ - - - - - - - - -AAI OIDC Profile | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

AAI OIDC Profile

-
- -
-

Abstract

- -

This specification defines a profile for using the OpenID Connect protocol -[OIDC-Core] to provide federated multilateral authorization infrastructure for greater -interoperability between biomedical institutions sharing restricted datasets. (OpenID Connect is a simple -identity layer, on top of the OAuth 2.0 protocol, that supports identity verification and the ability to -obtain basic profile information about end users.) In particular, this specification defines tokens, -endpoints, and flows that enable an OIDC provider (called a Broker) to -provide Passports and Visas to downstream consumers called -Passport Clearinghouses. Passports can then be used for -authorization purposes by downstream systems.

- -

Table of Contents

- - - -
- -

Introduction

- -

This specification -leverages OpenID Connect (OIDC) to authenticate researchers -desiring to access clinical and genomic resources from data -holders -adhering to GA4GH standards. Beyond standard OIDC authentication, AAI enables -data holders to obtain security-related attributes and authorizations of those -researchers. The Data Use and Researcher Identity (DURI) Work Stream has developed a standard -representation for researcher authorizations and attributes [Researcher-ID].

- -

Technical Summary

- -

At its core, the AAI specification defines cryptographically secure tokens for exchanging -researcher attributes called Visas, and how various -participants can interact to authenticate researchers, and obtain and validate Visas.

- -

The main components identified in the specification are:

-
    -
  • -Visa Issuers, that cryptographically sign researcher attributes in the -form of Visas.
  • -
  • -Brokers, that authenticate researchers and provide Visas.
  • -
  • -Clients, that perform actions that may require data access on behalf of researchers, -relying on tokens issued by Brokers and Visa Issuers.
  • -
  • -Passport Clearinghouses, that accept tokens containing or -otherwise availing researcher visas for the purposes of enforcing access control.
  • -
- -

Visa Tokens

- -

Visas are used -for securely transmitting authorizations or attributes of a researcher. -Visas are tokens [JWT] signed by Visa Issuers and -validated by Passport Clearinghouses.

- -

Separation of Data Holders and Data Access Committees

- -

It is a fairly common situation that, for a single dataset, the Data Access Committee (DAC) (the authority managing -who has access to a dataset) is not the same party as the -Data Holder (the organization -that hosts the data, while respecting the DAC’s access policies).

- -

For these situations, AAI is a standard mechanism for data holders to obtain -and validate existing authorizations from DACs, by specifying the interactions -between Visa Issuers, Brokers, and -Passport Clearinghouses.

- -

The AAI standard enables Data Holders and Visa Issuers to recognize -and accept identities from multiple Brokers — allowing for a more federated -approach. An organization can still use this specification with a single -Broker and Visa Issuer, -though they may find in that case that there are few benefits beyond standard OIDC.

- -
- -

Notation and Conventions

- -

Terms defined in Terminology appear as capitalized -links, e.g. Passport.

- -

References to Relevant Specifications appear -as bracket-enclosed links, e.g. [OIDC-Core].

- -

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this specification are to -be interpreted as described in [RFC2119].

- -
- -

Terminology

- -

This specification inherits terminology from the OpenID -Connect [OIDC-Core] -and OAuth 2.0 Authorization Framework [RFC6749] specifications.

- -

Broker – An OIDC Provider service that -authenticates a user (potentially by relying on an Identity Provider), -collects user’s Visas from internal and/or external Visa Issuers, -and provides them to Passport Clearinghouses.

- -

Claim – as defined -by the JWT specification [RFC7519] – A piece of information asserted about a subject, -represented as a name/value pair consisting of -a claim name (a string) and a claim value (any JSON value).

- -

Client – as discussed in the OAuth 2.0 Authorization Framework [RFC6749] specification

- -

Data Holder – An organization that -holds a specific set of data (or its copy) and respects -and enforces the Data Access Committee’s (DAC’s) decisions on who can access it.

- -

-GA4GH Claim – A Claim as defined by a GA4GH -documented technical standard that is making use of this AAI specification. Typically -this is the ga4gh_passport_v1 or ga4gh_visa_v1 Claim for Passports v1.x. -A GA4GH Claim is asserted by the entity that signed the token in which it is contained (not by GA4GH).

- -

Identity Provider (IdP) – A -service that provides to users an identity, authenticates it, and provides -assertions to a Broker using standard protocols, such as OpenID Connect, SAML or -other federation protocols. Examples: eduGAIN, Facebook, NIH -eRA Commons. IdPs MAY be Visa Assertion Sources.

- -

JWT – JSON Web Token as defined in [RFC7519]. -A JWT contains a set of Claims.

- -

Passport Clearinghouse – -A service that consumes Visas and uses them to make an -authorization decision based on inspecting them and -allows access to a specific set of underlying resources in the target -environment or platform. This abstraction allows for a variety of models for -how systems consume these Visas in order to provide access to resources. -Access can be granted by either issuing new access tokens for downstream -services (i.e. the Passport Clearinghouse may act like an authorization server) -or by providing access to the underlying resources directly (i.e. the Passport -Clearinghouse may act like a resource server). Some Passport Clearinghouses may -issue Passports that contain a new set or subset of Visas for downstream consumption.

- -

Passport-Scoped Access Token – -An OIDC access token with scope -including the identifier ga4gh_passport_v1.

- -

The access token MUST be a JWS-encoded JWT token containing openid and ga4gh_passport_v1 -entries in the value of its scope Claim. -It is RECOMMENDED that Passport-Scoped Access Tokens follow the JWT Profile for OAuth 2.0 Access Tokens specification [RFC9068].

- -

Passport – A signed and verifiable JWT that contains Visas.

- -

Passport Issuer – -A service that creates and signs Passports.

- -

Token Endpoint – a Broker’s implementation of the [OIDC-Core] Token Endpoint.

- -

Token Exchange – -The protocol defined in [RFC 8693] as an extension of OAuth 2.0 -for exchanging access tokens for other tokens. A token exchange is performed by calling the Token Endpoint.

- -

UserInfo Endpoint – a Broker’s implementation of the [OIDC-Core] UserInfo Endpoint.

- -

-Visa – A -Visa encodes a Visa Assertion in compact and digitally signed -format that can be passed as a URL-safe string value.

- -

A Visa MUST be signed by a Visa Issuer. A Visa MAY be passed -through various Brokers as needed while retaining the -signature of the original Visa Issuer.

- -

-Visa Assertion – a piece of information about a user that is asserted by a Visa Assertion Source. It is then encoded by a Visa Issuer into a Visa.

- -

Visa Assertion Source – the source organization of -a Visa Assertion, which SHOULD include the organization associated with making the assertion, although it MAY optionally identify a sub-organization or a -specific assignment within the organization that made the assertion.

- -
    -
  • This is NOT necessarily the organization that signs the Visa; it is the -organization that has the authority to make the assertion on behalf of the -user and is responsible for making and maintaining the assertion.
  • -
- -

-Visa Issuer – A service that signs Visas. This service:

- - -
- -

Relevant Specifications

- -

-[IANA-JWT] – Standard JWT Claim name assignments, -Internet Assigned Numbers Authority

- -

-[OIDC-Core] – OpenID Connect Core 1.0 (OIDC) – - Authorization Code Flow - will generate id_tokens and access_tokens from the Broker.

- -

-[OIDC-Client] – OpenID Connect Basic Client Implementer’s Guide 1.0

- -

-[OIDC-Discovery] – OpenID Connect Discovery 1.0

- -

-[Passport] – GA4GH Passport Specification, Data Use and Researcher Identity (DURI) Work Stream – Defines Passport and Visa formats.

- -

-[Researcher-ID] – GA4GH Passport Specification, Data Use and Researcher Identity (DURI) Work Stream – Defines researcher identities for GA4GH Passports and Visas.

- -

-[RFC2119] - Key words for use in RFCs to Indicate Requirement Levels

- -

-[RFC5246] - Transport Layer Security (TLS). - Information passed among clients, applications, resource servers, - Brokers, and Passport Clearinghouses - MUST be protected using TLS.

- -

-[RFC6749] – The OAuth 2.0 Authorization Framework

- -

-[RFC6819] - - Lodderstedt, T, McGloin, M., and P. Hunt, - “OAuth 2.0 Threat Model and Security Considerations”, - RFC 6819, January 2013.

- -

-[RFC7515] – JSON Web Signature (JWS) is the - specific JWT to use for this spec.

- -

-[RFC7519] – JSON Web Token (JWT) – Specific implementations MAY extend - this structure with their own service-specific JWT Claim names as top-level - members of this JSON object. The JWTs specified here follow the JWS - specification [RFC7515].

- -

-[RFC7636] – Proof Key for Code Exchange by OAuth Public Clients (PKCE)

- -

-[RFC7662] – J. Richer, Ed., “OAuth 2.0 Token Introspection”, October 2015

- -

-[RFC8693] - Jones, M., Nadalin, A., Campbell, B., Ed., Bradley, J., - and C. Mortimore, “OAuth 2.0 Token Exchange”, RFC 8693, - DOI 10.17487/RFC8693, January 2020.

- -

-[RFC8725] - Sheffer, Y., Hardt, D., and M. Jones, “JSON Web Token Best - Current Practices”, BCP 225, RFC 8725, - DOI 10.17487/RFC8725, February 2020.

- -

-[RFC9068] – JWT Profile for OAuth 2.0 Access Tokens

- -
- -

Overview of Interactions

- -

Full Login and Token Exchange Interaction

- -

In the full token exchange flow recommended in this document, the client does not ever distribute the initial -Passport-Scoped Access Token to other services. A token exchange operation is executed by the client, in -exchange for a Passport JWT that may be used downstream to access resources. In this example flow, the -Passport is included as authorization in the POST to a Clearinghouse that holds data.

- - - - - - Researcher - - AAI - - Data Access Committee - - Data Holder - - - - - - User Agent - - - - Client - - Broker and Passport Issuer - - Visa Issuer - - Passport Clearinghouse - - - - - OIDC - - - Initiates login - - - Send redirect to Broker - - - Follow redirects - - - ref - Broker authenticates user (potentially with external IdP) - - - Send redirect to client with authorization code - - - Follow redirect with code - - - Request Passport-Scoped Access Token with code and client credentials - - - Respond with Passport-Scoped Access Token - - - - - Exchange - - - Request to exchange Passport-Scoped Access Token for Passport - - - - Exchange of visas, if needed (protocol unspecified) - - - Response with Passport - - - - - Use - - - User initiates action requiring data - - - Client requests data with Passport - - - Request public keys - - - Respond with public keys - - - Clearinghouse responds with data - - - - -

Notable differences between this diagram and interaction specified in AAI/Passport v1.0:

-
    -
  • The Passport Clearinghouse is no longer required to be a Client of the Broker
  • -
  • The Passport-Scoped Access Token is only ever shared between the Client and the Broker
  • -
  • An additional Token Exchange request is used to exchange the Passport-Scoped Access Token for a Passport Token, -which can be sent to a Passport Clearinghouse. The Passport Token carries only the authorization in a user’s -Visas, whereas the Passport-Scoped Access Token contains authorizations above and beyond the Visas.
  • -
- -

Flow of Assertions

- -

- -

The above diagram shows how Visa Assertions flow from a Visa Assertion Source -to a Passport Clearinghouse that uses them.

- -

Implementations may introduce clients, services, and protocols -to provide the mechanisms to move the data between the -Visa Assertion Sources and the Broker. These mechanisms are unspecified by the scope of this specification except that -they MUST adhere to security and privacy best practices, such as those outlined -in this specification, in their handling of protocols, claims, tokens and -related data. The flow between these components -MAY be indirect or conversely services shown as being separate MAY be -combined into one service. For example, some implementations MAY deploy one -service that handles the responsibilities of both the Visa Issuer and -the Broker.

- -

Here are two non-normative examples illustrating two of many possible mechanisms:

- -

- -

- -
- -

Profile Requirements

- -

Conformance for Clients/Applications

- -

Clients are applications which want to access data on behalf of users, and are responsible for using the standard described here to do so securely.

- -
    -
  1. OAuth defines two client types in section 2.1 of [RFC6749]. -
      -
    1. -

      Confidential clients (which are able to keep the client secret secure, typically server-side web-applications) - MUST implement OAuth2 Authorization Code - Flow (see OIDC Basic Client Implementer’s Guide 1.0 [OIDC-Client]).

      -
    2. -
    3. -

      Public clients (single pages apps or mobile apps) SHOULD implement Authorization Code Flow - with [PKCE].

      -
    4. -
    -
  2. -
  3. -

    Protection of Confidential Information

    - -
      -
    1. -

      Sensitive information (e.g., including client secrets, -authorization codes, id_tokens, access_tokens) MUST be passed over -encrypted channels as per [OIDC-Client].

      -
    2. -
    3. -

      All responses that contain tokens, secrets, or other sensitive -information MUST include the following HTTP response header fields and -values as per [OIDC-Client].

      - -
        -
      1. -

        Cache-Control: no-cache, no-store

        -
      2. -
      3. -

        Pragma: no-cache

        -
      4. -
      -
    4. -
    -
  4. -
  5. Clients MUST provide protection against client attacks as outlined in -[RFC6819].
  6. -
- -
- -

Conformance for Brokers

-

Brokers operate downstream from IdPs or provide their own IdP service. They issue id_tokens -and access_tokens (and potentially refresh tokens) for consumption within the GA4GH compliant environment.

- -
    -
  1. -

    Broker MUST be an OpenID Provider

    - -
      -
    1. -

      Broker MUST conform to the OIDC Core specification [OIDC-Core].

      -
    2. -
    3. -

      Broker MUST support the OIDC Discovery specification [OIDC-Discovery] -and provide proper metadata -(i.e. must have a jwks_uri as required that’s reachable by a Passport Clearinghouse)

      -
    4. -
    5. -

      A Broker MUST issue Passport-Scoped Access Tokens -(access_tokens).

      - -
        -
      1. This document makes no specifications beyond those in [OIDC-Core].
      2. -
      -
    6. -
    7. -

      Access tokens MUST be in JWS format

      - -
        -
      1. -

        Access tokens for GA4GH use MUST be a GA4GH JWT using -Passport-Scoped Access Token format.

        -
      2. -
      3. -

        Access tokens MUST NOT contain GA4GH Claims directly in the access token.

        -
      4. -
      5. -

        Access tokens MAY contain additional non-GA4GH Claims directly in the access token.

        -
      6. -
      -
    8. -
    -
  2. -
  3. -

    Broker MUST support a Token Endpoint and UserInfo Endpoint.

    - -
      -
    1. -

      Token Exchange at the Token Endpoint SHOULD be used for Visas in -preference to the UserInfo Endpoint.

      -
    2. -
    3. -

      When presented with a valid Passport-scoped Access Token, -the UserInfo endpoint MUST provide Visas as described in the section -Visas provided by a Broker via UserInfo Endpoint.

      -
    4. -
    -
  4. -
  5. -

    Brokers operate downstream from IdPs or provide their own IdP service. They -issue id_tokens and access_tokens (and potentially refresh tokens) for -consumption within the GA4GH compliant environment.

    -
  6. -
  7. -

    Broker MAY support Token Exchange. If implemented, it MUST behave as described -for passport issuance in Conformance For Passport Issuers.

    -
  8. -
  9. -

    Broker MUST provide protection against attacks as outlined in -[RFC6819].

    -
  10. -
  11. -

    The user represented by the identity of the access token MUST have agreed to -release claims related to the requested scopes as part of generating tokens. -Brokers MUST adhere to -section 3.1.2.4 -of [OIDC-Core].

    - -
      -
    1. -

      The user represented by a researcher identity MUST approve the release -of these claims to relying parties with sufficient granularity to -allow for responsible disclosure of information best practices as well -as to meet privacy regulations that may be applicable within or between -jurisdictions where the user’s identity will be used (e.g. GDPR for -a European Union user).

      -
    2. -
    3. -

      If the user’s release agreement has been remembered as part of a user’s -settings such that the user no longer needs to be prompted, then the -user MUST have the ability to remove this setting (i.e. be prompted -again in the future). If a feature is to bypass prompts by remembering -settings is available, it MUST only be used as an opt-in feature with -explicit controls available to the user.

      -
    4. -
    5. -

      A user’s withdrawal of this agreement does not need to apply to -previously generated access tokens.

      -
    6. -
    -
  12. -
  13. -

    When a Broker acts as a Visa Issuer then it MUST adhere to the Conformance -for Visa Issuers section of this -specification.

    - -

    When a Broker provides Visas from other Visa Issuers, it is providing -them “as is” (i.e. it provides no additional assurance as to the quality, -authenticity, or trustworthiness of the Claims from such tokens and any such -assurances are made by the issuer of the Visa, i.e. the Visa Issuer).

    -
  14. -
- -
- -

-

Conformance for Visa Issuers

- -

Visa Issuers issue signed JWTs (Visas) asserting facts about researchers, which may be used by Passport Clearinghouses -to justify granting access to data. This specification defines the format of the Visas and endpoints Visa Issuers -should have in order for Passport Clearinghouses to validate those Visas. This document does not specify how a Broker -obtains Visas contained in a Passport or returned from the Userinfo Endpoint.

- -
    -
  1. -

    A Visa Issuer MUST provide one or more of the following - types of Visas:

    - -
      -
    1. -

      - - - -Visa Document Token – The Visa Issuer does not need to -be an OIDC provider, and MAY provide tokens of this type without any -revocation process.

      - -
        -
      1. The token MUST conform with JWS format [RFC7515] requirements
      2. -
      3. The token MUST be signed by a Visa Issuer.
      4. -
      5. The JWS header MUST contain jku as specified by section -4.1.2 of [RFC7515], and -MUST provide the corresponding endpoint to fetch -the public key used to sign the Visa Document Token.
      6. -
      7. The token is not treated as an access token, but validity -checks outlined elsewhere in this specification still apply.
      8. -
      9. -Visas MUST be signed with a conformant signing algorithm.
      10. -
      11. The scope Claim, if included, MUST NOT contain “openid” as -a space-delimited substring of the scope JWT Claim.
      12. -
      13. Payload Claims are specified in -Visa Format in [Passport].
      14. -
      -
    2. -
    3. -

      -Visa Access Token – The Visa Issuer is providing an OIDC provider -service and issues OIDC-compliant access tokens in a specific format that can -be used as a Visa. Details are specified in the AAI Profile 1.0 specification.

      -
    4. -
    - -

    The Visa Access Token is proposed for removal in a future - version of the specification. Current and future specifications emphasize use of Visas embedded in a Passport, which are not access tokens. New implementations should issue Visas - as Visa Document Tokens.

    -
  2. -
  3. -

    By signing a Visa, a Visa Issuer asserts that - the Visa Assertions made available by the Visa were legitimately derived - from their Visa Assertion Sources, and the content is - presented and/or transformed without misrepresenting the original intent.

    -
  4. -
- -
- -

Conformance for Passport Issuers

- -

Passport Issuers are used to package Visas into signed Passports. Passports are signed JWTs -that use this format to contain Visas.

- -
    -
  1. -

    Passport Issuers MUST be Brokers.

    -
  2. -
  3. -

    Passports MUST be signed with a conformant signing algorithm.

    -
  4. -
  5. -

    Passports MAY be issued from a Token Endpoint using Token Exchange, with the following clarifications:

    - -
      -
    1. -

      The Token Endpoint MAY also support other OAuth2 grant types.

      -
    2. -
    3. -

      Client authentication is REQUIRED (using OAuth2 client authentication in [RFC6749] is RECOMMENDED).

      -
    4. -
    5. -

      The requested_token_type parameter MUST be present with the value urn:ga4gh:params:oauth:token-type:passport.

      -
    6. -
    7. -

      The subject_token parameter value MUST be a valid Passport-Scoped Access Token.

      -
    8. -
    9. -

      The subject_token_type parameter value MUST be urn:ietf:params:oauth:token-type:access_token.

      -
    10. -
    11. -

      The Token Endpoint MAY accept or require any other optional parameters defined in [RFC8693].

      -
    12. -
    -
  6. -
- -


-Passport Issuing via Token Exchange (non-normative example)

- - - - - - Researcher - - AAI - - Data Access Committee (1) - - Data Access Committee (2) - - - - - - User Agent - - - - Client - - Broker and Passport Issuer - - Visa Issuer (1) - - Visa Issuer (2) - - - - - OIDC - - - Initiates login - - - Send redirect to Broker - - - Follow redirects - - - ref - Broker authenticates user - (potentially with external IdP) - - - Send redirect to client with authorization code - - - Follow redirect with code - - - Request Passport-Scoped Access Token - - - Respond with Passport-Scoped Access Token - - - - - Token Exchange - - - Request to exchange Passport-Scoped - Access Token for Passport - - - ref - Signed visas can be sourced from multiple visa issuers - either on demand or via batch transfer/cached - - - - Obtain Visa A - - - - Obtain Visa B - - - - Obtain Visa C - - - Response with Passport containing Visas A, B, C - - - - -
- -

Conformance for Passport Clearinghouses

- -

Passport Clearinghouses consume Passports containing Visas in order to grant access to data.

- -
    -
  1. -

    Passport Clearinghouses MUST trust at least one Broker.

    - -
      -
    1. -

      Passport Clearinghouses MAY trust more than one Broker

      -
    2. -
    3. -

      The Passport Clearinghouse is responsible for assessing the risk in choosing to trust a token from a Broker.

      -
    4. -
    -
  2. -
  3. -

    Passport Clearinghouses MUST process access tokens to access a Broker’s Token or UserInfo Endpoint to get access to Visas OR MUST process Passports directly.

    - -
      -
    1. -

      For access token flows, Passport Clearinghouses MUST either check the validity of the access token or treat the access -token as opaque.

      -
    2. -
    3. -

      For Passport flows, Passport Clearinghouses MUST check the validity of the Passport.

      -
    4. -
    -
  4. -
  5. -

    A Passport Clearinghouse service can be a Broker itself and would follow the -Conformance For Brokers.

    -
  6. -
  7. -

    Passport Clearinghouses MUST provide protection against attacks as outlined in -[RFC6819].

    - -
      -
    1. -Section 5.1.6 of [RFC6819] states Ensure that client applications do not share tokens with 3rd parties. This profile provides a mechanism for Clearinghouses to consume access tokens from multiple brokers in a manner that does not involve 3rd parties. Client applications SHOULD take care to not spread the tokens to any other services that would be considered 3rd parties.
    2. -
    -
  8. -
  9. -

    If making use of Visas:

    - -
      -
    1. -

      The Passport Clearinghouse MUST validate that all JWT checks pass (such as -the JWT hasn’t expired) as described elsewhere in this specification and -the underlying OIDC specifications.

      -
    2. -
    3. -

      If making use of Visa Access Tokens:

      - -
        -
      1. -

        Token checks MUST be performed to ensure it complies with the access -token specification.

        -
      2. -
      3. -

        In addition to other validation checks, a Visa is considered -invalid if it is more than 1 hour old (as per the iat Claim) AND -Access Token Polling does not confirm that the token is still -valid (e.g. provide a success status code).

        -
      4. -
      -
    4. -
    5. -

      If making use of Visa Document Tokens:

      - -
        -
      1. -

        Fetching the public keys using the jku is not required if a Passport -Clearinghouse has received the keys for the given iss via a trusted, -out-of-band process.

        -
      2. -
      3. -

        If a Passport Clearinghouse is to use the jku URL to fetch the public -keys to verify the signature, then it MUST verify that the jku is -trusted for the given iss as part of the Passport Clearinghouse’s -trusted issuer configuration. This check MUST be performed before -calling the jku endpoint.

        -
      4. -
      -
    6. -
    -
  10. -
  11. -

    Access Token Polling: Clients MAY use access tokens, -including Visas, to occasionally check which Visas are still valid -at the associated Token or UserInfo Endpoint in order to establish -whether the user still meets the access requirements.

    - -

    This MUST NOT be done more than once per hour (excluding any optional retries) -per Passport Clearinghouse. Any request retries MUST include exponential backoff -delays based on best practices (e.g. include appropriate jitter). At a -minimum, the client MUST stop checking once any of the following occurs:

    - -
      -
    1. -

      The system can reasonably determine that authorization related to these -Claims is no longer needed by the user. For example, all downstream cloud -tasks have terminated and the related systems will no longer be using the -access token nor any downstream tokens that were authorized by evaluating -access requirements against Claims in the token.

      -
    2. -
    3. -

      The JWT access token has expired as per the exp field.

      -
    4. -
    5. -

      The client has detected that the user owning the identity or a system -administrator has revoked the access token or a refresh token related to -minting the access token.

      -
    6. -
    7. -

      The endpoint returns an HTTP status that is not retryable, e.g. HTTP status 400.

      -
    8. -
    9. -

      If the endpoint returns an updated set of Visas (this is -an OPTIONAL feature of a Visa Issuer), then the Passport -Clearinghouse MUST use the updated Visas and ignore the original -GA4GH Claim values in the Visa Access Token. If the Passport -Clearinghouse is unable to adjust for the updated Visas, then -it MUST act as though the token was revoked.

      -
    10. -
    -
  12. -
- -
- -

-

GA4GH JWT Formats

- -

This specification builds on the JWT format defined in [RFC7519]. -A well-formed JWS-Encoded JSON Web Token (JWT) consists of three concatenated -Base64url-encoded strings, separated by dots (.) The three sections are: header, -payload and signature. These JWTs follow JWS [RFC7515] -and utilize a number of standard JWT Claim names [IANA-JWT] -as per the registration process. -This profile is agnostic to the format of the id_token.

- -
- -

-

-

Passport-Scoped Access Token

- -

This is the format for the token that is issued by Brokers, extending the definition of -the [OIDC-Core] access token.

- -

Header

- -
{
- "typ": "<jwt-type-identifier>",
- "alg": "<algorithm-identifier>",
- "kid": "<key-identifier>"
-}
-
- - -

Payload

- -
{
- "iss": "https://<issuer-website>/",
- "sub": "<subject-identifier>",
- "idp": "<short-idp-identifier>",
- "aud": [
-  "<client-id1>",
-  "<client-id2>" ...
- ],
- "iat": <seconds-since-epoch>,
- "exp": <seconds-since-epoch>,
- "jti": <token-identifier>,
- "scope": "openid ga4gh_passport_v1 <additional-scopes>",
- <additional claims>
-}
-
-
    -
  • -

    iss: REQUIRED. MUST be able to be appended with -.well-known/openid-configuration to get spec of Broker.

    -
  • -
  • -

    sub: REQUIRED. Authenticated user unique identifier.

    -
  • -
  • -

    idp: OPTIONAL. SHOULD contain the IDP the user used to auth with. -This does not have to be unique and -can be used just to help inform if that is what a Visa Issuer -or Data Holder needs.

    -
  • -
  • -

    aud: OPTIONAL. If provided, it MUST contain the OAuth Client ID of the -relying party.

    -
  • -
  • -

    iat: REQUIRED. Time issued.

    -
  • -
  • -

    exp: REQUIRED. Time expired.

    -
  • -
  • -

    jti: RECOMMENDED. a unique identifier for the token as per -section 4.1.7 of [RFC7519]

    -
  • -
  • -

    scope: REQUIRED. Includes verified scopes. MUST include openid and ga4gh_passport_v1. -The scope Claim is defined by section 4.2 -of [RFC8693].

    -
  • -
  • -

    GA4GH Claims (ga4gh_passport_v1 or ga4gh_visa_v1): MUST NOT be included.

    -
  • -
  • -

    additional Claims: OPTIONAL. Any other additional non-GA4GH Claims are allowed. This specification does not dictate the format of other Claims.

    -
  • -
- -
- -

Visas provided by a Broker via UserInfo Endpoint

- -

The UserInfo Endpoint MAY use application/json -or application/jwt response content type. It is RECOMMENDED that if desiring to return a JWT, a Token Endpoint supporting -Token Exchange exists to do that and that the UserInfo Endpoint returns an application/json response. -Only the GA4GH claims must be as prescribed here. Refer to [OIDC-Core] for more information.

- -

The UserInfo response MUST include a ga4gh_passport_v1 Claim with a list of Visas -if a Passport-Scoped Access Token was used for accessing it.

- -
- -

Passport Format

- -

Passport Issuers MUST issue a Passport conforming to the requirements in this section when a Token Exchange -with the requested_token_type=urn:ga4gh:params:oauth:token-type:passport is successfully performed -(as described in the Conformance for Passport Issuers section).

- -

Passports are defined as signed JWTs. The JWT specification [RFC7519] -states that JWTs can be either signed and encoded using JWS Compact Serialization, -or encrypted and encoded using JWE Compact Serialization. -Passports are signed JWTs, which implies that they must be encoded using JWS Compact Serialization [RFC7515].

- -

Header

- -

This spec prescribes the following JWS headers for Passports -in addition to the guidelines established in [RFC7515]:

- -
    -
  • -typ: REQUIRED where the value must be vnd.ga4gh.passport+jwt for Passports.
  • -
- -

Payload

- -

Only the GA4GH claims must be as prescribed here. See the -JWT specification [RFC7519] for more details.

- -
{
- "iss": "https://<issuer-website>/",
- "sub": "<subject-identifier>",
- "aud": [
-  "<client-id1>",
-  "<client-id2>" ...
- ],
- "iat": <seconds-since-epoch>,
- "exp": <seconds-since-epoch>,
- "ga4gh_passport_v1": [
-    <Passport Visa>,
-    <Passport Visa (if more than one)>,
-    ...
- ]
-}
-
- -
    -
  • -

    iss: REQUIRED.

    -
  • -
  • -

    sub: REQUIRED. Please note that [OIDC-Core] in its section - Subject Identifier Types - allows the use of PPIDs (Pairwise Pseudonymous Identifiers) providing different sub value to each client - to preclude correlation of user’s activities at different clients. Even if a public identifier is used (same for all clients), - the value of the sub claim of a Passports may be different from the values of sub claims of its Visas, - and the values may need to be linked using LinkedIdentities - visas.

    -
  • -
  • -

    aud: OPTIONAL.

    -
  • -
  • -

    iat: REQUIRED.

    -
  • -
  • -

    exp: REQUIRED.

    -
  • -
  • -

    jti: RECOMMENDED.

    -
  • -
  • -

    ga4gh_passport_v1: REQUIRED. An array of GA4GH Visas. May be empty if a - user has no visas. See the [Passport] specification - for more details on types of visas.

    -
  • -
- -
- -

Signing Algorithms

- -

JWTs MUST be issued with signatures using the ES256 or RS256 algorithm.

- -
- -

Security Considerations

- -

The confidentiality and integrity of tokens must be secured, taking -JSON Web Token Best Current Practices in [RFC8725] -into consideration. Of special concern are:

-
    -
  • Revoking access tokens and Visa Assertions
  • -
  • Limiting damage of leaked tokens
  • -
- -
- -

Specification Revision History

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VersionDateEditorNotes
1.2.02023-01Andrew Patterson, Martin Kuba, Kurt Rodarmer, Tom Conner, Max BarkleyIntroduce token exchange and Passport format, incorporate Visas, update diagrams
1.1.02021-07Craig Voisin -abandoned version now reserved, new concepts moved to v1.2
1.0.42021-07Craig VoisinImprove existing terminology and define Passport and Visa JWTs
1.0.32021-06Craig VoisinLinks for “scope” claim
1.0.22020-02David BernickClarify risk scenarios
1.0.12019-10David BernickClarify that non-GA4GH claims are allowed in tokens
1.0.02019-10Approved by GA4GH Steering Committee 
0.9.92019-10David Bernick, Craig Voisin, Mikael LindenApproved standard
0.9.52019-09Craig VoisinUpdate claim flow diagram and definitions
0.9.42019-08Craig VoisinEmbedded tokens for signed RI Claim Objects
0.9.32019-08Craig VoisinSupport for RI’s embedded tokens
0.9.22019-07David BernickMade changes based on feedback from review
0.9.12019-06Craig VoisinAdded terminology links
0.9.02017-Mikael Linden, Craig Voisin, David BernickInitial working version
- -
- -
- -
-
- - - diff --git a/driver-project-usage/assets/main.css b/driver-project-usage/assets/main.css deleted file mode 100644 index fbb59e6..0000000 --- a/driver-project-usage/assets/main.css +++ /dev/null @@ -1,701 +0,0 @@ -/** - * Reset some basic elements - */ -body, h1, h2, h3, h4, h5, h6, -p, blockquote, pre, hr, -dl, dd, ol, ul, figure { - margin: 0; - padding: 0; -} - -/** - * Basic styling - */ -body { - font: 400 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - color: #111; - background-color: #fdfdfd; - -webkit-text-size-adjust: 100%; - -webkit-font-feature-settings: "kern" 1; - -moz-font-feature-settings: "kern" 1; - -o-font-feature-settings: "kern" 1; - font-feature-settings: "kern" 1; - font-kerning: normal; - display: flex; - min-height: 100vh; - flex-direction: column; -} - -/** - * Set `margin-bottom` to maintain vertical rhythm - */ -h1, h2, h3, h4, h5, h6, -p, blockquote, pre, -ul, ol, dl, figure, -.highlight { - margin-bottom: 15px; -} - -/** - * `main` element - */ -main { - display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ -} - -/** - * Images - */ -img { - max-width: 100%; - vertical-align: middle; -} - -/** - * Figures - */ -figure > img { - display: block; -} - -figcaption { - font-size: 14px; -} - -/** - * Lists - */ -ul, ol { - margin-left: 30px; -} - -li > ul, -li > ol { - margin-bottom: 0; -} - -/** - * Headings - */ -h1, h2, h3, h4, h5, h6 { - font-weight: 400; -} - -/** - * Links - */ -a { - color: #2a7ae2; - text-decoration: none; -} -a:visited { - color: #1756a9; -} -a:hover { - color: #111; - text-decoration: underline; -} -.social-media-list a:hover { - text-decoration: none; -} -.social-media-list a:hover .username { - text-decoration: underline; -} - -/** - * Blockquotes - */ -blockquote { - color: #828282; - border-left: 4px solid #e8e8e8; - padding-left: 15px; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; -} -blockquote > :last-child { - margin-bottom: 0; -} - -/** - * Code formatting - */ -pre, -code { - font-size: 15px; - border: 1px solid #e8e8e8; - border-radius: 3px; - background-color: #eef; -} - -code { - padding: 1px 5px; -} - -pre { - padding: 8px 12px; - overflow-x: auto; -} -pre > code { - border: 0; - padding-right: 0; - padding-left: 0; -} - -/** - * Wrapper - */ -.wrapper { - max-width: -webkit-calc(1200px - (30px * 2)); - max-width: calc(1200px - (30px * 2)); - margin-right: auto; - margin-left: auto; - padding-right: 30px; - padding-left: 30px; -} -@media screen and (max-width: 800px) { - .wrapper { - max-width: -webkit-calc(1200px - (30px)); - max-width: calc(1200px - (30px)); - padding-right: 15px; - padding-left: 15px; - } -} - -/** - * Clearfix - */ -.footer-col-wrapper:after, .wrapper:after { - content: ""; - display: table; - clear: both; -} - -/** - * Icons - */ -.svg-icon { - width: 16px; - height: 16px; - display: inline-block; - fill: #828282; - padding-right: 5px; - vertical-align: text-top; -} - -.social-media-list li + li { - padding-top: 5px; -} - -/** - * Tables - */ -table { - margin-bottom: 30px; - width: 100%; - text-align: left; - color: #3f3f3f; - border-collapse: collapse; - border: 1px solid #e8e8e8; -} -table tr:nth-child(even) { - background-color: #f7f7f7; -} -table th, table td { - padding: 10px 15px; -} -table th { - background-color: #f0f0f0; - border: 1px solid #dedede; - border-bottom-color: #c9c9c9; -} -table td { - border: 1px solid #e8e8e8; -} - -/** - * Site header - */ -.site-header { - border-top: 5px solid #424242; - border-bottom: 1px solid #e8e8e8; - min-height: 55.95px; - position: relative; -} - -.site-title { - font-size: 26px; - font-weight: 300; - line-height: 54px; - letter-spacing: -1px; - margin-bottom: 0; - float: left; -} -.site-title, .site-title:visited { - color: #424242; -} - -.site-nav { - float: right; - line-height: 54px; -} -.site-nav .nav-trigger { - display: none; -} -.site-nav .menu-icon { - display: none; -} -.site-nav .page-link { - color: #111; - line-height: 1.5; -} -.site-nav .page-link:not(:last-child) { - margin-right: 20px; -} -@media screen and (max-width: 600px) { - .site-nav { - position: absolute; - top: 9px; - right: 15px; - background-color: #fdfdfd; - border: 1px solid #e8e8e8; - border-radius: 5px; - text-align: right; - } - .site-nav label[for=nav-trigger] { - display: block; - float: right; - width: 36px; - height: 36px; - z-index: 2; - cursor: pointer; - } - .site-nav .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - } - .site-nav .menu-icon > svg { - fill: #424242; - } - .site-nav input ~ .trigger { - clear: both; - display: none; - } - .site-nav input:checked ~ .trigger { - display: block; - padding-bottom: 5px; - } - .site-nav .page-link { - display: block; - padding: 5px 10px; - margin-left: 20px; - } - .site-nav .page-link:not(:last-child) { - margin-right: 0; - } -} - -/** - * Site footer - */ -.site-footer { - border-top: 1px solid #e8e8e8; - padding: 30px 0; -} - -.footer-heading { - font-size: 18px; - margin-bottom: 15px; -} - -.contact-list, -.social-media-list { - list-style: none; - margin-left: 0; -} - -.footer-col-wrapper { - font-size: 15px; - color: #828282; - margin-left: -15px; -} - -.footer-col { - float: left; - margin-bottom: 15px; - padding-left: 15px; -} - -.footer-col-1 { - width: -webkit-calc(35% - (30px / 2)); - width: calc(35% - (30px / 2)); -} - -.footer-col-2 { - width: -webkit-calc(20% - (30px / 2)); - width: calc(20% - (30px / 2)); -} - -.footer-col-3 { - width: -webkit-calc(45% - (30px / 2)); - width: calc(45% - (30px / 2)); -} - -@media screen and (max-width: 800px) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (30px / 2)); - width: calc(50% - (30px / 2)); - } - .footer-col-3 { - width: -webkit-calc(100% - (30px / 2)); - width: calc(100% - (30px / 2)); - } -} -@media screen and (max-width: 600px) { - .footer-col { - float: none; - width: -webkit-calc(100% - (30px / 2)); - width: calc(100% - (30px / 2)); - } -} -/** - * Page content - */ -.page-content { - padding: 30px 0; - flex: 1; -} - -.page-heading { - font-size: 32px; -} - -.post-list-heading { - font-size: 28px; -} - -.post-list { - margin-left: 0; - list-style: none; -} -.post-list > li { - margin-bottom: 30px; -} - -.post-meta { - font-size: 14px; - color: #828282; -} - -.post-link { - display: block; - font-size: 24px; -} - -/** - * Posts - */ -.post-header { - margin-bottom: 30px; -} - -.post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; -} -@media screen and (max-width: 800px) { - .post-title { - font-size: 36px; - } -} - -.post-content { - margin-bottom: 30px; -} -.post-content h2 { - font-size: 32px; -} -@media screen and (max-width: 800px) { - .post-content h2 { - font-size: 28px; - } -} -.post-content h3 { - font-size: 26px; -} -@media screen and (max-width: 800px) { - .post-content h3 { - font-size: 22px; - } -} -.post-content h4 { - font-size: 20px; -} -@media screen and (max-width: 800px) { - .post-content h4 { - font-size: 18px; - } -} - -/** - * Syntax highlighting styles - */ -.highlight { - background: #fff; -} -.highlighter-rouge .highlight { - background: #eef; -} -.highlight .c { - color: #998; - font-style: italic; -} -.highlight .err { - color: #a61717; - background-color: #e3d2d2; -} -.highlight .k { - font-weight: bold; -} -.highlight .o { - font-weight: bold; -} -.highlight .cm { - color: #998; - font-style: italic; -} -.highlight .cp { - color: #999; - font-weight: bold; -} -.highlight .c1 { - color: #998; - font-style: italic; -} -.highlight .cs { - color: #999; - font-weight: bold; - font-style: italic; -} -.highlight .gd { - color: #000; - background-color: #fdd; -} -.highlight .gd .x { - color: #000; - background-color: #faa; -} -.highlight .ge { - font-style: italic; -} -.highlight .gr { - color: #a00; -} -.highlight .gh { - color: #999; -} -.highlight .gi { - color: #000; - background-color: #dfd; -} -.highlight .gi .x { - color: #000; - background-color: #afa; -} -.highlight .go { - color: #888; -} -.highlight .gp { - color: #555; -} -.highlight .gs { - font-weight: bold; -} -.highlight .gu { - color: #aaa; -} -.highlight .gt { - color: #a00; -} -.highlight .kc { - font-weight: bold; -} -.highlight .kd { - font-weight: bold; -} -.highlight .kp { - font-weight: bold; -} -.highlight .kr { - font-weight: bold; -} -.highlight .kt { - color: #458; - font-weight: bold; -} -.highlight .m { - color: #099; -} -.highlight .s { - color: #d14; -} -.highlight .na { - color: #008080; -} -.highlight .nb { - color: #0086B3; -} -.highlight .nc { - color: #458; - font-weight: bold; -} -.highlight .no { - color: #008080; -} -.highlight .ni { - color: #800080; -} -.highlight .ne { - color: #900; - font-weight: bold; -} -.highlight .nf { - color: #900; - font-weight: bold; -} -.highlight .nn { - color: #555; -} -.highlight .nt { - color: #000080; -} -.highlight .nv { - color: #008080; -} -.highlight .ow { - font-weight: bold; -} -.highlight .w { - color: #bbb; -} -.highlight .mf { - color: #099; -} -.highlight .mh { - color: #099; -} -.highlight .mi { - color: #099; -} -.highlight .mo { - color: #099; -} -.highlight .sb { - color: #d14; -} -.highlight .sc { - color: #d14; -} -.highlight .sd { - color: #d14; -} -.highlight .s2 { - color: #d14; -} -.highlight .se { - color: #d14; -} -.highlight .sh { - color: #d14; -} -.highlight .si { - color: #d14; -} -.highlight .sx { - color: #d14; -} -.highlight .sr { - color: #009926; -} -.highlight .s1 { - color: #d14; -} -.highlight .ss { - color: #990073; -} -.highlight .bp { - color: #999; -} -.highlight .vc { - color: #008080; -} -.highlight .vg { - color: #008080; -} -.highlight .vi { - color: #008080; -} -.highlight .il { - color: #099; -} - -ol ol { - list-style-type: lower-alpha; -} - -ol ol ol { - list-style-type: lower-roman; -} - -ol ol ol ol { - list-style-type: circle; -} - -ol ol ol ol ol { - list-style-type: disc; -} - -li:only-child { - margin-bottom: 1em; -} - -.rationale { - background: rgba(170, 170, 170, 0.2); - border-left: 5px solid #008; - border-radius: 5px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); - padding: 0.8rem; -} -.rationale::before { - color: #008; - content: "RATIONALE"; - display: block; - font-weight: bold; - font-size: 0.75em; - padding-bottom: 0.125rem; -} - -.deprecation { - background: rgba(221, 221, 221, 0.2); - border-left: 5px solid #FFA500; - border-radius: 5px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); - padding: 0.8rem; -} -.deprecation::before { - color: #FFA500; - content: "DEPRECATION WARNING"; - display: block; - font-weight: bold; - font-size: 0.75em; - padding-bottom: 0.125rem; -} - -/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/driver-project-usage/assets/main.css.map b/driver-project-usage/assets/main.css.map deleted file mode 100644 index 8f17265..0000000 --- a/driver-project-usage/assets/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_base.scss","../_sass/minima.scss","../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_layout.scss","../vendor/bundle/ruby/2.7.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;EAGE;EACA;;;AAKF;AAAA;AAAA;AAGA;EACE;EACA,OCLiB;EDMjB,kBCLiB;EDMjB;EACA;EACG;EACE;EACG;EACR;EACA;EACA;EACA;;;AAKF;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;EAIE;;;AAKF;AAAA;AAAA;AAGA;EACE;;;AAKF;AAAA;AAAA;AAGA;EACE;EACA;;;AAKF;AAAA;AAAA;AAGA;EACE;;;AAGF;EACE,WChEiB;;;ADqEnB;AAAA;AAAA;AAGA;EACE,aCtEiB;;;AD0EjB;AAAA;EAEE;;;AAMJ;AAAA;AAAA;AAGA;EACE,aC1FiB;;;AD+FnB;AAAA;AAAA;AAGA;EACE,OC3FiB;ED4FjB;;AAEA;EACE;;AAGF;EACE,OCrGe;EDsGf;;AAGF;EACE;;AAEA;EACE;;;AAMN;AAAA;AAAA;AAGA;EACE,OCnHiB;EDoHjB;EACA;EC1FA;ED4FA;EACA;;AAEA;EACE;;;AAMJ;AAAA;AAAA;AAGA;AAAA;ECzGE;ED4GA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;EACA;EACA,eC3KiB;ED4KjB,cC5KiB;;AA2BjB;ED2IF;IAUI;IACA;IACA;IACA;;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;;;AAKF;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;;;AAMJ;AAAA;AAAA;AAGA;EACE,eC7NiB;ED8NjB;EACA,YCrNiB;EDsNjB;EACA;EACA;;AAEE;EACE;;AAGJ;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EACE;;;AE3PJ;AAAA;AAAA;AAGA;EACE;EACA;EACA;EAGA;;;AAGF;ED+BE;EC7BA;EACA;EACA;EACA;EACA;;AAEA;EAEE,ODJe;;;ACQnB;EACE;EACA;;AAEA;EACI;;AAGJ;EACE;;AAGF;EACE,OD3Be;EC4Bf,aDhCe;;ACmCf;EACE;;ADPJ;ECXF;IAuBI;IACA;IACA;IACA,kBDvCe;ICwCf;IACA;IACA;;EAEA;IACE;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IACE,MD1DW;;EC8Df;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IAKA;;EAHA;IACE;;;;AASR;AAAA;AAAA;AAGA;EACE;EACA;;;AAGF;EDrEE;ECuEA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EDhFE;ECkFA,OD7GiB;EC8GjB;;;AAIF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AD/GA;ECmHA;AAAA;IAEE;IACA;;EAGF;IACE;IACA;;;AD3HF;ECgIA;IACE;IACA;IACA;;;AAMJ;AAAA;AAAA;AAGA;EACE;EACA;;;AAGF;ED3IE;;;AC+IF;ED/IE;;;ACmJF;EACE;EACA;;AAEA;EACE,eDzLe;;;AC6LnB;EACE,WDjMiB;ECkMjB,ODzLiB;;;AC4LnB;EACE;EDlKA;;;ACwKF;AAAA;AAAA;AAGA;EACE,eD7MiB;;;ACgNnB;ED/KE;ECiLA;EACA;;ADxLA;ECqLF;ID/KE;;;;ACyLF;EACE,eD3NiB;;AC6NjB;ED5LA;;AANA;ECkMA;ID5LA;;;ACoMA;EDpMA;;AANA;EC0MA;IDpMA;;;AC4MA;ED5MA;;AANA;ECkNA;ID5MA;;;;AE3CF;AAAA;AAAA;AAGA;EACE;;AAGA;EACE;;AAGF;EAAS;EAAa;;AACtB;EAAS;EAAgB;;AACzB;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;EAAa;EAAmB;;AACzC;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;EAAa;;AACtB;EAAS;EAAa;;AACtB;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;AACT;EAAS;;;AFdX;EAAQ;;;AACR;EAAW;;;AACX;EAAc;;;AACd;EAAiB;;;AAIjB;EACE;;;AAeA;EACE;EACA;EACA,eAbY;EAcZ;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAbJ;EACE;EACA;EACA,eAbY;EAcZ;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA","sourcesContent":["/**\n * Reset some basic elements\n */\nbody, h1, h2, h3, h4, h5, h6,\np, blockquote, pre, hr,\ndl, dd, ol, ul, figure {\n margin: 0;\n padding: 0;\n}\n\n\n\n/**\n * Basic styling\n */\nbody {\n font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;\n color: $text-color;\n background-color: $background-color;\n -webkit-text-size-adjust: 100%;\n -webkit-font-feature-settings: \"kern\" 1;\n -moz-font-feature-settings: \"kern\" 1;\n -o-font-feature-settings: \"kern\" 1;\n font-feature-settings: \"kern\" 1;\n font-kerning: normal;\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n}\n\n\n\n/**\n * Set `margin-bottom` to maintain vertical rhythm\n */\nh1, h2, h3, h4, h5, h6,\np, blockquote, pre,\nul, ol, dl, figure,\n%vertical-rhythm {\n margin-bottom: $spacing-unit / 2;\n}\n\n\n\n/**\n * `main` element\n */\nmain {\n display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */\n}\n\n\n\n/**\n * Images\n */\nimg {\n max-width: 100%;\n vertical-align: middle;\n}\n\n\n\n/**\n * Figures\n */\nfigure > img {\n display: block;\n}\n\nfigcaption {\n font-size: $small-font-size;\n}\n\n\n\n/**\n * Lists\n */\nul, ol {\n margin-left: $spacing-unit;\n}\n\nli {\n > ul,\n > ol {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Headings\n */\nh1, h2, h3, h4, h5, h6 {\n font-weight: $base-font-weight;\n}\n\n\n\n/**\n * Links\n */\na {\n color: $brand-color;\n text-decoration: none;\n\n &:visited {\n color: darken($brand-color, 15%);\n }\n\n &:hover {\n color: $text-color;\n text-decoration: underline;\n }\n\n .social-media-list &:hover {\n text-decoration: none;\n\n .username {\n text-decoration: underline;\n }\n }\n}\n\n\n/**\n * Blockquotes\n */\nblockquote {\n color: $grey-color;\n border-left: 4px solid $grey-color-light;\n padding-left: $spacing-unit / 2;\n @include relative-font-size(1.125);\n letter-spacing: -1px;\n font-style: italic;\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Code formatting\n */\npre,\ncode {\n @include relative-font-size(0.9375);\n border: 1px solid $grey-color-light;\n border-radius: 3px;\n background-color: #eef;\n}\n\ncode {\n padding: 1px 5px;\n}\n\npre {\n padding: 8px 12px;\n overflow-x: auto;\n\n > code {\n border: 0;\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n\n/**\n * Wrapper\n */\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));\n margin-right: auto;\n margin-left: auto;\n padding-right: $spacing-unit;\n padding-left: $spacing-unit;\n @extend %clearfix;\n\n @include media-query($on-laptop) {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));\n max-width: calc(#{$content-width} - (#{$spacing-unit}));\n padding-right: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n }\n}\n\n\n\n/**\n * Clearfix\n */\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n\n\n/**\n * Icons\n */\n\n.svg-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n fill: #{$grey-color};\n padding-right: 5px;\n vertical-align: text-top;\n}\n\n.social-media-list {\n li + li {\n padding-top: 5px;\n }\n}\n\n\n\n/**\n * Tables\n */\ntable {\n margin-bottom: $spacing-unit;\n width: 100%;\n text-align: $table-text-align;\n color: lighten($text-color, 18%);\n border-collapse: collapse;\n border: 1px solid $grey-color-light;\n tr {\n &:nth-child(even) {\n background-color: lighten($grey-color-light, 6%);\n }\n }\n th, td {\n padding: ($spacing-unit / 3) ($spacing-unit / 2);\n }\n th {\n background-color: lighten($grey-color-light, 3%);\n border: 1px solid darken($grey-color-light, 4%);\n border-bottom-color: darken($grey-color-light, 12%);\n }\n td {\n border: 1px solid $grey-color-light;\n }\n}\n","@charset \"utf-8\";\n\n// Define defaults for each variable.\n\n$base-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\" !default;\n$base-font-size: 16px !default;\n$base-font-weight: 400 !default;\n$small-font-size: $base-font-size * 0.875 !default;\n$base-line-height: 1.5 !default;\n\n$spacing-unit: 30px !default;\n\n$text-color: #111 !default;\n$background-color: #fdfdfd !default;\n$brand-color: #2a7ae2 !default;\n\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 40%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$table-text-align: left !default;\n\n// Width of the content area\n// changed from minima default (GA4GH)\n$content-width: 1200px !default;\n\n$on-palm: 600px !default;\n$on-laptop: 800px !default;\n\n// Use media queries like this:\n// @include media-query($on-palm) {\n// .wrapper {\n// padding-right: $spacing-unit / 2;\n// padding-left: $spacing-unit / 2;\n// }\n// }\n@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n@mixin relative-font-size($ratio) {\n font-size: $base-font-size * $ratio;\n}\n\n// Import partials.\n@import\n\"minima/base\",\n\"minima/layout\",\n\"minima/syntax-highlighting\"\n;\n\n// due to estensive nested lists we set styling (GA4GH added)\n\nol ol { list-style-type: lower-alpha; }\nol ol ol { list-style-type: lower-roman; }\nol ol ol ol { list-style-type: circle; }\nol ol ol ol ol { list-style-type: disc; }\n\n// a fix for Kramdowns markup/css that doesn't leave enough space at the end of single item lists (GA4GH added)\n\nli:only-child {\n margin-bottom: 1em;\n}\n\n// custom CSS for callouts (GA4GH added)\n\n$border-radius: 5px;\n\n$callouts: (\n // rationale example callout\n rationale: (#008, rgba(#aaa, .2), 'RATIONALE'),\n // deprecation warning callout\n deprecation: (#FFA500, rgba(#ddd, .2), 'DEPRECATION WARNING'),\n);\n\n@each $class, $props in $callouts {\n .#{$class} {\n background: nth($props, 2);\n border-left: $border-radius solid nth($props, 1);\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n\n &::before {\n color: nth($props, 1);\n content: nth($props, 3);\n display: block;\n font-weight: bold;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n }\n}\n","/**\n * Site header\n */\n.site-header {\n border-top: 5px solid $grey-color-dark;\n border-bottom: 1px solid $grey-color-light;\n min-height: $spacing-unit * 1.865;\n\n // Positioning context for the mobile navigation icon\n position: relative;\n}\n\n.site-title {\n @include relative-font-size(1.625);\n font-weight: 300;\n line-height: $base-line-height * $base-font-size * 2.25;\n letter-spacing: -1px;\n margin-bottom: 0;\n float: left;\n\n &,\n &:visited {\n color: $grey-color-dark;\n }\n}\n\n.site-nav {\n float: right;\n line-height: $base-line-height * $base-font-size * 2.25;\n\n .nav-trigger {\n display: none;\n }\n\n .menu-icon {\n display: none;\n }\n\n .page-link {\n color: $text-color;\n line-height: $base-line-height;\n\n // Gaps between nav items, but not on the last one\n &:not(:last-child) {\n margin-right: 20px;\n }\n }\n\n @include media-query($on-palm) {\n position: absolute;\n top: 9px;\n right: $spacing-unit / 2;\n background-color: $background-color;\n border: 1px solid $grey-color-light;\n border-radius: 5px;\n text-align: right;\n\n label[for=\"nav-trigger\"] {\n display: block;\n float: right;\n width: 36px;\n height: 36px;\n z-index: 2;\n cursor: pointer;\n }\n\n .menu-icon {\n display: block;\n float: right;\n width: 36px;\n height: 26px;\n line-height: 0;\n padding-top: 10px;\n text-align: center;\n\n > svg {\n fill: $grey-color-dark;\n }\n }\n\n input ~ .trigger {\n clear: both;\n display: none;\n }\n\n input:checked ~ .trigger {\n display: block;\n padding-bottom: 5px;\n }\n\n .page-link {\n display: block;\n padding: 5px 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n margin-left: 20px;\n }\n }\n}\n\n\n\n/**\n * Site footer\n */\n.site-footer {\n border-top: 1px solid $grey-color-light;\n padding: $spacing-unit 0;\n}\n\n.footer-heading {\n @include relative-font-size(1.125);\n margin-bottom: $spacing-unit / 2;\n}\n\n.contact-list,\n.social-media-list {\n list-style: none;\n margin-left: 0;\n}\n\n.footer-col-wrapper {\n @include relative-font-size(0.9375);\n color: $grey-color;\n margin-left: -$spacing-unit / 2;\n @extend %clearfix;\n}\n\n.footer-col {\n float: left;\n margin-bottom: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n}\n\n.footer-col-1 {\n width: -webkit-calc(35% - (#{$spacing-unit} / 2));\n width: calc(35% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-2 {\n width: -webkit-calc(20% - (#{$spacing-unit} / 2));\n width: calc(20% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-3 {\n width: -webkit-calc(45% - (#{$spacing-unit} / 2));\n width: calc(45% - (#{$spacing-unit} / 2));\n}\n\n@include media-query($on-laptop) {\n .footer-col-1,\n .footer-col-2 {\n width: -webkit-calc(50% - (#{$spacing-unit} / 2));\n width: calc(50% - (#{$spacing-unit} / 2));\n }\n\n .footer-col-3 {\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n@include media-query($on-palm) {\n .footer-col {\n float: none;\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n\n\n/**\n * Page content\n */\n.page-content {\n padding: $spacing-unit 0;\n flex: 1;\n}\n\n.page-heading {\n @include relative-font-size(2);\n}\n\n.post-list-heading {\n @include relative-font-size(1.75);\n}\n\n.post-list {\n margin-left: 0;\n list-style: none;\n\n > li {\n margin-bottom: $spacing-unit;\n }\n}\n\n.post-meta {\n font-size: $small-font-size;\n color: $grey-color;\n}\n\n.post-link {\n display: block;\n @include relative-font-size(1.5);\n}\n\n\n\n/**\n * Posts\n */\n.post-header {\n margin-bottom: $spacing-unit;\n}\n\n.post-title {\n @include relative-font-size(2.625);\n letter-spacing: -1px;\n line-height: 1;\n\n @include media-query($on-laptop) {\n @include relative-font-size(2.25);\n }\n}\n\n.post-content {\n margin-bottom: $spacing-unit;\n\n h2 {\n @include relative-font-size(2);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.75);\n }\n }\n\n h3 {\n @include relative-font-size(1.625);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.375);\n }\n }\n\n h4 {\n @include relative-font-size(1.25);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.125);\n }\n }\n}\n","/**\n * Syntax highlighting styles\n */\n.highlight {\n background: #fff;\n @extend %vertical-rhythm;\n\n .highlighter-rouge & {\n background: #eef;\n }\n\n .c { color: #998; font-style: italic } // Comment\n .err { color: #a61717; background-color: #e3d2d2 } // Error\n .k { font-weight: bold } // Keyword\n .o { font-weight: bold } // Operator\n .cm { color: #998; font-style: italic } // Comment.Multiline\n .cp { color: #999; font-weight: bold } // Comment.Preproc\n .c1 { color: #998; font-style: italic } // Comment.Single\n .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special\n .gd { color: #000; background-color: #fdd } // Generic.Deleted\n .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific\n .ge { font-style: italic } // Generic.Emph\n .gr { color: #a00 } // Generic.Error\n .gh { color: #999 } // Generic.Heading\n .gi { color: #000; background-color: #dfd } // Generic.Inserted\n .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific\n .go { color: #888 } // Generic.Output\n .gp { color: #555 } // Generic.Prompt\n .gs { font-weight: bold } // Generic.Strong\n .gu { color: #aaa } // Generic.Subheading\n .gt { color: #a00 } // Generic.Traceback\n .kc { font-weight: bold } // Keyword.Constant\n .kd { font-weight: bold } // Keyword.Declaration\n .kp { font-weight: bold } // Keyword.Pseudo\n .kr { font-weight: bold } // Keyword.Reserved\n .kt { color: #458; font-weight: bold } // Keyword.Type\n .m { color: #099 } // Literal.Number\n .s { color: #d14 } // Literal.String\n .na { color: #008080 } // Name.Attribute\n .nb { color: #0086B3 } // Name.Builtin\n .nc { color: #458; font-weight: bold } // Name.Class\n .no { color: #008080 } // Name.Constant\n .ni { color: #800080 } // Name.Entity\n .ne { color: #900; font-weight: bold } // Name.Exception\n .nf { color: #900; font-weight: bold } // Name.Function\n .nn { color: #555 } // Name.Namespace\n .nt { color: #000080 } // Name.Tag\n .nv { color: #008080 } // Name.Variable\n .ow { font-weight: bold } // Operator.Word\n .w { color: #bbb } // Text.Whitespace\n .mf { color: #099 } // Literal.Number.Float\n .mh { color: #099 } // Literal.Number.Hex\n .mi { color: #099 } // Literal.Number.Integer\n .mo { color: #099 } // Literal.Number.Oct\n .sb { color: #d14 } // Literal.String.Backtick\n .sc { color: #d14 } // Literal.String.Char\n .sd { color: #d14 } // Literal.String.Doc\n .s2 { color: #d14 } // Literal.String.Double\n .se { color: #d14 } // Literal.String.Escape\n .sh { color: #d14 } // Literal.String.Heredoc\n .si { color: #d14 } // Literal.String.Interpol\n .sx { color: #d14 } // Literal.String.Other\n .sr { color: #009926 } // Literal.String.Regex\n .s1 { color: #d14 } // Literal.String.Single\n .ss { color: #990073 } // Literal.String.Symbol\n .bp { color: #999 } // Name.Builtin.Pseudo\n .vc { color: #008080 } // Name.Variable.Class\n .vg { color: #008080 } // Name.Variable.Global\n .vi { color: #008080 } // Name.Variable.Instance\n .il { color: #099 } // Literal.Number.Integer.Long\n}\n"],"file":"main.css"} \ No newline at end of file diff --git a/driver-project-usage/assets/minima-social-icons.svg b/driver-project-usage/assets/minima-social-icons.svg deleted file mode 100644 index fa7399f..0000000 --- a/driver-project-usage/assets/minima-social-icons.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/driver-project-usage/changes-1_2.html b/driver-project-usage/changes-1_2.html deleted file mode 100644 index aee7cbf..0000000 --- a/driver-project-usage/changes-1_2.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - -Changes Between Versions 1.0 and 1.2 | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

Changes Between Versions 1.0 and 1.2

-
- -
-

This document lists changes between

-
    -
  • GA4GH AAI OIDC Profile 1.0.0 and 1.2 -
  • -
  • GA4GH Passport 1.0.0 and 1.2
  • -
- -

Table of Contents

- - - -

Terminology changes

- -
    -
  • Removed double definitions of same concepts like “Claim Source” in AAI and “Passport Visa Assertion Source” in Passport.
  • -
  • Made distinction between claim as an abstract assertion and a JWT/OIDC claim as a pair of a string key and a JSON value.
  • -
  • Renamed “Data Owner” to “Data Controller” to be compatible with European GDPR
  • -
- -

Changed terms

- -
    -
  • -Claim Management System removed, the term was not used
  • -
  • claim → Visa Assertion -
  • -
  • -Claim RepositoryVisa Assertion Repository -
  • -
  • -Claim SourceVisa Assertion Source -
  • -
  • -Claim ClearinghousePassport Clearinghouse -
  • -
  • -Embedded TokenVisa -
  • -
  • -Embedded Token IssuerVisa Issuer -
  • -
  • -Embedded Access TokenVisa Access Token -
  • -
  • -Embedded Document TokenVisa Document Token -
  • -
  • -Flow of ClaimsFlow of Assertions -
  • -
  • -Passport Bearer TokenPassport-Scoped Access Token -
  • -
  • -Data OwnerData Controller -
  • -
- -

New terms

- -
    -
  • -Passport - A signed and verifiable JWT container for holding Visas.
  • -
  • -Passport Issuer - a service that creates and signs Passports.
  • -
  • -Token Endpoint – as defined by OIDC
  • -
  • -UserInfo Endpoint - as defined by OIDC
  • -
- -

Introduced Token Exchange mechanism

- -

The standardized mechanism for exchanging access tokens for other tokens defined in RFC 8693 OAuth 2.0 Token Exchange -was added and used for releasing Passports.

- -

Redefined Passport as a JWT containing Visas

- -

In version 1.0, Passport was defined as ”GA4GH-compatible access token along with the Passport Claim that is returned from Passport Broker service endpoints using such an access token“, -thus as a tuple of an access token and a list of Visas that can be obtained from UserInfo endpoint using the access token.

- -

In version 1.2, Passport is defined as “a signed and verifiable JWT container for holding Visas“, thus as a token that can be passed among systems.

- -

For backward compatibility with version 1.0, list of Visas is still provided as a claim value from UserInfo endpoint.

- -

Defined Passport Issuer

- -

A Passport Issuer is a service that creates and signs Passports. -A Broker is an OIDC Provider service that collects Visas from Visa Issuers and provides them to Passport Clearinghouses.

- -

Broker may optionally become a Passport Issuer by supporting Token Exchange for issuance of Passports.

- -

Brokers conforming to version 1.0 are still compatible with version 1.2, because Token Exchange support is optional.

- -

Added more signing algorithms

- -

The version 1.0 allowed only RS256 algorithm for JWT signing. -It is RSA-based algorithm using keys of size 2048 bits or larger and SHA-256 hash function.

- -

The AAI specification version 1.2 allows also the ES256 algorithm which is -ECDSA-based using P-256 elliptic curve and SHA-256 hash function.

- -

Elliptic Curve Cryptography allows much shorter keys and signatures than RSA. -A short Elliptic Curve key of around 256 bits provides the same security as a 3072 bit RSA key.

- -

For a detailed discussion of signing algorithms, see the article -JWTs: Which Signing Algorithm Should I Use?

- -

Media types for JWTs

- -

In version 1.0, all the mentioned JWTs (access tokens, visas) used in their typ (media type) header parameter -the generic value JWT that marks a generic JWT.

- -

In version 1.2, the typ header parameter is used to distinguish the various types of JWTs:

- -
    -
  • access tokens conforming to RFC9038 -use the value at+jwt -
  • -
  • Passports use the value vnd.ga4gh.passport+jwt -
  • -
  • Visas are recommended to use the value vnd.ga4gh.visa+jwt but allowed to use JWT -for backward compatibility with version 1.0
  • -
- -

Proposed Deprecations

- -

Visa Access Tokens (also referred to as Embedded Access Tokens)

- -

It is proposed that the 1.x versions of this specification will be the last to support -Visa Access Tokens. New implementations should issue Visas -as Visa Document Tokens.

- -
- -
- -
-
- - - diff --git a/driver-project-usage/changes-1_2_1.html b/driver-project-usage/changes-1_2_1.html deleted file mode 100644 index 11148bf..0000000 --- a/driver-project-usage/changes-1_2_1.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - -Changes in v1.2.1 | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

Changes in v1.2.1

-
- -
-

This document lists changes between 1.2 and 1.2.1

- -
    -
  • Added DURI Passport specs to AAI repository
  • -
  • Added table of versions
  • -
- - -
- -
- -
-
- - - diff --git a/driver-project-usage/check-links.py b/driver-project-usage/check-links.py deleted file mode 100644 index 502aea8..0000000 --- a/driver-project-usage/check-links.py +++ /dev/null @@ -1,92 +0,0 @@ -from bs4 import BeautifulSoup -import os -from pprint import pprint -import re - -anchors = set() -local_hrefs = set() -external_hrefs = set() - -for root, dirs, files in os.walk('build'): - for relpath in files: - if 'htm' in relpath: - with open(os.path.join(root, relpath)) as fh: - content = fh.read() - - if relpath == 'index.html': - base = '' - - base = relpath.replace('.html','') - - soup = BeautifulSoup(content, 'html.parser') - for link in soup.find_all('a'): - href = link.get('href') - name = link.get('name') - if href is None: - anchors.add(f"{base}#{name}") - #print("No href: "+str(link)) - else: - if href in ['/local/', - '/local/aai-openid-connect-profile', - '/local/aai-faq', - '/local/changes-1_2']: - pass - elif href.startswith('#'): - local_hrefs.add(f"{base}{href}") - else: - external_hrefs.add(href) - - for heading in ['h1','h2','h3', 'strong']: - for link in soup.find_all(heading): - id = link.get('id') - if id is not None: - anchors.add(f"{base}#{id}") - #print("No href: "+str(link)) - - - -line_links_from_duri_passport = """ -[GA4GH AAI OIDC Profile](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#terminology) -* **[Passport](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport)** -* **[Passport-Scoped Access Token](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport-scoped-access-token)** -* **[Passport Clearinghouse](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-passport-clearinghouse)** -* **[Visa Assertion](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-assertion)** -* **[Visa Assertion Source](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-assertion-source)** -* **[Visa Issuer](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-issuer)** -* **[Visa](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa)** -* **[JWT](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-jwt)** -* **[GA4GH Claim](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-ga4gh-claim)** -* **[Broker](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-broker)** -Please see the [Flow of Assertions](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#flow-of-assertions) - [GA4GH AAI Specification Visa formats](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-issued-by-visa-issuer) - [GA4GH AAI Specification](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md) -[Conformance for Visa Issuers](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#conformance-for-visa-issuers) - for [Visa Document Token Format](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-document-token-format) -- For [Visa Access Token Format](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#visa-access-token-format) -- REQUIRED.The section [Signing Algorithms](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#signing-algorithms) -if the Visa is encoded as a [Visa Access Token](https://github.com/ga4gh/data-security/blob/master/AAI/AAIConnectProfile.md#term-visa-access-token-format). -""" - -print ("\n\nChecking anchors to which DURI passport links\n") -for line_from_duri in line_links_from_duri_passport.split('\n'): - #print(line_from_duri) - m = re.search(r'AAIConnectProfile.md#([^)]*)', line_from_duri) - if m: - target = f"aai-openid-connect-profile#{m.group(1)}" - if target in anchors: - print (f"valid {target}") - else: - print (f"INVALID ------ {target}") - -#pprint(anchors) - -print ("\n\nChecking links within AAI\n") -for local_href in local_hrefs: - if local_href in anchors: - print(f"valid {local_href}") - else: - print(f"INVALID ---- {local_href}") - -print ("\n\nListing links from AAI to external hrefs\n") -pprint(external_hrefs) - diff --git a/driver-project-usage/feed.xml b/driver-project-usage/feed.xml deleted file mode 100644 index 75cbedf..0000000 --- a/driver-project-usage/feed.xml +++ /dev/null @@ -1 +0,0 @@ -Jekyll2023-11-20T13:13:22+00:00/data-security/driver-project-usage/feed.xmlGA4GH Data SecurityAAI \ No newline at end of file diff --git a/driver-project-usage/ga4gh-custom-visas.html b/driver-project-usage/ga4gh-custom-visas.html deleted file mode 100644 index f3a092e..0000000 --- a/driver-project-usage/ga4gh-custom-visas.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - -GA4GH Passport Custom Visa Registry | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

GA4GH Passport Custom Visa Registry

-
- -
-

GA4GH Passport Custom Visa Registry

- -

Introduction

- -

This document captures Passport Custom Visa -Types that have gone -through the GA4GH Passport custom visa proposal -process.

- -

For more information about this process, please refer to the Passport -Custom Visa Types -section of the Passport specification or reach out to maintainers -on the Update Procedure page.

- -

Custom Visa Registry

- - - - - - - - - - - - - - - - - - - - -
DateVisa NameVisa Type StringShort DescriptionDocumentation Links
2020-06-30NIH RAS Controlled Accesshttps://ras.nih.gov/visas/v1.1Multiple controlled access authorizations encoded into a single visa with a more detailed list of attributes per authorization. Currently encodes a detailed list of attribrutes that come from NIH’s dbGaP visa source repository.RAS Service Offerings
- -
- -
- -
-
- - - diff --git a/driver-project-usage/ga4gh-passport.html b/driver-project-usage/ga4gh-passport.html deleted file mode 100644 index ab2ebe8..0000000 --- a/driver-project-usage/ga4gh-passport.html +++ /dev/null @@ -1,1669 +0,0 @@ - - - - - - - - -GA4GH Passport | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
-
- -
-

GA4GH Passport

-
- -
-

GA4GH Passport

- -

Version: 1.2.1

- -

Work Stream Name: Data Use and Researcher Identity (DURI)

- -

Product Name: GA4GH Passport

- -

Product Description: This document provides the GA4GH technical -specification for a GA4GH Passport to be -consumed by Passport Clearinghouses in a -standardized approach to determine whether or not data access should be -granted. Additionally, the specification provides guidance on encoding -specific use cases, including -Visas for Registered Access as -described in the “Registered access: authorizing data -access” publication. -Refer to the Overview for an introduction to how data -objects and services defined in this specification fit together.

- -

Table of Contents

- -
    -
  • toc
  • -
- -

Terminology

- -

Inherited Definitions

- -

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, -“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be -interpreted as described in RFC 2119.

- -

This specification inherits terminology from the -GA4GH AAI OIDC Profile -specification, namely these terms:

- - - -

Term Definitions

- -

Passport Claim

- -
    -
  • -

    The ga4gh_passport_v1 claim. It is a GA4GH Claim -with a claim value being a list of Visas.

    -
  • -
  • -

    Visas from multiple Visa Issuers can be bundled together in the -same ga4gh_passport_v1 claim.

    -
  • -
  • -

    For example, the following structure encodes a Passport Claim:

    - -
    -
    "ga4gh_passport_v1" : [
    -    <Visa>,
    -    <Visa (if more than one)>,
    -    ...
    -]
    -
    -

    Visa Claim

    -
  • -
  • -

    The ga4gh_visa_v1 claim. It is a GA4GH Claim -with a claim value being a Visa Object.

    -
  • -
  • -

    For example, the following structure encodes a Visa Claim:

    - -
    -
    "ga4gh_visa_v1" : {
    -    "type": "<visa-type>",
    -    "asserted": <seconds-since-epoch>,
    -    "value": "<value-string>",
    -    "source": "<source-URL>",
    -}
    -
    -
  • -
- -

Visa Identity

- -
    -
  • The {sub, iss} pair of JWT standard claims (RFC7519 section -4.1.1) that are -included within a Visa that represents a -given user (sub for subject) within the issuer’s (iss) system.
  • -
- -

Visa Object

- -
    -
  • -

    A claim value for - the ga4gh_visa_v1 claim name. The claim value is a JSON object - that provides claims that describe Visa’s - properties that cannot be described by the standard JWT claims like sub or exp.

    -
  • -
  • -

    The ga4gh_visa_v1 claim is required to define a GA4GH v1 visa and - contains controlled vocabulary as defined in this document. This object - is not the entire visa, and there are other important claims within - Visa JWTs that MAY be specific to its visa type as well as other - JWT claims that are required as per this specification and the GA4GH - AAI OIDC specification.

    -
  • -
  • -

    For claim definitions, refer to the Visa Object Claims section of this specification.

    -
  • -
- -

Visa Type

- -
    -
  • -

    The “type” claim value of a Visa Object -that represents the semantics of the assertion and informs all parties -involved in the authoring or handling the assertion how to interpret -other Visa Object Claims.

    -
  • -
  • -

    For example, a Visa Type of “AffiliationAndRole” per the -Standard Visa Type Definitions -specifies the semantics of the Visa as well as the -expected encoding of the “value” claim value for this purpose.

    -
  • -
  • -

    In addition to Standard Visa Type Definitions, there -MAY also be Visas with Custom Visa Types.

    -
  • -
- -

Overview

- -

Please see the Flow of Assertions -section in the GA4GH AAI OIDC Profile specification for an overview of interaction among the specified parties.

- -

General Requirements

- -
    -
  1. -

    Each Visa may have a different expiry.

    -
  2. -
  3. -

    Visas MUST have an indication of -which organization made the Visa Assertion (i.e. the -“source” claim), but Visas do not generally indicate -individual persons involved in making the assertion (i.e. who assigned/signed -the assertion) as detailed identity information is not needed to make an -access decision.

    -
  4. -
  5. -

    Additional information about identity -that is not needed to make an access decision SHOULD not be included in the -Visas. Identity description, encoding audit details, other data -for non-access purposes are not the intent of these Visas, -and must be handled via other means beyond the scope of this specification -should they be needed for entities and systems with sufficient authority to -process such information.

    -
  6. -
  7. -

    The Passport Claim -MUST only be present in a response when Passport-Scoped Access Token is provided.

    -
  8. -
  9. -

    If the Broker is the Visa Issuer, -it MUST set the iss to itself and sign such Visas with an -appropriate private key as described in the GA4GH AAI OIDC specification.

    -
  10. -
  11. -

    Visas are designed for machine -interpretation only in order to make an access decision and is a non-goal to -support rich user interface requirements nor do these claims fully encode the -audit trail.

    -
  12. -
  13. -

    A Visa Object MAY -contain the “conditions” claim to restrict the Visa -to only be valid when the conditions are met.

    - -
      -
    • For example, an identity can have several affiliations and a -Visa with type “ControlledAccessGrants” MAY establish a -dependency on one of them being present in the Passport by using the -conditions claim.
    • -
    -
  14. -
  15. -

    Processing a Passport within a Passport Clearinghouse MUST abide by the following:

    - -
      -
    1. -

      Passport Clearinghouses MUST reject all requests that include Passports -that fail the necessary checks as described in the GA4GH AAI OIDC specification.

      -
    2. -
    3. -

      A Passport Clearinghouse MUST ignore all Visas it does not -need to process a particular request.

      -
    4. -
    5. -

      Passport Clearinghouses MUST ignore Passports and Visas -unless:

      - -
        -
      1. -

        The Passport Clearinghouse has sufficient trust relationships -with all of: the Broker, Visa Assertion Source, -Visa Issuer; or

        -
      2. -
      3. -

        The Passport Clearinghouse can rely on a trusted service that -provides sufficient trust of any of the Broker, -Visa Assertion Source and/or Visa Issuer -such that the Passport Clearinghouse can establish trust of all -three such parties.

        -
      4. -
      -
    6. -
    7. -

      When combining Visas with multiple Visa Identities for the purposes of evaluating -authorization, a Passport Clearinghouse MUST check the -LinkedIdentities Visas by trusted issuers -and ensure that trusted sources have asserted that these -Visa Identities represent the same end user.

      -
    8. -
    -
  16. -
- -

Support for User Interfaces

- -

(e.g. mapping a URI string to a human-readable description for a user -interface.)

- -

For example, a user interface mapping of -“https://doi.org/10.1038/s41431-018-0219-y” to a human readable description -such as “this person is a bona fide researcher as described by the ‘Registered -access: authorizing data access’ publication”.

- -

It is a non-goal for this specification to consider the processes and data for -the purpose of supporting user interfaces.

- -

Passport Claim Format

- -

The Passport Claim name maps to an array of Visas.

- -

Non-normative example of a set of Visas, encoded as JWS Compact Serialization strings:

- -
{
-  "ga4gh_passport_v1": [
-    "<eyJhbGciOiJI...aaa>",
-    "<eyJhbGciOiJI...bbb>"
-  ]
-}
-
- -

For a more reader-friendly example, see the Example Passport -Claim section of the specification.

- -

Visa Requirements

- -
    -
  • -

    Visas MUST conform to one of the -GA4GH AAI Specification Visa formats -as JWS Compact Serialization strings as defined by RFC7515 section -7.1.

    -
  • -
  • -

    Visa Issuers, Brokers, and Passport Clearinghouses -MUST conform to the -GA4GH AAI Specification -requirements for Visas in their use of Visas.

    -
  • -
  • -

    Validation, as outlined elsewhere in this specification and the -GA4GH AAI Specification, MUST be performed before Visas are -used for identity or authorization.

    -
  • -
- -

Visa Format

- -

Visas are signed JWTs encoded into strings using JWS Compact Serialization. -When decoded, their structure is:

- -
{
-  ["typ": "vnd.ga4gh.visa+jwt | at+jwt | JWT",]
-  "alg": "<signing-algorithm>",
-  ["jku": "<json-web-keys-set-URL>",]
-  "kid": "<signing-key-identifier>"
-}.
-{
-  "iss": "<issuer-URL>",
-  "sub": "<subject-identifier>",
-  ["scope": "openid ...",]
-  "jti": "<token-identifier>",
-  "iat": <seconds-since-epoch>,
-  "exp": <seconds-since-epoch>,
-  "ga4gh_visa_v1": {
-    "type": "<visa-type>",
-    "asserted": <seconds-since-epoch>,
-    "value": "<value-string>",
-    "source": "<source-URL>",
-    ["conditions": [...],]
-    ["by": "<by-identifier>"]
-  }
-}.<signature>
-
-

The standard JWT payload claims iss, sub, iat, exp are all REQUIRED.

- -

One of scope or jku MUST be present as described in -Conformance for Visa Issuers -within the AAI specification.

- -

Claims within the ga4gh_visa_v1 Visa Object are as described -in the Visa Object Claims section of this specification.

- -

typ

- -
    -
  • OPTIONAL. The value of the typ header claim is RECOMMENDED to be vnd.ga4gh.visa+jwt -for Visa Document Token Format -visas. The value JWT marking general JWTs MAY also be used.
  • -
  • For Visa Access Token Format -visas the value is unspecified, but it would likely be at+jwt as required by section 2.1 of RFC 9068 -for JWT access tokens.
  • -
  • The typ header claim is specified by section 5.1 of JWT RFC -to contain media type of the JWT for disambiguation. -The full recommended media type for GA4GH Visas is application/vnd.ga4gh.visa+jwt where the subtype consist of -the “vendor tree” prefix vnd, the “producer name” ga4gh, and the “product designation” visa -followed by the +jwt structured syntax suffix (specified in section 3.2 -and section 4.2.8 of RFC 6838). -Then section 4.1.9 of JWS RFC recommends to omit the prefix -application/ to keep messages compact.
  • -
- -

alg

- -
    -
  • REQUIRED.The section Signing Algorithms -in the AAI specification lists possible algorithms used in the alg header claim.
  • -
- -

exp

- -
    -
  • -

    REQUIRED. Generally, it is seconds since unix epoch of when the -Visa Assertion Source -requires such an assertion to be no longer valid. A Visa -Assertion Source MAY choose to make an assertion very long lived. -However, a Visa Issuer MAY -choose an earlier timestamp in order to limit the assertion’s duration -within downstream Passport Clearinghouses.

    -
  • -
  • -

    Access is NOT necessarily removed by the exp timestamp. Instead, -this timestamp may be viewed as a cut-off after which no new access -will be granted and action to remove any existing access may -commence anytime shortly after this cut-off period.

    -
  • -
  • -

    Its use by a Passport Clearinghouse is described in the -Visa Expiry section and -Token Revocation section.

    -
  • -
- -

Visa Object Claims

- -

Although standard claims within a Visa Object -are defined in this section, other claims MAY exist within the object -and should be ignored by any Passport Clearinghouse that is not familiar -with the use of such claims. Claim names are reserved for definition by -GA4GH (or a body it elects).

- -

type

- - - -

asserted

- -
    -
  • -

    REQUIRED. Seconds since unix epoch that represents when the - Visa Assertion Source made the claim.

    -
  • -
  • -

    Note that the standard iat JWT claim on the Visa reflects the timestamp - of when the Visa was minted whereas the asserted claim - reflects when the Visa Assertion Source made the assertion.

    -
  • -
  • -

    asserted MAY be used by a Passport Clearinghouse as described in the - Visa Expiry section.

    -
  • -
  • -

    If a Visa Assertion repository does not include enough - information to construct an asserted timestamp, a Visa Issuer MAY use a recent timestamp (for - example, the current timestamp) if the Visa Assertion repository - is kept up to date such that the Visa Issuer can ensure that - the assertion is valid at or near the time of minting the Visa. - However, generally it is RECOMMENDED to have the - Visa Assertion repository provide more accurate asserted information.

    -
  • -
- -

value

- -
    -
  • -

    REQUIRED. A string that represents any of the scope, process, identifier and - version of the assertion. The format of the string can vary by the - Visa Type.

    -
  • -
  • -

    For example, value: "https://doi.org/10.1038/s41431-018-0219-y" when type: "ResearcherStatus" - represents a version of Registered Access Bona Fide - researcher status. Note that Registered Access requires more than one - Visa as outlined in the Registered - Access section.

    -
  • -
  • -

    For the purposes of enforcing its policies for access, a Passport - Clearinghouse evaluating the value claim MUST:

    - -
      -
    • -

      Validate URL strings as per the URL Claim -requirements if the Visa Type definition indicates the value -is a URL (as indicated by the type claim).

      -
    • -
    • -

      Value strings MUST be full string case-sensitive matches -unless the Visa Type defines a safe and reliable format for -partitioning the value into substrings and matching on the various -substrings. For example, the standard -AffiliationAndRole Visa Type can be -reliably partitioned by splitting the string at the first “@” sign if such -exists, or otherwise producing an error (i.e. denying permission).

      -
    • -
    -
  • -
- -

source

- -
    -
  • -

    REQUIRED. A URL Claim that provides at a minimum the -organization that made the assertion. If there is no organization -making the assertion, the source claim value MUST be set to -“https://no.organization”.

    -
  • -
  • -

    For complex organizations that may require more specific information -regarding which part of the organization made the assertion, this claim MAY -also encode some substructure to the organization that represents the -origin of the authority of the assertion. When this approach is chosen, then:

    - -
      -
    • -

      The additional substructure MUST only encode the sub-organization or -department but no other details or variables that would make it -difficult to enumerate the full set of possible values or cause Passport -Clearinghouses confusion about which URLs to whitelist.

      -
    • -
    • -

      The additional information SHOULD be encoded into the subdomain or path -whenever possible and SHOULD generally avoid the use of query parameters -or anchors to represent the sub-organization.

      -
    • -
    • -

      Some organizations MAY wish to attribute the source to a particular -Data Access Committee (DAC), especially for -ControlledAccessGrants Visa Types. -For example:

      - -

      source: "https://www.ebi.ac.uk/ega/dacs/EGAC00000000001"

      - -

      could represent one particular logical “DAC” organization as referred -to by the EBI organization, and could be maintained by the EBI as a -permanent identifier for this DAC.

      -
    • -
    -
  • -
- -

conditions

- -
    -
  • -

    OPTIONAL. A set of conditions on a -Visa Object indicates that the Visa is -only valid if the clauses of the conditions match other Visas -elsewhere in the Passport and such content is both valid -(e.g. hasn’t expired; signature of Visa has been verified against -the public key; etc.) and if such content is accepted by the Passport -Clearinghouse (e.g. the issuer is trusted; the source claim meets any -policy criteria that has been established, etc.).

    -
  • -
  • -

    A Passport Clearinghouse MUST always check for the presence of -the conditions claim and if present it MUST only accept the -Visa if it can confirm that the conditions have been met.

    -
  • -
  • -

    Although it is RECOMMENDED to always implement full condition checking -capabilities as described in this section, if a Passport Clearinghouse will be -deployed for a more limited purpose where it is not expected to ever receive -Visas with conditions, then such a Passport Clearinghouse MAY choose to -not implement full condition checking. However, even in this case it MUST -still check for the presence of the conditions claim on Visa -Objects and reject (ignore) any Visas that contain a non-empty -conditions claim value. Likewise if not all condition matching algorithms -are implemented, it MUST reject any Visas that contain patterns -that are not supported.

    -
  • -
  • -

    Format:

    - -
    -
    "conditions": [
    -  [
    -    { // Condition clause 1
    -      "type": "<visa-type>",
    -      "<visa-object-claim-name-1>": "<match-type>:<match-value>",
    -      "<visa-object-claim-name-2>": "<match-type>:<match-value>",
    -      ...
    -    }, // AND
    -    { // Condition clause 2
    -      ...
    -    }
    -  ], // OR
    -  [
    -    { // Condition clause 3
    -      "type": "<visa-type>",
    -      "<visa-object-claim-name>": "<match-type>:<match-value>",
    -      ...
    -    }
    -  ],
    -  ...
    -]
    -
    -
  • -
  • -

    The conditions value is a two-nested-lists structure in Disjunctive -Normal Form:

    - -
      -
    • -

      The outer level list is a set of OR clauses

      -
    • -
    • -

      The inner level list is a set of AND clauses that contain “Condition -Clauses”

      -
    • -
    • -

      A Condition Clause MUST specify a “type” claim with a value as a -Visa Type plus it MUST include at least one other claim with a -name that matches a valid Visa Object claim name.

      -
    • -
    • -

      The values of Condition Clause claims MUST have a string prefix followed -by a colon and then string suffix, except for type where it MUST be -assumed to be “const” and is not specified.

      - -
        -
      • -

        If prefix is “const”, then suffix MUST use case sensitive full string -matching.

        -
      • -
      • -

        If prefix is “pattern”, then suffix MUST use full string Pattern -Matching to match input.

        -
      • -
      • -

        If prefix is “split_pattern”, then the full suffix MUST use full -string Pattern Matching on each full -substring from splitting the corresponding Visa Object -claim value that is being compared by the “;” character. If any one -full substring matches, then the Condition Clause claim has found a -match. “split_pattern” SHOULD only be used on claims where the -Visa Type has been specified in a format that makes splitting -on this character to be reliable, such as URI-encoded substrings with -semicolon separators (see LinkedIdentities as an -example).

        - -
          -
        • For example: a Condition Clause claim value of -“split_pattern:123,https:%2F%2Fexample?.org” will match a -Visa Object claim value of -“001,https::%2F%2Fexample1.org;123,https::%2F%2Fexample2.org;456,https::%2F%2Fexample3.org” -because this comparison value will be split into: -
          -
          [
          -  "001,https::%2F%2Fexample1.org",
          -  "123,https::%2F%2Fexample2.org",
          -  "456,https::%2F%2Fexample3.org"
          -]
          -
          -

          and the second entry in that list is a match using the Pattern -Matching definition with 123,https:%2F%2Fexample?.org as the -pattern to use.

          -
        • -
        -
      • -
      • -

        If prefix is unknown or unsupported, then the Condition Clause must -fail to match.

        -
      • -
      -
    • -
    -
  • -
  • -

    Condition Clause claims are restricted to only Visa Object Claims -(e.g. value, source, etc.) with string value -definitions.

    - -
      -
    • -

      It MUST NOT include conditions (i.e. a condition cannot be placed on -another condition)

      -
    • -
    • -

      It MUST NOT contain a timestamp claim such as asserted.

      -
    • -
    -
  • -
  • -

    The Passport Clearinghouse MUST verify that for each Condition Clause -present, there exists a valid single corresponding -Visa Object such that:

    - -
      -
    • -

      Checking the correctness of the Condition Clause MUST be performed first. -For example, a type claim MUST be present.

      -
    • -
    • -

      Ignore Visa Objects that have the conditions claim present. -This will avoid deep nesting of condition evaluation (i.e. avoid condition -loops, stack overflows, etc).

      -
    • -
    • -

      A Condition Clause claim matches when the <match-type> algorithm -matches a corresponding Visa Object’s claim in the Passport.

      -
    • -
    • -

      Visa Object Claims that are not specified -in the Condition Clause are not required to match (i.e. any value will be -accepted within that claim, including if the claim is not present in the -Visa Object).

      -
    • -
    • -

      All Condition Clause claims that are specified within one Condition -Clause MUST match the same Visa Object in the Passport.

      -
    • -
    -
  • -
  • -

    Non-normative example:

    - -
    -
    "conditions": [
    -  [
    -    {
    -      "type": "AffiliationAndRole",
    -      "value": "const:faculty@uni-heidelberg.de",
    -      "by": "const:so"
    -    }, // AND
    -    {
    -      "type": "ResearcherStatus",
    -      "value": "const:https://doi.org/10.1038/s41431-018-0219-y",
    -    }
    -  ], // OR
    -  [
    -    {
    -      "type": "AffiliationAndRole",
    -      "value": "pattern:faculty@*",
    -      "source": "const:https://visas.elixir.org"
    -      "by": "const:system"
    -    }
    -  ]
    -]
    -
    - -

    Would match a corresponding AffiliationAndRole assertion within the same -Visa Object that has any of the following:

    - -
      -
    • -

      On “Visa match 1”:

      - -
        -
      • -

        type = “AffilationAndRole”; AND

        -
      • -
      • -

        value = “faculty\@uni-heidelberg.de”; AND

        -
      • -
      • -

        by = “so”

        -
      • -
      - -

      AND on any other Visa as well as checking “Visa match 1”:

      - - -
    • -
    • -

      OR, alternative acceptance is matching just one Visa:

      - -
        -
      • -

        type = “AffilationAndRole”; AND

        -
      • -
      • -

        value starts with “faculty\@”; AND

        -
      • -
      • -

        source = “https://visas.elixir.org”; AND

        -
      • -
      • -

        by = “system”

        -
      • -
      -
    • -
    -
  • -
- -
Pattern Matching
- -
    -
  • -

    Pattern Matching is only for use as specified by -“conditions”.

    -
  • -
  • -

    MUST Use full string case-sensitive character pattern comparison.

    -
  • -
  • -

    MUST support special meaning characters as the specification of patterns:

    - -
      -
    • -

      ? : A <question-mark> is a pattern that SHALL match any single -character.

      -
    • -
    • -

      * : An <asterisk> is a pattern that SHALL match multiple characters:

      - -
        -
      • -

        Match any string, including the empty string and null string.

        -
      • -
      • -

        Match the greatest possible number of characters that still allows -the remainder of the pattern to match the string.

        -
      • -
      -
    • -
    -
  • -
  • -

    There is no escape character for special characters such as patterns. -? is always treated as the <question-mark> pattern and * is always -treated as the <asterisk> pattern.

    -
  • -
  • -

    A method evaluating a pattern on a string of input SHALL return a true if -the input has found one or more possible ways to match or false if it does -not.

    -
  • -
- -

by

- -
    -
  • -

    OPTIONAL. The level or type of authority within the “source” organization -of the assertion.

    -
  • -
  • -

    A Passport Clearinghouse MAY use this claim as part of an authorization -decision based on the policies that it enforces.

    -
  • -
  • -

    Fixed vocabulary values for this claim are:

    - -
      -
    • -

      self: The Visa Identity for which the assertion is being made -and the person who made the assertion is the same person.

      -
    • -
    • -

      peer: A person at the source organization has made this assertion on -behalf of the Visa Identity’s person, and the person who is making -the assertion has the same Visa Type and value in that source -organization. The source claim represents the peer’s -organization that is making the assertion, which is not necessarily -the same organization as the Visa Identity’s organization.

      -
    • -
    • -

      system: The source organization’s information system has made the -assertion based on system data or metadata that it stores.

      -
    • -
    • -

      so: The person (also known as “signing official”) making the assertion -within the source organization possesses direct authority (as part of -their formal duties) to bind the organization to their assertion that the -Visa Identity did possess such authority at the time the -assertion was made.

      -
    • -
    • -

      dac: A Data Access Committee or other authority that is responsible -as a grantee decision-maker for the given value and source claims -pair.

      -
    • -
    -
  • -
  • -

    If this claim is not provided, then none of the above values can be assumed -as the level or type of authority and the authority MUST be assumed to be -“unknown”. Any policy expecting a specific value as per the list above MUST -fail to accept an “unknown” value.

    -
  • -
- -

URL Claims

- -

A Visa Object Claim that is defined as being of URL -format (see RFC3986 section -1.1.3) with the following -limitations:

- -
    -
  1. -

    For the purposes of evaluating access, the URL MUST be treated as a simple -unique persistent string identifier.

    -
  2. -
  3. -

    The URL is a canonical identifier and as such it is important that Passport -Clearinghouses MUST match this identifier consistently using a -case-sensitive full string comparison.

    - -
      -
    • -

      If TLS is available on the resource, then its persistent identifier URL -SHOULD use the “https” scheme even if the resource will also resolve using -the “http” scheme.

      -
    • -
    • -

      When the URL is being used to represent an organization or a well defined -child organization within a “source” claim, it is RECOMMENDED -to use a URL as a persistent organizational ontology identifier, whether -managed directly or by a third-party service such as -GRID when reasonable to do so.

      -
    • -
    -
  4. -
  5. -

    The URL SHOULD also be as short as reasonably possible while avoiding -collisions, and MUST NOT exceed 255 characters.

    -
  6. -
  7. -

    The URL MUST NOT be fetched as part of policy evaluation when making an -access decision. For policy evaluation, it is considered an opaque string.

    -
  8. -
  9. -

    URLs SHOULD resolve to a human readable document for a policy maker to -reason about.

    -
  10. -
- -

GA4GH Standard Visa Type Definitions

- -

Note: in addition to these GA4GH standard Visa Types, there is also -the ability to for a Visa Issuer to encode Custom Visa Types.

- -

AffiliationAndRole

- -
    -
  • -

    The Visa Identity’s role within the identity’s affiliated institution -as specified by one of the following:

    - -
      -
    • -

      eduPersonScopedAffiliation -attributed value of: faculty, student, or member.
      -This term is defined by eduPerson by the affiliated organization -(organization after the \@-sign).

      - -
        -
      • -

        Example: “faculty\@cam.ac.uk”

        -
      • -
      • -

        Note: based on the eduPerson specification, it is possible that -institutions use a different definition for the meaning of “faculty” -ranging from “someone who does research”, to “someone who teaches”, -to “someone in education that works with students”.

        -
      • -
      -
    • -
    • -

      A custom role that includes a namespace prefix followed by a dot (“.”) -where implementers introducing a new custom role MUST coordinate -with GA4GH (or a body it elects) to align custom role use cases in order -to maximize interoperability and avoid fragmentation across -implementations.

      - -
        -
      • -

        Non-normative example: “ega.researcher\@med.stanford.edu” where “ega” -is the namespace and “researcher” is the custom role within that -namespace.

        -
      • -
      • -

        Custom roles and their prefixes MUST be limited to characters: a-z, -dash (“-“), underscore (“_”), digits (0-9). Custom roles and prefixes -MUST start with characters a-z.

        -
      • -
      -
    • -
    -
  • -
  • -

    If there is no affiliated institution associated with a given assertion, the -affiliation portion of AffliationAndRole MUST be set to “no.organization”.

    - -
      -
    • Example: “public.citizen-scientist\@no.organization”
    • -
    -
  • -
  • -

    AffiliationAndRole can be safely partitioned into a {role, affiliation} pair -by splitting the value string at the first “@” sign.

    -
  • -
- -

AcceptedTermsAndPolicies

- -
    -
  • -

    The Visa Identity or the - “source” organization has acknowledged the specific terms, - policies, and conditions (or meet particular criteria) as indicated by the - value claim.

    -
  • -
  • -

    The value claim value conforms to URL Claim format.

    -
  • -
  • -

    The URL SHOULD resolve to a public-facing, human readable web page that - describe the terms and policies.

    -
  • -
  • -

    Example value: "https://doi.org/10.1038/s41431-018-0219-y" - acknowledges ethics compliance for a particular version of Registered - Access. Note that more - Visas are needed to meet the requirements for Registered - Access status.

    -
  • -
  • -

    MUST include the “by” claim.

    -
  • -
- -

ResearcherStatus

- -
    -
  • -

    The person has been acknowledged to be a researcher of a particular type or -standard.

    -
  • -
  • -

    The value claim conforms to URL Claim format, and it -indicates the minimum standard and/or type of researcher that describes -the person represented by the given Visa Identity.

    -
  • -
  • -

    The URL SHOULD resolve to a human readable web page that describes the -process that has been followed and the qualifications this person has met.

    -
  • -
  • -

    Example value: "https://doi.org/10.1038/s41431-018-0219-y" -acknowledges a particular version of the registration process as needed -for Registered Access Bona Fide researcher -status. Note that more Visas are needed to meet -the requirements for Registered Access status.

    -
  • -
- -

ControlledAccessGrants

- -
    -
  • -

    A dataset or other object for which controlled access has been granted to -this Visa Identity.

    -
  • -
  • -

    The value claim conforms to URL Claim format.

    -
  • -
  • -

    The source claim contains the access grantee organization.

    -
  • -
  • -

    MUST include the “by” claim.

    -
  • -
- -

LinkedIdentities

- -
    -
  • -

    The identity as indicated by the {“sub”, “iss”} pair (aka -Visa Identity) of the -Visa is the same as the identity or identities listed -in the “value” claim.

    -
  • -
  • -

    The “value” claim format is a semicolon-delimited list of -“<uri-encoded-sub>,<uri-encoded-iss>” entries with no added whitespace -between entries.

    - -
      -
    • -

      The “sub” and “iss” that are used to encode the “value” claim do -not need to conform to URL Claim -requirements since they must match the corresponding Visa -“sub” and “iss” claims that may be issued.

      -
    • -
    • -

      By URI encoding (RFC 3986) the -“iss”, special characters (such as “,” and “;”) are encoded within the URL -without causing parsing conflicts.

      -
    • -
    • -

      Example: -“123456,https%3A%2F%2Fexample.org%2Fa%7Cb%2Cc;7890,https%3A%2F%2Fexample2.org”.

      -
    • -
    -
  • -
  • -

    The “source” claim refers to the Visa Assertion -Source that is making the assertion. This is -typically the same organization as the Visa -Issuer (iss) that signs the Visa, but the -source MAY also refer to another Visa Assertion Source depending -on which organization collected the information.

    -
  • -
  • -

    As a non-normative example, if a policy needs 3 Visas and -there are three Visas that meet the criteria on one Passport -but they use 3 different sub values (“1234”, “567”, “890123”), then -any of the following, if from a trusted issuers and sources, may -allow these Visas to be combined (shown with JSON payload only -and without the REQUIRED URI-encoding in order to improve readability of -the example).

    - -
      -
    1. -

      One Visa that links 3 Visa Identities together.

      - -
      -
      {
      -  "iss": "https://example1.org/oidc",
      -  "sub": "1234",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "567,https://example2.org/oidc;890123,https://example3.org/oidc",
      -    "source": "https://example1.org/oidc"
      -    ...
      -  }
      -}
      -
      - -

      or

      -
    2. -
    3. -

      One Visa that links a superset of Visa -Identities together.

      - -
      -
      {
      -  "iss": "https://example0.org/oidc",
      -  "sub": "00001",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value":
      -      "1234,http://example1.org/oidc;567,http://example2.org/oidc;890123,http://example3.org/oidc;sub4,http://example4.org/oidc"
      -    "source": "https://example0.org/oidc"
      -    ...
      -  }
      -}
      -
      - -

      or

      -
    4. -
    5. -

      Multiple Visas that chain together a set or superset -of Visa Identities.

      - -
      -
      {
      -  "iss": "https://example1.org/oidc",
      -  "sub": "1234",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "567,https://example2.org/oidc",
      -    "source": "https://example1.org/oidc"
      -    ...
      -  }
      -},
      -{
      -  "iss": "https://example2.org/oidc",
      -  "sub": "567",
      -  "ga4gh_visa_v1": {
      -    "type": "LinkedIdentities",
      -    "value": "890123,https://example3.org/oidc",
      -    "source": "https://example2.org/oidc"
      -    ...
      -  }
      -}
      -
      -
    6. -
    -
  • -
- -

Custom Visa Types

- -
    -
  • -

    In addition to the -GA4GH Standard Visa Type Definitions, -Visas MAY be added using custom type names so long as the -encoding of these Visas will abide by the requirements described -elsewhere in this specification.

    -
  • -
  • -

    Custom Visa Types MUST limit personally identifiable information -to only that which is necessary to provide authorization.

    -
  • -
  • -

    The custom type name MUST follow the format prescribed in the -URL Claims section of the specification.

    -
  • -
  • -

    Implementers introducing a new custom type name MUST coordinate with the -GA4GH (or a body it elects) to align custom type use cases to maximize -interoperability and avoid unnecessary fragmentation across implementations.

    - -
      -
    • -

      To review the custom visa registry, including any visa descriptions, -examples and links that have been provided through proposals using this -process, visit the Custom Visa Type Registry -page.

      -
    • -
    • -

      Documentation on encoding and interpreting the claims SHOULD -be provided as part of the proposal and for inclusion in a public custom -visa type registry maintained by GA4GH. This documentation SHOULD also include -examples and links to relevant documentation and/or open source software -that MAY be available.

      -
    • -
    -
  • -
  • -

    Passport Clearinghouses MUST ignore all Visas containing a custom -type name that they do not support.

    -
  • -
  • -

    Non-normative example custom type name:
    -type: "https://example.org/passportVisaTypes/researcherStudies".

    -
  • -
- -

Encoding Use Cases

- -

Use cases include, but are not limited to the following:

- -

Registered Access

- -
    -
  • -

    To meet the requirements of Registered Access to data as defined by -publication https://doi.org/10.1038/s41431-018-0219-y as a specific -version of Registered Access, a user needs to have all of the following -Visas:

    - -
      -
    1. -

      Meeting the ethics requirements is represented by:

      - -
        -
      • -

        type: "AcceptedTermsAndPolicies"; and

        -
      • -
      • -

        value: "https://doi.org/10.1038/s41431-018-0219-y"

        -
      • -
      -
    2. -
    3. -

      Meeting the bona fide status is represented by:

      - -
        -
      • -

        type: "ResearcherStatus"; and

        -
      • -
      • -

        value: "https://doi.org/10.1038/s41431-018-0219-y"

        -
      • -
      -
    4. -
    -
  • -
  • -

    If other versions of Registered Access are introduced, then the value -claims for AcceptedTermsAndPolicies as well as ResearcherStatus MAY -refer to the document or publication or sections thereof to act as the -permanent identifiers for such versions of Registered Access.

    -
  • -
  • -

    The Passport Clearinghouse (e.g. to -authorize a registered access beacon) needs to evaluate the -multiple Visas listed above to ensure their values match -before granting access.

    - - -
  • -
- -

Controlled Access

- -
    -
  • -

    Controlled Access to data utilizes the following Visa Types:

    - -
      -
    • -

      MUST utilize one or more -ControlledAccessGrants and/or custom -controlled access visa type(s) for permissions associated with specific -data or datasets. There MAY be more standard visa types introduced for -encoding controlled access in future revisions of the Passport -specification.

      -
    • -
    • -

      MAY utilize the conditions claim on -“ControlledAccessGrants” to cause such a grant to require -a Visa from a trusted Visa Assertion Source to -assert that the identity has a role within a specific organization. -This can be achieved by using the -AffiliationAndRole Visa Type on -the conditions.

      -
    • -
    • -

      MAY utilize any other valid Visa Type or conditions claim -that may be required to meet controlled access policies.

      -
    • -
    -
  • -
- -

Visa Expiry

- -

In addition to any other policy restrictions that a Passport Clearinghouse -may enforce, Passport Clearinghouses that provide access for a given -duration provided by the user (excluding any revocation policies) MUST -enforce one of the following algorithm options to ensure that Visa -expiry is accounted for:

- -

Option A: use the following algorithm to determine if the Visa -is valid for the entire duration of the requested duration:

- -
now()+requestedTTL < min(token.exp, token.ga4gh_visa_v1.asserted+maxAuthzTTL)
-
- -

Where:

- -
    -
  • -

    requestedTTL represents the duration for which access is being requested. -Alternatively a solution may choose to have a stronger revocation policy -instead of requiring such a duration.

    -
  • -
  • -

    maxAuthzTTL represents any additional expiry policy that the Passport -Clearinghouse may choose to enforce. If this is not needed, it can -effectively ignored by using a large number of years or otherwise have -token.ga4gh_visa_v1.asserted+maxAuthzTTL removed and simplify the right -hand side expression accordingly.

    -
  • -
- -

Option B: if tokens are sufficiently short lived and/or the authorization -system has an advanced revocation scheme that does not need to specify a -maxAuthzTTL as per Option A, then the check can be simplified:

- -
now()+accessTokenTTL < token.exp
-
- -

Where:

- -
    -
  • -

    accessTokenTTL represents the duration for which an access token will be -accepted and is bounded by the next refresh token cycle or Access Token -Polling -cycle or any larger propagation delay before access is revoked, which -needs to be assessed based on the revocation model.

    - -
      -
    • For example, accessTokenTTL may be set to one hour, after which time -more access tokens may be minted using a corresponding refresh token if -it has not yet been revoked.
    • -
    -
  • -
- -

Expiry when using multiple Visas: if multiple Visas are -required as part of an access policy evaluation, then the expiry to be used MUST -be the minimum expiry timestamp, as calculated by the appropriate option above, -across all Visas (token set) that were accepted as part of evaluating -the access policy.

- -

Token Revocation

- -

As per the GA4GH AAI Specification on Token -Revocation, -the following mechanisms are available within Visa:

- -
    -
  1. -

    Visa Objects have an “asserted” claim to allow -downstream policies to limit the life, if needed, of how long assertions -will be accepted for use with access and refresh tokens.

    -
  2. -
  3. -

    Visas have an “exp” claim to allow Brokers and -Passport Clearinghouses to limit the duration of access.

    -
  4. -
- -

At a minimum, these Visa Claims MUST be checked by all Passport -Clearinghouses and systems MUST be in place to begin to take action to remove access -by the expiry timestamp or shortly thereafter. Propagation of these permission -changes may also require some reasonable delay.

- -

Systems employing Visas MUST provide mechanisms to -limit the life of access, and specifically MUST conform to the GA4GH AAI -Specification requirements in this regard. Systems utilizing Visas MAY also -employ other mechanisms outlined in the GA4GH AAI Specification, such as Access -Token Polling -if the Visa is encoded as a Visa Access Token.

- -

Example Passport Claim

- -

This non-normative example illustrates a Passport Claim -that has Visas representing Registered Access bona fide researcher -status along with other Visas for access to specific Controlled Access -data. The Visa Types for this example are:

- -
    -
  • -

    AffiliationAndRole: The person is a member of faculty at Stanford -University as asserted by a Signing Official at Stanford.

    -
  • -
  • -

    ControlledAccessGrants: The person has approved access by the DAC at the -Example Institute for datasets 710 and approval for dataset 432 for a dataset -from EGA.

    - -
      -
    • -

      In this example, assume dataset 710 does not have any -“conditions” based on the -AffiliationAndRole because the system that is asserting the assertion has an -out of band process to check the researcher’s affiliation and role and -withdraw the dataset 710 claim automatically, hence it does not need the -conditions claim to accomplish this.

      -
    • -
    • -

      In this example, assume that dataset 432 does not use an out of band -mechanism to check affiliation and role, so it makes use of the -“conditions” claim mechanism to -enforce the affiliation and role. The dataset 432 assertion is only valid if -accompanied with a valid AffiliationAndRole claim for -“faculty\@med.stanford.edu”.

      -
    • -
    -
  • -
  • -

    AcceptedTermsAndPolicies: The person has accepted the Ethics terms and -conditions as defined by Registered Access. They took this action -themselves.

    -
  • -
  • -

    ResearcherStatus: A Signing Official at Stanford Medicine has asserted -that this person is a bona fide researcher as defined by the Registered -Access model.

    -
  • -
  • -

    LinkedIdentities: A Broker at example3.org has provided -software functionality to allow a user to link their own accounts together. -After the user has successfully logged into the two accounts and passed all -auth challenges, the Broker added the -LinkedIdentities Visa for those two accounts: -(1) “10001” from example1.org, and (2) “abcd” from example2.org. -Since the Broker is signing the “LinkedIdentities” -Visa, it is acting as the Visa Issuer.

    -
  • -
- -

Normally a Passport like this would include Visa -Format entries as JWS Compact Serialization strings, -however this example shows the result after the Visas have been -unencoded into JSON (and reduced to include only the payload) to be more -reader-friendly.

- -
"ga4gh_passport_v1": [
-    {
-        "iat": 1580000000,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "AffiliationAndRole",
-            "asserted": 1549680000,
-            "value": "faculty@med.stanford.edu",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "so"
-        }
-    },
-    {
-        "iat": 1580000100,
-        "exp": 1581168872,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ControlledAccessGrants",
-            "asserted": 1549632872,
-            "value": "https://example-institute.org/datasets/710",
-            "source": "https://grid.ac/institutes/grid.0000.0a",
-            "by": "dac"
-        }
-    },
-    {
-        "iat": 1580000200,
-        "exp": 1581168000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ControlledAccessGrants",
-            "asserted": 1549640000,
-            "value": "https://ega-archive.org/datasets/EGAD00000000432",
-            "source": "https://ega-archive.org/dacs/EGAC00001000205",
-            "by": "dac"
-            "conditions": [
-                [
-                    {
-                        "type": "AffiliationAndRole",
-                        "value": "const:faculty@med.stanford.edu",
-                        "source": "const:https://grid.ac/institutes/grid.240952.8",
-                        "by": "const:so"
-                    }
-                ],
-                [
-                    {
-                        "type": "AffiliationAndRole",
-                        "value": "const:faculty@med.stanford.edu",
-                        "source": "const:https://grid.ac/institutes/grid.240952.8",
-                        "by": "const:system"
-                    }
-                ]
-            ],
-        }
-    },
-    {
-        "iss": "https://issuer.example1.org/oidc",
-        "sub": "10001",
-        "iat": 1580000300,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "AcceptedTermsAndPolicies",
-            "asserted": 1549680000,
-            "value": "https://doi.org/10.1038/s41431-018-0219-y",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "self"
-        }
-    },
-    {
-        "iss": "https://other.example2.org/oidc",
-        "sub": "abcd",
-        "iat": 1580000400,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "ResearcherStatus",
-            "asserted": 1549680000,
-            "value": "https://doi.org/10.1038/s41431-018-0219-y",
-            "source": "https://grid.ac/institutes/grid.240952.8",
-            "by": "so"
-        }
-    },
-    {
-        "iss": "https://broker.example3.org/oidc",
-        "sub": "999999",
-        "iat": 1580000500,
-        "exp": 1581208000,
-        ...
-        "ga4gh_visa_v1": {
-            "type": "LinkedIdentities",
-            "asserted": 1549680000,
-            "value": "10001,https:%2F%2Fissuer.example1.org%2Foidc;abcd,https:%2F%2Fother.example2.org%2Foidc",
-            "source": "https://broker.example3.org/oidc",
-            "by": "system"
-        }
-    }
-]
-
- -
- -
- -
-
- - - diff --git a/driver-project-usage/index.html b/driver-project-usage/index.html deleted file mode 100644 index 46dd8fa..0000000 --- a/driver-project-usage/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - -GA4GH Data Security | AAI - - - - - - - - - - - - - - - - - - -
-
-
-

Authentication and Authorization Infrastructure (AAI)

- - -
- -
-
- - - diff --git a/driver-project-usage/install-and-serve b/driver-project-usage/install-and-serve deleted file mode 100755 index 3cc18d1..0000000 --- a/driver-project-usage/install-and-serve +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/ash -bundle install -bundle exec jekyll serve --host "0.0.0.0" \ No newline at end of file diff --git a/driver-project-usage/versions.html b/driver-project-usage/versions.html deleted file mode 100644 index 483af3b..0000000 --- a/driver-project-usage/versions.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - -Version History | GA4GH Data Security - - - - - - - - - - - - - - - - - - -
-
- - -
-
- - - diff --git a/feed.xml b/feed.xml index 37ffa8f..204c1ec 100644 --- a/feed.xml +++ b/feed.xml @@ -1 +1 @@ -Jekyll2023-07-20T18:50:00+00:00/data-security/feed.xmlGA4GH Data SecurityAAI \ No newline at end of file +Jekyll2023-12-21T14:19:18+00:00/data-security/feed.xmlGA4GH Data SecurityAAI \ No newline at end of file