@lifeready/core 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/lifeready-core.umd.js +9745 -9700
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js +2 -2
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/run-outside-angular.js +2 -2
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/api/lr-apollo.service.js +3 -3
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +3 -3
- package/esm2015/lib/api/query-processor/common-processors.service.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +4 -4
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +6 -5
- package/esm2015/lib/api/types/lr-graphql.types.js +1 -1
- package/esm2015/lib/auth/auth.gql.js +1 -28
- package/esm2015/lib/auth/auth.types.js +1 -1
- package/esm2015/lib/auth/life-ready-auth.service.js +32 -31
- package/esm2015/lib/category/category.gql.js +1 -1
- package/esm2015/lib/category/category.service.js +6 -6
- package/esm2015/lib/contact-card/contact-card.gql.js +79 -0
- package/esm2015/lib/contact-card/contact-card.service.js +154 -0
- package/esm2015/lib/contact-card/contact-card2.gql.js +29 -0
- package/esm2015/lib/contact-card/contact-card2.service.js +103 -0
- package/esm2015/lib/encryption/encryption.service.js +189 -0
- package/esm2015/lib/file-upload/file-upload.service.js +74 -0
- package/esm2015/lib/file-upload/file-upload.types.js +1 -0
- package/esm2015/lib/{auth → idle}/idle.service.js +7 -7
- package/esm2015/lib/{auth → idle}/idle.types.js +1 -1
- package/esm2015/lib/items2/item2.service.js +20 -20
- package/esm2015/lib/key/key-factory.service.js +237 -0
- package/esm2015/lib/{cryptography → key}/key-graph.service.js +10 -10
- package/esm2015/lib/key/key-meta.service.js +200 -0
- package/esm2015/lib/key/key.service.js +124 -0
- package/esm2015/lib/key/key.types.js +11 -0
- package/esm2015/lib/key-exchange/key-exchange.gql.js +188 -0
- package/esm2015/lib/key-exchange/key-exchange.service.js +443 -0
- package/esm2015/lib/key-exchange/key-exchange.types.js +7 -0
- package/esm2015/lib/key-exchange/key-exchange2.gql.js +171 -0
- package/esm2015/lib/key-exchange/key-exchange2.service.js +500 -0
- package/esm2015/lib/lbop/lbop.service.js +355 -0
- package/esm2015/lib/life-ready.module.js +2 -27
- package/esm2015/lib/lock/lock.gql.js +40 -0
- package/esm2015/lib/lock/lock.service.js +64 -0
- package/esm2015/lib/message/message.gql.js +32 -0
- package/esm2015/lib/message/message.service.js +116 -0
- package/esm2015/lib/message/message.types.js +1 -0
- package/esm2015/lib/password/password.gql.js +28 -0
- package/esm2015/lib/password/password.service.js +315 -0
- package/esm2015/lib/persist/persist.service.js +180 -0
- package/esm2015/lib/profile/profile-details.service.js +214 -0
- package/esm2015/lib/profile/profile.gql.js +97 -0
- package/esm2015/lib/profile/profile.service.js +169 -0
- package/esm2015/lib/profile/profile.types.js +34 -0
- package/esm2015/lib/record/record-attachment.service.js +15 -15
- package/esm2015/lib/record/record.service.js +3 -3
- package/esm2015/lib/register/register.service.js +172 -0
- package/esm2015/lib/scenario/scenario.controller.js +2 -2
- package/esm2015/lib/scenario/{scenario.gql.private.js → scenario.private.gql.js} +1 -1
- package/esm2015/lib/scenario/scenario.service.js +9 -9
- package/esm2015/lib/scenario/scenario.types.js +1 -1
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +119 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/slip39/slip39.service.js +169 -0
- package/esm2015/lib/time/time.service.js +146 -0
- package/esm2015/lib/tp-assembly/tp-assembly.js +365 -0
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +22 -0
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +1 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +100 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +117 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +34 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +74 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +165 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +54 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +92 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +1 -0
- package/esm2015/lib/trusted-party/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-party/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-party/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.js +64 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.private.js +25 -0
- package/esm2015/lib/trusted-party/trusted-party2.service.js +224 -0
- package/esm2015/lib/trusted-party/trusted-party2.types.js +1 -0
- package/esm2015/lib/two-factor/two-factor.service.js +74 -0
- package/esm2015/lib/user/user.gql.js +60 -0
- package/esm2015/lib/user/user.service.js +79 -0
- package/esm2015/lib/user/user.types.js +1 -0
- package/esm2015/lib/web-crypto/web-crypto.service.js +29 -0
- package/esm2015/lifeready-core.js +15 -13
- package/esm2015/public-api.js +49 -51
- package/fesm2015/lifeready-core.js +9232 -9214
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/types.d.ts +3 -1
- package/lib/api/lr-apollo.service.d.ts +1 -1
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +1 -1
- package/lib/api/query-processor/common-processors.service.d.ts +1 -1
- package/lib/api/query-processor/query-processor.service.d.ts +1 -1
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +1 -1
- package/lib/api/types/lr-graphql.types.d.ts +11 -0
- package/lib/auth/auth.gql.d.ts +0 -3
- package/lib/auth/auth.types.d.ts +2 -2
- package/lib/auth/life-ready-auth.service.d.ts +12 -12
- package/lib/category/category.gql.d.ts +1 -1
- package/lib/category/category.service.d.ts +2 -2
- package/lib/{api → contact-card}/contact-card.service.d.ts +9 -9
- package/lib/contact-card/contact-card2.gql.d.ts +25 -0
- package/lib/{api → contact-card}/contact-card2.service.d.ts +11 -12
- package/lib/{cryptography → encryption}/encryption.service.d.ts +2 -2
- package/lib/{api/file.service.d.ts → file-upload/file-upload.service.d.ts} +3 -7
- package/lib/file-upload/file-upload.types.d.ts +5 -0
- package/lib/{auth → idle}/idle.service.d.ts +4 -4
- package/lib/items2/item2.service.d.ts +11 -11
- package/lib/{cryptography → key}/key-factory.service.d.ts +2 -2
- package/lib/{cryptography → key}/key-graph.service.d.ts +5 -5
- package/lib/{cryptography → key}/key-meta.service.d.ts +1 -1
- package/lib/{cryptography → key}/key.service.d.ts +2 -2
- package/lib/{cryptography/cryptography.types.d.ts → key/key.types.d.ts} +9 -13
- package/lib/{api → key-exchange}/key-exchange.service.d.ts +5 -5
- package/lib/{api → key-exchange}/key-exchange.types.d.ts +4 -4
- package/lib/{api → key-exchange}/key-exchange2.gql.d.ts +1 -1
- package/lib/{api → key-exchange}/key-exchange2.service.d.ts +71 -18
- package/lib/{auth → lbop}/lbop.service.d.ts +7 -7
- package/lib/{api → lock}/lock.gql.d.ts +1 -1
- package/lib/{api → lock}/lock.service.d.ts +1 -1
- package/lib/message/message.gql.d.ts +13 -0
- package/lib/message/message.service.d.ts +29 -0
- package/lib/message/message.types.d.ts +12 -0
- package/lib/password/password.gql.d.ts +3 -0
- package/lib/{auth → password}/password.service.d.ts +8 -8
- package/lib/{api → persist}/persist.service.d.ts +3 -3
- package/lib/{users → profile}/profile-details.service.d.ts +3 -3
- package/lib/{users → profile}/profile.gql.d.ts +2 -2
- package/lib/{users → profile}/profile.service.d.ts +6 -6
- package/lib/{users → profile}/profile.types.d.ts +1 -1
- package/lib/record/record-attachment.service.d.ts +6 -6
- package/lib/record/record.service.d.ts +1 -1
- package/lib/{auth → register}/register.service.d.ts +4 -4
- package/lib/scenario/scenario.controller.d.ts +1 -1
- package/lib/scenario/scenario.service.d.ts +2 -2
- package/lib/scenario/scenario.types.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card.service.d.ts +9 -9
- package/lib/{api → shared-contact-card}/shared-contact-card2.gql.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card2.service.d.ts +6 -6
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.d.ts +7 -7
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.types.d.ts +1 -1
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-request.service.d.ts +4 -8
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-user.service.d.ts +7 -13
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.controller.d.ts +1 -1
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +63 -0
- package/lib/{trusted-parties/tp-password-reset.gql.d.ts → tp-password-reset/tp-password-reset.private.gql.d.ts} +1 -63
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +59 -0
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.service.d.ts +6 -89
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +40 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party.service.d.ts +7 -7
- package/lib/{trusted-parties → trusted-party}/trusted-party.types.d.ts +2 -3
- package/lib/{trusted-parties → trusted-party}/trusted-party2.gql.d.ts +0 -22
- package/lib/trusted-party/trusted-party2.gql.private.d.ts +23 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party2.service.d.ts +11 -35
- package/lib/trusted-party/trusted-party2.types.d.ts +12 -0
- package/lib/{users → user}/user.gql.d.ts +1 -1
- package/lib/{users → user}/user.types.d.ts +1 -1
- package/lifeready-core.d.ts +14 -12
- package/lifeready-core.metadata.json +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +48 -50
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -7
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -480
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/password.service.js +0 -315
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/key.service.js +0 -124
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +0 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +0 -365
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +0 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -237
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -218
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -1
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/message.service.d.ts +0 -59
- /package/lib/{api → contact-card}/contact-card.gql.d.ts +0 -0
- /package/lib/{auth → idle}/idle.types.d.ts +0 -0
- /package/lib/{api → key-exchange}/key-exchange.gql.d.ts +0 -0
- /package/lib/scenario/{scenario.gql.private.d.ts → scenario.private.gql.d.ts} +0 -0
- /package/lib/{cryptography → slip39}/slip39.service.d.ts +0 -0
- /package/lib/{api → time}/time.service.d.ts +0 -0
- /package/lib/{trusted-parties/tp-assembly.gql.private.d.ts → tp-assembly/tp-assembly.private.gql.d.ts} +0 -0
- /package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.constants.d.ts +0 -0
- /package/lib/{trusted-parties → trusted-party}/trusted-party.gql.d.ts +0 -0
- /package/lib/{auth → two-factor}/two-factor.service.d.ts +0 -0
- /package/lib/{users → user}/user.service.d.ts +0 -0
- /package/lib/{cryptography → web-crypto}/web-crypto.service.d.ts +0 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
// Ref: https://stackoverflow.com/questions/59735280/angular-8-moment-error-cannot-call-a-namespace-moment
|
|
4
|
+
import * as moment_ from 'moment';
|
|
5
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
6
|
+
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
7
|
+
import { EncryptionService, JoseSerialization, } from '../encryption/encryption.service';
|
|
8
|
+
import { KeyFactoryService as KFS } from '../key/key-factory.service';
|
|
9
|
+
import { KeyService } from '../key/key.service';
|
|
10
|
+
import { UserService } from '../user/user.service';
|
|
11
|
+
import { LrCodeMismatchException } from '../_common/exceptions';
|
|
12
|
+
import { CompleteOtkMutation, CurrentUserSharedKeyQuery, InitiateOtkMutation, KeyExchangeQuery, KeyExchangesQuery, KeyExchangeTokenQuery, RespondOtkMutation, } from './key-exchange.gql';
|
|
13
|
+
import { OtkState, } from './key-exchange.types';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "../key/key-factory.service";
|
|
16
|
+
import * as i2 from "../key/key.service";
|
|
17
|
+
import * as i3 from "../api/lr-apollo.service";
|
|
18
|
+
import * as i4 from "../encryption/encryption.service";
|
|
19
|
+
import * as i5 from "../auth/life-ready-auth.service";
|
|
20
|
+
import * as i6 from "../user/user.service";
|
|
21
|
+
const moment = moment_;
|
|
22
|
+
export class KeyExchangeService {
|
|
23
|
+
constructor(keyFactory, keyService, lrApollo, encryptionService, authService, userService) {
|
|
24
|
+
this.keyFactory = keyFactory;
|
|
25
|
+
this.keyService = keyService;
|
|
26
|
+
this.lrApollo = lrApollo;
|
|
27
|
+
this.encryptionService = encryptionService;
|
|
28
|
+
this.authService = authService;
|
|
29
|
+
this.userService = userService;
|
|
30
|
+
this.CLIENT_NONCE_LENGTH = 32;
|
|
31
|
+
}
|
|
32
|
+
getKeyExchangeList(input = {}) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const { keyExchanges } = yield this.lrApollo.query({
|
|
35
|
+
query: KeyExchangesQuery,
|
|
36
|
+
variables: Object.assign({}, input),
|
|
37
|
+
});
|
|
38
|
+
return keyExchanges;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param id If the current user can responder the key exchange if they are either the initiator or the receiver.
|
|
43
|
+
* @param token If not signed in, or not the initiator or responder, 'token' must be given.
|
|
44
|
+
* @param otKeyK Is the raw one-time key (string). If the responder is explicitly specified at time of initiation, then
|
|
45
|
+
* it's possible to have the otKey wrapped by the public key of the responder. In which case, the otKeyK is not needed.
|
|
46
|
+
*/
|
|
47
|
+
getKeyExchange(id, { otKeyK, token } = {}) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const { keyExchange } = yield this.lrApollo.query({
|
|
50
|
+
query: token ? KeyExchangeTokenQuery : KeyExchangeQuery,
|
|
51
|
+
variables: {
|
|
52
|
+
id,
|
|
53
|
+
token,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return yield this.decryptKeyExchange(keyExchange, otKeyK);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
decryptResponseCipher(otKey, otPrk, content) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
// The response could be wrapped by the OtK as well as we the OtPrk
|
|
62
|
+
try {
|
|
63
|
+
content = yield this.encryptionService.decrypt(otKey, content);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error.message !== 'no key found') {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
// Do nothing to support older versions where message is not wrapped with otk.
|
|
70
|
+
}
|
|
71
|
+
// The Prk is single-use and only used to send information from the responder back to the initiator.
|
|
72
|
+
return yield this.encryptionService.decrypt(otPrk, content);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
decryptKeyExchange(keyExchange, otKeyK) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
if (keyExchange.isInitiator) {
|
|
78
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
79
|
+
// Decrypt using the root key to get the Prk
|
|
80
|
+
const plainInitiatorRootKeyCipher = (yield this.encryptionService.decrypt(rootKey.jwk, keyExchange.initiatorRootKeyCipher));
|
|
81
|
+
const plainInitiatorOneTimePbkCipher = keyExchange.otk
|
|
82
|
+
.initiatorOneTimePbkCipher
|
|
83
|
+
? yield this.decryptResponseCipher(yield KFS.asKey(plainInitiatorRootKeyCipher.otKey), yield KFS.asKey(plainInitiatorRootKeyCipher.oneTimePrk), keyExchange.otk.initiatorOneTimePbkCipher)
|
|
84
|
+
: null;
|
|
85
|
+
const responder = plainInitiatorOneTimePbkCipher &&
|
|
86
|
+
plainInitiatorOneTimePbkCipher.responder;
|
|
87
|
+
const initiator = plainInitiatorRootKeyCipher && plainInitiatorRootKeyCipher.initiator;
|
|
88
|
+
return Object.assign(Object.assign({}, keyExchange), { message: responder ? responder.message : null, contactCard: responder && responder.contactCard
|
|
89
|
+
? responder.contactCard.plainSharedCipherDataJson
|
|
90
|
+
: null, myContactCard: initiator && initiator.contactCard
|
|
91
|
+
? initiator.contactCard.plainSharedCipherDataJson
|
|
92
|
+
: null, myMessage: initiator && initiator.message });
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const decryptedOtk = yield this.decryptOtk(keyExchange, otKeyK);
|
|
96
|
+
const initiator = decryptedOtk && decryptedOtk.plainOtKeyCipher.initiator;
|
|
97
|
+
return Object.assign(Object.assign({}, keyExchange), { decryptedOtk, message: initiator && initiator.message, contactCard: initiator &&
|
|
98
|
+
initiator.contactCard &&
|
|
99
|
+
initiator.contactCard.plainSharedCipherDataJson });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
decryptOtk(keyExchange, otKeyK) {
|
|
104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
+
const otKey = yield this.getOtKey(keyExchange, otKeyK);
|
|
106
|
+
return otKey && keyExchange.otk.otKeyCipher
|
|
107
|
+
? {
|
|
108
|
+
plainOtKeyCipher: yield this.encryptionService.decrypt(otKey, keyExchange.otk.otKeyCipher),
|
|
109
|
+
otKey,
|
|
110
|
+
}
|
|
111
|
+
: null;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
getOtKey(keyExchange, otKeyK) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
if (otKeyK) {
|
|
117
|
+
return yield KFS.asKey(Object.assign(Object.assign({}, JSON.parse(keyExchange.otk.otKeyParams)), { k: otKeyK }));
|
|
118
|
+
}
|
|
119
|
+
else if (keyExchange.otk.state === OtkState.OTK_INITIATED &&
|
|
120
|
+
!keyExchange.isInitiator &&
|
|
121
|
+
keyExchange.otk.responderPbkCipher) {
|
|
122
|
+
// Assuming existing user getting invited where OTK is wrapped in responder's public key.
|
|
123
|
+
const prk = yield this.keyService.getCurrentPxk();
|
|
124
|
+
const decryptedCipher = yield this.encryptionService.decrypt(prk.jwk, JSON.parse(keyExchange.otk.responderPbkCipher), {
|
|
125
|
+
serializations: [JoseSerialization.COMPACT],
|
|
126
|
+
});
|
|
127
|
+
if (decryptedCipher.otKey) {
|
|
128
|
+
return yield KFS.asKey(decryptedCipher.otKey);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
initiateOtk({ message, email, contactCard, upgrade, }) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
const otKey = yield this.keyFactory.createKey();
|
|
137
|
+
const nonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
138
|
+
const user = yield this.authService.getUser();
|
|
139
|
+
// New PKC key for encryption. This key is used only once when the responder sends
|
|
140
|
+
// back their signing public key.
|
|
141
|
+
const initiatorOneTimePrk = yield this.keyFactory.createPkcKey();
|
|
142
|
+
// Option 1: New PKC key for signing
|
|
143
|
+
// const initiatorSigPrk = await this.keyService.createPkcSignKey();
|
|
144
|
+
// Option 2: Use the user's global signing key.
|
|
145
|
+
// This key is used to prove the initiator's identity.
|
|
146
|
+
const initiatorPrk = yield this.keyService.getCurrentPxk();
|
|
147
|
+
const initiatorSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
148
|
+
let initiatorPlainDataSig = null;
|
|
149
|
+
if (contactCard && contactCard.ownerPlainData) {
|
|
150
|
+
initiatorPlainDataSig = JSON.stringify(yield this.encryptionService.sign(initiatorSigPrk.jwk, contactCard.ownerPlainData));
|
|
151
|
+
}
|
|
152
|
+
const initiator = {
|
|
153
|
+
message,
|
|
154
|
+
contactCard: contactCard
|
|
155
|
+
? {
|
|
156
|
+
plainSharedCipherDataJson: contactCard.plainSharedCipherDataJson,
|
|
157
|
+
}
|
|
158
|
+
: null,
|
|
159
|
+
};
|
|
160
|
+
// Content to be encrypted using the OTK.
|
|
161
|
+
const plainOtKeyCipher = {
|
|
162
|
+
nonce,
|
|
163
|
+
initiator: Object.assign(Object.assign({}, initiator), { oneTimePbk: initiatorOneTimePrk.toJSON(), pbk: initiatorPrk.jwk.toJSON(), sigPbk: initiatorSigPrk.jwk.toJSON(), profile: {
|
|
164
|
+
username: user.username,
|
|
165
|
+
} }),
|
|
166
|
+
};
|
|
167
|
+
const otKeyCipher = yield this.encryptionService.encrypt(otKey, plainOtKeyCipher);
|
|
168
|
+
// Content to be encrypted using the initiator's root key.
|
|
169
|
+
const plainInitiatorRootKeyCipher = {
|
|
170
|
+
nonce,
|
|
171
|
+
oneTimePrk: initiatorOneTimePrk.toJSON(true),
|
|
172
|
+
// Should not need to keep this encrypted since we are using the global signing key.
|
|
173
|
+
// sigPrk: initiatorSigPrk.toJSON(true),
|
|
174
|
+
// Save it in case the initiator want to decode the otKeyCipher.
|
|
175
|
+
// Since the otKey is only used once, and that otKeyCipher contains only
|
|
176
|
+
// the public key of the initiator, it's safe just leave the otKey stored here.
|
|
177
|
+
otKey: otKey.toJSON(true),
|
|
178
|
+
// These should be storing information such as how the fields of the shared contact card is
|
|
179
|
+
// derived from the master contact card.
|
|
180
|
+
initiatorContactCard: contactCard,
|
|
181
|
+
initiator,
|
|
182
|
+
};
|
|
183
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
184
|
+
const initiatorRootKeyCipher = yield this.encryptionService.encrypt(rootKey.jwk, plainInitiatorRootKeyCipher);
|
|
185
|
+
// The raw OTK
|
|
186
|
+
const otKeyK = otKey.toJSON(true).k;
|
|
187
|
+
// API call
|
|
188
|
+
const { initiateKeyExchangeOtk } = yield this.lrApollo.mutate({
|
|
189
|
+
mutation: InitiateOtkMutation,
|
|
190
|
+
variables: {
|
|
191
|
+
input: {
|
|
192
|
+
// These will be stored on the server
|
|
193
|
+
initiatorRootKeyCipher: JSON.stringify(initiatorRootKeyCipher),
|
|
194
|
+
initiatorPxkId: initiatorPrk.id,
|
|
195
|
+
initiatorSigPxkId: initiatorSigPrk.id,
|
|
196
|
+
// These will be sent to the responder
|
|
197
|
+
otKeyParams: JSON.stringify(otKey.toJSON()),
|
|
198
|
+
otKeyCipher: JSON.stringify(otKeyCipher),
|
|
199
|
+
sendEmail: email
|
|
200
|
+
? {
|
|
201
|
+
email,
|
|
202
|
+
rawOtKey: otKeyK,
|
|
203
|
+
}
|
|
204
|
+
: null,
|
|
205
|
+
createTp: true,
|
|
206
|
+
initiatorPlainDataSig,
|
|
207
|
+
upgrade,
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
return { keyExchange: initiateKeyExchangeOtk.keyExchange, otKeyK };
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
respondOtk({ id, token, decryptedOtk, message, initiatorContactCard, responderContactCard: sentContactCard, }) {
|
|
215
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
216
|
+
const user = yield this.authService.getUser();
|
|
217
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
218
|
+
const masterKeyId = this.keyService.getCurrentMasterKey().id;
|
|
219
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
220
|
+
const sharedKey = yield this.keyFactory.createKey();
|
|
221
|
+
const mkSharedKey = yield this.keyFactory.createKey();
|
|
222
|
+
const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
|
|
223
|
+
const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
|
|
224
|
+
const initiatorOneTimePbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.oneTimePbk);
|
|
225
|
+
const initiatorPbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.pbk);
|
|
226
|
+
const initiatorSigPbk = yield KFS.asKey(decryptedOtk.plainOtKeyCipher.initiator.sigPbk);
|
|
227
|
+
// Option 1: Using new Prk for each TP pair
|
|
228
|
+
// Create a new public signing key for the responder.
|
|
229
|
+
// const responderSigPrk = await this.keyService.createPkcSignKey()
|
|
230
|
+
// const rkWrappedResponderSigPrk = await this.encrypt(rootKey, responderSigPrk.toJSON(true));
|
|
231
|
+
// Option 2: Responder already has a signing Prk
|
|
232
|
+
const responderPrk = yield this.keyService.getCurrentPxk();
|
|
233
|
+
const responderSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
234
|
+
const signedInitiatorPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorPbk.toJSON());
|
|
235
|
+
const signedInitiatorSigPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorSigPbk.toJSON());
|
|
236
|
+
const plainInitiatorOneTimePbkCipher = {
|
|
237
|
+
nonce: decryptedOtk.plainOtKeyCipher.nonce,
|
|
238
|
+
sharedKey: sharedKey.toJSON(true),
|
|
239
|
+
mkSharedKey: mkSharedKey.toJSON(true),
|
|
240
|
+
responder: {
|
|
241
|
+
pbk: responderPrk.jwk.toJSON(),
|
|
242
|
+
sigPbk: responderSigPrk.jwk.toJSON(),
|
|
243
|
+
profile: {
|
|
244
|
+
username: user.username,
|
|
245
|
+
},
|
|
246
|
+
message,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
let receivedCardInput;
|
|
250
|
+
if (decryptedOtk.plainOtKeyCipher.initiator.contactCard) {
|
|
251
|
+
// Set the info about the initiator to be the ones sent by the initiator. We need th responder to do the encryption here
|
|
252
|
+
// because the initiator does not have the shared key yet, and we want the responder to have a functional contact card after
|
|
253
|
+
// this exchange. The initiator can double check the contact details are correct and sign it when it completes the exchange.
|
|
254
|
+
const plainSharedCipherDataJson = decryptedOtk.plainOtKeyCipher.initiator.contactCard
|
|
255
|
+
.plainSharedCipherDataJson;
|
|
256
|
+
// Create keys
|
|
257
|
+
const receiverKey = yield this.keyFactory.createKey();
|
|
258
|
+
const ccSharedKey = yield this.keyFactory.createKey();
|
|
259
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
260
|
+
receivedCardInput = {
|
|
261
|
+
receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
|
|
262
|
+
receiverWrappingKeyId: rootKey.id,
|
|
263
|
+
receiverCipherData: initiatorContactCard
|
|
264
|
+
? JSON.stringify(yield this.encryptionService.encrypt(receiverKey, initiatorContactCard.plainReceiverCipherDataJson))
|
|
265
|
+
: '',
|
|
266
|
+
sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
|
|
267
|
+
};
|
|
268
|
+
const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, plainSharedCipherDataJson);
|
|
269
|
+
receivedCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
270
|
+
receivedCardInput.sigPxkId = sigPxk.id;
|
|
271
|
+
plainInitiatorOneTimePbkCipher.responder.contactCard = Object.assign(Object.assign({}, plainInitiatorOneTimePbkCipher.responder.contactCard), { sharedCipherKey: ccSharedKey.toJSON(true) });
|
|
272
|
+
}
|
|
273
|
+
let sentCardInput;
|
|
274
|
+
if (sentContactCard) {
|
|
275
|
+
// Create keys
|
|
276
|
+
const ownerKey = yield this.keyFactory.createKey();
|
|
277
|
+
const ccSharedKey = yield this.keyFactory.createKey();
|
|
278
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
279
|
+
sentCardInput = {
|
|
280
|
+
ownerWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true))),
|
|
281
|
+
ownerWrappingKeyId: rootKey.id,
|
|
282
|
+
ownerCipherData: sentContactCard.plainOwnerCipherDataJson
|
|
283
|
+
? JSON.stringify(yield this.encryptionService.encrypt(ownerKey, sentContactCard.plainOwnerCipherDataJson))
|
|
284
|
+
: '',
|
|
285
|
+
sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
|
|
286
|
+
};
|
|
287
|
+
const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, sentContactCard.plainSharedCipherDataJson);
|
|
288
|
+
sentCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
289
|
+
sentCardInput.sigPxkId = sigPxk.id;
|
|
290
|
+
if (sentContactCard.ownerPlainData) {
|
|
291
|
+
sentCardInput.ownerPlainDataSig = JSON.stringify(yield this.encryptionService.sign(responderSigPrk.jwk, sentContactCard.ownerPlainData));
|
|
292
|
+
}
|
|
293
|
+
// Contact card info readable by the initiator
|
|
294
|
+
plainInitiatorOneTimePbkCipher.responder.contactCard = Object.assign(Object.assign({}, plainInitiatorOneTimePbkCipher.responder.contactCard), { plainSharedCipherDataJson: sentContactCard.plainSharedCipherDataJson });
|
|
295
|
+
}
|
|
296
|
+
// Encrypt with one-time public key
|
|
297
|
+
let initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(initiatorOneTimePbk, plainInitiatorOneTimePbkCipher);
|
|
298
|
+
// Encrypt with the otk again to keep use of asymmetric keys to a minimum.
|
|
299
|
+
initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(decryptedOtk.otKey, initiatorOneTimePbkCipher);
|
|
300
|
+
const { respondKeyExchangeOtk } = yield this.lrApollo.mutate({
|
|
301
|
+
mutation: RespondOtkMutation,
|
|
302
|
+
variables: {
|
|
303
|
+
input: {
|
|
304
|
+
keyExchangeId: id,
|
|
305
|
+
keyExchangeToken: token,
|
|
306
|
+
rootKeyId: rootKey.id,
|
|
307
|
+
masterKeyId,
|
|
308
|
+
// These will be stored on the server
|
|
309
|
+
responderPxkId: responderPrk.id,
|
|
310
|
+
responderSigPxkId: responderSigPrk.id,
|
|
311
|
+
signedInitiatorPbk: JSON.stringify(signedInitiatorPbk),
|
|
312
|
+
signedInitiatorSigPbk: JSON.stringify(signedInitiatorSigPbk),
|
|
313
|
+
// rkWrappedInitiatorSigPbk: JSON.stringify(rkWrappedInitiatorSigPbk),
|
|
314
|
+
// Option 1: Using new Prk for each TP pair
|
|
315
|
+
// rkWrappedResponderSigPrk: JSON.stringify(rkWrappedResponderSigPrk),
|
|
316
|
+
rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
|
|
317
|
+
mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
|
|
318
|
+
// These will be sent to the initiator
|
|
319
|
+
initiatorOneTimePbkCipher: JSON.stringify(initiatorOneTimePbkCipher),
|
|
320
|
+
initiatorContactCard: receivedCardInput,
|
|
321
|
+
responderContactCard: sentCardInput,
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
return {
|
|
326
|
+
keyExchange: respondKeyExchangeOtk.keyExchange,
|
|
327
|
+
userSharedKey: respondKeyExchangeOtk.userSharedKey,
|
|
328
|
+
tp: respondKeyExchangeOtk.tp,
|
|
329
|
+
};
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
completeOtk(keyExchangeId, initiatorRootKeyCipher, initiatorOneTimePbkCipher, responderContactCard) {
|
|
333
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
334
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
335
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
336
|
+
// Decrypt using the root key to get the Prk
|
|
337
|
+
const plainInitiatorRootKeyCipher = (yield this.encryptionService.decrypt(rootKey.jwk, initiatorRootKeyCipher));
|
|
338
|
+
// The Prk is single-use and only used to send information from the responder back to the initiator.
|
|
339
|
+
const plainInitiatorOneTimePbkCipher = yield this.decryptResponseCipher(yield KFS.asKey(plainInitiatorRootKeyCipher.otKey), yield KFS.asKey(plainInitiatorRootKeyCipher.oneTimePrk), initiatorOneTimePbkCipher);
|
|
340
|
+
// Check the nonce match to ensure the responder was the one holding the OTK
|
|
341
|
+
if (plainInitiatorRootKeyCipher.nonce !== plainInitiatorOneTimePbkCipher.nonce) {
|
|
342
|
+
throw new LrCodeMismatchException('The nonce returned by responder does not match with the one created by the initiator.');
|
|
343
|
+
}
|
|
344
|
+
// Option 1: Assuming the signing key is unique between users.
|
|
345
|
+
// const initiatorSigPrk = await KFS.asKey(ke.plainInitiatorRootKeyCipher.sigPrk);
|
|
346
|
+
// const rkWrappedInitiatorSigPrk = await this.encrypt(rootKey, initiatorSigPrk.toJSON(true));
|
|
347
|
+
// Option 2: Use the user's global signing key.
|
|
348
|
+
// In this case the initiatorSigPrk is already a part of the key graph.
|
|
349
|
+
// So there's nothing to do here.
|
|
350
|
+
// Protected the signing public key of the responder.
|
|
351
|
+
const initiatorSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
352
|
+
const responderSigPbk = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.sigPbk);
|
|
353
|
+
const responderPbk = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.pbk);
|
|
354
|
+
const signedResponderPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderPbk.toJSON());
|
|
355
|
+
const signedResponderSigPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderSigPbk.toJSON());
|
|
356
|
+
const sharedKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.sharedKey);
|
|
357
|
+
const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
|
|
358
|
+
const mkSharedKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.mkSharedKey);
|
|
359
|
+
const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
|
|
360
|
+
let responderContactCardCipherInput;
|
|
361
|
+
if (responderContactCard) {
|
|
362
|
+
// Create key
|
|
363
|
+
const receiverKey = yield this.keyFactory.createKey();
|
|
364
|
+
responderContactCardCipherInput = {
|
|
365
|
+
receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
|
|
366
|
+
receiverWrappingKeyId: rootKey.id,
|
|
367
|
+
receiverCipherData: JSON.stringify(yield this.encryptionService.encrypt(receiverKey, responderContactCard)),
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
// Get the data needed from the initiator's cipher data.
|
|
371
|
+
let initiatorContactCardCipherInput;
|
|
372
|
+
let initiatorContactCardSharedCipherInput;
|
|
373
|
+
if (plainInitiatorRootKeyCipher.initiatorContactCard) {
|
|
374
|
+
const initiatorContactCard = plainInitiatorRootKeyCipher.initiatorContactCard;
|
|
375
|
+
const ownerKey = yield this.keyFactory.createKey();
|
|
376
|
+
const sharedCipherKey = yield KFS.asKey(plainInitiatorOneTimePbkCipher.responder.contactCard.sharedCipherKey);
|
|
377
|
+
const ownerWrappedKey = JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true)));
|
|
378
|
+
const ownerCipherData = initiatorContactCard.plainOwnerCipherDataJson
|
|
379
|
+
? JSON.stringify(yield this.encryptionService.encrypt(ownerKey, initiatorContactCard.plainOwnerCipherDataJson))
|
|
380
|
+
: '';
|
|
381
|
+
initiatorContactCardCipherInput = {
|
|
382
|
+
ownerWrappedKey,
|
|
383
|
+
ownerWrappingKeyId: rootKey.id,
|
|
384
|
+
ownerCipherData,
|
|
385
|
+
};
|
|
386
|
+
initiatorContactCardSharedCipherInput = {
|
|
387
|
+
sigPxkId: initiatorSigPrk.id,
|
|
388
|
+
};
|
|
389
|
+
const sharedCipherData = yield this.encryptionService.encrypt(sharedCipherKey, initiatorContactCard.plainSharedCipherDataJson);
|
|
390
|
+
initiatorContactCardSharedCipherInput.sharedCipherDataSig =
|
|
391
|
+
JSON.stringify(yield this.encryptionService.sign(initiatorSigPrk.jwk, sharedCipherData));
|
|
392
|
+
}
|
|
393
|
+
// TODO ideally we update the shared data in the contact card sent to the responder as well since that
|
|
394
|
+
// CC was created by the responder.
|
|
395
|
+
const res = yield this.lrApollo.mutate({
|
|
396
|
+
mutation: CompleteOtkMutation,
|
|
397
|
+
variables: {
|
|
398
|
+
input: {
|
|
399
|
+
keyExchangeId,
|
|
400
|
+
rootKeyId: rootKey.id,
|
|
401
|
+
masterKeyId: masterKey.id,
|
|
402
|
+
initiatorSigPxkId: initiatorSigPrk.id,
|
|
403
|
+
signedResponderPbk: JSON.stringify(signedResponderPbk),
|
|
404
|
+
signedResponderSigPbk: JSON.stringify(signedResponderSigPbk),
|
|
405
|
+
rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
|
|
406
|
+
mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
|
|
407
|
+
responderContactCardCipher: responderContactCardCipherInput,
|
|
408
|
+
initiatorContactCardCipher: initiatorContactCardCipherInput,
|
|
409
|
+
initiatorContactCardSharedCipher: initiatorContactCardSharedCipherInput,
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
return res.completeKeyExchangeOtk;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
currentUserSharedKey(input) {
|
|
417
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
418
|
+
const { currentUserSharedKey } = yield this.lrApollo.query({
|
|
419
|
+
query: CurrentUserSharedKeyQuery,
|
|
420
|
+
variables: {
|
|
421
|
+
username: input.username,
|
|
422
|
+
userId: input.userId,
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
return currentUserSharedKey.userSharedKey;
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
KeyExchangeService.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyExchangeService_Factory() { return new KeyExchangeService(i0.ɵɵinject(i1.KeyFactoryService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.EncryptionService), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.UserService)); }, token: KeyExchangeService, providedIn: "root" });
|
|
430
|
+
KeyExchangeService.decorators = [
|
|
431
|
+
{ type: Injectable, args: [{
|
|
432
|
+
providedIn: 'root',
|
|
433
|
+
},] }
|
|
434
|
+
];
|
|
435
|
+
KeyExchangeService.ctorParameters = () => [
|
|
436
|
+
{ type: KFS },
|
|
437
|
+
{ type: KeyService },
|
|
438
|
+
{ type: LrApolloService },
|
|
439
|
+
{ type: EncryptionService },
|
|
440
|
+
{ type: LifeReadyAuthService },
|
|
441
|
+
{ type: UserService }
|
|
442
|
+
];
|
|
443
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4Y2hhbmdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2tleS1leGNoYW5nZS9rZXktZXhjaGFuZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQywwR0FBMEc7QUFDMUcsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFFbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEdBQ2xCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEUsT0FBTyxFQUNMLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGtCQUFrQixHQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFRTCxRQUFRLEdBT1QsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7QUFDOUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBS3ZCLE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFDVSxVQUFlLEVBQ2YsVUFBc0IsRUFDdEIsUUFBeUIsRUFDekIsaUJBQW9DLEVB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bGFyL2NvcmUnO1xuLy8gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81OTczNTI4MC9hbmd1bGFyLTgtbW9tZW50LWVycm9yLWNhbm5vdC1jYWxsLWEtbmFtZXNwYWNlLW1vbWVudFxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IExyQXBvbGxvU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1hcG9sbG8uc2VydmljZSc7XG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRW5jcnlwdGlvblNlcnZpY2UsXG4gIEpvc2VTZXJpYWxpemF0aW9uLFxufSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUdyYXBoUmVzcG9uc2UgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTHJDb2RlTWlzbWF0Y2hFeGNlcHRpb24gfSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ29tcGxldGVPdGtNdXRhdGlvbixcbiAgQ3VycmVudFVzZXJTaGFyZWRLZXlRdWVyeSxcbiAgSW5pdGlhdGVPdGtNdXRhdGlvbixcbiAgS2V5RXhjaGFuZ2VRdWVyeSxcbiAgS2V5RXhjaGFuZ2VzUXVlcnksXG4gIEtleUV4Y2hhbmdlVG9rZW5RdWVyeSxcbiAgUmVzcG9uZE90a011dGF0aW9uLFxufSBmcm9tICcuL2tleS1leGNoYW5nZS5ncWwnO1xuaW1wb3J0IHtcbiAgQ29tcGxldGVPdGssXG4gIERlY3J5cHRlZEtleUV4Y2hhbmdlLFxuICBEZWNyeXB0ZWRPdGssXG4gIEdldEtleUV4Y2hhbmdlTGlzdE9wdGlvbnMsXG4gIEdldEtleUV4Y2hhbmdlT3B0aW9ucyxcbiAgSW5pdGlhdGVPdGtJbnB1dCxcbiAgS2V5RXhjaGFuZ2UsXG4gIE90a1N0YXRlLFxuICBQbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXG4gIFBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlcixcbiAgUGxhaW5PdEtleUNpcGhlcixcbiAgUmVzcG9uZE90ayxcbiAgUmVzcG9uZE90a0lucHV0LFxuICBVc2VyU2hhcmVkS2V5LFxufSBmcm9tICcuL2tleS1leGNoYW5nZS50eXBlcyc7XG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgS2V5RXhjaGFuZ2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBDTElFTlRfTk9OQ0VfTEVOR1RIID0gMzI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBrZXlGYWN0b3J5OiBLRlMsXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbHJBcG9sbG86IExyQXBvbGxvU2VydmljZSxcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBMaWZlUmVhZHlBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGdldEtleUV4Y2hhbmdlTGlzdChcbiAgICBpbnB1dDogR2V0S2V5RXhjaGFuZ2VMaXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBrZXlFeGNoYW5nZXMgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8e1xuICAgICAga2V5RXhjaGFuZ2VzOiBhbnk7XG4gICAgICBrZXlHcmFwaDogS2V5R3JhcGhSZXNwb25zZTtcbiAgICB9Pih7XG4gICAgICBxdWVyeTogS2V5RXhjaGFuZ2VzUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBrZXlFeGNoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlkIElmIHRoZSBjdXJyZW50IHVzZXIgY2FuIHJlc3BvbmRlciB0aGUga2V5IGV4Y2hhbmdlIGlmIHRoZXkgYXJlIGVpdGhlciB0aGUgaW5pdGlhdG9yIG9yIHRoZSByZWNlaXZlci5cbiAgICogQHBhcmFtIHRva2VuIElmIG5vdCBzaWduZWQgaW4sIG9yIG5vdCB0aGUgaW5pdGlhdG9yIG9yIHJlc3BvbmRlciwgJ3Rva2VuJyBtdXN0IGJlIGdpdmVuLlxuICAgKiBAcGFyYW0gb3RLZXlLIElzIHRoZSByYXcgb25lLXRpbWUga2V5IChzdHJpbmcpLiBJZiB0aGUgcmVzcG9uZGVyIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGF0IHRpbWUgb2YgaW5pdGlhdGlvbiwgdGhlblxuICAgKiAgIGl0J3MgcG9zc2libGUgdG8gaGF2ZSB0aGUgb3RLZXkgd3JhcHBlZCBieSB0aGUgcHVibGljIGtleSBvZiB0aGUgcmVzcG9uZGVyLiBJbiB3aGljaCBjYXNlLCB0aGUgb3RLZXlLIGlzIG5vdCBuZWVkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0S2V5RXhjaGFuZ2UoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB7IG90S2V5SywgdG9rZW4gfTogR2V0S2V5RXhjaGFuZ2VPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRLZXlFeGNoYW5nZT4ge1xuICAgIGNvbnN0IHsga2V5RXhjaGFuZ2UgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8e1xuICAgICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlO1xuICAgICAga2V5R3JhcGg6IEtleUdyYXBoUmVzcG9uc2U7XG4gICAgfT4oe1xuICAgICAgcXVlcnk6IHRva2VuID8gS2V5RXhjaGFuZ2VUb2tlblF1ZXJ5IDogS2V5RXhjaGFuZ2VRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpZCxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRlY3J5cHRLZXlFeGNoYW5nZShrZXlFeGNoYW5nZSwgb3RLZXlLKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVjcnlwdFJlc3BvbnNlQ2lwaGVyKFxuICAgIG90S2V5OiBKV0suS2V5LFxuICAgIG90UHJrOiBKV0suS2V5LFxuICAgIGNvbnRlbnQ6IGFueVxuICApOiBQcm9taXNlPFBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlcj4ge1xuICAgIC8vIFRoZSByZXNwb25zZSBjb3VsZCBiZSB3cmFwcGVkIGJ5IHRoZSBPdEsgYXMgd2VsbCBhcyB3ZSB0aGUgT3RQcmtcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChvdEtleSwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSAnbm8ga2V5IGZvdW5kJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIERvIG5vdGhpbmcgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyB3aGVyZSBtZXNzYWdlIGlzIG5vdCB3cmFwcGVkIHdpdGggb3RrLlxuICAgIH1cblxuICAgIC8vIFRoZSBQcmsgaXMgc2luZ2xlLXVzZSBhbmQgb25seSB1c2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzcG9uZGVyIGJhY2sgdG8gdGhlIGluaXRpYXRvci5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KG90UHJrLCBjb250ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWNyeXB0S2V5RXhjaGFuZ2UoXG4gICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlLFxuICAgIG90S2V5Sz86IHN0cmluZ1xuICApOiBQcm9taXNlPERlY3J5cHRlZEtleUV4Y2hhbmdlPiB7XG4gICAgaWYgKGtleUV4Y2hhbmdlLmlzSW5pdGlhdG9yKSB7XG4gICAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XG4gICAgICAvLyBEZWNyeXB0IHVzaW5nIHRoZSByb290IGtleSB0byBnZXQgdGhlIFBya1xuICAgICAgY29uc3QgcGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyID0gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgICAgcm9vdEtleS5qd2ssXG4gICAgICAgIGtleUV4Y2hhbmdlLmluaXRpYXRvclJvb3RLZXlDaXBoZXJcbiAgICAgICkpIGFzIHVua25vd24gYXMgUGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyO1xuXG4gICAgICBjb25zdCBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBrZXlFeGNoYW5nZS5vdGtcbiAgICAgICAgLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXJcbiAgICAgICAgPyBhd2FpdCB0aGlzLmRlY3J5cHRSZXNwb25zZUNpcGhlcihcbiAgICAgICAgICAgIGF3YWl0IEtGUy5hc0tleShwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIub3RLZXkpLFxuICAgICAgICAgICAgYXdhaXQgS0ZTLmFzS2V5KHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5vbmVUaW1lUHJrKSxcbiAgICAgICAgICAgIGtleUV4Y2hhbmdlLm90ay5pbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyXG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHJlc3BvbmRlciA9XG4gICAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlciAmJlxuICAgICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyO1xuICAgICAgY29uc3QgaW5pdGlhdG9yID1cbiAgICAgICAgcGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyICYmIHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5pbml0aWF0b3I7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmtleUV4Y2hhbmdlLFxuICAgICAgICBtZXNzYWdlOiByZXNwb25kZXIgPyByZXNwb25kZXIubWVzc2FnZSA6IG51bGwsXG4gICAgICAgIGNvbnRhY3RDYXJkOlxuICAgICAgICAgIHJlc3BvbmRlciAmJiByZXNwb25kZXIuY29udGFjdENhcmRcbiAgICAgICAgICAgID8gcmVzcG9uZGVyLmNvbnRhY3RDYXJkLnBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb25cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgbXlDb250YWN0Q2FyZDpcbiAgICAgICAgICBpbml0aWF0b3IgJiYgaW5pdGlhdG9yLmNvbnRhY3RDYXJkXG4gICAgICAgICAgICA/IGluaXRpYXRvci5jb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIG15TWVzc2FnZTogaW5pdGlhdG9yICYmIGluaXRpYXRvci5tZXNzYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVjcnlwdGVkT3RrID0gYXdhaXQgdGhpcy5kZWNyeXB0T3RrKGtleUV4Y2hhbmdlLCBvdEtleUspO1xuXG4gICAgICBjb25zdCBpbml0aWF0b3IgPSBkZWNyeXB0ZWRPdGsgJiYgZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIuaW5pdGlhdG9yO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5rZXlFeGNoYW5nZSxcbiAgICAgICAgZGVjcnlwdGVkT3RrLFxuICAgICAgICBtZXNzYWdlOiBpbml0aWF0b3IgJiYgaW5pdGlhdG9yLm1lc3NhZ2UsXG4gICAgICAgIGNvbnRhY3RDYXJkOlxuICAgICAgICAgIGluaXRpYXRvciAmJlxuICAgICAgICAgIGluaXRpYXRvci5jb250YWN0Q2FyZCAmJlxuICAgICAgICAgIGluaXRpYXRvci5jb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlY3J5cHRPdGsoXG4gICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlLFxuICAgIG90S2V5Sz86IHN0cmluZ1xuICApOiBQcm9taXNlPERlY3J5cHRlZE90az4ge1xuICAgIGNvbnN0IG90S2V5ID0gYXdhaXQgdGhpcy5nZXRPdEtleShrZXlFeGNoYW5nZSwgb3RLZXlLKTtcblxuICAgIHJldHVybiBvdEtleSAmJiBrZXlFeGNoYW5nZS5vdGsub3RLZXlDaXBoZXJcbiAgICAgID8ge1xuICAgICAgICAgIHBsYWluT3RLZXlDaXBoZXI6IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgICAgICAgIG90S2V5LFxuICAgICAgICAgICAga2V5RXhjaGFuZ2Uub3RrLm90S2V5Q2lwaGVyXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvdEtleSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPdEtleShcbiAgICBrZXlFeGNoYW5nZTogS2V5RXhjaGFuZ2UsXG4gICAgb3RLZXlLPzogc3RyaW5nXG4gICk6IFByb21pc2U8SldLLktleT4ge1xuICAgIGlmIChvdEtleUspIHtcbiAgICAgIHJldHVybiBhd2FpdCBLRlMuYXNLZXkoe1xuICAgICAgICAuLi5KU09OLnBhcnNlKGtleUV4Y2hhbmdlLm90ay5vdEtleVBhcmFtcyksXG4gICAgICAgIGs6IG90S2V5SyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBrZXlFeGNoYW5nZS5vdGsuc3RhdGUgPT09IE90a1N0YXRlLk9US19JTklUSUFURUQgJiZcbiAgICAgICFrZXlFeGNoYW5nZS5pc0luaXRpYXRvciAmJlxuICAgICAga2V5RXhjaGFuZ2Uub3RrLnJlc3BvbmRlclBia0NpcGhlclxuICAgICkge1xuICAgICAgLy8gQXNzdW1pbmcgZXhpc3RpbmcgdXNlciBnZXR0aW5nIGludml0ZWQgd2hlcmUgT1RLIGlzIHdyYXBwZWQgaW4gcmVzcG9uZGVyJ3MgcHVibGljIGtleS5cbiAgICAgIGNvbnN0IHByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50UHhrKCk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRDaXBoZXI6IGFueSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgICAgcHJrLmp3ayxcbiAgICAgICAgSlNPTi5wYXJzZShrZXlFeGNoYW5nZS5vdGsucmVzcG9uZGVyUGJrQ2lwaGVyKSxcbiAgICAgICAge1xuICAgICAgICAgIHNlcmlhbGl6YXRpb25zOiBbSm9zZVNlcmlhbGl6YXRpb24uQ09NUEFDVF0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoZGVjcnlwdGVkQ2lwaGVyLm90S2V5KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBLRlMuYXNLZXkoZGVjcnlwdGVkQ2lwaGVyLm90S2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBpbml0aWF0ZU90ayh7XG4gICAgbWVzc2FnZSxcbiAgICBlbWFpbCxcbiAgICBjb250YWN0Q2FyZCxcbiAgICB1cGdyYWRlLFxuICB9OiBJbml0aWF0ZU90a0lucHV0KTogUHJvbWlzZTx7IGtleUV4Y2hhbmdlOiBLZXlFeGNoYW5nZTsgb3RLZXlLOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IG90S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgIGNvbnN0IG5vbmNlID0gdGhpcy5rZXlGYWN0b3J5LnJhbmRvbVN0cmluZyh0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEgpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKTtcblxuICAgIC8vIE5ldyBQS0Mga2V5IGZvciBlbmNyeXB0aW9uLiBUaGlzIGtleSBpcyB1c2VkIG9ubHkgb25jZSB3aGVuIHRoZSByZXNwb25kZXIgc2VuZHNcbiAgICAvLyBiYWNrIHRoZWlyIHNpZ25pbmcgcHVibGljIGtleS5cbiAgICBjb25zdCBpbml0aWF0b3JPbmVUaW1lUHJrID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZVBrY0tleSgpO1xuXG4gICAgLy8gT3B0aW9uIDE6IE5ldyBQS0Mga2V5IGZvciBzaWduaW5nXG4gICAgLy8gY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmNyZWF0ZVBrY1NpZ25LZXkoKTtcblxuICAgIC8vIE9wdGlvbiAyOiBVc2UgdGhlIHVzZXIncyBnbG9iYWwgc2lnbmluZyBrZXkuXG4gICAgLy8gVGhpcyBrZXkgaXMgdXNlZCB0byBwcm92ZSB0aGUgaW5pdGlhdG9yJ3MgaWRlbnRpdHkuXG4gICAgY29uc3QgaW5pdGlhdG9yUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRQeGsoKTtcbiAgICBjb25zdCBpbml0aWF0b3JTaWdQcmsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFNpZ1B4aygpO1xuXG4gICAgbGV0IGluaXRpYXRvclBsYWluRGF0YVNpZzogc3RyaW5nID0gbnVsbDtcblxuICAgIGlmIChjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5vd25lclBsYWluRGF0YSkge1xuICAgICAgaW5pdGlhdG9yUGxhaW5EYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgICAgICBpbml0aWF0b3JTaWdQcmsuandrLFxuICAgICAgICAgIGNvbnRhY3RDYXJkLm93bmVyUGxhaW5EYXRhXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhdG9yID0ge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGNvbnRhY3RDYXJkOiBjb250YWN0Q2FyZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IGNvbnRhY3RDYXJkLnBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb24sXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgfTtcblxuICAgIC8vIENvbnRlbnQgdG8gYmUgZW5jcnlwdGVkIHVzaW5nIHRoZSBPVEsuXG4gICAgY29uc3QgcGxhaW5PdEtleUNpcGhlcjogUGxhaW5PdEtleUNpcGhlciA9IHtcbiAgICAgIG5vbmNlLFxuICAgICAgaW5pdGlhdG9yOiB7XG4gICAgICAgIC4uLmluaXRpYXRvcixcbiAgICAgICAgb25lVGltZVBiazogaW5pdGlhdG9yT25lVGltZVByay50b0pTT04oKSwgLy8gb25ldGltZSBwdWJsaWMgZW5jcnlwdGlvbiBrZXkgcmVzcG9uZGVyIHVzZSB0byBzZW5kIGRhdGEgYmFjayB0byBpbml0aWF0b3JcbiAgICAgICAgcGJrOiBpbml0aWF0b3JQcmsuandrLnRvSlNPTigpLCAvLyBwdWJsaWMgZW5jcnlwdGlvbiBrZXlcbiAgICAgICAgc2lnUGJrOiBpbml0aWF0b3JTaWdQcmsuandrLnRvSlNPTigpLCAvLyBwdWJsaWMgc2lnbmluZyBrZXlcbiAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3RLZXlDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBvdEtleSxcbiAgICAgIHBsYWluT3RLZXlDaXBoZXJcbiAgICApO1xuXG4gICAgLy8gQ29udGVudCB0byBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIGluaXRpYXRvcidzIHJvb3Qga2V5LlxuICAgIGNvbnN0IHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlcjogUGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyID0ge1xuICAgICAgbm9uY2UsXG4gICAgICBvbmVUaW1lUHJrOiBpbml0aWF0b3JPbmVUaW1lUHJrLnRvSlNPTih0cnVlKSxcbiAgICAgIC8vIFNob3VsZCBub3QgbmVlZCB0byBrZWVwIHRoaXMgZW5jcnlwdGVkIHNpbmNlIHdlIGFyZSB1c2luZyB0aGUgZ2xvYmFsIHNpZ25pbmcga2V5LlxuICAgICAgLy8gc2lnUHJrOiBpbml0aWF0b3JTaWdQcmsudG9KU09OKHRydWUpLFxuXG4gICAgICAvLyBTYXZlIGl0IGluIGNhc2UgdGhlIGluaXRpYXRvciB3YW50IHRvIGRlY29kZSB0aGUgb3RLZXlDaXBoZXIuXG4gICAgICAvLyBTaW5jZSB0aGUgb3RLZXkgaXMgb25seSB1c2VkIG9uY2UsIGFuZCB0aGF0IG90S2V5Q2lwaGVyIGNvbnRhaW5zIG9ubHlcbiAgICAgIC8vIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBpbml0aWF0b3IsIGl0J3Mgc2FmZSBqdXN0IGxlYXZlIHRoZSBvdEtleSBzdG9yZWQgaGVyZS5cbiAgICAgIG90S2V5OiBvdEtleS50b0pTT04odHJ1ZSksXG4gICAgICAvLyBUaGVzZSBzaG91bGQgYmUgc3RvcmluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIGhvdyB0aGUgZmllbGRzIG9mIHRoZSBzaGFyZWQgY29udGFjdCBjYXJkIGlzXG4gICAgICAvLyBkZXJpdmVkIGZyb20gdGhlIG1hc3RlciBjb250YWN0IGNhcmQuXG4gICAgICBpbml0aWF0b3JDb250YWN0Q2FyZDogY29udGFjdENhcmQsXG4gICAgICBpbml0aWF0b3IsXG4gICAgfTtcblxuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcbiAgICBjb25zdCBpbml0aWF0b3JSb290S2V5Q2lwaGVyID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcm9vdEtleS5qd2ssXG4gICAgICBwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXJcbiAgICApO1xuXG4gICAgLy8gVGhlIHJhdyBPVEtcbiAgICBjb25zdCBvdEtleUs6IHN0cmluZyA9IChvdEtleS50b0pTT04odHJ1ZSkgYXMgYW55KS5rO1xuXG4gICAgLy8gQVBJIGNhbGxcbiAgICBjb25zdCB7IGluaXRpYXRlS2V5RXhjaGFuZ2VPdGsgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPGFueT4oe1xuICAgICAgbXV0YXRpb246IEluaXRpYXRlT3RrTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgc2VydmVyXG4gICAgICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlcjogSlNPTi5zdHJpbmdpZnkoaW5pdGlhdG9yUm9vdEtleUNpcGhlciksXG4gICAgICAgICAgaW5pdGlhdG9yUHhrSWQ6IGluaXRpYXRvclByay5pZCxcbiAgICAgICAgICBpbml0aWF0b3JTaWdQeGtJZDogaW5pdGlhdG9yU2lnUHJrLmlkLFxuICAgICAgICAgIC8vIFRoZXNlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVzcG9uZGVyXG4gICAgICAgICAgb3RLZXlQYXJhbXM6IEpTT04uc3RyaW5naWZ5KG90S2V5LnRvSlNPTigpKSxcbiAgICAgICAgICBvdEtleUNpcGhlcjogSlNPTi5zdHJpbmdpZnkob3RLZXlDaXBoZXIpLFxuICAgICAgICAgIHNlbmRFbWFpbDogZW1haWxcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgIHJhd090S2V5OiBvdEtleUssXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjcmVhdGVUcDogdHJ1ZSxcbiAgICAgICAgICBpbml0aWF0b3JQbGFpbkRhdGFTaWcsXG4gICAgICAgICAgdXBncmFkZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsga2V5RXhjaGFuZ2U6IGluaXRpYXRlS2V5RXhjaGFuZ2VPdGsua2V5RXhjaGFuZ2UsIG90S2V5SyB9O1xuICB9XG5cbiAgYXN5bmMgcmVzcG9uZE90ayh7XG4gICAgaWQsXG4gICAgdG9rZW4sXG4gICAgZGVjcnlwdGVkT3RrLFxuICAgIG1lc3NhZ2UsXG4gICAgaW5pdGlhdG9yQ29udGFjdENhcmQsXG4gICAgcmVzcG9uZGVyQ29udGFjdENhcmQ6IHNlbnRDb250YWN0Q2FyZCxcbiAgfTogUmVzcG9uZE90a0lucHV0KTogUHJvbWlzZTxSZXNwb25kT3RrPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlcigpO1xuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcblxuICAgIGNvbnN0IG1hc3RlcktleUlkID0gdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRNYXN0ZXJLZXkoKS5pZDtcbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudE1hc3RlcktleSgpO1xuXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgIGNvbnN0IG1rU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgY29uc3QgcmtXcmFwcGVkU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcm9vdEtleS5qd2ssXG4gICAgICBzaGFyZWRLZXkudG9KU09OKHRydWUpXG4gICAgKTtcbiAgICBjb25zdCBta1dyYXBwZWRNa1NoYXJlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG1hc3RlcktleS5qd2ssXG4gICAgICBta1NoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgY29uc3QgaW5pdGlhdG9yT25lVGltZVBiayA9IGF3YWl0IEtGUy5hc0tleShcbiAgICAgIGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLmluaXRpYXRvci5vbmVUaW1lUGJrXG4gICAgKTtcblxuICAgIGNvbnN0IGluaXRpYXRvclBiayA9IGF3YWl0IEtGUy5hc0tleShcbiAgICAgIGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLmluaXRpYXRvci5wYmtcbiAgICApO1xuICAgIGNvbnN0IGluaXRpYXRvclNpZ1BiayA9IGF3YWl0IEtGUy5hc0tleShcbiAgICAgIGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLmluaXRpYXRvci5zaWdQYmtcbiAgICApO1xuXG4gICAgLy8gT3B0aW9uIDE6IFVzaW5nIG5ldyBQcmsgZm9yIGVhY2ggVFAgcGFpclxuICAgIC8vIENyZWF0ZSBhIG5ldyBwdWJsaWMgc2lnbmluZyBrZXkgZm9yIHRoZSByZXNwb25kZXIuXG4gICAgLy8gY29uc3QgcmVzcG9uZGVyU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmNyZWF0ZVBrY1NpZ25LZXkoKVxuICAgIC8vIGNvbnN0IHJrV3JhcHBlZFJlc3BvbmRlclNpZ1ByayA9IGF3YWl0IHRoaXMuZW5jcnlwdChyb290S2V5LCByZXNwb25kZXJTaWdQcmsudG9KU09OKHRydWUpKTtcblxuICAgIC8vIE9wdGlvbiAyOiBSZXNwb25kZXIgYWxyZWFkeSBoYXMgYSBzaWduaW5nIFBya1xuICAgIGNvbnN0IHJlc3BvbmRlclByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50UHhrKCk7XG4gICAgY29uc3QgcmVzcG9uZGVyU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRTaWdQeGsoKTtcblxuICAgIGNvbnN0IHNpZ25lZEluaXRpYXRvclBiayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgIHJlc3BvbmRlclNpZ1Byay5qd2ssXG4gICAgICBpbml0aWF0b3JQYmsudG9KU09OKClcbiAgICApO1xuICAgIGNvbnN0IHNpZ25lZEluaXRpYXRvclNpZ1BiayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgIHJlc3BvbmRlclNpZ1Byay5qd2ssXG4gICAgICBpbml0aWF0b3JTaWdQYmsudG9KU09OKClcbiAgICApO1xuXG4gICAgY29uc3QgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyOiBQbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSB7XG4gICAgICBub25jZTogZGVjcnlwdGVkT3RrLnBsYWluT3RLZXlDaXBoZXIubm9uY2UsXG4gICAgICBzaGFyZWRLZXk6IHNoYXJlZEtleS50b0pTT04odHJ1ZSksXG4gICAgICBta1NoYXJlZEtleTogbWtTaGFyZWRLZXkudG9KU09OKHRydWUpLFxuICAgICAgcmVzcG9uZGVyOiB7XG4gICAgICAgIHBiazogcmVzcG9uZGVyUHJrLmp3ay50b0pTT04oKSwgLy8gcHVibGljIGtleVxuICAgICAgICBzaWdQYms6IHJlc3BvbmRlclNpZ1Byay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBrZXlcbiAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lLFxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbGV0IHJlY2VpdmVkQ2FyZElucHV0O1xuICAgIGlmIChkZWNyeXB0ZWRPdGsucGxhaW5PdEtleUNpcGhlci5pbml0aWF0b3IuY29udGFjdENhcmQpIHtcbiAgICAgIC8vIFNldCB0aGUgaW5mbyBhYm91dCB0aGUgaW5pdGlhdG9yIHRvIGJlIHRoZSBvbmVzIHNlbnQgYnkgdGhlIGluaXRpYXRvci4gV2UgbmVlZCB0aCByZXNwb25kZXIgdG8gZG8gdGhlIGVuY3J5cHRpb24gaGVyZVxuICAgICAgLy8gYmVjYXVzZSB0aGUgaW5pdGlhdG9yIGRvZXMgbm90IGhhdmUgdGhlIHNoYXJlZCBrZXkgeWV0LCBhbmQgd2Ugd2FudCB0aGUgcmVzcG9uZGVyIHRvIGhhdmUgYSBmdW5jdGlvbmFsIGNvbnRhY3QgY2FyZCBhZnRlclxuICAgICAgLy8gdGhpcyBleGNoYW5nZS4gVGhlIGluaXRpYXRvciBjYW4gZG91YmxlIGNoZWNrIHRoZSBjb250YWN0IGRldGFpbHMgYXJlIGNvcnJlY3QgYW5kIHNpZ24gaXQgd2hlbiBpdCBjb21wbGV0ZXMgdGhlIGV4Y2hhbmdlLlxuICAgICAgY29uc3QgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbiA9XG4gICAgICAgIGRlY3J5cHRlZE90ay5wbGFpbk90S2V5Q2lwaGVyLmluaXRpYXRvci5jb250YWN0Q2FyZFxuICAgICAgICAgIC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uO1xuXG4gICAgICAvLyBDcmVhdGUga2V5c1xuICAgICAgY29uc3QgcmVjZWl2ZXJLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgICBjb25zdCBjY1NoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICAgIGNvbnN0IHNpZ1B4ayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50U2lnUHhrKCk7XG5cbiAgICAgIHJlY2VpdmVkQ2FyZElucHV0ID0ge1xuICAgICAgICByZWNlaXZlcldyYXBwZWRLZXk6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgIHJvb3RLZXkuandrLFxuICAgICAgICAgICAgcmVjZWl2ZXJLZXkudG9KU09OKHRydWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICByZWNlaXZlcldyYXBwaW5nS2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIHJlY2VpdmVyQ2lwaGVyRGF0YTogaW5pdGlhdG9yQ29udGFjdENhcmRcbiAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICAgICAgICAgICAgcmVjZWl2ZXJLZXksXG4gICAgICAgICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQucGxhaW5SZWNlaXZlckNpcGhlckRhdGFKc29uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBzaGFyZWRXcmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICAgICAgICBzaGFyZWRLZXksXG4gICAgICAgICAgICBjY1NoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICBjY1NoYXJlZEtleSxcbiAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvblxuICAgICAgKTtcbiAgICAgIHJlY2VpdmVkQ2FyZElucHV0LnNoYXJlZENpcGhlckRhdGFTaWcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHNpZ1B4ay5qd2ssIHNoYXJlZENpcGhlckRhdGEpXG4gICAgICApO1xuICAgICAgcmVjZWl2ZWRDYXJkSW5wdXQuc2lnUHhrSWQgPSBzaWdQeGsuaWQ7XG5cbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQgPSB7XG4gICAgICAgIC4uLnBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQsXG4gICAgICAgIHNoYXJlZENpcGhlcktleTogY2NTaGFyZWRLZXkudG9KU09OKHRydWUpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgc2VudENhcmRJbnB1dDtcbiAgICBpZiAoc2VudENvbnRhY3RDYXJkKSB7XG4gICAgICAvLyBDcmVhdGUga2V5c1xuICAgICAgY29uc3Qgb3duZXJLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG4gICAgICBjb25zdCBjY1NoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICAgIGNvbnN0IHNpZ1B4ayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50U2lnUHhrKCk7XG5cbiAgICAgIHNlbnRDYXJkSW5wdXQgPSB7XG4gICAgICAgIG93bmVyV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgcm9vdEtleS5qd2ssXG4gICAgICAgICAgICBvd25lcktleS50b0pTT04odHJ1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG93bmVyV3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcbiAgICAgICAgb3duZXJDaXBoZXJEYXRhOiBzZW50Q29udGFjdENhcmQucGxhaW5Pd25lckNpcGhlckRhdGFKc29uXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgICAgIG93bmVyS2V5LFxuICAgICAgICAgICAgICAgIHNlbnRDb250YWN0Q2FyZC5wbGFpbk93bmVyQ2lwaGVyRGF0YUpzb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG5cbiAgICAgICAgc2hhcmVkV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICAgICAgY2NTaGFyZWRLZXkudG9KU09OKHRydWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2hhcmVkQ2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgY2NTaGFyZWRLZXksXG4gICAgICAgIHNlbnRDb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uXG4gICAgICApO1xuICAgICAgc2VudENhcmRJbnB1dC5zaGFyZWRDaXBoZXJEYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihzaWdQeGsuandrLCBzaGFyZWRDaXBoZXJEYXRhKVxuICAgICAgKTtcbiAgICAgIHNlbnRDYXJkSW5wdXQuc2lnUHhrSWQgPSBzaWdQeGsuaWQ7XG5cbiAgICAgIGlmIChzZW50Q29udGFjdENhcmQub3duZXJQbGFpbkRhdGEpIHtcbiAgICAgICAgc2VudENhcmRJbnB1dC5vd25lclBsYWluRGF0YVNpZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgICAgICAgIHJlc3BvbmRlclNpZ1Byay5qd2ssXG4gICAgICAgICAgICBzZW50Q29udGFjdENhcmQub3duZXJQbGFpbkRhdGFcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRhY3QgY2FyZCBpbmZvIHJlYWRhYmxlIGJ5IHRoZSBpbml0aWF0b3JcbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQgPSB7XG4gICAgICAgIC4uLnBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlci5yZXNwb25kZXIuY29udGFjdENhcmQsXG4gICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IHNlbnRDb250YWN0Q2FyZC5wbGFpblNoYXJlZENpcGhlckRhdGFKc29uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFbmNyeXB0IHdpdGggb25lLXRpbWUgcHVibGljIGtleVxuICAgIGxldCBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgaW5pdGlhdG9yT25lVGltZVBiayxcbiAgICAgIHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxuICAgICk7XG5cbiAgICAvLyBFbmNyeXB0IHdpdGggdGhlIG90ayBhZ2FpbiB0byBrZWVwIHVzZSBvZiBhc3ltbWV0cmljIGtleXMgdG8gYSBtaW5pbXVtLlxuICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBkZWNyeXB0ZWRPdGsub3RLZXksXG4gICAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyXG4gICAgKTtcblxuICAgIGNvbnN0IHsgcmVzcG9uZEtleUV4Y2hhbmdlT3RrIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZTxhbnk+KHtcbiAgICAgIG11dGF0aW9uOiBSZXNwb25kT3RrTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBrZXlFeGNoYW5nZUlkOiBpZCxcbiAgICAgICAgICBrZXlFeGNoYW5nZVRva2VuOiB0b2tlbixcbiAgICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgICAgbWFzdGVyS2V5SWQsXG4gICAgICAgICAgLy8gVGhlc2Ugd2lsbCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlclxuICAgICAgICAgIHJlc3BvbmRlclB4a0lkOiByZXNwb25kZXJQcmsuaWQsXG4gICAgICAgICAgcmVzcG9uZGVyU2lnUHhrSWQ6IHJlc3BvbmRlclNpZ1Byay5pZCxcbiAgICAgICAgICBzaWduZWRJbml0aWF0b3JQYms6IEpTT04uc3RyaW5naWZ5KHNpZ25lZEluaXRpYXRvclBiayksXG4gICAgICAgICAgc2lnbmVkSW5pdGlhdG9yU2lnUGJrOiBKU09OLnN0cmluZ2lmeShzaWduZWRJbml0aWF0b3JTaWdQYmspLFxuICAgICAgICAgIC8vIHJrV3JhcHBlZEluaXRpYXRvclNpZ1BiazogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkSW5pdGlhdG9yU2lnUGJrKSxcblxuICAgICAgICAgIC8vIE9wdGlvbiAxOiBVc2luZyBuZXcgUHJrIGZvciBlYWNoIFRQIHBhaXJcbiAgICAgICAgICAvLyBya1dyYXBwZWRSZXNwb25kZXJTaWdQcms6IEpTT04uc3RyaW5naWZ5KHJrV3JhcHBlZFJlc3BvbmRlclNpZ1ByayksXG4gICAgICAgICAgcmtXcmFwcGVkU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShya1dyYXBwZWRTaGFyZWRLZXkpLFxuICAgICAgICAgIG1rV3JhcHBlZE1rU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShta1dyYXBwZWRNa1NoYXJlZEtleSksXG4gICAgICAgICAgLy8gVGhlc2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBpbml0aWF0b3JcbiAgICAgICAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyOiBKU09OLnN0cmluZ2lmeShpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyKSxcbiAgICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZDogcmVjZWl2ZWRDYXJkSW5wdXQsXG4gICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQ6IHNlbnRDYXJkSW5wdXQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleUV4Y2hhbmdlOiByZXNwb25kS2V5RXhjaGFuZ2VPdGsua2V5RXhjaGFuZ2UsXG4gICAgICB1c2VyU2hhcmVkS2V5OiByZXNwb25kS2V5RXhjaGFuZ2VPdGsudXNlclNoYXJlZEtleSxcbiAgICAgIHRwOiByZXNwb25kS2V5RXhjaGFuZ2VPdGsudHAsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlT3RrKFxuICAgIGtleUV4Y2hhbmdlSWQ6IHN0cmluZyxcbiAgICBpbml0aWF0b3JSb290S2V5Q2lwaGVyOiBzdHJpbmcsXG4gICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcjogc3RyaW5nLFxuICAgIHJlc3BvbmRlckNvbnRhY3RDYXJkPzogc3RyaW5nXG4gICk6IFByb21pc2U8Q29tcGxldGVPdGs+IHtcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRNYXN0ZXJLZXkoKTtcblxuICAgIC8vIERlY3J5cHQgdXNpbmcgdGhlIHJvb3Qga2V5IHRvIGdldCB0aGUgUHJrXG4gICAgY29uc3QgcGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyID0gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgICAgIHJvb3RLZXkuandrLFxuICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlclxuICAgICkpIGFzIHVua25vd24gYXMgUGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyO1xuXG4gICAgLy8gVGhlIFByayBpcyBzaW5nbGUtdXNlIGFuZCBvbmx5IHVzZWQgdG8gc2VuZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXNwb25kZXIgYmFjayB0byB0aGUgaW5pdGlhdG9yLlxuICAgIGNvbnN0IHBsYWluSW5pdGlhdG9yT25lVGltZVBia0NpcGhlciA9IGF3YWl0IHRoaXMuZGVjcnlwdFJlc3BvbnNlQ2lwaGVyKFxuICAgICAgYXdhaXQgS0ZTLmFzS2V5KHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5vdEtleSksXG4gICAgICBhd2FpdCBLRlMuYXNLZXkocGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLm9uZVRpbWVQcmspLFxuICAgICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxuICAgICk7XG5cbiAgICAvLyBDaGVjayB0aGUgbm9uY2UgbWF0Y2ggdG8gZW5zdXJlIHRoZSByZXNwb25kZXIgd2FzIHRoZSBvbmUgaG9sZGluZyB0aGUgT1RLXG4gICAgaWYgKFxuICAgICAgcGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLm5vbmNlICE9PSBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIubm9uY2VcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBMckNvZGVNaXNtYXRjaEV4Y2VwdGlvbihcbiAgICAgICAgJ1RoZSBub25jZSByZXR1cm5lZCBieSByZXNwb25kZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgb25lIGNyZWF0ZWQgYnkgdGhlIGluaXRpYXRvci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbiAxOiBBc3N1bWluZyB0aGUgc2lnbmluZyBrZXkgaXMgdW5pcXVlIGJldHdlZW4gdXNlcnMuXG4gICAgLy8gY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gYXdhaXQgS0ZTLmFzS2V5KGtlLnBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5zaWdQcmspO1xuICAgIC8vIGNvbnN0IHJrV3JhcHBlZEluaXRpYXRvclNpZ1ByayA9IGF3YWl0IHRoaXMuZW5jcnlwdChyb290S2V5LCBpbml0aWF0b3JTaWdQcmsudG9KU09OKHRydWUpKTtcblxuICAgIC8vIE9wdGlvbiAyOiBVc2UgdGhlIHVzZXIncyBnbG9iYWwgc2lnbmluZyBrZXkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBpbml0aWF0b3JTaWdQcmsgaXMgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGtleSBncmFwaC5cbiAgICAvLyBTbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS5cblxuICAgIC8vIFByb3RlY3RlZCB0aGUgc2lnbmluZyBwdWJsaWMga2V5IG9mIHRoZSByZXNwb25kZXIuXG4gICAgY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRTaWdQeGsoKTtcbiAgICBjb25zdCByZXNwb25kZXJTaWdQYmsgPSBhd2FpdCBLRlMuYXNLZXkoXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyLnNpZ1Bia1xuICAgICk7XG4gICAgY29uc3QgcmVzcG9uZGVyUGJrID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlci5wYmtcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnbmVkUmVzcG9uZGVyUGJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKFxuICAgICAgaW5pdGlhdG9yU2lnUHJrLmp3ayxcbiAgICAgIHJlc3BvbmRlclBiay50b0pTT04oKVxuICAgICk7XG4gICAgY29uc3Qgc2lnbmVkUmVzcG9uZGVyU2lnUGJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKFxuICAgICAgaW5pdGlhdG9yU2lnUHJrLmp3ayxcbiAgICAgIHJlc3BvbmRlclNpZ1Biay50b0pTT04oKVxuICAgICk7XG5cbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCBLRlMuYXNLZXkocGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnNoYXJlZEtleSk7XG4gICAgY29uc3QgcmtXcmFwcGVkU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcm9vdEtleS5qd2ssXG4gICAgICBzaGFyZWRLZXkudG9KU09OKHRydWUpXG4gICAgKTtcblxuICAgIGNvbnN0IG1rU2hhcmVkS2V5ID0gYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLm1rU2hhcmVkS2V5XG4gICAgKTtcbiAgICBjb25zdCBta1dyYXBwZWRNa1NoYXJlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG1hc3RlcktleS5qd2ssXG4gICAgICBta1NoYXJlZEtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgbGV0IHJlc3BvbmRlckNvbnRhY3RDYXJkQ2lwaGVySW5wdXQ7XG4gICAgaWYgKHJlc3BvbmRlckNvbnRhY3RDYXJkKSB7XG4gICAgICAvLyBDcmVhdGUga2V5XG4gICAgICBjb25zdCByZWNlaXZlcktleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcblxuICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmRDaXBoZXJJbnB1dCA9IHtcbiAgICAgICAgcmVjZWl2ZXJXcmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICAgICAgICByb290S2V5Lmp3ayxcbiAgICAgICAgICAgIHJlY2VpdmVyS2V5LnRvSlNPTih0cnVlKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgcmVjZWl2ZXJXcmFwcGluZ0tleUlkOiByb290S2V5LmlkLFxuICAgICAgICByZWNlaXZlckNpcGhlckRhdGE6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgIHJlY2VpdmVyS2V5LFxuICAgICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmRcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGF0YSBuZWVkZWQgZnJvbSB0aGUgaW5pdGlhdG9yJ3MgY2lwaGVyIGRhdGEuXG4gICAgbGV0IGluaXRpYXRvckNvbnRhY3RDYXJkQ2lwaGVySW5wdXQ7XG4gICAgbGV0IGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVySW5wdXQ7XG4gICAgaWYgKHBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlci5pbml0aWF0b3JDb250YWN0Q2FyZCkge1xuICAgICAgY29uc3QgaW5pdGlhdG9yQ29udGFjdENhcmQgPVxuICAgICAgICBwbGFpbkluaXRpYXRvclJvb3RLZXlDaXBoZXIuaW5pdGlhdG9yQ29udGFjdENhcmQ7XG4gICAgICBjb25zdCBvd25lcktleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlcktleSA9IGF3YWl0IEtGUy5hc0tleShcbiAgICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlci5jb250YWN0Q2FyZC5zaGFyZWRDaXBoZXJLZXlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG93bmVyV3JhcHBlZEtleSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQocm9vdEtleS5qd2ssIG93bmVyS2V5LnRvSlNPTih0cnVlKSlcbiAgICAgICk7XG4gICAgICBjb25zdCBvd25lckNpcGhlckRhdGEgPSBpbml0aWF0b3JDb250YWN0Q2FyZC5wbGFpbk93bmVyQ2lwaGVyRGF0YUpzb25cbiAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgICAgb3duZXJLZXksXG4gICAgICAgICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkLnBsYWluT3duZXJDaXBoZXJEYXRhSnNvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgOiAnJztcblxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRDaXBoZXJJbnB1dCA9IHtcbiAgICAgICAgb3duZXJXcmFwcGVkS2V5LFxuICAgICAgICBvd25lcldyYXBwaW5nS2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIG93bmVyQ2lwaGVyRGF0YSxcbiAgICAgIH07XG5cbiAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVySW5wdXQgPSB7XG4gICAgICAgIHNpZ1B4a0lkOiBpbml0aWF0b3JTaWdQcmsuaWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgICBzaGFyZWRDaXBoZXJLZXksXG4gICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkLnBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb25cbiAgICAgICk7XG4gICAgICBpbml0aWF0b3JDb250YWN0Q2FyZFNoYXJlZENpcGhlcklucHV0LnNoYXJlZENpcGhlckRhdGFTaWcgPVxuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXG4gICAgICAgICAgICBpbml0aWF0b3JTaWdQcmsuandrLFxuICAgICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGlkZWFsbHkgd2UgdXBkYXRlIHRoZSBzaGFyZWQgZGF0YSBpbiB0aGUgY29udGFjdCBjYXJkIHNlbnQgdG8gdGhlIHJlc3BvbmRlciBhcyB3ZWxsIHNpbmNlIHRoYXRcbiAgICAvLyBDQyB3YXMgY3JlYXRlZCBieSB0aGUgcmVzcG9uZGVyLlxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGU8YW55Pih7XG4gICAgICBtdXRhdGlvbjogQ29tcGxldGVPdGtNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGtleUV4Y2hhbmdlSWQsXG4gICAgICAgICAgcm9vdEtleUlkOiByb290S2V5LmlkLFxuICAgICAgICAgIG1hc3RlcktleUlkOiBtYXN0ZXJLZXkuaWQsXG4gICAgICAgICAgaW5pdGlhdG9yU2lnUHhrSWQ6IGluaXRpYXRvclNpZ1Byay5pZCxcbiAgICAgICAgICBzaWduZWRSZXNwb25kZXJQYms6IEpTT04uc3RyaW5naWZ5KHNpZ25lZFJlc3BvbmRlclBiayksXG4gICAgICAgICAgc2lnbmVkUmVzcG9uZGVyU2lnUGJrOiBKU09OLnN0cmluZ2lmeShzaWduZWRSZXNwb25kZXJTaWdQYmspLFxuICAgICAgICAgIHJrV3JhcHBlZFNoYXJlZEtleTogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkU2hhcmVkS2V5KSxcbiAgICAgICAgICBta1dyYXBwZWRNa1NoYXJlZEtleTogSlNPTi5zdHJpbmdpZnkobWtXcmFwcGVkTWtTaGFyZWRLZXkpLFxuICAgICAgICAgIHJlc3BvbmRlckNvbnRhY3RDYXJkQ2lwaGVyOiByZXNwb25kZXJDb250YWN0Q2FyZENpcGhlcklucHV0LFxuICAgICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkQ2lwaGVyOiBpbml0aWF0b3JDb250YWN0Q2FyZENpcGhlcklucHV0LFxuICAgICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVyOlxuICAgICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXJJbnB1dCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5jb21wbGV0ZUtleUV4Y2hhbmdlT3RrO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGN1cnJlbnRVc2VyU2hhcmVkS2V5KGlucHV0OiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxVc2VyU2hhcmVkS2V5PiB7XG4gICAgY29uc3QgeyBjdXJyZW50VXNlclNoYXJlZEtleSB9ID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcbiAgICAgIHF1ZXJ5OiBDdXJyZW50VXNlclNoYXJlZEtleVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIHVzZXJuYW1lOiBpbnB1dC51c2VybmFtZSxcbiAgICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBjdXJyZW50VXNlclNoYXJlZEtleS51c2VyU2hhcmVkS2V5O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var OtkState;
|
|
2
|
+
(function (OtkState) {
|
|
3
|
+
OtkState["OTK_INITIATED"] = "OTK_INITIATED";
|
|
4
|
+
OtkState["OTK_ACCEPTED"] = "OTK_ACCEPTED";
|
|
5
|
+
OtkState["OTK_COMPLETED"] = "OTK_COMPLETED";
|
|
6
|
+
})(OtkState || (OtkState = {}));
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4Y2hhbmdlLnR5cGVzLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9rZXktZXhjaGFuZ2Uva2V5LWV4Y2hhbmdlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVGQSxNQUFNLENBQU4sSUFBWSxRQUlYO0FBSkQsV0FBWSxRQUFRO0lBQ2xCLDJDQUErQixDQUFBO0lBQy9CLHlDQUE2QixDQUFBO0lBQzdCLDJDQUErQixDQUFBO0FBQ2pDLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBKU09OT2JqZWN0LCBLZXlFeGNoYW5nZU1vZGUsIEtleUV4Y2hhbmdlU3RhdGUgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgQWNjZXNzTGV2ZWwgfSBmcm9tICcuLi9jYXRlZ29yeS9jYXRlZ29yeS50eXBlcyc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCB7IENvbnRhY3RDYXJkTmFtZSwgVHJ1c3RlZFBhcnR5RGV0YWlscyB9IGZyb20gJy4uL3Byb2ZpbGUvcHJvZmlsZS50eXBlcyc7XG5cbi8vIFdpbGwgYmUgZW5jcnlwdGVkIHVzaW5nIHRoZSByb290IGtleSBvZiB0aGUgaW5pdGlhdG9yXG5leHBvcnQgaW50ZXJmYWNlIFBsYWluSW5pdGlhdG9yUm9vdEtleUNpcGhlciB7XG4gIG5vbmNlOiBzdHJpbmc7XG4gIG9uZVRpbWVQcms6IG9iamVjdDsgLy8gb25ldGltZSBwdWJsaWMgZW5jcnlwdGlvbiBrZXkgcmVzcG9uZGVyIHVzZSB0byBzZW5kIGRhdGEgYmFjayB0byBpbml0aWF0b3JcbiAgb3RLZXk6IG9iamVjdDtcbiAgaW5pdGlhdG9yQ29udGFjdENhcmQ/OiB7XG4gICAgLy8gT3duZXIgb25seSBhY2Nlc3MgdG8gdGhpcyBkYXRhXG4gICAgcGxhaW5Pd25lckNpcGhlckRhdGFKc29uOiBKU09OT2JqZWN0O1xuICAgIC8vIFNoYXJlZCByZWFkIGFjY2VzcyBiZXR3ZWVuIG93bmVyIGFuZCByZWNlaXZlci4gT25seSB0aGUgb3duZXIgaGFzIHdyaXRlIGFjY2Vzcy5cbiAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBKU09OT2JqZWN0O1xuICB9O1xuICBpbml0aWF0b3I6IHtcbiAgICBtZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICAgIGNvbnRhY3RDYXJkPzoge1xuICAgICAgLy8gU2hhcmVkIHJlYWQgYWNjZXNzIGJldHdlZW4gb3duZXIgYW5kIHJlY2VpdmVyLiBPbmx5IHRoZSBvd25lciBoYXMgd3JpdGUgYWNjZXNzLlxuICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogVHJ1c3RlZFBhcnR5RGV0YWlscztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZENvbnRhY3RDYXJkSW5wdXQge1xuICBwbGFpbkNpcGhlckRhdGFKc29uPzogSlNPTk9iamVjdDtcbiAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbj86IEpTT05PYmplY3Q7XG4gIHNoYXJlZENpcGhlcktleT86IG9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFBlcm1pc3Npb25zIHtcbiAgY2F0ZWdvcmllcz86IHsgY2F0ZWdvcnlJZDogc3RyaW5nOyBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWwgfVtdO1xuICByZWNvcmRzPzogeyByZWNvcmRJZDogc3RyaW5nOyBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWwgfVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleUV4Y2hhbmdlTWVzc2FnZSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFByZXBhcmVkUGVybWlzc2lvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhaW5PdEtleUNpcGhlciB7XG4gIG5vbmNlOiBzdHJpbmc7XG4gIGluaXRpYXRvcjoge1xuICAgIG9uZVRpbWVQYms6IG9iamVjdDsgLy8gb25ldGltZSBwdWJsaWMgZW5jcnlwdGlvbiBrZXkgcmVzcG9uZGVyIHVzZSB0byBzZW5kIGRhdGEgYmFjayB0byBpbml0aWF0b3JcbiAgICBwYms6IG9iamVjdDsgLy8gcHVibGljIGVuY3J5cHRpb24ga2V5XG4gICAgc2lnUGJrOiBvYmplY3Q7IC8vIHB1YmxpYyBzaWduaW5nIGtleVxuICAgIHByb2ZpbGU/OiB7XG4gICAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICB9O1xuICAgIG1lc3NhZ2U/OiBLZXlFeGNoYW5nZU1lc3NhZ2U7XG4gICAgY29udGFjdENhcmQ/OiB7XG4gICAgICAvLyBTaGFyZWQgcmVhZCBhY2Nlc3MgYmV0d2VlbiBvd25lciBhbmQgcmVjZWl2ZXIuIE9ubHkgdGhlIG93bmVyIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBUcnVzdGVkUGFydHlEZXRhaWxzO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjcnlwdGVkT3RrIHtcbiAgcGxhaW5PdEtleUNpcGhlcjogUGxhaW5PdEtleUNpcGhlcjtcbiAgb3RLZXk6IEpXSy5LZXk7IC8vIFRoZSBvbmUtdGltZSBrZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIge1xuICBub25jZTogc3RyaW5nO1xuICBzaGFyZWRLZXk6IG9iamVjdDtcbiAgbWtTaGFyZWRLZXk6IG9iamVjdDtcbiAgcmVzcG9uZGVyOiB7XG4gICAgcGJrOiBvYmplY3Q7XG4gICAgc2lnUGJrOiBvYmplY3Q7XG4gICAgcHJvZmlsZT86IHtcbiAgICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIH07XG4gICAgbWVzc2FnZT86IEtleUV4Y2hhbmdlTWVzc2FnZTtcbiAgICBjb250YWN0Q2FyZD86IHtcbiAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IFRydXN0ZWRQYXJ0eURldGFpbHM7XG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBfbm90XyB0aGUgc2FtZSBrZXkgYXMgdGhlIHNoYXJlZEtleS4gVGhlIHNoYXJlZEtleSB3cmFwc1xuICAgICAgLy8gdGhpcyBrZXkgaW4gdGhlIGtleSBncmFwaC4gQnV0IGJlY2F1c2UgdGhpcyBrZXkgaGFzIG5vdCBiZWVuIGVudGVyZWQgaW50b1xuICAgICAgLy8gdGhlIGtleSBncmFwaCB0aGVuIHRoZSByZXNwb25kZXIgY2FsbHMgdGhlIEFQSSwgd2UgcGFzcyB0aGUgSldLIGRpcmVjdGx5IGhlcmUuXG4gICAgICBzaGFyZWRDaXBoZXJLZXk6IG9iamVjdDtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZW51bSBPdGtTdGF0ZSB7XG4gIE9US19JTklUSUFURUQgPSAnT1RLX0lOSVRJQVRFRCcsXG4gIE9US19BQ0NFUFRFRCA9ICdPVEtfQUNDRVBURUQnLFxuICBPVEtfQ09NUExFVEVEID0gJ09US19DT01QTEVURUQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleUV4Y2hhbmdlQ29udGFjdENhcmRJbnB1dCB7XG4gIC8vIEFjY2Vzc2libGUgYnkgdGhlIHNlcnZlciBhbmQgaW5pdGlhdG9yLiBTZXJ2ZXIgc2lkZSBub3RpZmljYXRpb24gZW1haWxzIG5lZWQgdG8ga25vdyBzb21lXG4gIC8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbml0aWF0b3IuXG4gIG93bmVyUGxhaW5EYXRhPzoge1xuICAgIG5hbWU6IENvbnRhY3RDYXJkTmFtZTtcbiAgfTtcbiAgLy8gT3duZXIgb25seSBhY2Nlc3MgdG8gdGhpcyBkYXRhXG4gIHBsYWluT3duZXJDaXBoZXJEYXRhSnNvbjogSlNPTk9iamVjdDtcbiAgLy8gU2hhcmVkIHJlYWQgYWNjZXNzIGJldHdlZW4gb3duZXIgYW5kIHJlY2VpdmVyLiBPbmx5IHRoZSBvd25lciBoYXMgd3JpdGUgYWNjZXNzLlxuICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBUcnVzdGVkUGFydHlEZXRhaWxzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYXRlT3RrSW5wdXQge1xuICBlbWFpbD86IHN0cmluZztcbiAgbWVzc2FnZT86IEtleUV4Y2hhbmdlTWVzc2FnZTtcbiAgY29udGFjdENhcmQ/OiBLZXlFeGNoYW5nZUNvbnRhY3RDYXJkSW5wdXQ7XG4gIHVwZ3JhZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbmRPdGtJbnB1dCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGRlY3J5cHRlZE90azogRGVjcnlwdGVkT3RrO1xuICBtZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICBpbml0aWF0b3JDb250YWN0Q2FyZD86IHtcbiAgICBwbGFpblJlY2VpdmVyQ2lwaGVyRGF0YUpzb246IEpTT05PYmplY3Q7XG4gIH07XG4gIHJlc3BvbmRlckNvbnRhY3RDYXJkPzogS2V5RXhjaGFuZ2VDb250YWN0Q2FyZElucHV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE90ayB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXRlOiBPdGtTdGF0ZTtcbiAgb3RLZXlQYXJhbXM6IHN0cmluZztcbiAgb3RLZXlDaXBoZXI6IHN0cmluZztcbiAgc2hhcmVkS2V5OiBLZXk7XG4gIG1rU2hhcmVkS2V5OiBLZXk7XG4gIGluaXRpYXRvclNpZ1B4azogS2V5O1xuICByZXNwb25kZXJTaWdQeGs6IEtleTtcbiAgLy8gRW5jcnlwdGVkXG4gIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXI6IHN0cmluZzsgLy8gc2luZ2xlIHRpbWUgdXNlIHB1YmxpYyBrZXkgY3JlYXRlZCBieSB0aGUgaW5pdGlhdG9yLlxuICByZXNwb25kZXJQYmtDaXBoZXI/OiBzdHJpbmc7IC8vIHJlc3BvbmRlclBiayBpcyB0aGUgbG9uZyBsaXZlZCBQYmsgb2YgdGhlIHJlc3BvbmRlci5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlFeGNoYW5nZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXRlOiBLZXlFeGNoYW5nZVN0YXRlO1xuICBtb2RlOiBLZXlFeGNoYW5nZU1vZGU7XG4gIGNyZWF0ZWQ6IHN0cmluZztcbiAgbW9kaWZpZWQ6IHN0cmluZztcbiAgaXNJbml0aWF0b3I6IGJvb2xlYW47XG4gIGluaXRpYXRvcjoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgfTtcbiAgcmVzcG9uZGVyOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICB9O1xuICBpbml0aWF0b3JBY3Rpb25SZXF1aXJlZD86IGJvb2xlYW47XG4gIHJlc3BvbmRlckFjdGlvblJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcmVzcG9uZGVyRW1haWxBZGRyZXNzPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgdG9rZW5FeHBpcnlUaW1lPzogc3RyaW5nO1xuICBpc0V4cGlyZWQ/OiBib29sZWFuO1xuICBvdGs/OiBPdGs7XG4gIGluaXRpYXRvclJvb3RLZXlDaXBoZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNyeXB0ZWRLZXlFeGNoYW5nZSBleHRlbmRzIEtleUV4Y2hhbmdlIHtcbiAgZGVjcnlwdGVkT3RrPzogRGVjcnlwdGVkT3RrO1xuICBtZXNzYWdlPzogS2V5RXhjaGFuZ2VNZXNzYWdlO1xuICBjb250YWN0Q2FyZD86IFRydXN0ZWRQYXJ0eURldGFpbHM7XG4gIG15TWVzc2FnZT86IEtleUV4Y2hhbmdlTWVzc2FnZTtcbiAgbXlDb250YWN0Q2FyZD86IFRydXN0ZWRQYXJ0eURldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0S2V5RXhjaGFuZ2VPcHRpb25zIHtcbiAgLy8gVGhlIG90S2V5IGFzIGEgcmF3IHN0cmluZy4gaS5lLiBrZXkudG9KU09OKHRydWUpLmtcbiAgb3RLZXlLPzogc3RyaW5nO1xuICAvLyBVc2VyIG5lZWQgdGhlIHRva2VuIGlmIHRoZXkgaGF2ZSBub3QgcmVzcG9uZGVkIHRvIHRoZSBrZXkgZXhjaGFuZ2UgeWV0LlxuICAvLyBPbmNlIHRoZXkndmUgcmVzcG9uZGVkIChoZW5jZSBwcm92ZW4gdGhleSBoYXZlIHRoZSBPT0IgS2V5KSB0aGV5IGJlY29tZVxuICAvLyB0aGUgXCJyZXNwb25kZXJcIiBvZiB0aGlzIGV4Y2hhbmdlLCBhbmQgY2FuIGFjY2VzcyBpdCB3aGVuIHNpZ25lZCBpbi5cbiAgdG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uZE90ayB7XG4gIGtleUV4Y2hhbmdlOiBLZXlFeGNoYW5nZTtcbiAgdXNlclNoYXJlZEtleTogVXNlclNoYXJlZEtleTtcbiAgdHA6IHtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRlT3RrIHtcbiAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlO1xuICB1c2VyU2hhcmVkS2V5OiBVc2VyU2hhcmVkS2V5O1xuICB0cDoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclNoYXJlZEtleSB7XG4gIHVzZXJTaWdQcms6IEtleTtcbiAgc2hhcmVkS2V5OiBLZXk7XG4gIG1rU2hhcmVkS2V5PzogS2V5O1xuICBta1B4az86IEtleTtcbiAgbWtSZXNoYXJlUmVxdWVzdENpcGhlcj86IHN0cmluZztcbiAgbWtSZXNoYXJlUmVzcG9uc2VDaXBoZXI/OiBzdHJpbmc7XG4gIG1rUmVzaGFyZVJlcXVlc3RTZW50PzogYm9vbGVhbjtcbiAgbWtSZXNoYXJlUmVzcG9uc2VTZW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRLZXlFeGNoYW5nZUxpc3RPcHRpb25zIHtcbiAgb3JkZXJCeT86XG4gICAgfCAnY3JlYXRlZCdcbiAgICB8ICctY3JlYXRlZCdcbiAgICB8ICdtb2RpZmllZCdcbiAgICB8ICctbW9kaWZpZWQnXG4gICAgfCAnZXhwaXJ5X3RpbWUnXG4gICAgfCAnLWV4cGlyeV90aW1lJztcbiAgaXNFeHBpcmVkPzogYm9vbGVhbjtcbiAgaW5pdGlhdG9yQWN0aW9uUmVxdWlyZWQ/OiBib29sZWFuO1xuICByZXNwb25kZXJBY3Rpb25SZXF1aXJlZD86IGJvb2xlYW47XG4gIGluaXRpYXRvcj86IHN0cmluZztcbiAgcmVzcG9uZGVyPzogc3RyaW5nO1xuICBzdGF0ZT86ICdJTl9QUk9HUkVTUycgfCAnQ09NUExFVEVEJyB8ICdERUNMSU5FRCcgfCAnQ0FOQ0VMTEVEJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFpblJlc3BvbmRlclBia0NpcGhlciB7XG4gIG90S2V5OiBvYmplY3Q7XG59XG4iXX0=
|