From 0b32b7d9af72c8e68f23781de5c065f0733aea8c Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Wed, 18 Dec 2024 12:47:49 +0100 Subject: [PATCH 1/7] feat: update api according to ID1 spec --- README.md | 2 +- api/spec/openapi.gen.go | 419 +++++++++++++------------- docs/v1/openapi.yaml | 71 +---- pkg/restapi/v1/issuer/openapi.gen.go | 8 +- pkg/restapi/v1/oidc4ci/controller.go | 18 -- pkg/restapi/v1/oidc4ci/openapi.gen.go | 47 +-- 6 files changed, 244 insertions(+), 321 deletions(-) diff --git a/README.md b/README.md index 27d79f6c0..df20b7f3c 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ the Issuer and Verifier role defined in the [W3C VC Specification](https://www.w The TrustBloc VCS implements following specifications. - W3C [Verifiable Credential Data Model (VCDM)](https://www.w3.org/TR/vc-data-model/) - W3C [Decentralized Identifier (DID)](https://www.w3.org/TR/did-core/) -- OIDF [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html) +- OIDF [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0-ID1.html) - Pre Authorization Code flow - Authorization Code low - OIDF [OpenID for Verifiable Presentation](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) diff --git a/api/spec/openapi.gen.go b/api/spec/openapi.gen.go index 89abfbbc7..1cb71906b 100644 --- a/api/spec/openapi.gen.go +++ b/api/spec/openapi.gen.go @@ -19,216 +19,215 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/docs/v1/openapi.yaml b/docs/v1/openapi.yaml index 7eb4c0ea6..dad5e64b0 100644 --- a/docs/v1/openapi.yaml +++ b/docs/v1/openapi.yaml @@ -51,7 +51,6 @@ paths: $ref: '#/components/schemas/WellKnownOpenIDIssuerConfiguration' operationId: openid-credential-issuer-config description: Returns openid-config. - deprecated: true tags: - issuer '/oidc/idp/{profileID}/{profileVersion}/.well-known/openid-credential-issuer': @@ -2273,19 +2272,16 @@ components: description: Model for Prepare Credential response. properties: credential: - deprecated: true - description: Deprecated. Credential value. + description: Credential value. According to draft 13 spec. oneOf: - type: string - type: object format: - deprecated: true type: string - description: Deprecated. Format of issued credential. + description: Format of issued credential. Internal use only. oidc_format: - deprecated: true type: string - description: Deprecated. OIDC credential format + description: OIDC credential format. Internal use only. credentials: type: array description: Contains an array of one or more issued Credentials. @@ -2296,13 +2292,12 @@ components: description: String identifying an issued Credential that the Wallet includes in the acknowledgement request. retry: type: boolean - deprecated: true - description: Deprecated. TRUE if claim data is not yet available in the issuer OP server. This will indicate VCS OIDC to issue acceptance_token instead of credential response (Deferred Credential flow). + description: Boolean value indicating whether the Wallet should retry the issuance request. Internal Use. Used for deferred issuance. required: - credential - format - - oidc_format - retry + - oidc_format - notification_id - credentials CredentialRequest: @@ -2385,46 +2380,21 @@ components: type: object description: Ack request. properties: - credentials: - description: Deprecated. Ack request credentials data. - deprecated: true - type: array - items: - $ref: '#/components/schemas/AckRequestItem' notification_id: type: string - description: Ack ID. + description: Ack ID. According to draft 13 spec. issuer_identifier: type: string - description: Optional issuer identifier. + description: Optional issuer identifier. Proprietary. event: type: string - description: Type of the notification event. + description: Type of the notification event. According to draft 13 spec. event_description: type: string - description: 'Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred.' + description: 'Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred. According to draft 13 spec.' interaction_details: type: object - AckRequestItem: - deprecated: true - type: object - description: Deprecated. AckRequestItem - properties: - notification_id: - type: string - description: Deprecated. Ack ID. - event: - type: string - description: Deprecated. Type of the notification event. - issuer_identifier: - type: string - description: Deprecated. Optional issuer identifier. - event_description: - type: string - description: 'Deprecated. Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred.' - required: - - notification_id - - event + description: Proprietary interaction details. AckErrorResponse: title: AckResponse x-tags: @@ -2444,38 +2414,29 @@ components: type: object description: Model for OIDC Credential response. properties: - format: - deprecated: true - type: string - description: Deprecated. JSON string denoting the format of the issued Credential. credential: - deprecated: true - description: Deprecated. Credential value. + description: Credential value. According to draft 13 spec. oneOf: - type: string - type: object credentials: type: array - description: Contains an array of one or more issued Credentials. + description: Contains an array of one or more issued Credentials. According to editor-draft spec. items: $ref: "./common.yaml#/components/schemas/CredentialResponseCredentialObject" - acceptance_token: - deprecated: true + transaction_id: type: string - description: Deprecated. A JSON string containing a token subsequently used to obtain a Credential. MUST be present when credential is not returned. + description: A JSON string containing a token subsequently used to obtain a Credential. MUST be present when credential is not returned. c_nonce: - deprecated: true type: string - description: Deprecated. JSON string containing a nonce to be used to create a proof of possession of key material when requesting a Credential. + description: JSON string containing a nonce to be used to create a proof of possession of key material when requesting a Credential. According to draft 13 spec. c_nonce_expires_in: - deprecated: true type: integer - description: Deprecated. JSON integer denoting the lifetime in seconds of the c_nonce. + description: JSON integer denoting the lifetime in seconds of the c_nonce. According to draft 13 spec. notification_id: type: string description: String identifying one or more Credentials issued in one Credential Response. required: - - format - credential - credentials - notification_id diff --git a/pkg/restapi/v1/issuer/openapi.gen.go b/pkg/restapi/v1/issuer/openapi.gen.go index e1bbad92f..fbfe34c03 100644 --- a/pkg/restapi/v1/issuer/openapi.gen.go +++ b/pkg/restapi/v1/issuer/openapi.gen.go @@ -453,22 +453,22 @@ type PrepareCredentialBase struct { // Model for Prepare Credential response. type PrepareCredentialResult struct { - // Deprecated. Credential value. + // Credential value. According to draft 13 spec. Credential interface{} `json:"credential"` // Contains an array of one or more issued Credentials. Credentials []externalRef0.CredentialResponseCredentialObject `json:"credentials"` - // Deprecated. Format of issued credential. + // Format of issued credential. Internal use only. Format string `json:"format"` // String identifying an issued Credential that the Wallet includes in the acknowledgement request. NotificationId string `json:"notification_id"` - // Deprecated. OIDC credential format + // OIDC credential format. Internal use only. OidcFormat string `json:"oidc_format"` - // Deprecated. TRUE if claim data is not yet available in the issuer OP server. This will indicate VCS OIDC to issue acceptance_token instead of credential response (Deferred Credential flow). + // Boolean value indicating whether the Wallet should retry the issuance request. Internal Use. Used for deferred issuance. Retry bool `json:"retry"` } diff --git a/pkg/restapi/v1/oidc4ci/controller.go b/pkg/restapi/v1/oidc4ci/controller.go index 83b6f516d..11509edb6 100644 --- a/pkg/restapi/v1/oidc4ci/controller.go +++ b/pkg/restapi/v1/oidc4ci/controller.go @@ -652,8 +652,6 @@ func (c *Controller) OidcAcknowledgement(e echo.Context) error { var finalErr error - // todo: according to the spec those 2 fields are required, so condition is redundant. - // Should be removed during endpoint update to the latest spec. if body.NotificationId != nil && body.Event != nil { if err := c.ackService.Ack(ctx, oidc4ci.AckRemote{ TxID: issuecredential.TxID(lo.FromPtr(body.NotificationId)), @@ -667,21 +665,6 @@ func (c *Controller) OidcAcknowledgement(e echo.Context) error { } } - // todo: backward compatability code. - // Should be removed during endpoint update to the latest spec. - for _, r := range lo.FromPtr(body.Credentials) { - if err := c.ackService.Ack(ctx, oidc4ci.AckRemote{ - TxID: issuecredential.TxID(r.NotificationId), - Event: r.Event, - HashedToken: hashedToken, - EventDescription: lo.FromPtr(r.EventDescription), - IssuerIdentifier: lo.FromPtr(r.IssuerIdentifier), - InteractionDetails: interactionDetails, - }); err != nil { - finalErr = errors.Join(finalErr, err) - } - } - if finalErr != nil { return apiUtil.WriteOutputWithCode(http.StatusBadRequest, e)(AckErrorResponse{ Error: finalErr.Error(), @@ -920,7 +903,6 @@ func (c *Controller) OidcCredential(e echo.Context) error { //nolint:funlen credentialResp := &CredentialResponse{ Credential: prepareCredentialResult.Credential, - Format: prepareCredentialResult.OidcFormat, CNonce: lo.ToPtr(nonce), CNonceExpiresIn: lo.ToPtr(int(cNonceTTL.Seconds())), NotificationId: prepareCredentialResult.NotificationId, diff --git a/pkg/restapi/v1/oidc4ci/openapi.gen.go b/pkg/restapi/v1/oidc4ci/openapi.gen.go index 62ea790d6..255aaa07e 100644 --- a/pkg/restapi/v1/oidc4ci/openapi.gen.go +++ b/pkg/restapi/v1/oidc4ci/openapi.gen.go @@ -47,38 +47,22 @@ type AckErrorResponse struct { // Ack request. type AckRequest struct { - // Deprecated. Ack request credentials data. - Credentials *[]AckRequestItem `json:"credentials,omitempty"` - - // Type of the notification event. + // Type of the notification event. According to draft 13 spec. Event *string `json:"event,omitempty"` - // Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred. - EventDescription *string `json:"event_description,omitempty"` + // Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred. According to draft 13 spec. + EventDescription *string `json:"event_description,omitempty"` + + // Proprietary interaction details. InteractionDetails *map[string]interface{} `json:"interaction_details,omitempty"` - // Optional issuer identifier. + // Optional issuer identifier. Proprietary. IssuerIdentifier *string `json:"issuer_identifier,omitempty"` - // Ack ID. + // Ack ID. According to draft 13 spec. NotificationId *string `json:"notification_id,omitempty"` } -// Deprecated. AckRequestItem -type AckRequestItem struct { - // Deprecated. Type of the notification event. - Event string `json:"event"` - - // Deprecated. Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred. - EventDescription *string `json:"event_description,omitempty"` - - // Deprecated. Optional issuer identifier. - IssuerIdentifier *string `json:"issuer_identifier,omitempty"` - - // Deprecated. Ack ID. - NotificationId string `json:"notification_id"` -} - // Model for OIDC batch Credential request. type BatchCredentialRequest struct { CredentialRequests []CredentialRequest `json:"credential_requests"` @@ -112,26 +96,23 @@ type CredentialRequest struct { // Model for OIDC Credential response. type CredentialResponse struct { - // Deprecated. A JSON string containing a token subsequently used to obtain a Credential. MUST be present when credential is not returned. - AcceptanceToken *string `json:"acceptance_token,omitempty"` - - // Deprecated. JSON string containing a nonce to be used to create a proof of possession of key material when requesting a Credential. + // JSON string containing a nonce to be used to create a proof of possession of key material when requesting a Credential. According to draft 13 spec. CNonce *string `json:"c_nonce,omitempty"` - // Deprecated. JSON integer denoting the lifetime in seconds of the c_nonce. + // JSON integer denoting the lifetime in seconds of the c_nonce. According to draft 13 spec. CNonceExpiresIn *int `json:"c_nonce_expires_in,omitempty"` - // Deprecated. Credential value. + // Credential value. According to draft 13 spec. Credential interface{} `json:"credential"` - // Contains an array of one or more issued Credentials. + // Contains an array of one or more issued Credentials. According to editor-draft spec. Credentials []externalRef0.CredentialResponseCredentialObject `json:"credentials"` - // Deprecated. JSON string denoting the format of the issued Credential. - Format string `json:"format"` - // String identifying one or more Credentials issued in one Credential Response. NotificationId string `json:"notification_id"` + + // A JSON string containing a token subsequently used to obtain a Credential. MUST be present when credential is not returned. + TransactionId *string `json:"transaction_id,omitempty"` } // Credential element Batch Credential Response. From d7d1182bf2bb93678ec988d94a670883dc4ccf2f Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Wed, 18 Dec 2024 12:52:36 +0100 Subject: [PATCH 2/7] fix: coverage --- .codecov.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.codecov.yaml b/.codecov.yaml index 1152f4bb1..f56f7536a 100644 --- a/.codecov.yaml +++ b/.codecov.yaml @@ -6,10 +6,10 @@ coverage: status: project: default: - target: 85% + target: 70% patch: default: - target: 85% + target: 75% only_pulls: true ignore: From b31296fc137ccc1133076508c0c348d7c2b7daa2 Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Wed, 18 Dec 2024 12:56:39 +0100 Subject: [PATCH 3/7] fix: lint --- pkg/restapi/v1/oidc4ci/controller_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/restapi/v1/oidc4ci/controller_test.go b/pkg/restapi/v1/oidc4ci/controller_test.go index bc58748d2..0645c175f 100644 --- a/pkg/restapi/v1/oidc4ci/controller_test.go +++ b/pkg/restapi/v1/oidc4ci/controller_test.go @@ -2989,11 +2989,9 @@ func TestController_OidcBatchCredential(t *testing.T) { require.NoError(t, json.Unmarshal(decrypted, &resp)) assert.Equal(t, resp, &oidc4ci.CredentialResponse{ - AcceptanceToken: nil, CNonce: nil, CNonceExpiresIn: nil, Credential: "credential1 in jwt format", - Format: "", NotificationId: "notificationId", }) From 0e2dbc2c18bf16ba9fac0a201ab6cbdbb147a1c8 Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Wed, 18 Dec 2024 13:08:58 +0100 Subject: [PATCH 4/7] fix: ack --- pkg/restapi/v1/oidc4ci/controller_test.go | 53 ++++++++++++++++------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/pkg/restapi/v1/oidc4ci/controller_test.go b/pkg/restapi/v1/oidc4ci/controller_test.go index 0645c175f..cafda5df9 100644 --- a/pkg/restapi/v1/oidc4ci/controller_test.go +++ b/pkg/restapi/v1/oidc4ci/controller_test.go @@ -4598,15 +4598,24 @@ func TestController_Ack(t *testing.T) { return nil }) - req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer([]byte(`{ - "credentials" : [{"notification_id" : "tx_id", "event" : "credential_accepted", "event_description" : "err_txt"}], - "interaction_details": {"userId": "userId", "transactionId": "transactionId"} - }`))) + b, err := json.Marshal(oidc4ci.AckRequest{ + NotificationId: lo.ToPtr("tx_id"), + Event: lo.ToPtr("credential_accepted"), + EventDescription: lo.ToPtr("err_txt"), + InteractionDetails: lo.ToPtr(map[string]any{ + "userId": "userId", + "transactionId": "transactionId", + }), + }) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer(b)) + req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) req.Header.Set("Authorization", "Bearer xxxx") rec := httptest.NewRecorder() - err := controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) + err = controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) assert.NoError(t, err) assert.Equal(t, http.StatusNoContent, rec.Code) }) @@ -4667,20 +4676,25 @@ func TestController_Ack(t *testing.T) { ackMock.EXPECT().Ack(gomock.Any(), gomock.Any()). Return(errors.New("some error")) - req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer([]byte(`{ - "credentials" : [{"ack_id" : "tx_id", "status" : "status", "error_description" : "err_txt"}] - }`))) + b, err := json.Marshal(oidc4ci.AckRequest{ + NotificationId: lo.ToPtr("tx_id"), + Event: lo.ToPtr("credential_accepted"), + EventDescription: lo.ToPtr("err_txt"), + }) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer(b)) req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) req.Header.Set("Authorization", "Bearer xxxx") rec := httptest.NewRecorder() - err := controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) + err = controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) assert.NoError(t, err) assert.Equal(t, http.StatusBadRequest, rec.Code) var bd oidc4ci.AckErrorResponse - b, _ := io.ReadAll(rec.Body) + b, _ = io.ReadAll(rec.Body) assert.NoError(t, json.Unmarshal(b, &bd)) assert.Equal(t, "some error", bd.Error) @@ -4754,20 +4768,29 @@ func TestController_Ack(t *testing.T) { ackMock.EXPECT().Ack(gomock.Any(), gomock.Any()). Return(oidc4cisrv.ErrAckExpired) - req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer([]byte(`{ - "credentials" : [{"ack_id" : "tx_id", "status" : "status", "error_description" : "err_txt"}] - }`))) + b, err := json.Marshal(oidc4ci.AckRequest{ + NotificationId: lo.ToPtr("tx_id"), + Event: lo.ToPtr("credential_accepted"), + EventDescription: lo.ToPtr("err_txt"), + InteractionDetails: lo.ToPtr(map[string]any{ + "userId": "userId", + "transactionId": "transactionId", + }), + }) + require.NoError(t, err) + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer(b)) + req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON) req.Header.Set("Authorization", "Bearer xxxx") rec := httptest.NewRecorder() - err := controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) + err = controller.OidcAcknowledgement(echo.New().NewContext(req, rec)) assert.NoError(t, err) assert.Equal(t, http.StatusBadRequest, rec.Code) var bd oidc4ci.AckErrorResponse - b, _ := io.ReadAll(rec.Body) + b, _ = io.ReadAll(rec.Body) assert.NoError(t, json.Unmarshal(b, &bd)) assert.Equal(t, "expired_ack_id", bd.Error) From b49d23c759f725fb03f540467bfef7d22603a86f Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Thu, 19 Dec 2024 13:08:54 +0100 Subject: [PATCH 5/7] fix: notification as required --- api/spec/openapi.gen.go | 418 +++++++++++++------------- docs/v1/openapi.yaml | 3 + pkg/restapi/v1/oidc4ci/controller.go | 23 +- pkg/restapi/v1/oidc4ci/openapi.gen.go | 4 +- 4 files changed, 223 insertions(+), 225 deletions(-) diff --git a/api/spec/openapi.gen.go b/api/spec/openapi.gen.go index 1cb71906b..02048bbf7 100644 --- a/api/spec/openapi.gen.go +++ b/api/spec/openapi.gen.go @@ -19,215 +19,215 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x963IbN9bgq6C4WxW7lqTsXGYm2j+fIikJM7al0c01FbtYUDdIwmo2OgBaNCelrX2N", - "fb19kq9wAHQD3egbdYlnol+Jxcbt4JyDcz+/jyK2zlhKUilG+7+PRLQiawz/exBFRIgLdkPSMyIylgqi", - "/hwTEXGaScrS0f7oLYtJghaMI/05gu+RHTAdjUcZZxnhkhKYFcNnc6k+q093sSJIf4HgC0SFyEmMrrdI", - "qp9yuWKc/gurz5Eg/JZwtYTcZmS0PxKS03Q5uhuPvA/nMZGYJqK+3NnxPy5nZ8dHaLMiKQoOQhnmeE0k", - "4YgKlAsSI8kQJ7/lREjYHk4jgtgCYRQRLjFN0SEnMUklxQlSO0NYoJgsaEpiRFN0TiLY/nfT19PXUzST", - "6O3l+QV6d3KBrolegckV4RsqCPxMBcIpwpzjrVqHXX8ikRTjhmn/qr759ezHw++/+f4vHxV0qCRrOPz/", - "5GQx2h9N9yK2XrN0usXr5H/slQiwZ25/78CFxJGB3l0BZ9iK+nc0T1kaBdDiHG4CRSxVAFH/ixF8qoBn", - "TykZijjBkiCMMs7U0RYoY0IQIdRJ2ALdkC1aY0m4giVckoG8njIqAB3EArO9OfmcUU7EnAYwbpZKsiQc", - "xSRlMKvCs4QuiKRrouAqSMTSWKjdqJ/MnM56VM+gFmxb6KJ9Xhfrw5NzsuBErNpIx3yiZxmjzYpGKxTh", - "1AU5uwYcTcnGW1MEISgilgWu9+T0Ynby7uDNGNEFonAFkUJ2BkeBQfaiSuKNEkpS+b9L5B4jS3/BtWFb", - "c/3n0GGBtAz0XGYRmAyg91tOOYlH+7/6PMhb6ON4JKlM1NgQ+ysm1jQ4Go8+TyReCjUpo3H0bURHH+/G", - "o4Po5phzxpv55kF0g3gjkyRqcH0QzImcv3UfVc/kHetml+Oc6dtsOgj8GDjHLUkDYy6cm1NUt6CR5ujw", - "/VQ9JYzHQIwMxRwvJHr9DRIZiYKIAqPm3hLVFX/O1zidcIJjfJ0QdHB+OJshST5LxXhuKayF45iqz3GC", - "aLpgfA17GheEg4WgQsKmHQY/UzinLuWWJOroirTzNCZcSJzGlqHAFpFcYYlYFOWck3jwMRUr4Dhqf9FO", - "Ocs4JRLzLXIGIDNgWrtzNTEcYa7peEFJAPNOMgsZfdzy2ylylgzu273hOY3DKDQ7GgiPuwpKa/Tsi9E/", - "YBmtyltsxO5SvDmZHR2iazXMvf1GzC9fprn5Bv5cfYqDr299X7Wnt0LlodUcmm847c7A6hYGAVo/1KHV", - "xPAaBYlfzk/eIfE00sTh/aUJ2C59SJHCu1oNPh+TWEpOFqP9X3+v7bg/lul5K/c8uvs4CO/s5toQb+DD", - "Uw49ZOmCLnMOXESc51nGuCQhZpIaAVlzW/3jNRHARxQfKsDuSunq0zBjF3op4Yr6AfxNMF0H2PGPjKO1", - "YPN1zCKE0xjdRv9LxJNPG4luI8TSZDtFJ3q7HnYn6qVhC5TiNdm7xUlOUIYpF0qmI5wggqMV/FhyYqHk", - "YbUNhK9Zro8jcj03WywI12qCf8opUpKUXsDIiTgFAQ2JPFpZUL5ItSQXY4kVNeaRzDkRL8eIcU83cQaF", - "3xoHY0B3ofa97q2blJs/KifwZxZ0qeA4x8lyDmcTc9GCMXbzERYECZIKKuktMVxHaOQwYDZqaLJknMrV", - "WpSYY9AlF0QJ1EhtAf5uFFiftxTEWxd6qxoW32aSLTnOVjSaX1MQKeZrIlcsfsBTrdimiv9UoGuWp7GV", - "6ssn3xLQcRpPLgXhaLNiltOq0/sYNui4MRVZgrdBsq4rwA4tMI+I9CbMZKgkVbvzAm6OBgnvVqnDJzhd", - "5nhJQgp0F16aQ4TOx6KwQuMxioI1GDXaXpN9Syr2haol4NfZ+cn09d9evf5m8t3H4FOmpdsAlJH73laX", - "1aM0DKlwQDdGdEqmY/RpI+e30fyTUM8tR0mczW+jKToiGdGiMEvdiYA0x/CX6vUtcg5MiCRkraCsj2c3", - "oo0qaYxeMCOXJtuXKMNc0ihPMNd8UCOBc8FvD/5pV4DRjpRveCaQASsQxx8fhCTjcUheLqhPK76KKwO3", - "1txIE5/i8bDHteXLMJn6vy0SK5YnseLHZjOlHv0eJwmRw+gKBCJQcStMo1R6Tr0HrQ3TT9VkSocrn2GF", - "2r7C0O8NVhIZ7O2FeNnnFQ6+KQ1GinZk1kYK/fKZhaloe/8Ve4BvXDxrR47bSIYpPSAFGFKPiXo5sPRQ", - "HYyLhw65+fS+kjIT+3t76nWWHEc3hE8pkYsp48u9mEV7K7lO9kChmqi/TxjO5WqidzC5jSavXnfaEQzH", - "cGS7TtnMEnX5zk9bBT+tWlbkvqPyQfAlrmsc3Sy5eqDmEUu0taR2AQmLcEIaflqyLkR/o75RGixehyeR", - "5LNsWT7nSeDvdyEY2nM2AKgRPjMjlf5MhWR8e4QlrqNc6+eIk4wTAVy2wjALkXelPzdPsGHKrUpvSM93", - "iSts8nMmAF7VoGAVkkDkP4RiGFMERc4Y+7EMcJDj4gN0hCUJW2UMjBqmsABvnyD0hMxqlpbQ6IyzBU3I", - "/JZwEbR8mWlO9XfIfBc2uHKcCmNgCt3fRfl7+AKbtUMaj4qTBq45yFYquFpYD4YzkTNtFj+4xTTB1wnp", - "Y8FwkPUyU3fb4tO6JZwuqJr5VFMS4IxjVGpjMletg6swbV8qCEe9/UbduwKpfoawgSawx1P12oyW5kl1", - "NR2tJlc1f6XqEPVp6bPQhiXjUEDvVyQtHn/fGzh2JdryVyVf4nSrnR3uguZLKwmVQ4TnBjQsuYtLWpqY", - "kxQ0RR/CPe0+x+XYFt3gR0f6914JDbpG34sRPru29cv7C5ArG97HoTbLHcyV/5aGyqFOhEc3YvbbUNDA", - "2SoxgKTeNXubLbTC9T56SwckjUOri3q+91RpaWjNeMCyIyrbIzGVjE/0Lu0Whzvj66hc/uWk4OFV4abT", - "6xKwLbinc45lT0pT+MK5FPdJHCxO+PqZRzPanSvya6HQPpXJtuq+9okAOGfJNTXJeIIsSplEnMicp308", - "xA5S+mhSB+zHMLva2dLdZI1vIw4jkdc9Ls0ySyvZWdQPGi8HEtkuiIjT+tKleUAbQBBNoySPibDWExzd", - "pGyTkHipgeEIJoNx0wY4BE1wGB2RBeGcxKgQ750Jp+gCzGNg9VH/o6FZmt/t64LoosHcscEC5Sm4qiVD", - "dL0mMcWSJFsNlhYjPhWtZGOXJxEYg52VN1Su4OfibM6Px2mcMRoUR5oJp5Uwqti9O50ce5JP0Arl8BbX", - "5qdefis31S2rLSFsyTLwaL4/RjhZlr6BAdPXIxrSKLwCSaOHWeHT5qYPuDASNF0mBGX5dUIjEEywEqF/", - "ef93jVs776GCOGpDYwCtPn4r9jh3/hCI0+JObMcgbTXerAhI+R0OxFJED3gglb7QyL3Bbs4yNezizXkI", - "H3u7uYJeRrUXhV2/nv14+NfvXv/lo7tXx9n1QiG4Xuml/fhvHx1virFQd53LshMQktKIxVWOpqSQZmjA", - "8//L+wu7he8/DrT7pNETwUuR638EvMzh5iXFVsH1A2MJwal5hrR6C69lO3WYCbXp0YnAconFRX5jhg8z", - "GTTTd1M8hZJbB1PLys5SwMxuCd8G4ajuRh2FLJSA7EgiIH7qQDLiTndDtqLuc0dGl61vd4ETYfZrZz74", - "J4pWTJACjNSGrPk7h6UYV2Kuw2uv9aXUAyBDHKOBMML335M9P4gP4FximYtWAVjAJ/WnWhRDG7D8945n", - "yUxgPg+e+tz7ZOixTjLZFG6nfU5qLChInhDuH7PfWbqOoLbS8xRHJOMkwpLEh0phFeRkdnT47eGsqq/Y", - "r0b7QIqVY5azTNGlIGhPr7BnjNpi73fzf7Oju+L/r7QF+27PCW8Ue4BdWJKJevMnkd7UFJUmHv0nBUiz", - "1VaAtmlHZ3iD1KkTIkk1fgDCPhSfiHIh2dpE0AeDLuO5JOssCXsNjgJ2Nvu52m2aJ2DJtnCt+6VvCec0", - "JvMm98KJ+cBEdLZMWjARZ1YTWDSPg8qTndrZvI1Eimncb6mMcCVnzdWRIqnYEo1xWMo/1Z8i/SkqP+2z", - "kmNt7IHUgYs8/hytcLokXs7EIYtJD1s60WNBusjlCsHTvuBsbeNswVMbiDajJJVzLIT6G2tIBtDPCrxN", - "NupBbpgSBMQYCZJhjo0MgtGH0f/5MELRCiuCIlxrlAvKhQTBgQongh9hKYnQjgf1q36wtDmw5ctTdqq+", - "DlslKwdqiPo/10ZzIy3oIKgyPDuXK52IIIm3hyxLbHy5CWUKpRGhF1eH5y/1wVmabB0prXifP4xynu5T", - "Ihf7YLYX+3A/+3qlSbH9idr+/qeNnNhfSjh8GOmcnjSGnToRZGa/61xI/zC5ZlsKwdDX01fooJxt8gNW", - "xz/UQw/KUepgGkBtAA96afVcsyPA0KvDc20dd7htOBAmm6s99XiGii+dp6iTiHq+Sy3zNHkBCvFufV+y", - "bEw6e7wELPnZ3GHHy/+5YqnshlNPgP9EpPGuktjz1rSxvSWRUrvbzMjWt7h0ec4zx+dZX6D0pCLXOapm", - "tE6t0fVWkk5bRNOKDgCbz90GOHPgVsiJ7OFApy/q8mwWlICdY/ryDk632sJ793EAqDybeblyD6CJrDfU", - "ZkbOs4bXhiik+8SFv80TSbOkpjNiE6MfiPyex8G4mzMDKLi5U04mltwUy1Y85ceEbaYljz0n/JZGBOFI", - "CoQFOjmFkRutCzoPmWgWbJxQa9gZMbaDEKPHdI3s7/b0RjsGbqfjax0pTtu0IQp8hYVxapZOc7yQOnA8", - "IkIs8iTZIhwpEAAnrSYbdsqwRorv8hz3ENuqgectmWLOpbs/tLvhrTc15Dc/Uk94xSElnPjOiKWCxoSr", - "C9fzxC7DipVSI+madGzBxqg1ngY+6Ii5MhpGOPrH/BjSTJxgCbRZ0YT4SBAxcNVo+zAVnixR5ICOrTvE", - "6HnGdQI0rSW8XD3SljgDipFoTxPryTruYbLoucJhiddPxKMeXZv9smihVH4DeGx/LCyJStKlJAH3XDnJ", - "uVZYp+jc2u8NmtF02Y97hfbzkMp4aIHH18udVf8AFf3paNg+IppWe+jydqAJJtLjQvRZ2H/7KxAVpm6o", - "kQi0UXzihqYxxIjrF7bwIUNEL0NLegtu5KvD81Zd0Ox/XkS0mvBlf/HLszeWCRXhwWYoZHA74gS2qQro", - "At8QgdQzraAREaQQ1ii88w1JkpuUbYogpzImDkzk10ypYC2b1CyqOhnmkFxureVguk8d37u9ruIU6mQb", - "miSFtURzvYYvaVrkw2QkpfGksEDaz/b39trgXey0T/UMLQLurVgC3NExaQC2GdNBefjIo4bLszfhnbQ8", - "RNVsq3s/Sb2SqAa+oAGNeMlxKhvsR4YyIpwW3hpzxzBKx5AjueIsX64q8Z4mqqP80JGAwQSl5R7XdJD6", - "pWwgv8yzPIFdAXLNQG6WJAMRhqT5Grw0HjtQH4/GDRYo2JY2O2WcTHChZ+hhHzsMNkH0M1mhEKoYclUa", - "aCriYxn+LSfWvGZ8Vza01hrorqn2n6k3Z2IiVFxDl4KI5QBFNEp9PckQBtIgnyUSRKI8Q3EOO844uaUs", - "FwaU1r9mqENxH3oLAcD6aG5Gj77kMaLGm2eCi9S/jQOvDKup2tkMP7fHD4BIGywtxJ0wYRPVWCsARFPk", - "mWa0urhI2EaLT4FLVqBuixouQoXDtFHEfBUcEpDcXCIcg3zOgBMofdWI4xrpjSBgnSsVLLdxWOiILHCe", - "6EepWuems+RMsT/4XfTbmBs1W6c8cAsVGq2/P83Uh/nJc0H4PKNtXvKeFoFezvTK4V1LlX591X7Q6ewd", - "wglTYy1N2RJdpoRVCnHILj4Z8KitjEIyoH6Nisc4Ll7j5rCARYKXwrF624Mo4SR1o+cQ6IdmYsV1ynTH", - "HnJhWGrbTfQbLvP9O8h6vrWqr392H/yzTdI2TYUkOJ6iL8/g9cAH/KNtZs/C+7PwXrcvRJ2m7y9amg/X", - "vWg21z40TT+ExfeB97SDoWx6P6vx4wF1F8PzA+/m39N2/azMPiuzz8rsszL7rMz+qZXZ+2qx3enPfdTY", - "pmQoKC3nxH6EFQ8bcxsWx52Hx3Dmkj1mWCgyTsiteqvc5JsKg2aByeHWSw8eKCM/X1ycop+OL4DXwz/O", - "SEw5+Pr0sgKtoWqYziX9x5nGIEegt4wdlDoFQIWcuuybeo5BD5QrQjlas2tFuu8LhTacjfg57HH3wGLZ", - "r6MUm8BmzkliBJ4FSgmJG/LwLUmHqsZ6FKPB9hNJiQ4RPbk4RZnWmQrYdmd0BTFjXI9Fa0LYXfD96tRW", - "wKl4wEEyujx7c65Uk3Axn3ib4jWN3NCxH2kiCe9REKsccqRnsSOh/IHza+GQ3GXq2uDG2Wdx8IhZzq3D", - "J/xUBSxQb0zSkxEu3RdL16ASbt6OqbxW2jeAGH7Wqq9kSMfoaRd338eoiTWay27Dk1uzXAhTXM7YYptz", - "zIABwp0ddUdfBqczgz82nq2tYAvwAqc6SjD6rOTv5nFtTXhoKGB6XqicxkSg5LmFCUkO6DHtwSGtAUo0", - "RZ824oUG4kvEOPokWJrEL/RML43JRtyr0MMjBH89euTVYR3MCAoqBdQgbSztssv46GOyjXxCC2BYX4Yc", - "nv3eSU7RSr2i6TIE7BVOcLoEtQHHMSmKlkJ9lSbzGQ7mfV6sCIodW4GeQqlfbE2lYmliKyRZIyiEAjZH", - "80p3mOnKNLZ+5XnKpCwoHLrGoZf7CP4+4NyaI2oB4i0kCIRBcHk2sxCoDylTv8MQ0pkjJP76u+9ef+/m", - "jrMFOpodoRdGmGFlYbKj2dHLLmg246dFsp4oWhQbqgsKG9nSJoYuUFlJE5HfcpwIFG3kFJ3TZarUnvcX", - "SkEuyvpAfcuitE9DJv7gFT85K/4yfEWoy5oNXVSPmqI3NL0hMYLSgQDEjuU73TblUs1bmupaMUWRTKcm", - "kV5aDZ+iw5xzXfdC1tN4yg8VuXz1aSO/6hZinc05T3WBP32rD7wx1SariftyLsln2VA8knZYs0AGK0rm", - "YiBZ7X5y9CKlkDjFPxK2ZIHyA7Mi7rAdHGpTDhzgWP1KVkL60mlR7KxJXAG9XiGRU/TcVb2ccmlKa8xp", - "EhsvCuMkbKtBL85+PPzLX7/9/qVWdjXrgUHGcKoVTROiaJyPYG/w5wO75LQpG4+GRW7zqyARJ+GLrtmy", - "mq1IAyRm99b8Fdzsr+r+7FrOHVcvrieLPeUkw7y7ilEppZoRobYRj9Bkw6xWLvMDDgeUrbBYkbip69LP", - "8KsxihujbFxYAIy1dpDSP7DIpp5mHIRFZfPOpTbczrC7BWe4egcOGvSlrpvW3nR4SXwD8fCoicdLsWtJ", - "bOy0Q1+VKbhKg9Jmqg+jiMXkw6jdYPxApB5Ktux1fQ+DCt22xx640FiHyUOG5kQnzfG/EhWe7zN30lzi", - "qtpOkPcr7FplnE61XjWfvpe5lEmwixMIxUWVUMj91f6Wi4s34UKKWQ60HtzrcOicHpy1w6QX/4Jil8ZA", - "SVCeRWxd91/wtkJVNfP8ImGbQYSuBSFrXYl/TNgG1NlWM01xyeMmNBsXrLfhVvtT3DCDZ+3l0qJkYgwi", - "uzx6Pcizx3P8b/JSdryJQ5/D4JUAXENmdv8zpL7Tiech9hZTkkYaa8JK+gf10YeRcfwNAmowQ+hIU6zu", - "G2liIhwjXxkkAJ1hBrUW2b18cGFLnt+v8PGZnaerAnJD6fmypwdEVnSfZMcnXC8/rtx/G6ICtu3KPc6I", - "yJN+4lqvAsn/QeV8n7BcbzfZ1MhximapJDzFCQQJQBuRnfov/hEFWBmNo3nTobVCX62Z3ve8nEi+7SpQ", - "Z5z31TAEczITaAcz+dGyRfxHsZdLQaB6lbaHxrZ6asBP2lSNzSucYGBij+FDqn6ZPta3MQlD5/3ZRLvT", - "0qd6SKAVA/UWZ6sta/V277V4YetmXh1y1ezt/C/zRcHnrw6Hxc80KISH2lLZattuOchOwGji8O43iqPn", - "iWyqvhJylHjDXR+BM1cH5heTfwyfvgfOVk5d60zVVNHVN56uicQQzVH2TnTMxT0bU/mA05bjP7AVYaBz", - "VWkq31086XEu7zZrN9KXA+ViFbLR9LEv5WJVsSKYwc3Ky5dlWWoqmTVu2KcL8Q64DQA/iYebc2BYbxNO", - "WxsK0x8gzdfX8DpjWW1VVbSjMDzaGvwvz2ZuhwooWJ0xQ0vGYqIrvbkjyuYWAhlKiqmIOHFLNgdLx13n", - "Ursu5TajEU6Src7xSbBaMYFuflyiF2S6nI7RNZEbQlL0HUSg/eXVK7vRl019/7UJJ+gQqh4CjC0K2lao", - "rm+6SNRhAipvQig4gEwU9b4nSsLiSpYhpntJpXK8FwJXDyoOB812qujuUccuclTwuwkx+7rjTBUqk35W", - "Fw+E/uG40WhmE9faLWThIoZmaLMcUKvZOq5tyIFH5SwBB6v/xcwkMDSeurcLpbJy18Nhp/8Y3OKSCkk4", - "2Ex1BcJjzhlvZjllOcQiIl5NYTI/iBrcoqXC74G70cXuD84PZzMzB8R+6ssJl+pXX7VHFf2cr3E64QTH", - "UJtOzw4R/853lsHoVfNSn7jOl8vw4hX46jN5mNEB1P7kUpuo8RVuv5dmV552Q4ZjqSoANB1joKEq87Ii", - "tHHKvBFlNAxJ4wn4c01qhced2tL8giz38uyN3QJEpm/INcrwkhjbebhHQIc1DgTRSLZZnawMWLyBOrVw", - "K7SNHcajjLAsKTqMUAWtQvrTy4+dR4qsMU0QjmMOnZuHKThlblLbrkt08LOS/Jqn6uVJErYpcqWKoG1b", - "flXso3oG0RjtkkA07JifNjeiqUjqV0KLKO/JNfo72aJzIlHMohysH6a7sbalen2pIzu4DIwKN7ZVa3fi", - "oH2lbTxMFNzai1/e//2lt8Fdtua3T+3cmpHZjBShpAsIP7FxYy30kLGERtt+C8CLKHQq1crnFBmntzja", - "Ij1deTeV7Ffb/TwmWcK28AXjS5yWCTZJojuO54KIMeIEIDYGAU7JiAkTRKCMcAFB0JCBEzZN6UwDdbA2", - "qrHEYL/XecCzggdUIFjm3dOFJalC+6uTjUOKw2jBcy73o3ovAatO+BFOwZhn/trgkg0wg+GE3JCKdR5o", - "PyYyHJFJWSLb9v1wekY3H6XWrq8zh1+whdxgThq6pOUp/S33+u8b7Ad9Al1ezo5eIiyEjgc0CTRmUzG5", - "JYl6ZxHjyK6jiVusCC+SS3zhycAdaMqzNljcshPp99YkTsCTwo2o0ODLKY7a2K/2wLaoDRzYR/tyG8WX", - "cJYPLkAbwizgNgpfrvbcrhuiYQu/UVFRPFRmu9icdnC24W7KUjJGXuDVXClj1b9dY0GjKXrHUlKknqpV", - "DG/WHwv0IgU1E+EsE2ObcaT+8dJyeJxCMYUVvoU67ZxIUSQI7gcXDcNM3JshS8LXYFI1ykDJkit3W+HQ", - "OklWqS05eJ90vpNY0axQpz1Bz7Rq8WbzP4gikkmhqdWyHf8JbTfStsjE9xKrO8uUQ4RkSWal6RKSwUyC", - "c1UK74haDFaA7+g8XUygq1rGwYKfF3QNzF0joivxlcS9waLu/nUbhH6RqkEZ0BkEnv7ZGFeKBgJuiiPU", - "ByiLxNhN+m0MWIildO6qtQZr45XosdqQpSdQj8YrJVNQ82fFRfRPrVf1rDY9q03PatOz2vSsNj2rTc9q", - "07Pa9Kw2/enVJi/eqZ5+5GkRrXjmS1AfOxSywY6OPiGiPZoEl/UPnhtOhyoihNo89wN+z/CFcyLdabSj", - "UmLpVvLvVwHhHdmYqhbTjs4XO5QW6Krs2FEOIBj2Prw4wZC27pZsAVjO7XUC/P4XZ6PYKr1PO1r5D04T", - "8Ofrd8QhoZXnkvGdukUKyfjgVpEsDmeutaa1PV3SjRPZVBT3s+BuhdM9gT2gG+AuYG/py9d1vGHJQJdZ", - "jCWpFo1oRKbWz4ugHiF5HmnZIlcD1OmvDhubLJfMIVgN5/41MJzUuYYV/N7A3QF15Wy1sWP/PIHdOzja", - "Dv6ed3ilu+GQ0xIfSNyTJ9hOOrpgZK3snRLoMppOn1vIPreQ/eJbyIaKvYaizlEFywcWu7tUiowhii4u", - "Ea4+a4i/k27vT//dAbe7MoCe/QeKmjCexucNcirAOgVy7VtSZM6A0T8iHLiIm1W0zQjCwhSTg2qx58Z2", - "99309fQ14HqtpiyTK8I3VBBNCpW0Ll3kfNww7V/VN7+e/Xj4/Tff/+Xjblleu8R4V8tf6YTu5jIAIVNh", - "YVSrXLYZMChDJZxW65UvjburPJYCXLGHWonHbgzvSypFu1k/TaRJp2svGQY/mVTEYI5se9Gt5oHUibHt", - "H0FbRObejUe/5SSUxObQjZd+8w/1eUA/rVyWnrU42NgBkLNp9+Ja4R1Qh2HA1inIviLRTVMCkv7YzfQr", - "7N6OLWWBaZJzgiI1FTJMJ1QejkQ3oXtWo+A8zfG79WEQKIvWRAi8JDsXUrtys6Ia39Kqrg0HsTsLLlS9", - "oQaA986bqk7SVVDSuTF3d93ZwO11/XcpBol+wNHNBnP13q0zLOk1Tajcgs8Jld2pD73CggMTi3uWVaxC", - "sair6LbaPvyDi2HeNaPOsGqqTadtrfN4W6X4xy7z+EB1E1ug1qf0YCvg+kh5BV9kC68jSAf1KV7QvyRW", - "Gytpy99tPNBAkHh5rx0cKGtKPg1UKB9Cve4egvTrftCRE/uYNBzuwe9trvZI1OB7j/sZQu3uXQ2mdy2j", - "/fEEHzr8PeA3lOgH4HuA6jt1gahSJmBQHb1qunZgfpBlBu4p609pGv5B/0wWTIQffiI3Dz7URIIrWVXc", - "o3JbFsp7r9/L2N7vOJg934JpvbH1PUmSv6dsk55kJJ0d6XTyw/YeY91jqsm7pk22/4VBeJAxsSDG0Xx1", - "eK5NbJDLOzs63b0WnNMB7+T0K+GaxDyL3nFbsOU1ltHKrUbUa71a8YCvRL3WZbGuTct9o20fSppVk6yk", - "zAQCVNXGnbcH/yxssxnjcowyLFfwE2h7jnWmxHW3WPO4obJBzIiA+AdjxYTPmvc7pEVdpQZC2T7g1LvT", - "fi4CD4VEWWbgblxvg8ec2g8tze9CNW+aSz+4Ji5zbcwLCIAIPmO2SfGa7Dm1bcemYi/B0UqHLUMWdj14", - "yWytNCnXCk/ZA8VdfuqdsfXp8bTTPW7h01pWo1cHopYL5kTmwN9ReG3XAprW3QOFodT2KjJczunUpdsZ", - "cb8wkVm/TqyxjkEqvQoLnAgSbm/k7ljb0YKentB1dyUA3KsaW1uQR4WIdUWlB+G3R7Y808Oj8vixeG7r", - "nsOl/USW4G2vRqAe/6myLTMRKp9abcWvbxzaARbWfaWk58Zu1kuIdGwQZu/tkfNtxA7x2/qYXnSq5cDw", - "9Bev/k8Q03uxrQWoUuhG7Jb36S+5ekW6dsbVd84sXzyShjfbw8unbxWnLN2uWS7mOu6384ItS2+o42aC", - "M2y4Iq60iQN2i4M963QtF7liuVQYbbOVtFfXMt52lutGBQ8QRU2pL+uJPXNji1sh6seXPxxtePM+IHlo", - "P9HD7fNXU9//YzDSnArrnt9xtxAgPrdpdo2h8LZDKEai6MxhqPWX9xclU60TVJHB5zQ3wKIedNgUhz1E", - "y9F00IpOzcG397qztihw4ci1EIlPRS0g/KikvQ+jlKWmgvoO9QZ76apD/JJ34PJbMFtZ0Hj+IE9stD9a", - "kSRh/yV5LuR1wqJpTG5H45GOzBxdqD//kLAISYLXU2iKC4MUQ9/f2/OH1ZSacjgoyYYjO7pBoZwoxu9V", - "6dMxIe+/OURXh5OD05nbWVND5tsrKAguWcTcRmJ71lrgRnTocWV/y4RGxNi3zEkPMhytyOTr6avaITeb", - "zRTDz1PGl3tmrNh7Mzs8fnd+rMZM5WdtWap5Jl2KssWVIBJHm0h0QNjo1VQtDM4ckuKMjvZH30xfwV7U", - "wwgotGfO51jY90QRsZax5og64YK8jJNTYhO2/fhGp0w4AaTCRJMVBb5+YPG2qE2pqdoJPNr7JLRQrWWm", - "LomqPTDt7u7OeTfgdF+/ejVo8aqjuYaZJ38HohP5eo35tgtSdZoaF9ex5CzPxN7v8N/Z0V3gfvZ+1/+d", - "Hd2pzS1DmblnRHJKbk3oV4/7+okErytzmtj82tCV+ye1VRNuTNXfFY6VRG9OMnItgNohWgNwaZCuvzv6", - "xOElRPlr/zU+PjlS9LiUNtRwGJDYM+3KS/FSx7fZOLIw/R6bQcGeytU436I9Qh1Z7DwtAcuPQeedyz4A", - "qe+4vnlB+2DBbpcwBDcyXQ55AkLVRElbgCX/mjjNPMIIYgopWyEq2KjGldychpteR43Ae6Bnbmi/8hjY", - "0qvzyyNjTL9eGH2wpm8boZ3wxAvTaHj6TRZoEeDqsC8rt7qhkG67VKg9oLvy69hYr2V1E6p4vSkeE0HK", - "dZ4IG6plygfdv9exY/ebnoBf5+HuG6bzIzZ2vfh6o65HvP3qYg+AAru1ZGuMPemPG1WH1SAMycWqIkt0", - "vhY1HDFZx247JSjWAcIwcoNttVHKY2BOsGMFLRqKPD8WYnTUlG7GkK5raqzUPeSihGR8mNQHyVfivjJf", - "V4baY1xF+5qPzK07ctb6EOYukB+CCyYfgkx8O3MHPtgAddGYRJE7WSM+FvRIA3kMROhc9pFxoTumvw86", - "9Ad8BxKYLD6x93uR23enf4snlcZATdaBnNfNs/A0r6jiMNv61Zcf229/1p+O7gn4gaZVJyK0MCab/j3X", - "W7SktyRFBiw7+OQqZ9N5vDu8yVZZ6gBxIO2j1eRimyU2WULcXM97mFuKrUovodyuaVMrzKLyM/w0YH4v", - "rb9h1kpmaoshp4syfvezXn2bGgwEZtnD1FWCf/ro8HeWMxtvX7PM6R1kAwu/EWYDkd8grG7irbSmfyyZ", - "rLKMya7/A+y6sBEU9RWx+6Gj96bD6QWZ4DSe2JoEE6s4PeNpgwri+MElQxZuoJXMgh4i15tDIerSNknx", - "k7JEOVkx9vLsjVM2yWZpuuuq7Sgd15PzHFwMUJMtH+EG+wEmWF78WKRl1lWg+vZw9kQCVWVVc1Rn8W5K", - "dO8YmQlCz+3Dk2hBlozG0TNJ/olI8s9Ai4NUmgoVPgX1cZ1H/Ex3DXRX0pyBlEtsOs5GfeZSYFy39jSV", - "f3osS09XRa3HNvZ0lLsK0cJN1dpDpF8hTkPfgq2NDFqxf7ohSTK5Sdkm3WMZSamr5E/KQOdWVd8OhMif", - "Oqs7gZ99RmfjhEaPCPce6TdDtO2rw3M0OzoN5Nt8wcp2hWU8PMdQiKZElb3C5NSILk0pQgbAtiC0YQFQ", - "wFNXCi5K2FYDad1K7hWco3FUWNO6Yk2uyupM1wQJAo6FD1BHzcTGBUwIXlDn/S7pIlTOv2ldt+jnPdY8", - "QEW+KIoJr7S7Z7HN+bcdIyH6U20wbe6EODYFeW0+HcJLJVJJlGDZciAWk7lbP+NepzKVqGDPG1yW0dFn", - "1CcrFuu3pbJi6sA7Dda2sjW1daBOLgif4KXpWeCVQHeLbxcer4yTW8pykWwRERLrOsqxSXtpWtK0ZHAK", - "W3n1ljPOgL4Y11mCa3xjP29sPxmmiLK6+HBg6ZBj2x1UU3zHgrqk9jAESRHL8G+5LcnmNZIoekesMdUB", - "/1CRxyvxa33SOI1RhJPkGkc3WpUIgr5o7S7L/hWmQre5XQNpBxHUlD426AXKPIPzn08u3xwVqojJ4781", - "TRkizoSYCCrL3S4YX5rCNkFAFoWHegPyOFVEEpd5MM3ZWhFLb8lWmIwr/TenK4Vjc1f/1iUz0QabGs7s", - "Wt3EFL3NE0mzpHERRzXT1LBV6ASix9yPGyiu0Lswmupm0WyB1napiokyBLpw+a9BoNSxvl8JEyysZIuU", - "RNJGtV+evdH3b/4NDURsukpMRcRuIQvFUDHwOkn4mqbEAehXCkQZhqIulAjA36LQ+hSdHR+evH17/O7o", - "+EhBokihcEXOVlq0lU61+LMjTYKLagWe/RIT3h78E46ryLFsjGtpT+NIJuma/osUlPSVQORzRjglaUQe", - "4HRQBE9tbDQwshQYr0kvNJXstcvJpniZa7M9AMhnaZsRVMwYhE/RgZmqbETuVowrG6tkWAhdqg2nrg0E", - "9Gm3dXHx4peKXQl5k3TBq6F5bnU6tRIMMTPoGmZmmx4jq5/molwXCi1KfAOGGqbYP8tt3XRbGE0tmzKJ", - "ljlWUiHRG2CcLmmqfjZnoaYJEh+jiOVJrLgCThGWUnHqhvt1N7/TFTvpU7ohftFYRmcHYK+fgDpGtWNC", - "6PloKYHZUf+SxhOdw6b/PLF8Al8nxFTC/DCyCdtEKGnXypUfRvU03IJlQn3Any8uTs/RNZS7vDx7E+6V", - "/cFpYgSFNlv6fheZcDjhBMdb3SrAFBYtm3IBopa9FmxDIaqbX3ATAV0Zp7BCf/n//+//E6jUd1HCysof", - "rZL2XINyNCTi+5tXX7cosp8nm81msmB8Pcl5QvRb6mu24fLT4aKSIQFEd1ohKSlKy7ZjWWA0aESmgxV0", - "Xk+2CC8ALQC1jWdcCUxU0qW1hHIqbtQzmhB809BxJFzJsaiRSRcGheBDDyGVTG/KX1jkdBKi6rIqnI18", - "xpHN8uYkIhVtp2+7BVu2tMuz9yPL07hiRQCrQVdUbdlCoVCrqyUymkNvLtrKSui7EqVo4/hVFRxZGhhc", - "JNgrss8yzm5LRDpO4wkUgM0zUCHcIjILhHU5VXSg5XidLOd1DgNGrSc1peRq+vvTxGpWVnkim2Bt1cIu", - "PvZn3cigW7lA0W77FWBeS/hmAOn6oNtMI1Tk45FNHdGJ7JVCtzoVMXzZj37PT37FT3i7fe+VxtmXbQ6+", - "+vrZIPyfYhB2izc8GRs5iBTyJiRekjVJHytk9CC6aWUi3waM3zdK8Pn2AbH5ILqB4rptPlX4IMQx3DIT", - "7Twjw7z59oomrWls87qCYhjSxq5ka7sD1FQAnMZoSWSpbl6ezRQmlA38QK1yrDxYlL0drdKhAzY9Q4Gd", - "r7Zwu/PgNBcrEt8rpWywkN+zlHzN9PYfbnYb0jGh0ZUSaHnruR32vwwHScc2G5sE7uD4aO1k9Oe1YxXm", - "pi/ZhtXa2TVMFf/Bzqj2Qj7BJJV2f2+4jUQYrh1+q762j2fHVLjzzCpYl+cLcxk09n1rKBT4b+fxaTeM", - "VUMhvL6k/jMbMp/V5efXD5pwWRPjmuXlQ06wKZf47avvAjWl9SP7jkl0oHtkw6evv2ls24uOU0nlFl0w", - "ht5gviQw4OvvA8yEMfQWp1sLdxGS2/V5djEkGtubK8vXMqTVB2FYPZrM29A25KDC640SAF+DLKOU1TxJ", - "8HVCrFIabknS3k20dR330x7L0XgOmmlAyT0yJtCy+LJRap0KXmCYzjQDL7hz4ccoJferUz3ZtM+eGgW6", - "QtoI62tQOJpx2+k42Lclazqu3WF5DJYS9aKvGQfLgy045ZbXFj3Oc9eLewTypc9zxSnVrr8L/fyj7oxT", - "rbNkZEORX69p3b9g9VLmKgKc5csVujo8rxLjbeYSo31km2PlFLHbr+A2VjiNE90S2Rb3LoPN1VPi1kjR", - "UgBTz25OEMtNCZUiRq+hSIJSfM/s1jrsVU4Xz7JQi5No3BRXdT/zlfXQtkWx7F6m6ZtXQUZuABJgxw6w", - "WlhvQSatJjC3UT/cn+63AYoQLuKt9c/WG1rYyapWAH0zrit6hYVR6pXeCV48kcOSizxpQO4whgBtP96L", - "0KLdWwfh2HoISzc7eI8dhmoL8DU6Pftwz7DXtcFbWncs3mvdedFKIGSa4NtMsiXH2cqoyhynMVt7ffAd", - "9dayctKsSFnBXhpfXSH7de62rCfcW9XyjUktilevVpYeWtgRwOL6bL9dda6h3AdvQM03bZ68uMMOpOhb", - "rgjltsiqBZG2rkTaJ9q5d/l5MEj00npcyJvuKAAni0UvhK2oAw4+fOz/YD+QTVwxNGBQXalGhTG+UuIe", - "x6i07dcYvlf+uJ3rtzratM1DE/dzppH32mrACBRrjVS/f6lTetcw/YK9Xx2eN7LakHyjF9Cui0dyENlF", - "YNN6pVaH0evHXbmnwvvqMXfR6avqoDw7pUGE4vrCFGjEpVYibBS+B5SiNRt2srp6lzZ9wnIbdYp+cIJ+", - "iDIcT1dftW/cBtzqwS2m8Px1PylB1+87hgxGVfD6JyILuV4jWKUpqBtHYFNTIZCggXWCAGpKosXohRlC", - "4pftxTZ+IhaBSeyFkjyj8ROg8cO/PuH7PCO/Pbb41bSwyHoG1vRG4DpVKK5vVSY/qbtaebBsGBg2hEK7", - "zmcz6LMZ9NkMunVy/wsrp1vYwi+/ob1ZXjAwqJxhu6jTK7GZeH+Xn6FSfYLp2hHYqlKYDv2fOSOhmPEj", - "lI+Dnbjl41wpMbfNLXao6t8F5iWRtsRCYcczznRjYXarnEzDgO5604/Ak10WZgs/sKYo28CowOKChxdS", - "0w1wu5XlI+uIL6DoVut7NOHkqrIaun0CvbleMK3aP/qxKqYF+50/dpXMpt7YvYpjVrul9+BCj1+76c+L", - "rEVVIBpHDs9+ispHV6dPga2VJQch65O/t/0w3V3lARjyH4LifwQ79lrJPyY/rnWlfxKOHOyQPYAnZz54", - "QriqhoFBV2NY2fFqf28vYRFOVkzI/b+9+uurkboQM0UVJ7SHeqLdYDFas5gklaCoaj7wqI5Zdl895ymO", - "EfBk6zi8FcGJXCHoRV6O03/Vf7z7ePffAQAA//9IPiQkXToBAA==", + "H4sIAAAAAAAC/+x963IbN9bgq6C4WxW7lqTsXGYm2j+fIikJM06k0c01FbtYUDdIwmo2OgBaNCflrX2N", + "fb19kq9wAHQD3egbJSqeiX4lFhu3g3MOzv38PorYOmMpSaUYHf4+EtGKrDH871EUESGu2B1JL4jIWCqI", + "+nNMRMRpJilLR4ejn1lMErRgHOnPEXyP7IDpaDzKOMsIl5TArBg+m0v1WX26qxVB+gsEXyAqRE5idLtF", + "Uv2UyxXj9F9YfY4E4feEqyXkNiOjw5GQnKbL0afxyPtwHhOJaSLqy12c/uN6dnF6gjYrkqLgIJRhjtdE", + "Eo6oQLkgMZIMcfJbToSE7eE0IogtEEYR4RLTFB1zEpNUUpwgtTOEBYrJgqYkRjRFlySC7X8zfT19PUUz", + "iX6+vrxCv5xdoVuiV2ByRfiGCgI/U4FwijDneKvWYbcfSCTFuGHav6pvfr34/vjbr779y3sFHSrJGg7/", + "PzlZjA5H04OIrdcsnW7xOvkfByUCHJjbPzhyIXFioPepgDNsRf07mqcsjQJocQk3gSKWKoCo/8UIPlXA", + "s6eUDEWcYEkQRhln6mgLlDEhiBDqJGyB7sgWrbEkXMESLslAXk8ZFYAOYoHZ3px8zCgnYk4DGDdLJVkS", + "jmKSMphV4VlCF0TSNVFwFSRiaSzUbtRPZk5nPapnUAu2LXTVPq+L9eHJOVlwIlZtpGM+0bOM0WZFoxWK", + "cOqCnN0CjqZk460pghAUEcsC13t2fjU7++XozRjRBaJwBZFCdgZHgUH2okrijRJKUvm/S+QeI0t/wbVh", + "W3P959BhgbQM9FxmEZgMoPdbTjmJR4e/+jzIW+j9eCSpTNTYEPsrJtY0OBqPPk4kXgo1KaNx9HVER+8/", + "jUdH0d0p54w3882j6A7xRiZJ1OD6IJgTOX/rPqqeyTvW3S7HudC32XQQ+DFwjnuSBsZcOTenqG5BI83R", + "4fupekoYj4EYGYo5Xkj0+iskMhIFEQVGzb0lqiv+mK9xOuEEx/g2Iejo8ng2Q5J8lIrx3FNYC8cxVZ/j", + "BNF0wfga9jQuCAcLQYWETTsMfqZwTl3KPUnU0RVp52lMuJA4jS1DgS0iucISsSjKOSfx4GMqVsBx1P6i", + "nXOWcUok5lvkDEBmwLR252piOMJc0/GCkgDmnWUWMvq45bdT5CwZ3Ld7w3Mah1FodjIQHhU8ry5isKKG", + "+RqL+yL+d1hGq/KyG4mglILOZifH6FYNc5GkkUDKB2xuvoE/V1/s4CNd31ftha4AKbSaA6CG0+4MrG6Z", + "EaD1XR1aTXyxUd746fLsFySeRug4frjQAduljyl5eFerwedjEkvJ2WJ0+OvvtR33xzI9b+WeR5/eD8I7", + "u7k2xBv4PpVDj1m6oMucAx8Ql3mWMS5JiOekRo7WTFn/eEsEsBvFSQqwu8K8+jTM/4VeSrgaQQB/E0zX", + "Aa79PeNoLdh8HbMI4TRG99H/EvHkw0ai+wixNNlO0ZnerofdiXqQ2AKleE0O7nGSE5RhyoUS/QgniOBo", + "BT+WDFsosVltA+FbluvjiFzPzRYLwrU24Z9yipTApRcw4iROQY5DIo9WFpQvUi3wxVhiRY15JHNOxMsx", + "YtxTYZxB4SfJwRhQcah91nurMOXmT8oJ/JkFXSo4znGynMPZxFy0YIzdfIQFQYKkgkp6TwzXERo5DJiN", + "tposGadytRYl5hh0yQVRcjdSW4C/Gz3X5y0F8dZl46oixreZZEuOsxWN5rcUJI/5msgVix/xVCu2qeI/", + "FeiW5Wlshf9SMrAEdJrGk2tBONqsmOW06vQ+hg06bkxFluBtkKzrerJDC8wjIr0JMxkqSdXuvICbo2jC", + "u1Wq+glOlzlekpCe3YWX5hCh87EorPd4jKJgDUbbttdk35KKGaJqMPh1dnk2ff23V6+/mnzzPviUaSE4", + "AGXkvrfVZfUoDUMqHNCNEZ2S6Rh92Mj5fTT/INRzy1ESZ/P7aIpOSEa0xMxSdyIgzTH8pXp9i5wDEyIJ", + "WSso6+PZjWjbSxqjF8yIr8n2JcowlzTKE8w1H9RI4Fzwz0f/tCvAaEcZMDwTyIAViOOPD0KS8TgkVhfU", + "p/VjxZWBW2tupIlP8XjY49ryZZhM/d8WiRXLk1jxY7OZUt1+i5OEyGF0BQIRaMIVplHqRufeg9aG6edq", + "MqXqlc+wQm1fr+j3BiuJDPb2Qrzs8woH35QGW0Y7Mmtbhn75zMJUtL3/ij3ANy6etSPHfSTDlB6QAgyp", + "x0S9HFh6qA42yGOH3Hx6X0mZicODA/U6S46jO8KnlMjFlPHlQcyig5VcJwegd03U3ycM53I10TuY3EeT", + "V6871TDDMRzZrlM2s0RdvvPTVsFPa6AVue+kfBB8iesWR3dLrh6oecQSbVSpXUDCIpyQhp+WrAvR36hv", + "lKKL1+FJJPkoW5bPeRL4+6cQDO05GwDUCJ+ZkUp/pEIyvj3BEtdRrvVzxEnGiQAuW2GYhci70p+bJ9gw", + "5ValN2QOcIkrbBl0JgBe1aBgFZJA5D+EYhhTBEXO+ASwDHCQ0+IDdIIlCRtvDIwaprAAb58g9ITMagaZ", + "0OiMswVNyPyecBE0kJlpzvV3yHwXtstynApjhwrd31X5e/gCm7VDMNyYkwauOchWKrhaWA+GM5ELbT0/", + "usc0wbcJ6WPBcJD1OlN32+L6uiecLqia+VxTEuCMY1RqYzI3rYOrMG1fKghHvf1G3bsCqX6GsIEmsP2p", + "em22TfOkupqOVpOrmr9SdYj6tHRtaMOS8TugtyuSFo+/7zQcuxJt+auSL3G61T4Rd0HzpZWEyiHC8xYa", + "ltzFJS1NzEkKmqIP4Z52n9NybItu8L0j/XuvhAZdo4vGCJ9d2/rp7RXIlQ3v41Cb5Q7myn9LQ+VQX8Pe", + "jZj9NhQ0cLZKDCCpd83eZgutcL333tIBSePY6qKeiz5VWhpaMx6w7IjK9khMJeMTvUu7xeE++zoql385", + "K3h4VbjpdM4EbAvu6Zxj2ZPSFL5wLsV9EgeLE75+5tGM9vqK/FYotE9lsq16uX0iAM5Zck1NMp4gi1Im", + "EScy52kfR7KDlD6a1AH7PsyudrZ0N1nj24jDSOR1j0uzzNJKdhb1g8bLgUS2CyLitL50aR7QBhBE0yjJ", + "YyKs9QRHdynbJCReamA4gslg3LRxEEETHEYnZEE4JzEqxHtnwim6AvMYWH3U/2holuZ3+7ogumgwd2yw", + "QHkKHm3JEF2vSUyxJMlWg6XFiE9FK9nY5UkExmBn5Q2VK/i5OJvz42kaZ4wGxZFmwmkljCp2704np57k", + "E7RCObzFtfmpl9/KTXXLakukW7IMPJpvTxFOlqVvYMD09cCHNAqvQNLocVb4sLnrAy6MBE2XCUFZfpvQ", + "CAQTrETon97+XePWznuoII7a0BhAq4/fij3OnT8G4rS4E9sxSFuNNysCUn6HA7EU0QMeSKUvNHJvsJuz", + "TA27enMZwsfebq6gl1HtRWHXrxffH//1m9d/ee/u1XF2vVAIrld6aT/+23vHm2Is1F3nsuwEhKQ0YnGV", + "oykppBka8Pz/9PbKbuHb9wPtPmn0RPBS5PofAS9zuHlJsVVwfcdYQnBqniGt3sJr2U4dZkJtenQCtVxi", + "cZHfmOHDTAbN9N0UT6Hk1sHUsrKzFDCze8K3QTiqu1FHIQslIDuSCIifOt6MuNPdka2o+9yR0WXr213g", + "RJj92pmP/omiFROkACO1kW3+zmEpxpWY6/DaW30p9TjJEMdoIIzw/fdkz4/iA7iUWOaiVQAW8En9qRbF", + "0AYs/73jWTITmM+Dp770Phl6rLNMNkXlaZ+TGgsKkieE+8fsd5auI6it9DzFCck4ibAk8bFSWAU5m50c", + "f308q+or9qvRIZBi5ZjlLFN0LQg60CscGKO2OPjd/N/s5FPx/zfagv3pwImCFAeAXViSiXrzJ5He1BSV", + "Jh79JwVIs9VWgLZpRxd4g9SpEyJJNX4Awj4Un4hyIdnaBNoHYzPjuSTrLAl7DU4Cdjb7udptmidgybZw", + "rful7wnnNCbzJvfCmfnABH62TFowEWdWE1g0j4PKk53a2byNRIpp3G+pjHAlZ83VkSKp2BKNcVjKP9ef", + "Iv0pKj/ts5JjbeyB1IGLPP0YrXC6JF5qxTGLSQ9bOtFjQbrI5QrB077gbG3DccFTG4g2oySVcyyE+htr", + "yBnQzwq8TTbqQW6YEgTEGAmSYY6NDILRu9H/eTdC0QorgiJca5QLyoUEwYEKJ9AfYSmJ0I4H9at+sLQ5", + "sOXLc3auvg5bJSsHakgOuNRGcyMt6CCoMoo7lyudryCJt4csS2wYugllCmUboRc3x5cv9cFZmmwdKa14", + "n9+Ncp4eUiIXh2C2F4dwP4d6pUmx/Yna/uGHjZzYX0o4vBvp1J80hp06EWRmv+tcSP8wuWZbCsHQl9NX", + "6KicbfIdVsc/1kOPylHqYBpAbQAPemn1XLMTwNCb40ttHXe4bTgQJpurPfV4hoovnaeok4h6vkst8zR5", + "AQrxbv1QsmzMTdtfnpb8aO6w4+X/WLFUdsOpJ8B/INJ4V0nseWva2N6SSKndbWZk61tcujznmePzrC9Q", + "elKR6xxVM1qn1uh2K0mnLaJpRQeAzeduA5w5cCvkRPZ4oNMXdX0xC0rAzjF9eQenW23h/fR+AKg8m3m5", + "cg+giaw31GZGzrOG14YopIfEhf+cJ5JmSU1nxCZGPxD5PY+DcTcXBlBwc+ecTCy5KZateMr3CdtMSx57", + "Sfg9jQjCkRQIC3R2DiM3Whd0HjLRLNg4odawM2JsByFGj+ka2d/t6Y12DNxOx9c6Upy2aUMU+AoL49Qs", + "neZ4IXXgeESEWORJskU4UiAATlrNSeyUYY0U3+U57iG2VQPPWxLKnEt3f2h3w1tvashvfqKe8IpDSjjx", + "nRFLBY0JVxeu54ldhhUrpUbSNenYgo1RazwNfNARc2U0jHD0j/kxpJk4wRJos6IJ8ZEgYuCq0fZhKjxZ", + "okgVHVt3iNHzjOsEaFpLeLl6pC1xBhQjEbYyW+7Tk3U8wGTRc4XjEq+fiEftXZv9vGihVH4DeGx/LCyJ", + "StKlJAH3XDnJpVZYp+jS2u8NmtF02Y97hfbzmMp4aIH96+XOqn+Aiv50NGwfEU2rPXR5O9AEE+lxIfos", + "7L/9FYgKUzfUSATaKD5xR9MYYsT1C1v4kCGil6ElvQc38s3xZasuaPY/LyJaTfiyv/j1xRvLhIrwYDMU", + "Er0dcQLbVAV0he+IQOqZVtCICFIIaxTe+YYkyV3KNkWQUxkTBybyW6ZUsJZNahZVnQxzyEG31nIw3aeO", + "791eV3EKdbINTZLCWqK5XsOXNC3yYTKS0nhSWCDtZ4cHB23wLnbap8iGFgEPViwB7uiYNADbjOmgPHzk", + "UcP1xZvwTloeomq21YOfpF5JVANf0IBGvOQ4lQ32I0MZEU4Lb425YxilY8iRXHGWL1eVeE8T1VF+6EjA", + "YILSco9rOkj9ijeQX+ZZnsCuALlmIDdLkoEIQ9J8DV4ajx2oj0fjBgsUbEubnTJOJrjQM/Sw9x0GmyD6", + "maxQCFUMuSoNNBXxsQz/lhNrXjO+Kxtaaw10t1T7z9SbMzERKq6hS0HEcoAiGqW+nmQIA2mQjxIJIlGe", + "oTiHHWec3FOWCwNK618z1KG4D72HAGB9NDejR1/yGFHjzTPBRerfxoFXhtVU7WyGn9vjB0CkDZYW4k6Y", + "sIlqrNUJoinyTDNaXVwkbKPFp8AlK1C3RQ0XocJh2ihivgoOCUhuLhGOQT5mwAmUvmrEcY30RhCwzpUK", + "lts4LHRCFjhP9KNULYfTWZmm2B/8LvptzI2arVMeuIUKjdbfn2bqw/zkuSB8ntE2L3lPi0AvZ3rl8K6l", + "Sr++aj/ofPYLwglTYy1N2UpeptJVCnHILj4Z8KitjEIyoH6Nisc4Ll7j5rCARYKXwrF624Mo4SR1o+cQ", + "6IdmYsV1ynTHHnJhWGrbTfQbLvP9O8h6vrWqr3/2EPyzTdI2TYUkOJ6iz8/g9cgH/KNtZs/C+7PwXrcv", + "RJ2m789amg/XvWg21z42TT+GxfeR97SDoWz6MKvx/oC6i+H5kXfz72m7flZmn5XZZ2X2WZl9Vmb/1Mrs", + "Q7XY7vTnPmpsUzIUlJZzYj/CioeNuQ2L487DYzhzyR4zLBQZJ+RevVVu8k2FQbPA5HDrpQcPlJEfr67O", + "0Q+nV8Dr4R8XJKYcfH16WYHWUDVM55L+40JjkCPQW8YOSp0CoEJOXfZNPcegB8oVoRyt2a0i3beFQhvO", + "RvwY9rh7YLHs11GKTWAz5yQxAs8CpYTEDXn4lqRDxWU9itFg+4GkRIeInl2do0zrTAVsuzO6gpgxrsei", + "NSHsLvh+c24r4FQ84CAZXV+8uVSqSbiYT7xN8ZpGbujY9zSRhPcoiFUOOdGz2JFQ/sD5tXBI7jJ1bXDj", + "7LM4eMQs59bhE36qAhaoNybpyQiX7oula1AJN2/HVF4r7RtADD9q1VcypGP0tIu772PUxBrNZbfhyb1Z", + "LoQpLmdssc05ZsAA4c5OuqMvg9OZwe8bz9ZWsAV4gVMdJRh9VvJ387i2Jjw0FDC9LFROYyJQ8tzChCQH", + "9Jj24JDWACWaog8b8UID8SViHH0QLE3iF3qml8ZkIx5U6GEPwV97j7w6roMZQUGlgBqkjaVddhkffUy2", + "kU9oAQzry5DDsz84ySlaqVc0XYaAvcIJTpegNuA4JkXRUqiv0mQ+w8G8z6sVQbFjK9BTKPWLralULE1s", + "hSRrBIVQwOZoXukOM12ZxtavPE+ZlAWFQ9c49HKfwN8HnFtzRC1A/AwJAmEQXF/MLATqQ8rU7zCEdOYI", + "ib/85pvX37q542yBTmYn6IURZlhZmOxkdvKyC5rN+GmRrCeKFsWG6oLCRrZ0k6ELVFbSROS3HCcCRRs5", + "RZd0mSq15+2VUpCLsj5Q37Io7dOQiT94xQ/Oij8NXxHqsmZDF9WjpugNTe9IjKB0IACxY/lOt025VPOW", + "prpWTFEk06lJpJdWw6foOOdc172Q9TSe8kNFLl982MgvuoVYZ3POU13gT9/qA29Mtclq4r6cS/JRNhSP", + "pB3WLJDBipK5GEhWu58cvUgpJE7xj4QtWaD8wKyIO2wHh9qUAwc4Vr+SlZC+dF4UO2sSV0CvV0jkFD13", + "VS+nXJrSGnOaxMaLwjgJ22rQi4vvj//y16+/famVXc16YJAxnGpF04QoGucj2Bv8+cAuOW3KxqNhkdv8", + "KkjESfiia7asZivSAInZvTV/BTf7q7o/u5Zzx9WL68lizznJMO+uYlRKqWZEqG3EHppsmNXKZb7D4YCy", + "FRYrEjc1Z/oRfjVGcWOUjQsLgLHWDlL6BxbZ1NOMg7CobN651IbbGXa34AxX78BRg77UddPamw4viW8g", + "Hh41sb8Uu5bExk479E2Zgqs0KG2mejeKWEzejdoNxo9E6qFky17X9zio0G177IELjXWYPGRoTnTSHP8L", + "UeH5PnMnzSWuql0Heb/CrlXG6VTrVfPpe5lLmQSbPYFQXFQJhdxf7W+5unoTLqSY5UDrwb0Oh8750UU7", + "THrxLyh2aQyUBOVZxNZ1/wVvK1RVM88vErYZROhaELLWlfj7hG1AnW010xSXPG5Cs3HBehtutT/FDTN4", + "1l4uLUomxiCyy6PXgzx7PMf/Ji9lx5s49DkMXgnANWRm9z9D6judeB5ibzElaaSxJqykv1MfvRsZx98g", + "oAYzhE40xer2kiYmwjHylUEC0BlmUGuR3csHF7bk+cMKH1/YeboqIDeUni97ekBkRfdJdnzC9fLjyv23", + "ISpg267c44KIPOknrvUqkPwfVM73Ccv1dpNNjRynaJZKwlOcQJAAtBHZqU3jH1GAldE4mjcdWiv01Zrp", + "fc/LieTbrgJ1xnlfDUMwJzOBdjCTHy1bxH8Ue7kWBKpXaXtobKunBvykTdXYvMIJBib2GD6kxoF2mC7W", + "tzEJQ+f92US709KnekigFQP1FmerLWv1du+1eGHrZl4dctXs7fwv80XB52+Oh8XPNCiEx9pS2WrbbjnI", + "TsBo4vDuN4qj54lsqr4ScpR4w10fgTNXB+YXk78Pn74HzlZOXetM1VTR1TeeronEEM1R9k50zMU9G1P5", + "gNOW4z+wFWGgc1VpKt9dPOlxLu82azfSlwPlYhWy0fSxL+ViVbEimMHNysvnZVlqKpk1btinC/EOuA0A", + "P4mHm3NgWG8TTlsbCtMfIM3Xt/A6Y1ltVVW0ozA82hr8ry9mbocKKFidMUNLxmKiK725I8rmFgIZSoqp", + "iDhxSzYHS8fd5lK7LuU2oxFOkq3O8UmwWjGBbn5cohdkupyO0S2RG0JS9A1EoP3l1Su70Zdhu4414QQd", + "QtVDgLFFQdsK1fVNF4k6TEDlTQgFB5CJot73RElYXMkyxHQvqVSO90Lg6kHF4aDZThXdPerYRY4Kfjch", + "Zl93nKlCZdLP6uKB0D+cNhrNbOJau4UsXMTQDG2WA2o1W8e1DTnwqJwl4GD1v5iZBIbGU/d2oVRW7no4", + "7PTvg1tcUiEJB5uprkB4yjnjzSynLIdYRMSrKUzmB1GDW7RU+D1wN7rY/dHl8Wxm5oDYT3054VL96qv2", + "qKIf8zVOJ5zgGGrT6dkh4t/5zjIYvWpe6hO3+XIZXrwCX30mDzM6gNqfXGoTNb7C7ffS7MrTbshwLFUF", + "gKZjDDRUZV5WhDZOmTeijIYhaTwBf65JrfC4U1uaX5DlXl+8sVuAyPQNuUUZXhJjOw/3COiwxoEgGsk2", + "q5OVAYs3UKcWboW2scN4lBGWJUWHEaqgVUh/evmx80iRNaYJwnHMoXPzMAWnzE1q23WJDn5Wkl/zVL08", + "ScI2Ra5UEbRty6+KQ1TPIBqjXRKIhh3zw+ZONBVJ/UJoEeUtuUV/J1t0SSSKWZSD9cN0N9a2VK8vdWQH", + "l4FR4ca2au1OHLSvtI2HiYJbe/HT27+/9Da4y9b89qmdWzMym5EilHQB4Sc2bqyFHjKW0GjbbwF4EYVO", + "pVr5nCLj9B5HW6SnK++mkv1qu5/HJEvYFr5gfInTMsEmSXTH8VwQMUacAMTGIMApGTFhggiUES4gCBoy", + "cMKmKZ1poA7WRjWWGOz3Og94VvCACgTLvHu6sCRVaH91snFIcRgteM7lflTvJWDVCT/CKRjzzF8bXLIB", + "ZjCckBtSsS4D7cdEhiMyKUtk274fTs/o5qPU2vV15vALtpAbzElDl7Q8pb/lXv99g/2gT6Dr69nJS4SF", + "0PGAJoHGbCom9yRR7yxiHNl1NHGLFeFFcokvPBm4A0151gaLW3Yi/d6axAl4UrgRFRp8OcVRG/vVHtkW", + "tYED+2hfbqP4Es7yzgVoQ5gF3Ebhy9We23VDNGzhNyoqiofKbBeb0w7ONtxNWUrGyAu8mitlrPq3Wyxo", + "NEW/sJQUqadqFcOb9ccCvUhBzUQ4y8TYZhypf7y0HB6nUExhhe+hTjsnUhQJgofBRcMwEw9myJLwNZhU", + "jTJQsuTK3VY4tE6SVWpLDt4nne8kVjQr1GlP0DOtWrzZ/A+iiGRSaGq1bMd/QtuNtC0y8YPE6s4y5RAh", + "WZJZabqEZDCT4FyVwjuiFoMV4Ds6TxcT6KqWcbDg5xVdA3PXiOhKfCVxb7Cou3/dBqGfpWpQBnQGgad/", + "NsaVooGAm+II9QHKIjF2k34bAxZiKZ27aq3B2ngleqw2ZOkJ1KPxSskU1PxZcRH9U+tVPatNz2rTs9r0", + "rDY9q03PatOz2vSsNj2rTX96tcmLd6qnH3laRCue+RLU+w6FbLCjo0+IaI8mwWX9g+eG06GKCKE2z/2A", + "3zN84ZJIdxrtqJRYupX8+1VA+IVsTFWLaUfnix1KC3RVduwoBxAMex9enGBIW3dLtgAs5/Y6Af7wi7NR", + "bJXepx2t/AenCfjz9TvikNDKS8n4Tt0ihWR8cKtIFocz11rT2p4u6caJbCqK+1lwt8LpgcAe0A1wF7C3", + "9OXrOt6wZKDrLMaSVItGNCJT6+dFUI+QPI+0bJGrAer0N8eNTZZL5hCshvPwGhhO6lzDCn5v4O6AunK2", + "2tixf57A7h0cbQd/zzu80d1wyHmJDyTuyRNsJx1dMLJW9k4JdBlNp88tZJ9byH72LWRDxV5DUeeoguUD", + "i91dK0XGEEUXlwhXnzXE30m3D6f/7oDbXRlAz/4DRU0YT+PzBjkVYJ0CufYtKTJnwOgfEQ5cxM0q2mYE", + "YWGKyUG12Etju/tm+nr6GnC9VlOWyRXhGyqIJoVKWpcucj5umPav6ptfL74//varb//yfrcsr11ivKvl", + "r3RCd3MZgJCpsDCqVS7bDBiUoRJOq/XKl8bdVR5LAa7YQ63EYzeG9yWVot2snybSpNO1lwyDn0wqYjBH", + "tr3oVvNA6sTY9o+gLSJzP41Hv+UklMTm0I2XfvMP9XlAP61clp61ONjYAZCzaffiWuEdUIdhwNYpyL4i", + "0V1TApL+2M30K+zeji1lgWmSc4IiNRUyTCdUHo5Ed6F7VqPgPM3xu/VhECiL1kQIvCQ7F1K7cbOiGt/S", + "qq4NB7E7Cy5UvaEGgPfOm6pO0lVQ0rkxd3fd2cDtdf13KQaJvsPR3QZz9d6tMyzpLU2o3ILPCZXdqY+9", + "woIDE4t7llWsQrGoq+i22j7+g4thfmpGnWHVVJtO21rn8b5K8fsu8/hIdRNboNan9GAr4PpIeQVfZAuv", + "I0gH9Sle0L8kVhsracvfbTzQQJB4ea8dHChrSj4NVCgfQr3uHoL0637QkRO7TxoO9+D3Nld7JGrwfcD9", + "DKF2964G07uW0f54gg8d/gHwG0r0A/A9QPWdukBUKRMwqI5eNV07MD/IMgP3lPWnNA3/oH8mCybCDz+R", + "mwcfaiLBlawqHlC5LQvlvdfvZWzvdxzMnm/BtN7Y+pYkyd9TtknPMpLOTnQ6+XF7j7HuMdXkXdMm2//C", + "IDzImFgQ42i+Ob7UJjbI5Z2dnO9eC87pgHd2/oVwTWKeRe+0LdjyFsto5VYj6rVerXjAF6Je67JY16bl", + "vtG2DyXNqklWUmYCAapq487PR/8sbLMZ43KMMixX8BNoe451psR1t1jzuKGyQcyIgPgHY8WEz5r3O6RF", + "XaUGQtk+4Ny7034uAg+FRFlm4NO43gaPObUfWprfhWreNJd+cE1c5tqYFxAAEXzGbJPiNTlwatuOTcVe", + "gqOVDluGLOx68JLZWmlSrhWesgeKu/zUO2Pr0+Npp3vcwqe1rEavDkQtF8yJzIG/o/DargU0rbsHCkOp", + "7VVkuJzTqUu3M+J+YSKzfp1YYx2DVHoVFjgRJNzeyN2xtqMFPT2h6+5KAHhQNba2II8KEeuKSo/Cb09s", + "eabHR+Xxvnhu657Dpf1EluBtr0agHv+psi0zESqfWm3Fr28c2gEW1n2lpOfGbtZLiHRsEGbv7ZHzbcQO", + "8dv6mF50quXA8PQXr/4PENN7ta0FqFLoRuyW9+kvuXpFunbG1V+cWT57JA1vtoeXT98qTlm6XbNczHXc", + "b+cFW5beUMfNBGfYcEVcaRMH7BYHe9bpWi5yxXKpMNpmK2mvrmW87SzXjQoeIIqaUl/WE3vhxha3QtSP", + "L3882vDmfUTy0H6ix9vnr6a+//tgpDkV1j2/424hQHxu0+waQ+Fth1CMRNGZw1DrT2+vSqZaJ6gig89p", + "boBFPeiwKQ57iJaj6aAVnZqDbx90Z21R4MKRayESn4paQPhJSXvvRilLTQX1HeoN9tJVh/glP4HLb8Fs", + "ZUHj+YM8sdHhaEWShP2X5LmQtwmLpjG5H41HOjJzdKX+/F3CIiQJXk+hKS4MUgz98ODAH1ZTasrhoCQb", + "juzoBoVyohi/V6VPx4S8/eoY3RxPjs5nbmdNDZmvb6AguGQRcxuJHVhrgRvRoceV/S0TGhFj3zInPcpw", + "tCKTL6evaofcbDZTDD9PGV8emLHi4M3s+PSXy1M1Zio/astSzTPpUpQtrgSRONpEogPCRq+mamFw5pAU", + "Z3R0OPpq+gr2oh5GQKEDcz7Hwn4gioi1jDVH1AkX5GWcnBKbsO3HNzpnwgkgFSaarCjw9R2Lt0VtSk3V", + "TuDRwQehhWotM3VJVO2BaZ8+fXLeDTjdl69eDVq86miuYebZ34HoRL5eY77tglSdpsbFdSw5yzNx8Dv8", + "d3byKXA/B7/r/85OPqnNLUOZuRdEckruTehXj/v6gQSvK3Oa2Pza0JX7B7VVE25M1d8VjpVEb04yci2A", + "2iFaA3BpkK6/O/rE4SVE+Wv/Nd4/OVL0uJQ21HAYkDgw7cpL8VLHt9k4sjD9nppBwZ7K1Tjfoj1CHVns", + "PC0By/ug885lH4HUd1zfvKB9sGC3SxiCG5kuhzwBoWqipC3Akn9NnGYeYQQxhZStEBVsVONKbk7DTa+j", + "RuA90DM3tF/ZB7b06vyyZ4zp1wujD9b0bSO0E554YRoNT7/JAi0CXB32ZeVWNxTSbZcKtQd0V34dG+u1", + "rG5CFa83xT4RpFznibChWqZ80P17HTt2v+kJ+HUe775hOj9iY9eLrzfq2uPtVxd7BBTYrSVbY+xJf9yo", + "OqwGYUguVhVZovO1qOGIyTp22ylBsQ4QhpEbbKuNUh4Dc4IdK2jRUOR5X4jRUVO6GUO6rqmxUveQixKS", + "8WFSHyRfiYfKfF0Zavu4ivY198ytO3LW+hDmLpAfggsmH4JMfDtzBz7YAHXRmESRO1kjPhb0SAPZByJ0", + "LrtnXOiO6e+DDv0B34EEJotPHPxe5PZ90r/Fk0pjoCbrQM7r5ll4mldUcZht/erLj+23P+pPRw8E/EDT", + "qhMRWhiTTf+e2y1a0nuSIgOWHXxylbPpPN4d3mSrLHWAOJD20Wpysc0Smywhbq7nA8wtxVall1Bu17Sp", + "FWZR+RF+GjC/l9bfMGslM7XFkNNFGb/7Wa++TQ0GArPsYeoqwT/dO/yd5czG29csc3oH2cDCb4TZQOQ3", + "CKubeCut6fclk1WWMdn1f4BdFzaCor4idj909N50OL0gE5zGE1uTYGIVp2c8bVBBHD+4ZMjCDbSSWdBD", + "5HpzKERd2iYpflKWKCcrxl5fvHHKJtksTXddtR2l43pynoOLAWqy5SPcYD/ABMuL90VaZl0Fqq+PZ08k", + "UFVWNUd1Fu+mRPeOkZkg9Nw+PokWZMloHD2T5J+IJP8MtDhIpalQ4VNQH9d5xM9010B3Jc0ZSLnEpuNs", + "1GcuBcZ1a09T+ad9WXq6Kmrt29jTUe4qRAt3VWsPkX6FOA19C7Y2MmjF/umGJMnkLmWb9IBlJKWukj8p", + "A51bVX07ECJ/6qzuDH72GZ2NExrtEe490m+GaNs3x5dodnIeyLf5jJXtCst4fI6hEE2JKgeFyakRXZpS", + "hAyAbUFowwKggKeuFFyUsK0G0rqV3Cs4R+OosKZ1xZrclNWZbgkSBBwL76COmomNC5gQvKDOh13SVaic", + "f9O6btHPB6x5hIp8URQTXml3z2Kb8287RkL0p9pg2twJcWwK8tp8OoSXSqSSKMGy5UAsJnO3fsaDTmUq", + "UcGeN7gso6PPqE9WLNZvS2XF1IF3GqxtZWtq60CdXBA+wUvTs8Arge4W3y48Xhkn95TlItkiIiTWdZRj", + "k/bStKRpyeAUtvLqLWecAX0xrrME1/jOft7YfjJMEWV18eHA0iHHtjuopviOBXVJ7WEIkiKW4d9yW5LN", + "ayRR9I5YY6oD/qEij1fi1/qkcRqjCCfJLY7utCoRBH3R2l2W/StMhW5zuwbSDiKoKX1s0AuUeQaXP55d", + "vzkpVBGTx39vmjJEnAkxEVSWu10wvjSFbYKALAoP9QbkaaqIJC7zYJqztSKW3pOtMBlX+m9OVwrH5q7+", + "rUtmog02NZzZrbqJKfo5TyTNksZFHNVMU8NWoROIHnM/bqC4Qu/CaKqbRbMFWtulKibKEOjC5b8GgVLH", + "+n4hTLCwki1SEkkb1X598Ubfv/k3NBCx6SoxFRG7hywUQ8XA6yTha5oSB6BfKBBlGIq6UCIAf4tC61N0", + "cXp89vPPp7+cnJ4oSBQpFK7I2UqLttKpFn92pElwUa3As19iws9H/4TjKnIsG+Na2tM4kkm6pv8iBSV9", + "IRD5mBFOSRqRRzgdFMFTGxsNjCwFxmvSC00le+1ysile5tpsDwDyUdpmBBUzBuFTdGSmKhuRuxXjysYq", + "GRZCl2rDqWsDAX3abV1cvPilYldC3iRd8GponludTq0EQ8wMuoaZ2abHyOqnuSrXhUKLEt+BoYYp9s9y", + "WzfdFkZTy6ZMomWOlVRI9AYYp0uaqp/NWahpgsTHKGJ5EiuugFOEpVScuuF+3c3vdMVO+pRuiF80ltHZ", + "AdjrJ6COUe2YEHo+WkpgdtS/pPFE57DpP08sn8C3CTGVMN+NbMI2EUratXLlu1E9DbdgmVAf8Merq/NL", + "dAvlLq8v3oR7Zb9zmhhBoc2Wvt9FJhxOOMHxVrcKMIVFy6ZcgKhlrwXbUIjq5hfcREBXxims0F/+///7", + "/wQq9V2UsLLyR6ukPdegHA2J+P7q1ZctiuzHyWazmSwYX09ynhD9lvqabbj8dLioZEgA0Z1WSEqK0rLt", + "WBYYDRqR6WAFndeTLcILQAtAbeMZVwITlXRpLaGcijv1jCYE3zV0HAlXcixqZNKFQSH40ENIJdOb8hcW", + "OZ2EqLqsCmcjH3Fks7w5iUhF2+nbbsGWLe3y7H3P8jSuWBHAatAVVVu2UCjU6mqJjObQm6u2shL6rkQp", + "2jh+VQVHlgYGFwn2iuyzjLP7EpFO03gCBWDzDFQIt4jMAmFdThUdaTleJ8t5ncOAUetJTSm5mv7+NLGa", + "lVWeyCZYW7Wwi4/9WTcy6FYuULTbfgWY1xK+GUC6Pug20wgV+XhkU0d0Inul0K1ORQxf9t7v+cmv+Alv", + "t++90jj7vM3BN18+G4T/UwzCbvGGJ2MjR5FC3oTES7Im6b5CRo+iu1Ym8nXA+H2nBJ+vHxGbj6I7KK7b", + "5lOFD0Icwy0z0c4zMsybb69o0prGNq8rKIYhbexKtrY7QE0FwGmMlkSW6ub1xUxhQtnAD9Qqx8qDRdnb", + "0SodOmDTMxTY+WoLtzsPznOxIvGDUsoGC/k9S8nXTG//4Wa3IR0TGl0pgZa3ntvh8PNwkHRss7FJ4A6O", + "j9ZORn9eO1ZhbvqcbVitnV3DVPEf7IxqL+QTTFJp9/eG20iE4drht+pr+3h2TIU7z6yCdXk+M5dBY9+3", + "hkKB/3Yen3bDWDUUwutL6j+zIfNZXX5+/agJlzUxrllePuYEm3KJX7/6JlBTWj+yvzCJjnSPbPj09VeN", + "bXvRaSqp3KIrxtAbzJcEBnz5bYCZMIZ+xunWwl2E5HZ9nl0Micb25srytQxp9UEYVnuTeRvahhxVeL1R", + "AuBrkGWUsponCb5NiFVKwy1J2ruJtq7jftpjORrPQTMNKLknxgRaFl82Sq1TwQsM05lm4AV3LvwYpeR+", + "c64nm/bZU6NAV0gbYX0NCkczbjsdB/u2ZE3HtTssj8FSol70NeNgebAFp9zy2qLHeT714h6BfOnLXHFK", + "tetvQj9/rzvjVOssGdlQ5LdrWvcvWL2UuYoAZ/lyhW6OL6vEeJ+5xGgf2eZYOUXs9iu4jRVO40S3RLbF", + "vctgc/WUuDVStBTA1LObE8RyU0KliNFrKJKgFN8Lu7UOe5XTxbMs1OIkGjfFVT3MfGU9tG1RLLuXafrq", + "VZCRG4AE2LEDrBbWW5BJqwnMbdQP96f7bYAihIt4a/2z9YYWdrKqFUDfjOuKXmFhlHqld4IXT+Sw5CJP", + "GpA7jCFA2/t7EVq0e+sgHFsPYelmB++xw1BtAb5Gp2cf7hn2ujZ4S+uOxQetOy9aCYRME3ybSbbkOFsZ", + "VZnjNGZrrw++o95aVk6aFSkr2Evjqytkv87dlvWEe6tavjGpRfHq1crSQws7Alhcn+23q841lHvnDaj5", + "ps2TF3fYgRR9yxWh3BZZtSDS1pVI+0Q79y4/DgaJXlqPC3nTHQXgbLHohbAVdcDBh/f9H+xHsokrhgYM", + "qivVqDDGV0rc4xiVtv0aw/fKH7dz/VZHm7Z5aOJ+zjTyXlsNGIFirZHq9y91Su8apl+w95vjy0ZWG5Jv", + "9ALadbEnB5FdBDatV2p1GL3e78o9Fd5X+9xFp6+qg/LslAYRiusLU6ARl1qJsFH4HlCK1mzYyerqXdr0", + "Cctt1Cn60Qn6McpwPF191b5xG3CrR/eYwvPX/aQEXb+/MGQwqoLXPxBZyPUawSpNQd04ApuaCoEEDawT", + "BFBTEi1GL8wQEr9sL7bxA7EITGIvlOQZjZ8AjR//9Qnf5wX5bd/iV9PCIusZWNMbgetUobi+VZn8pO5q", + "5cGyYWDYEArtOp/NoM9m0Gcz6NbJ/S+snG5hC7/8hvZmecHAoHKG7aJOr8Rm4v1dfoRK9Qmma0dgq0ph", + "OvR/5oyEYsZ7KB8HO3HLx7lSYm6bW+xQ1b8LzEsibYmFwo5nnOnGwuxWOZmGAd31pp+AJ7sszBZ+YE1R", + "toFRgcUFDy+kphvgdivLJ9YRX0DRrda3N+HkprIaun8CvbleMK3aP3pfFdOC/c73XSWzqTd2r+KY1W7p", + "PbjQ/ms3/XmRtagKROPI4dlPUfno5vwpsLWy5CBkffL3th+mu6s8AkP+Q1D8j2DHXiv5ffLjWlf6J+HI", + "wQ7ZA3hy5oMnhKtqGBh0NYaVHa8ODw4SFuFkxYQ8/Nurv74aqQsxU1RxQnuoJ9oNFqM1i0lSCYqq5gOP", + "6phl99VznuIYAU+2jsNbEZzIFYJe5OU4/Vf9x0/vP/13AAAA///ukTW8hDoBAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/docs/v1/openapi.yaml b/docs/v1/openapi.yaml index dad5e64b0..4332ac71f 100644 --- a/docs/v1/openapi.yaml +++ b/docs/v1/openapi.yaml @@ -2395,6 +2395,9 @@ components: interaction_details: type: object description: Proprietary interaction details. + required: + - notification_id + - event AckErrorResponse: title: AckResponse x-tags: diff --git a/pkg/restapi/v1/oidc4ci/controller.go b/pkg/restapi/v1/oidc4ci/controller.go index 11509edb6..ab109bba3 100644 --- a/pkg/restapi/v1/oidc4ci/controller.go +++ b/pkg/restapi/v1/oidc4ci/controller.go @@ -626,9 +626,6 @@ func mustGenerateNonce() string { func (c *Controller) OidcAcknowledgement(e echo.Context) error { req := e.Request() - // ctx, span := c.tracer.Start(req.Context(), "OidcAcknowledgement") - // defer span.End() - var body AckRequest if err := e.Bind(&body); err != nil { return err @@ -652,17 +649,15 @@ func (c *Controller) OidcAcknowledgement(e echo.Context) error { var finalErr error - if body.NotificationId != nil && body.Event != nil { - if err := c.ackService.Ack(ctx, oidc4ci.AckRemote{ - TxID: issuecredential.TxID(lo.FromPtr(body.NotificationId)), - Event: lo.FromPtr(body.Event), - HashedToken: hashedToken, - EventDescription: lo.FromPtr(body.EventDescription), - IssuerIdentifier: lo.FromPtr(body.IssuerIdentifier), - InteractionDetails: interactionDetails, - }); err != nil { - finalErr = errors.Join(finalErr, err) - } + if err := c.ackService.Ack(ctx, oidc4ci.AckRemote{ + TxID: issuecredential.TxID(body.NotificationId), + Event: body.Event, + HashedToken: hashedToken, + EventDescription: lo.FromPtr(body.EventDescription), + IssuerIdentifier: lo.FromPtr(body.IssuerIdentifier), + InteractionDetails: interactionDetails, + }); err != nil { + finalErr = errors.Join(finalErr, err) } if finalErr != nil { diff --git a/pkg/restapi/v1/oidc4ci/openapi.gen.go b/pkg/restapi/v1/oidc4ci/openapi.gen.go index 255aaa07e..e5fa1c9f0 100644 --- a/pkg/restapi/v1/oidc4ci/openapi.gen.go +++ b/pkg/restapi/v1/oidc4ci/openapi.gen.go @@ -48,7 +48,7 @@ type AckErrorResponse struct { // Ack request. type AckRequest struct { // Type of the notification event. According to draft 13 spec. - Event *string `json:"event,omitempty"` + Event string `json:"event"` // Human-readable ASCII text providing additional information, used to assist the Credential Issuer developer in understanding the event that occurred. According to draft 13 spec. EventDescription *string `json:"event_description,omitempty"` @@ -60,7 +60,7 @@ type AckRequest struct { IssuerIdentifier *string `json:"issuer_identifier,omitempty"` // Ack ID. According to draft 13 spec. - NotificationId *string `json:"notification_id,omitempty"` + NotificationId string `json:"notification_id"` } // Model for OIDC batch Credential request. From 0f7a20987e5e658425aa3886a37533ed36aa2a6a Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Thu, 19 Dec 2024 13:27:17 +0100 Subject: [PATCH 6/7] feat: vp flow --- README.md | 2 +- pkg/restapi/v1/oidc4ci/controller_test.go | 12 ++++++------ pkg/service/oidc4vp/api.go | 9 +++++---- pkg/service/oidc4vp/oidc4vp_service.go | 10 ---------- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index df20b7f3c..201fc6b1f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The TrustBloc VCS implements following specifications. - OIDF [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0-ID1.html) - Pre Authorization Code flow - Authorization Code low -- OIDF [OpenID for Verifiable Presentation](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) +- OIDF [OpenID for Verifiable Presentation](https://openid.net/specs/openid-4-verifiable-presentations-1_0-ID2.html) - DIF [Presentation Exchange](https://identity.foundation/presentation-exchange/) - DIF [Well Known DID Configuration](https://identity.foundation/.well-known/resources/did-configuration/) diff --git a/pkg/restapi/v1/oidc4ci/controller_test.go b/pkg/restapi/v1/oidc4ci/controller_test.go index cafda5df9..470baf830 100644 --- a/pkg/restapi/v1/oidc4ci/controller_test.go +++ b/pkg/restapi/v1/oidc4ci/controller_test.go @@ -4599,8 +4599,8 @@ func TestController_Ack(t *testing.T) { }) b, err := json.Marshal(oidc4ci.AckRequest{ - NotificationId: lo.ToPtr("tx_id"), - Event: lo.ToPtr("credential_accepted"), + NotificationId: "tx_id", + Event: "credential_accepted", EventDescription: lo.ToPtr("err_txt"), InteractionDetails: lo.ToPtr(map[string]any{ "userId": "userId", @@ -4677,8 +4677,8 @@ func TestController_Ack(t *testing.T) { Return(errors.New("some error")) b, err := json.Marshal(oidc4ci.AckRequest{ - NotificationId: lo.ToPtr("tx_id"), - Event: lo.ToPtr("credential_accepted"), + NotificationId: "tx_id", + Event: "credential_accepted", EventDescription: lo.ToPtr("err_txt"), }) require.NoError(t, err) @@ -4769,8 +4769,8 @@ func TestController_Ack(t *testing.T) { Return(oidc4cisrv.ErrAckExpired) b, err := json.Marshal(oidc4ci.AckRequest{ - NotificationId: lo.ToPtr("tx_id"), - Event: lo.ToPtr("credential_accepted"), + NotificationId: "tx_id", + Event: "credential_accepted", EventDescription: lo.ToPtr("err_txt"), InteractionDetails: lo.ToPtr(map[string]any{ "userId": "userId", diff --git a/pkg/service/oidc4vp/api.go b/pkg/service/oidc4vp/api.go index f4e9b1aa2..7b2341861 100644 --- a/pkg/service/oidc4vp/api.go +++ b/pkg/service/oidc4vp/api.go @@ -133,12 +133,13 @@ type RequestObject struct { RedirectURI string `json:"redirect_uri"` State string `json:"state"` Exp int64 `json:"exp"` - // Deprecated: Use client_metadata instead. - Registration RequestObjectRegistration `json:"registration"` - // Deprecated: Use top-level "presentation_definition" instead. - Claims RequestObjectClaims `json:"claims"` + ClientMetadata *ClientMetadata `json:"client_metadata"` PresentationDefinition *presexch.PresentationDefinition `json:"presentation_definition"` + + // presentation_definition_uri not supported + // client_metadata_uri not supported + // client_id_scheme not supported } type RequestObjectRegistration struct { diff --git a/pkg/service/oidc4vp/oidc4vp_service.go b/pkg/service/oidc4vp/oidc4vp_service.go index 7f9fc9ba1..d9a2b7dc6 100644 --- a/pkg/service/oidc4vp/oidc4vp_service.go +++ b/pkg/service/oidc4vp/oidc4vp_service.go @@ -888,16 +888,6 @@ func (s *Service) createRequestObject( RedirectURI: s.responseURI, State: string(tx.ID), Exp: now.Add(tokenLifetime).Unix(), - Registration: RequestObjectRegistration{ - ClientName: profile.Name, - SubjectSyntaxTypesSupported: []string{"did:ion"}, - VPFormats: vpFormats, - ClientPurpose: purpose, - LogoURI: profile.LogoURL, - }, - Claims: RequestObjectClaims{VPToken: VPToken{ - presentationDefinition, - }}, ClientMetadata: &ClientMetadata{ ClientName: profile.Name, SubjectSyntaxTypesSupported: []string{"did:web", "did:jwk", "did:key", "did:ion"}, From 3b3302c18cb6d268a4272b0dd20f29a936b7d2a4 Mon Sep 17 00:00:00 2001 From: Stas Dm Date: Thu, 19 Dec 2024 13:39:57 +0100 Subject: [PATCH 7/7] fix: lint --- component/wallet-cli/pkg/oidc4vci/oidc4vci_flow.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/component/wallet-cli/pkg/oidc4vci/oidc4vci_flow.go b/component/wallet-cli/pkg/oidc4vci/oidc4vci_flow.go index 5a1b1992e..d2e77d462 100644 --- a/component/wallet-cli/pkg/oidc4vci/oidc4vci_flow.go +++ b/component/wallet-cli/pkg/oidc4vci/oidc4vci_flow.go @@ -1172,13 +1172,13 @@ func (f *Flow) handleIssuanceAck( slog.Debug("Sending wallet notification", "notification_id", notificationID, "endpoint", notificationEndpoint) ackRequest := oidc4civ1.AckRequest{ - Event: lo.ToPtr("credential_accepted"), + Event: "credential_accepted", EventDescription: nil, IssuerIdentifier: wellKnown.CredentialIssuer, InteractionDetails: lo.ToPtr(map[string]interface{}{ "notification_id": notificationID, }), - NotificationId: lo.ToPtr(notificationID), + NotificationId: notificationID, } b, err := json.Marshal(ackRequest)