@lifeready/core 1.0.13 → 1.0.15
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/README.md +62 -62
- package/bundles/lifeready-core.umd.js +14315 -14315
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +40 -40
- package/esm2015/lib/_common/deferred-promise.js +24 -24
- package/esm2015/lib/_common/exceptions.js +157 -157
- package/esm2015/lib/_common/queries.gql.js +190 -190
- package/esm2015/lib/_common/run-outside-angular.js +79 -79
- package/esm2015/lib/_common/types.js +1 -1
- package/esm2015/lib/_common/utils.js +52 -52
- package/esm2015/lib/api/contact-card.gql.js +79 -79
- package/esm2015/lib/api/contact-card.service.js +154 -154
- package/esm2015/lib/api/contact-card2.gql.js +60 -60
- package/esm2015/lib/api/contact-card2.service.js +103 -103
- package/esm2015/lib/api/file.service.js +74 -74
- package/esm2015/lib/api/key-exchange.gql.js +188 -188
- package/esm2015/lib/api/key-exchange.service.js +442 -442
- package/esm2015/lib/api/key-exchange.types.js +18 -18
- package/esm2015/lib/api/key-exchange2.gql.js +171 -171
- package/esm2015/lib/api/key-exchange2.service.js +479 -479
- package/esm2015/lib/api/lock.gql.js +40 -40
- package/esm2015/lib/api/lock.service.js +64 -64
- package/esm2015/lib/api/lr-apollo.service.js +46 -46
- package/esm2015/lib/api/lr-graphql/index.js +6 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
- package/esm2015/lib/api/message.service.js +138 -138
- package/esm2015/lib/api/persist.service.js +181 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
- package/esm2015/lib/api/query-processor/index.js +3 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +262 -262
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
- package/esm2015/lib/api/shared-contact-card.service.js +119 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
- package/esm2015/lib/api/time.service.js +146 -146
- package/esm2015/lib/api/types/graphql.types.js +7 -7
- package/esm2015/lib/api/types/index.js +3 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +101 -101
- package/esm2015/lib/auth/auth.config.js +57 -57
- package/esm2015/lib/auth/auth.gql.js +48 -48
- package/esm2015/lib/auth/auth.types.js +27 -27
- package/esm2015/lib/auth/idle.service.js +168 -168
- package/esm2015/lib/auth/idle.types.js +7 -7
- package/esm2015/lib/auth/lbop.service.js +355 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +488 -488
- package/esm2015/lib/auth/password.service.js +320 -320
- package/esm2015/lib/auth/register.service.js +172 -172
- package/esm2015/lib/auth/two-factor.service.js +74 -74
- package/esm2015/lib/category/category-meta.service.js +99 -99
- package/esm2015/lib/category/category.gql.js +406 -406
- package/esm2015/lib/category/category.service.js +390 -390
- package/esm2015/lib/category/category.types.js +29 -29
- package/esm2015/lib/cryptography/cryptography.types.js +11 -11
- package/esm2015/lib/cryptography/encryption.service.js +189 -189
- package/esm2015/lib/cryptography/key-factory.service.js +237 -237
- package/esm2015/lib/cryptography/key-graph.service.js +299 -299
- package/esm2015/lib/cryptography/key-meta.service.js +200 -200
- package/esm2015/lib/cryptography/key.service.js +124 -124
- package/esm2015/lib/cryptography/slip39.service.js +169 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
- package/esm2015/lib/items2/item2.gql.js +139 -139
- package/esm2015/lib/items2/item2.service.js +498 -498
- package/esm2015/lib/items2/item2.types.js +1 -1
- package/esm2015/lib/life-ready.config.js +84 -84
- package/esm2015/lib/life-ready.module.js +74 -74
- package/esm2015/lib/notification/notification.gql.js +43 -43
- package/esm2015/lib/notification/notification.service.js +118 -118
- package/esm2015/lib/plan/plan.gql.js +123 -123
- package/esm2015/lib/plan/plan.service.js +149 -149
- package/esm2015/lib/plan/plan.types.js +11 -11
- package/esm2015/lib/record/record-attachment.service.js +101 -101
- package/esm2015/lib/record/record.gql.js +179 -179
- package/esm2015/lib/record/record.service.js +206 -206
- package/esm2015/lib/record/record.types.js +15 -15
- package/esm2015/lib/record-type/record-type.service.js +75 -75
- package/esm2015/lib/record-type/record-type.types.js +28 -28
- package/esm2015/lib/scenario/scenario.constants.js +2 -2
- package/esm2015/lib/scenario/scenario.controller.js +34 -34
- package/esm2015/lib/scenario/scenario.gql.js +72 -72
- package/esm2015/lib/scenario/scenario.gql.private.js +198 -198
- package/esm2015/lib/scenario/scenario.service.js +538 -538
- package/esm2015/lib/scenario/scenario.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +22 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +362 -362
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +1 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +113 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +34 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +236 -236
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +95 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
- package/esm2015/lib/users/profile-details.service.js +214 -214
- package/esm2015/lib/users/profile.gql.js +97 -97
- package/esm2015/lib/users/profile.service.js +169 -169
- package/esm2015/lib/users/profile.types.js +34 -34
- package/esm2015/lib/users/user.gql.js +60 -60
- package/esm2015/lib/users/user.service.js +79 -79
- package/esm2015/lib/users/user.types.js +5 -5
- package/esm2015/lifeready-core.js +13 -13
- package/esm2015/public-api.js +71 -71
- package/fesm2015/lifeready-core.js +12258 -12258
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/ast.d.ts +11 -11
- package/lib/_common/deferred-promise.d.ts +12 -12
- package/lib/_common/exceptions.d.ts +109 -109
- package/lib/_common/queries.gql.d.ts +10 -10
- package/lib/_common/run-outside-angular.d.ts +14 -14
- package/lib/_common/types.d.ts +10 -10
- package/lib/_common/utils.d.ts +9 -9
- package/lib/api/contact-card.gql.d.ts +7 -7
- package/lib/api/contact-card.service.d.ts +52 -52
- package/lib/api/contact-card2.gql.d.ts +34 -34
- package/lib/api/contact-card2.service.d.ts +49 -49
- package/lib/api/file.service.d.ts +18 -18
- package/lib/api/key-exchange.gql.d.ts +9 -9
- package/lib/api/key-exchange.service.d.ts +39 -39
- package/lib/api/key-exchange.types.d.ts +196 -196
- package/lib/api/key-exchange2.gql.d.ts +125 -125
- package/lib/api/key-exchange2.service.d.ts +187 -187
- package/lib/api/lock.gql.d.ts +27 -27
- package/lib/api/lock.service.d.ts +34 -34
- package/lib/api/lr-apollo.service.d.ts +15 -15
- package/lib/api/lr-graphql/index.d.ts +5 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
- package/lib/api/lr-graphql/lr.service.d.ts +9 -9
- package/lib/api/message.service.d.ts +58 -58
- package/lib/api/persist.service.d.ts +31 -31
- package/lib/api/query-processor/common-processors.service.d.ts +36 -36
- package/lib/api/query-processor/index.d.ts +2 -2
- package/lib/api/query-processor/query-processor.service.d.ts +18 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
- package/lib/api/shared-contact-card.service.d.ts +33 -33
- package/lib/api/shared-contact-card2.gql.d.ts +36 -36
- package/lib/api/shared-contact-card2.service.d.ts +45 -45
- package/lib/api/time.service.d.ts +16 -16
- package/lib/api/types/graphql.types.d.ts +29 -29
- package/lib/api/types/index.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +502 -502
- package/lib/auth/auth.config.d.ts +5 -5
- package/lib/auth/auth.gql.d.ts +15 -15
- package/lib/auth/auth.types.d.ts +66 -66
- package/lib/auth/idle.service.d.ts +40 -40
- package/lib/auth/idle.types.d.ts +10 -10
- package/lib/auth/lbop.service.d.ts +91 -91
- package/lib/auth/life-ready-auth.service.d.ts +61 -61
- package/lib/auth/password.service.d.ts +78 -78
- package/lib/auth/register.service.d.ts +25 -25
- package/lib/auth/two-factor.service.d.ts +15 -15
- package/lib/category/category-meta.service.d.ts +23 -23
- package/lib/category/category.gql.d.ts +45 -45
- package/lib/category/category.service.d.ts +67 -67
- package/lib/category/category.types.d.ts +79 -79
- package/lib/cryptography/cryptography.types.d.ts +83 -83
- package/lib/cryptography/encryption.service.d.ts +41 -41
- package/lib/cryptography/key-factory.service.d.ts +38 -38
- package/lib/cryptography/key-graph.service.d.ts +41 -41
- package/lib/cryptography/key-meta.service.d.ts +44 -44
- package/lib/cryptography/key.service.d.ts +36 -36
- package/lib/cryptography/slip39.service.d.ts +43 -43
- package/lib/cryptography/web-crypto.service.d.ts +5 -5
- package/lib/items2/item2.gql.d.ts +123 -123
- package/lib/items2/item2.service.d.ts +203 -203
- package/lib/items2/item2.types.d.ts +70 -70
- package/lib/life-ready.config.d.ts +14 -14
- package/lib/life-ready.module.d.ts +5 -5
- package/lib/notification/notification.gql.d.ts +37 -37
- package/lib/notification/notification.service.d.ts +63 -63
- package/lib/plan/plan.gql.d.ts +11 -11
- package/lib/plan/plan.service.d.ts +33 -33
- package/lib/plan/plan.types.d.ts +31 -31
- package/lib/record/record-attachment.service.d.ts +16 -16
- package/lib/record/record.gql.d.ts +14 -14
- package/lib/record/record.service.d.ts +25 -25
- package/lib/record/record.types.d.ts +57 -57
- package/lib/record-type/record-type.service.d.ts +11 -11
- package/lib/record-type/record-type.types.d.ts +50 -50
- package/lib/scenario/scenario.constants.d.ts +1 -1
- package/lib/scenario/scenario.controller.d.ts +10 -10
- package/lib/scenario/scenario.gql.d.ts +62 -62
- package/lib/scenario/scenario.gql.private.d.ts +16 -16
- package/lib/scenario/scenario.service.d.ts +233 -233
- package/lib/scenario/scenario.types.d.ts +50 -50
- package/lib/trusted-parties/tp-assembly.d.ts +177 -177
- package/lib/trusted-parties/tp-assembly.gql.private.d.ts +5 -5
- package/lib/trusted-parties/tp-assembly.types.d.ts +38 -38
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
- package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
- package/lib/trusted-parties/tp-password-reset.controller.d.ts +10 -10
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +223 -223
- package/lib/trusted-parties/tp-password-reset.service.d.ts +188 -188
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
- package/lib/users/profile-details.service.d.ts +21 -21
- package/lib/users/profile.gql.d.ts +11 -11
- package/lib/users/profile.service.d.ts +35 -35
- package/lib/users/profile.types.d.ts +96 -96
- package/lib/users/user.gql.d.ts +9 -9
- package/lib/users/user.service.d.ts +12 -12
- package/lib/users/user.types.d.ts +23 -23
- package/lifeready-core.d.ts +12 -12
- package/package.json +1 -1
- package/public-api.d.ts +67 -67
|
@@ -1,326 +1,326 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { KeyExchangeService } from '../api/key-exchange.service';
|
|
5
|
-
import { LrApolloService } from '../api/lr-apollo.service';
|
|
6
|
-
import { SharedContactCardService } from '../api/shared-contact-card.service';
|
|
7
|
-
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
8
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
9
|
-
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
10
|
-
import { KeyService } from '../cryptography/key.service';
|
|
11
|
-
import { UserService } from '../users/user.service';
|
|
12
|
-
import { ContactCardName } from '../users/profile.types';
|
|
13
|
-
import { CancelTrustedPartyInvitationMutation, DeclineTrustedPartyInvitationMutation, DeleteTrustedPartyMutation, GetAllTrustedPartiesQuery, GetTrustedPartiesQuery, GetTrustedPartyQuery, ShareCategoryMutation, UnshareCategoryMutation, } from './trusted-party.gql';
|
|
14
|
-
import { TrustedPartyInviteStatus, TrustedPartyType, TrustedPartyRoleType, } from './trusted-party.types';
|
|
15
|
-
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@angular/common/http";
|
|
18
|
-
import * as i2 from "../api/lr-apollo.service";
|
|
19
|
-
import * as i3 from "../api/shared-contact-card.service";
|
|
20
|
-
import * as i4 from "../users/user.service";
|
|
21
|
-
import * as i5 from "../auth/life-ready-auth.service";
|
|
22
|
-
import * as i6 from "../api/key-exchange.service";
|
|
23
|
-
import * as i7 from "../cryptography/key-graph.service";
|
|
24
|
-
import * as i8 from "../cryptography/key.service";
|
|
25
|
-
import * as i9 from "../cryptography/key-factory.service";
|
|
26
|
-
import * as i10 from "../cryptography/encryption.service";
|
|
27
|
-
export class TrustedPartyService {
|
|
28
|
-
constructor(http, lrApollo, sharedContactCardService, userService, authService, keyExchangeService, keyGraphService, keyService, keyFactory, encryptionService) {
|
|
29
|
-
this.http = http;
|
|
30
|
-
this.lrApollo = lrApollo;
|
|
31
|
-
this.sharedContactCardService = sharedContactCardService;
|
|
32
|
-
this.userService = userService;
|
|
33
|
-
this.authService = authService;
|
|
34
|
-
this.keyExchangeService = keyExchangeService;
|
|
35
|
-
this.keyGraphService = keyGraphService;
|
|
36
|
-
this.keyService = keyService;
|
|
37
|
-
this.keyFactory = keyFactory;
|
|
38
|
-
this.encryptionService = encryptionService;
|
|
39
|
-
}
|
|
40
|
-
getTrustedParties() {
|
|
41
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
-
const { tps } = yield this.lrApollo.query({
|
|
43
|
-
query: GetTrustedPartiesQuery,
|
|
44
|
-
});
|
|
45
|
-
return yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)));
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
getAllTrustedParties() {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
const user = yield this.authService.getUser();
|
|
51
|
-
const { tps, invites, sentInvites } = yield this.lrApollo.query({
|
|
52
|
-
query: GetAllTrustedPartiesQuery,
|
|
53
|
-
variables: {
|
|
54
|
-
userId: user.id,
|
|
55
|
-
isExpired: false,
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
return {
|
|
59
|
-
parties: (yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)))).filter((x) => x),
|
|
60
|
-
invites: (yield Promise.all(invites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
-
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
62
|
-
}))))
|
|
63
|
-
.filter((x) => x.status !== TrustedPartyInviteStatus.Completed)
|
|
64
|
-
.filter((x) => x.status !== TrustedPartyInviteStatus.Invited || x.actionRequired),
|
|
65
|
-
sentInvites: (yield Promise.all(sentInvites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
67
|
-
})))).filter((x) => x.status !== TrustedPartyInviteStatus.Completed),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
getTrustedParty(partyId) {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
-
const { tp } = yield this.lrApollo.query({
|
|
74
|
-
query: GetTrustedPartyQuery,
|
|
75
|
-
variables: { partyId },
|
|
76
|
-
});
|
|
77
|
-
return yield this.mapTrustedParty(tp);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
getTrustedPartyRoles(roleType = TrustedPartyRoleType.General) {
|
|
81
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
-
if (!this.trustedPartyRoles) {
|
|
83
|
-
this.trustedPartyRoles = yield this.http
|
|
84
|
-
.get('/assets/meta/trusted-party-roles.json')
|
|
85
|
-
.toPromise();
|
|
86
|
-
}
|
|
87
|
-
return Promise.resolve(this.trustedPartyRoles.filter((x) => x.roleType === roleType));
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
findByEmail(email) {
|
|
91
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
try {
|
|
93
|
-
const user = yield this.userService.getUserByEmail(email);
|
|
94
|
-
return user
|
|
95
|
-
? {
|
|
96
|
-
id: user.id,
|
|
97
|
-
email,
|
|
98
|
-
username: user.username,
|
|
99
|
-
isTrustedParty: user.haveTp,
|
|
100
|
-
isMe: user.isCurrentUser,
|
|
101
|
-
}
|
|
102
|
-
: null;
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
inviteTrustedParty(invite) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
-
const params = {
|
|
112
|
-
responderUsername: invite.party.username,
|
|
113
|
-
email: invite.party.email,
|
|
114
|
-
message: {
|
|
115
|
-
name: invite.party.name,
|
|
116
|
-
email: invite.party.email,
|
|
117
|
-
message: invite.party.message,
|
|
118
|
-
permissions: invite.permissions,
|
|
119
|
-
},
|
|
120
|
-
contactCard: {
|
|
121
|
-
plainOwnerCipherDataJson: null,
|
|
122
|
-
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
123
|
-
ownerPlainData: {
|
|
124
|
-
name: new ContactCardName(invite.mySharedDetails.name),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
yield this.keyExchangeService.initiateOtk(params);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
cancelInvitation(inviteId) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
yield this.lrApollo.mutate({
|
|
134
|
-
mutation: CancelTrustedPartyInvitationMutation,
|
|
135
|
-
variables: {
|
|
136
|
-
input: {
|
|
137
|
-
id: inviteId,
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
getInvitation(inviteId, inviteToken, key) {
|
|
144
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
const exchange = yield this.keyExchangeService.getKeyExchange(inviteId, {
|
|
146
|
-
token: inviteToken,
|
|
147
|
-
otKeyK: key,
|
|
148
|
-
});
|
|
149
|
-
return this.mapInvite(exchange);
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
acceptInvitation(invite) {
|
|
153
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
-
const params = {
|
|
155
|
-
id: invite.inviteId,
|
|
156
|
-
token: invite.inviteToken,
|
|
157
|
-
decryptedOtk: invite.decryptedOtk,
|
|
158
|
-
initiatorContactCard: null,
|
|
159
|
-
responderContactCard: {
|
|
160
|
-
plainOwnerCipherDataJson: null,
|
|
161
|
-
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
162
|
-
ownerPlainData: {
|
|
163
|
-
name: new ContactCardName(invite.mySharedDetails.name),
|
|
164
|
-
},
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
const { tp } = yield this.keyExchangeService.respondOtk(params);
|
|
168
|
-
return tp.id;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
declineInvitation(inviteId, inviteToken) {
|
|
172
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
-
yield this.lrApollo.mutate({
|
|
174
|
-
mutation: DeclineTrustedPartyInvitationMutation,
|
|
175
|
-
variables: {
|
|
176
|
-
input: {
|
|
177
|
-
id: inviteId,
|
|
178
|
-
token: inviteToken,
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
confirmInvitation(confirm) {
|
|
185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
-
const { tp } = yield this.keyExchangeService.completeOtk(confirm.inviteId, confirm.initiatorRootKeyCipher, confirm.initiatorOneTimePbkCipher, null);
|
|
187
|
-
return tp.id;
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
removeTrustedParty(partyId) {
|
|
191
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
-
yield this.lrApollo.mutate({
|
|
193
|
-
mutation: DeleteTrustedPartyMutation,
|
|
194
|
-
variables: {
|
|
195
|
-
input: {
|
|
196
|
-
id: partyId,
|
|
197
|
-
},
|
|
198
|
-
},
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
setCategoryAccessLevel(categoryId, keyId, trustedParty, accessLevel) {
|
|
203
|
-
return accessLevel
|
|
204
|
-
? this.shareDirectory(categoryId, keyId, trustedParty, accessLevel)
|
|
205
|
-
: this.unshareDirectory(categoryId, trustedParty.id);
|
|
206
|
-
}
|
|
207
|
-
setRecordAccessLevel(recordId, keyId, trustedParty, accessLevel) {
|
|
208
|
-
return accessLevel
|
|
209
|
-
? this.shareDirectory(recordId, keyId, trustedParty, accessLevel)
|
|
210
|
-
: this.unshareDirectory(recordId, trustedParty.id);
|
|
211
|
-
}
|
|
212
|
-
shareDirectory(directoryId, keyId, trustedParty, accessLevel) {
|
|
213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
const key = yield this.keyGraphService.getKey(keyId);
|
|
215
|
-
const wrappingKey = yield this.keyGraphService.getKey(trustedParty.userSharedKey.sharedKey.id);
|
|
216
|
-
const wrappedKey = yield this.encryptionService.encrypt(wrappingKey.jwk, key.jwk.toJSON(true));
|
|
217
|
-
yield this.lrApollo.mutate({
|
|
218
|
-
mutation: ShareCategoryMutation,
|
|
219
|
-
variables: {
|
|
220
|
-
input: {
|
|
221
|
-
id: directoryId,
|
|
222
|
-
tpId: trustedParty.id,
|
|
223
|
-
accessRole: accessLevel,
|
|
224
|
-
keyId: key.id,
|
|
225
|
-
wrappingKeyId: wrappingKey.id,
|
|
226
|
-
wrappedKey: JSON.stringify(wrappedKey),
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
unshareDirectory(directoryId, trustedPartyId) {
|
|
233
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
234
|
-
yield this.lrApollo.mutate({
|
|
235
|
-
mutation: UnshareCategoryMutation,
|
|
236
|
-
variables: {
|
|
237
|
-
input: {
|
|
238
|
-
id: directoryId,
|
|
239
|
-
tpId: trustedPartyId,
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
mapTrustedParty(tp) {
|
|
246
|
-
var _a;
|
|
247
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
-
try {
|
|
249
|
-
const contactCard = tp.sharedContactCard &&
|
|
250
|
-
(yield this.sharedContactCardService.decryptTrustedPartyDetails(tp.sharedContactCard));
|
|
251
|
-
const myContactCard = tp.myContactCard &&
|
|
252
|
-
(yield this.sharedContactCardService.decryptSharedTrustedPartyDetails(tp.myContactCard));
|
|
253
|
-
return {
|
|
254
|
-
id: tp.id,
|
|
255
|
-
type: TrustedPartyType.User,
|
|
256
|
-
hasScenarios: !!tp.sharedScenarios.edges.length,
|
|
257
|
-
hasSharedVault: !!tp.sharedItems.directories.edges.length,
|
|
258
|
-
name: contactCard && contactCard.name && contactCard.name.name,
|
|
259
|
-
details: contactCard,
|
|
260
|
-
mySharedDetails: myContactCard,
|
|
261
|
-
userSharedKey: tp.currentUserSharedKey.userSharedKey,
|
|
262
|
-
username: tp.other.username,
|
|
263
|
-
features: {
|
|
264
|
-
sharedVault: {
|
|
265
|
-
hasAccess: (((_a = tp.other.features) === null || _a === void 0 ? void 0 : _a.shareVault) || ['noaccess'])[0] === 'access',
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
catch (e) {
|
|
271
|
-
console.error('Failed to decrypt Trusted Party.', e, tp);
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
mapInvite(exchange) {
|
|
277
|
-
var _a, _b;
|
|
278
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
-
const contactCard = exchange.contactCard;
|
|
280
|
-
const name = exchange.isInitiator
|
|
281
|
-
? (_a = exchange.myMessage) === null || _a === void 0 ? void 0 : _a.name : contactCard && contactCard.name && contactCard.name.name;
|
|
282
|
-
const email = exchange.isInitiator
|
|
283
|
-
? (_b = exchange.myMessage) === null || _b === void 0 ? void 0 : _b.email : (contactCard && contactCard.email) || exchange.responderEmailAddress;
|
|
284
|
-
return {
|
|
285
|
-
id: exchange.id,
|
|
286
|
-
type: TrustedPartyType.User,
|
|
287
|
-
status: exchange.state,
|
|
288
|
-
token: exchange.token,
|
|
289
|
-
tokenExpiry: exchange.tokenExpiryTime,
|
|
290
|
-
decryptedOtk: exchange.decryptedOtk,
|
|
291
|
-
name,
|
|
292
|
-
email,
|
|
293
|
-
isSender: exchange.isInitiator,
|
|
294
|
-
actionRequired: exchange.isInitiator
|
|
295
|
-
? exchange.initiatorActionRequired
|
|
296
|
-
: exchange.responderActionRequired,
|
|
297
|
-
rootKeyCipher: exchange.initiatorRootKeyCipher,
|
|
298
|
-
pbkCipher: exchange.otk.initiatorOneTimePbkCipher,
|
|
299
|
-
isExpired: exchange.isExpired,
|
|
300
|
-
details: contactCard,
|
|
301
|
-
message: exchange.message,
|
|
302
|
-
mySharedDetails: exchange.myContactCard,
|
|
303
|
-
mySharedMessage: exchange.myMessage,
|
|
304
|
-
};
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
TrustedPartyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TrustedPartyService_Factory() { return new TrustedPartyService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.LrApolloService), i0.ɵɵinject(i3.SharedContactCardService), i0.ɵɵinject(i4.UserService), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.KeyExchangeService), i0.ɵɵinject(i7.KeyGraphService), i0.ɵɵinject(i8.KeyService), i0.ɵɵinject(i9.KeyFactoryService), i0.ɵɵinject(i10.EncryptionService)); }, token: TrustedPartyService, providedIn: "root" });
|
|
309
|
-
TrustedPartyService.decorators = [
|
|
310
|
-
{ type: Injectable, args: [{
|
|
311
|
-
providedIn: 'root',
|
|
312
|
-
},] }
|
|
313
|
-
];
|
|
314
|
-
TrustedPartyService.ctorParameters = () => [
|
|
315
|
-
{ type: HttpClient },
|
|
316
|
-
{ type: LrApolloService },
|
|
317
|
-
{ type: SharedContactCardService },
|
|
318
|
-
{ type: UserService },
|
|
319
|
-
{ type: LifeReadyAuthService },
|
|
320
|
-
{ type: KeyExchangeService },
|
|
321
|
-
{ type: KeyGraphService },
|
|
322
|
-
{ type: KeyService },
|
|
323
|
-
{ type: KeyFactoryService },
|
|
324
|
-
{ type: EncryptionService }
|
|
325
|
-
];
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9vcHQvYXRsYXNzaWFuL3BpcGVsaW5lcy9hZ2VudC9idWlsZC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMscUNBQXFDLEVBQ3JDLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsdUJBQXVCLEdBQ3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQVFMLHdCQUF3QixFQUV4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxF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RSxRQUFRLENBQUMsc0JBQXNCO2dCQUM5QyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUI7Z0JBQ2pELFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDN0IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDekIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhO2dCQUN2QyxlQUFlLEVBQUUsUUFBUSxDQUFDLFNBQVM7YUFDcEMsQ0FBQzs7S0FDSDs7OztZQTdWRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTdDUSxVQUFVO1lBU1YsZUFBZTtZQUNmLHdCQUF3QjtZQU14QixXQUFXO1lBTFgsb0JBQW9CO1lBUHBCLGtCQUFrQjtZQVVsQixlQUFlO1lBQ2YsVUFBVTtZQTBCVixpQkFBaUI7WUE1QmpCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgbWF0ZXJpYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBLZXlFeGNoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi9hcGkva2V5LWV4Y2hhbmdlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRGVjcnlwdGVkS2V5RXhjaGFuZ2UsXG4gIFJlc3BvbmRPdGtJbnB1dCxcbn0gZnJvbSAnLi4vYXBpL2tleS1leGNoYW5nZS50eXBlcyc7XG5pbXBvcnQgeyBMckFwb2xsb1NlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL3NoYXJlZC1jb250YWN0LWNhcmQuc2VydmljZSc7XG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4uL2F1dGgvbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNjZXNzTGV2ZWwgfSBmcm9tICcuLi9jYXRlZ29yeS9jYXRlZ29yeS50eXBlcyc7XG5pbXBvcnQgeyBFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2Vycy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGFjdENhcmROYW1lIH0gZnJvbSAnLi4vdXNlcnMvcHJvZmlsZS50eXBlcyc7XG5pbXBvcnQge1xuICBDYW5jZWxUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gIERlY2xpbmVUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gIERlbGV0ZVRydXN0ZWRQYXJ0eU11dGF0aW9uLFxuICBHZXRBbGxUcnVzdGVkUGFydGllc1F1ZXJ5LFxuICBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5LFxuICBHZXRUcnVzdGVkUGFydHlRdWVyeSxcbiAgU2hhcmVDYXRlZ29yeU11dGF0aW9uLFxuICBVbnNoYXJlQ2F0ZWdvcnlNdXRhdGlvbixcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LmdxbCc7XG5pbXBvcnQge1xuICBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGUsXG4gIENvbmZpcm1UcnVzdGVkUGFydHlJbnZpdGUsXG4gIEZvdW5kVHJ1c3RlZFBhcnR5LFxuICBJbnZpdGVUcnVzdGVkUGFydHksXG4gIFRydXN0ZWRQYXJ0aWVzLFxuICBUcnVzdGVkUGFydHksXG4gIFRydXN0ZWRQYXJ0eUludml0ZSxcbiAgVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLFxuICBUcnVzdGVkUGFydHlSb2xlLFxuICBUcnVzdGVkUGFydHlUeXBlLFxuICBUcnVzdGVkUGFydHlSb2xlVHlwZSxcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LnR5cGVzJztcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZFBhcnR5U2VydmljZSB7XG4gIHByaXZhdGUgdHJ1c3RlZFBhcnR5Um9sZXM6IFRydXN0ZWRQYXJ0eVJvbGVbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBsckFwb2xsbzogTHJBcG9sbG9TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2hhcmVkQ29udGFjdENhcmRTZXJ2aWNlOiBTaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTGlmZVJlYWR5QXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlFeGNoYW5nZVNlcnZpY2U6IEtleUV4Y2hhbmdlU2VydmljZSxcbiAgICBwcml2YXRlIGtleUdyYXBoU2VydmljZTogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtleUZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnRpZXMoKTogUHJvbWlzZTxUcnVzdGVkUGFydHlbXT4ge1xuICAgIGNvbnN0IHsgdHBzIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xuICAgICAgcXVlcnk6IEdldFRydXN0ZWRQYXJ0aWVzUXVlcnksXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHBzLmVkZ2VzLm1hcCgoeCkgPT4gdGhpcy5tYXBUcnVzdGVkUGFydHkoeC5ub2RlKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFRydXN0ZWRQYXJ0aWVzKCk6IFByb21pc2U8VHJ1c3RlZFBhcnRpZXM+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyKCk7XG4gICAgY29uc3QgeyB0cHMsIGludml0ZXMsIHNlbnRJbnZpdGVzIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xuICAgICAgcXVlcnk6IEdldEFsbFRydXN0ZWRQYXJ0aWVzUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgdXNlcklkOiB1c2VyLmlkLFxuICAgICAgICBpc0V4cGlyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXJ0aWVzOiAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eT4oXG4gICAgICAgICAgdHBzLmVkZ2VzLm1hcCgoeCkgPT4gdGhpcy5tYXBUcnVzdGVkUGFydHkoeC5ub2RlKSlcbiAgICAgICAgKVxuICAgICAgKS5maWx0ZXIoKHgpID0+IHgpLFxuICAgICAgaW52aXRlczogKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbDxUcnVzdGVkUGFydHlJbnZpdGU+KFxuICAgICAgICAgIGludml0ZXMuZWRnZXMubWFwKGFzeW5jICh4KSA9PlxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmRlY3J5cHRLZXlFeGNoYW5nZSh4Lm5vZGUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguc3RhdHVzICE9PSBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMuQ29tcGxldGVkKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgeC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5JbnZpdGVkIHx8IHguYWN0aW9uUmVxdWlyZWRcbiAgICAgICAgKSxcbiAgICAgIHNlbnRJbnZpdGVzOiAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eUludml0ZT4oXG4gICAgICAgICAgc2VudEludml0ZXMuZWRnZXMubWFwKGFzeW5jICh4KSA9PlxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmRlY3J5cHRLZXlFeGNoYW5nZSh4Lm5vZGUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLmZpbHRlcigoeCkgPT4geC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5Db21wbGV0ZWQpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8VHJ1c3RlZFBhcnR5PiB7XG4gICAgY29uc3QgeyB0cCB9ID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcbiAgICAgIHF1ZXJ5OiBHZXRUcnVzdGVkUGFydHlRdWVyeSxcbiAgICAgIHZhcmlhYmxlczogeyBwYXJ0eUlkIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubWFwVHJ1c3RlZFBhcnR5KHRwKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcnVzdGVkUGFydHlSb2xlcyhcbiAgICByb2xlVHlwZTogVHJ1c3RlZFBhcnR5Um9sZVR5cGUgPSBUcnVzdGVkUGFydHlSb2xlVHlwZS5HZW5lcmFsXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5Um9sZVtdPiB7XG4gICAgaWYgKCF0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzKSB7XG4gICAgICB0aGlzLnRydXN0ZWRQYXJ0eVJvbGVzID0gYXdhaXQgdGhpcy5odHRwXG4gICAgICAgIC5nZXQ8VHJ1c3RlZFBhcnR5Um9sZVtdPignL2Fzc2V0cy9tZXRhL3RydXN0ZWQtcGFydHktcm9sZXMuanNvbicpXG4gICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIHRoaXMudHJ1c3RlZFBhcnR5Um9sZXMuZmlsdGVyKCh4KSA9PiB4LnJvbGVUeXBlID09PSByb2xlVHlwZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRCeUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPEZvdW5kVHJ1c3RlZFBhcnR5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJCeUVtYWlsKGVtYWlsKTtcblxuICAgICAgcmV0dXJuIHVzZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpZDogdXNlci5pZCxcbiAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICBpc1RydXN0ZWRQYXJ0eTogdXNlci5oYXZlVHAsXG4gICAgICAgICAgICBpc01lOiB1c2VyLmlzQ3VycmVudFVzZXIsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGludml0ZVRydXN0ZWRQYXJ0eShpbnZpdGU6IEludml0ZVRydXN0ZWRQYXJ0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHJlc3BvbmRlclVzZXJuYW1lOiBpbnZpdGUucGFydHkudXNlcm5hbWUsXG4gICAgICBlbWFpbDogaW52aXRlLnBhcnR5LmVtYWlsLFxuICAgICAgbWVzc2FnZToge1xuICAgICAgICBuYW1lOiBpbnZpdGUucGFydHkubmFtZSxcbiAgICAgICAgZW1haWw6IGludml0ZS5wYXJ0eS5lbWFpbCxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLnBhcnR5Lm1lc3NhZ2UsXG4gICAgICAgIHBlcm1pc3Npb25zOiBpbnZpdGUucGVybWlzc2lvbnMsXG4gICAgICB9LFxuICAgICAgY29udGFjdENhcmQ6IHtcbiAgICAgICAgcGxhaW5Pd25lckNpcGhlckRhdGFKc29uOiBudWxsLFxuICAgICAgICBwbGFpblNoYXJlZENpcGhlckRhdGFKc29uOiBpbnZpdGUubXlTaGFyZWREZXRhaWxzLFxuICAgICAgICBvd25lclBsYWluRGF0YToge1xuICAgICAgICAgIG5hbWU6IG5ldyBDb250YWN0Q2FyZE5hbWUoaW52aXRlLm15U2hhcmVkRGV0YWlscy5uYW1lKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5pbml0aWF0ZU90ayhwYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbmNlbEludml0YXRpb24oaW52aXRlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBDYW5jZWxUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogaW52aXRlSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEludml0YXRpb24oXG4gICAgaW52aXRlSWQ6IHN0cmluZyxcbiAgICBpbnZpdGVUb2tlbjogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5SW52aXRlPiB7XG4gICAgY29uc3QgZXhjaGFuZ2UgPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5nZXRLZXlFeGNoYW5nZShpbnZpdGVJZCwge1xuICAgICAgdG9rZW46IGludml0ZVRva2VuLFxuICAgICAgb3RLZXlLOiBrZXksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5tYXBJbnZpdGUoZXhjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdEludml0YXRpb24oXG4gICAgaW52aXRlOiBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGVcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlc3BvbmRPdGtJbnB1dCA9IHtcbiAgICAgIGlkOiBpbnZpdGUuaW52aXRlSWQsXG4gICAgICB0b2tlbjogaW52aXRlLmludml0ZVRva2VuLFxuICAgICAgZGVjcnlwdGVkT3RrOiBpbnZpdGUuZGVjcnlwdGVkT3RrLFxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQ6IG51bGwsXG4gICAgICByZXNwb25kZXJDb250YWN0Q2FyZDoge1xuICAgICAgICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IG51bGwsXG4gICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IGludml0ZS5teVNoYXJlZERldGFpbHMsXG4gICAgICAgIG93bmVyUGxhaW5EYXRhOiB7XG4gICAgICAgICAgbmFtZTogbmV3IENvbnRhY3RDYXJkTmFtZShpbnZpdGUubXlTaGFyZWREZXRhaWxzLm5hbWUpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyB0cCB9ID0gYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UucmVzcG9uZE90ayhwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRwLmlkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlY2xpbmVJbnZpdGF0aW9uKFxuICAgIGludml0ZUlkOiBzdHJpbmcsXG4gICAgaW52aXRlVG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZSh7XG4gICAgICBtdXRhdGlvbjogRGVjbGluZVRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkOiBpbnZpdGVJZCxcbiAgICAgICAgICB0b2tlbjogaW52aXRlVG9rZW4sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbmZpcm1JbnZpdGF0aW9uKFxuICAgIGNvbmZpcm06IENvbmZpcm1UcnVzdGVkUGFydHlJbnZpdGVcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IHRwIH0gPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5jb21wbGV0ZU90ayhcbiAgICAgIGNvbmZpcm0uaW52aXRlSWQsXG4gICAgICBjb25maXJtLmluaXRpYXRvclJvb3RLZXlDaXBoZXIsXG4gICAgICBjb25maXJtLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXG4gICAgICBudWxsXG4gICAgKTtcbiAgICByZXR1cm4gdHAuaWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlVHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVUcnVzdGVkUGFydHlNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkOiBwYXJ0eUlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDYXRlZ29yeUFjY2Vzc0xldmVsKFxuICAgIGNhdGVnb3J5SWQ6IHN0cmluZyxcbiAgICBrZXlJZDogc3RyaW5nLFxuICAgIHRydXN0ZWRQYXJ0eTogVHJ1c3RlZFBhcnR5LFxuICAgIGFjY2Vzc0xldmVsPzogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGFjY2Vzc0xldmVsXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkoY2F0ZWdvcnlJZCwga2V5SWQsIHRydXN0ZWRQYXJ0eSwgYWNjZXNzTGV2ZWwpXG4gICAgICA6IHRoaXMudW5zaGFyZURpcmVjdG9yeShjYXRlZ29yeUlkLCB0cnVzdGVkUGFydHkuaWQpO1xuICB9XG5cbiAgcHVibGljIHNldFJlY29yZEFjY2Vzc0xldmVsKFxuICAgIHJlY29yZElkOiBzdHJpbmcsXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcbiAgICBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGFjY2Vzc0xldmVsXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIGtleUlkLCB0cnVzdGVkUGFydHksIGFjY2Vzc0xldmVsKVxuICAgICAgOiB0aGlzLnVuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIHRydXN0ZWRQYXJ0eS5pZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNoYXJlRGlyZWN0b3J5KFxuICAgIGRpcmVjdG9yeUlkOiBzdHJpbmcsXG4gICAga2V5SWQ6IHN0cmluZyxcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcbiAgICBhY2Nlc3NMZXZlbDogQWNjZXNzTGV2ZWxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaFNlcnZpY2UuZ2V0S2V5KGtleUlkKTtcbiAgICBjb25zdCB3cmFwcGluZ0tleSA9IGF3YWl0IHRoaXMua2V5R3JhcGhTZXJ2aWNlLmdldEtleShcbiAgICAgIHRydXN0ZWRQYXJ0eS51c2VyU2hhcmVkS2V5LnNoYXJlZEtleS5pZFxuICAgICk7XG4gICAgY29uc3Qgd3JhcHBlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIHdyYXBwaW5nS2V5Lmp3ayxcbiAgICAgIGtleS5qd2sudG9KU09OKHRydWUpXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcbiAgICAgIG11dGF0aW9uOiBTaGFyZUNhdGVnb3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogZGlyZWN0b3J5SWQsXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5LmlkLFxuICAgICAgICAgIGFjY2Vzc1JvbGU6IGFjY2Vzc0xldmVsLFxuICAgICAgICAgIGtleUlkOiBrZXkuaWQsXG4gICAgICAgICAgd3JhcHBpbmdLZXlJZDogd3JhcHBpbmdLZXkuaWQsXG4gICAgICAgICAgd3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkod3JhcHBlZEtleSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1bnNoYXJlRGlyZWN0b3J5KFxuICAgIGRpcmVjdG9yeUlkOiBzdHJpbmcsXG4gICAgdHJ1c3RlZFBhcnR5SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZSh7XG4gICAgICBtdXRhdGlvbjogVW5zaGFyZUNhdGVnb3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZDogZGlyZWN0b3J5SWQsXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5SWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG1hcFRydXN0ZWRQYXJ0eSh0cDogYW55KTogUHJvbWlzZTxUcnVzdGVkUGFydHk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFjdENhcmQgPVxuICAgICAgICB0cC5zaGFyZWRDb250YWN0Q2FyZCAmJlxuICAgICAgICAoYXdhaXQgdGhpcy5zaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UuZGVjcnlwdFRydXN0ZWRQYXJ0eURldGFpbHMoXG4gICAgICAgICAgdHAuc2hhcmVkQ29udGFjdENhcmRcbiAgICAgICAgKSk7XG4gICAgICBjb25zdCBteUNvbnRhY3RDYXJkID1cbiAgICAgICAgdHAubXlDb250YWN0Q2FyZCAmJlxuICAgICAgICAoYXdhaXQgdGhpcy5zaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UuZGVjcnlwdFNoYXJlZFRydXN0ZWRQYXJ0eURldGFpbHMoXG4gICAgICAgICAgdHAubXlDb250YWN0Q2FyZFxuICAgICAgICApKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHRwLmlkLFxuICAgICAgICB0eXBlOiBUcnVzdGVkUGFydHlUeXBlLlVzZXIsIC8vIFRPRE86IHdoZW4gcGFydG5lcnNcbiAgICAgICAgaGFzU2NlbmFyaW9zOiAhIXRwLnNoYXJlZFNjZW5hcmlvcy5lZGdlcy5sZW5ndGgsXG4gICAgICAgIGhhc1NoYXJlZFZhdWx0OiAhIXRwLnNoYXJlZEl0ZW1zLmRpcmVjdG9yaWVzLmVkZ2VzLmxlbmd0aCxcbiAgICAgICAgbmFtZTogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWUsXG4gICAgICAgIGRldGFpbHM6IGNvbnRhY3RDYXJkLFxuICAgICAgICBteVNoYXJlZERldGFpbHM6IG15Q29udGFjdENhcmQsXG4gICAgICAgIHVzZXJTaGFyZWRLZXk6IHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXksXG4gICAgICAgIHVzZXJuYW1lOiB0cC5vdGhlci51c2VybmFtZSxcbiAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICBzaGFyZWRWYXVsdDoge1xuICAgICAgICAgICAgaGFzQWNjZXNzOlxuICAgICAgICAgICAgICAodHAub3RoZXIuZmVhdHVyZXM/LnNoYXJlVmF1bHQgfHwgWydub2FjY2VzcyddKVswXSA9PT0gJ2FjY2VzcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgVHJ1c3RlZCBQYXJ0eS4nLCBlLCB0cCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1hcEludml0ZShcbiAgICBleGNoYW5nZTogRGVjcnlwdGVkS2V5RXhjaGFuZ2VcbiAgKTogUHJvbWlzZTxUcnVzdGVkUGFydHlJbnZpdGU+IHtcbiAgICBjb25zdCBjb250YWN0Q2FyZCA9IGV4Y2hhbmdlLmNvbnRhY3RDYXJkO1xuICAgIGNvbnN0IG5hbWUgPSBleGNoYW5nZS5pc0luaXRpYXRvclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/Lm5hbWVcbiAgICAgIDogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWU7XG4gICAgY29uc3QgZW1haWwgPSBleGNoYW5nZS5pc0luaXRpYXRvclxuICAgICAgPyBleGNoYW5nZS5teU1lc3NhZ2U/LmVtYWlsXG4gICAgICA6IChjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5lbWFpbCkgfHwgZXhjaGFuZ2UucmVzcG9uZGVyRW1haWxBZGRyZXNzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBleGNoYW5nZS5pZCxcbiAgICAgIHR5cGU6IFRydXN0ZWRQYXJ0eVR5cGUuVXNlciwgLy8gdG9kbyB3aGVuIHBhcnRuZXJzXG4gICAgICBzdGF0dXM6IChleGNoYW5nZS5zdGF0ZSBhcyB1bmtub3duKSBhcyBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMsXG4gICAgICB0b2tlbjogZXhjaGFuZ2UudG9rZW4sXG4gICAgICB0b2tlbkV4cGlyeTogZXhjaGFuZ2UudG9rZW5FeHBpcnlUaW1lLFxuICAgICAgZGVjcnlwdGVkT3RrOiBleGNoYW5nZS5kZWNyeXB0ZWRPdGssXG4gICAgICBuYW1lLFxuICAgICAgZW1haWwsXG4gICAgICBpc1NlbmRlcjogZXhjaGFuZ2UuaXNJbml0aWF0b3IsXG4gICAgICBhY3Rpb25SZXF1aXJlZDogZXhjaGFuZ2UuaXNJbml0aWF0b3JcbiAgICAgICAgPyBleGNoYW5nZS5pbml0aWF0b3JBY3Rpb25SZXF1aXJlZFxuICAgICAgICA6IGV4Y2hhbmdlLnJlc3BvbmRlckFjdGlvblJlcXVpcmVkLFxuICAgICAgcm9vdEtleUNpcGhlcjogZXhjaGFuZ2UuaW5pdGlhdG9yUm9vdEtleUNpcGhlcixcbiAgICAgIHBia0NpcGhlcjogZXhjaGFuZ2Uub3RrLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXG4gICAgICBpc0V4cGlyZWQ6IGV4Y2hhbmdlLmlzRXhwaXJlZCxcbiAgICAgIGRldGFpbHM6IGNvbnRhY3RDYXJkLFxuICAgICAgbWVzc2FnZTogZXhjaGFuZ2UubWVzc2FnZSxcbiAgICAgIG15U2hhcmVkRGV0YWlsczogZXhjaGFuZ2UubXlDb250YWN0Q2FyZCxcbiAgICAgIG15U2hhcmVkTWVzc2FnZTogZXhjaGFuZ2UubXlNZXNzYWdlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { KeyExchangeService } from '../api/key-exchange.service';
|
|
5
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
6
|
+
import { SharedContactCardService } from '../api/shared-contact-card.service';
|
|
7
|
+
import { LifeReadyAuthService } from '../auth/life-ready-auth.service';
|
|
8
|
+
import { EncryptionService } from '../cryptography/encryption.service';
|
|
9
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
10
|
+
import { KeyService } from '../cryptography/key.service';
|
|
11
|
+
import { UserService } from '../users/user.service';
|
|
12
|
+
import { ContactCardName } from '../users/profile.types';
|
|
13
|
+
import { CancelTrustedPartyInvitationMutation, DeclineTrustedPartyInvitationMutation, DeleteTrustedPartyMutation, GetAllTrustedPartiesQuery, GetTrustedPartiesQuery, GetTrustedPartyQuery, ShareCategoryMutation, UnshareCategoryMutation, } from './trusted-party.gql';
|
|
14
|
+
import { TrustedPartyInviteStatus, TrustedPartyType, TrustedPartyRoleType, } from './trusted-party.types';
|
|
15
|
+
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@angular/common/http";
|
|
18
|
+
import * as i2 from "../api/lr-apollo.service";
|
|
19
|
+
import * as i3 from "../api/shared-contact-card.service";
|
|
20
|
+
import * as i4 from "../users/user.service";
|
|
21
|
+
import * as i5 from "../auth/life-ready-auth.service";
|
|
22
|
+
import * as i6 from "../api/key-exchange.service";
|
|
23
|
+
import * as i7 from "../cryptography/key-graph.service";
|
|
24
|
+
import * as i8 from "../cryptography/key.service";
|
|
25
|
+
import * as i9 from "../cryptography/key-factory.service";
|
|
26
|
+
import * as i10 from "../cryptography/encryption.service";
|
|
27
|
+
export class TrustedPartyService {
|
|
28
|
+
constructor(http, lrApollo, sharedContactCardService, userService, authService, keyExchangeService, keyGraphService, keyService, keyFactory, encryptionService) {
|
|
29
|
+
this.http = http;
|
|
30
|
+
this.lrApollo = lrApollo;
|
|
31
|
+
this.sharedContactCardService = sharedContactCardService;
|
|
32
|
+
this.userService = userService;
|
|
33
|
+
this.authService = authService;
|
|
34
|
+
this.keyExchangeService = keyExchangeService;
|
|
35
|
+
this.keyGraphService = keyGraphService;
|
|
36
|
+
this.keyService = keyService;
|
|
37
|
+
this.keyFactory = keyFactory;
|
|
38
|
+
this.encryptionService = encryptionService;
|
|
39
|
+
}
|
|
40
|
+
getTrustedParties() {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
const { tps } = yield this.lrApollo.query({
|
|
43
|
+
query: GetTrustedPartiesQuery,
|
|
44
|
+
});
|
|
45
|
+
return yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
getAllTrustedParties() {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const user = yield this.authService.getUser();
|
|
51
|
+
const { tps, invites, sentInvites } = yield this.lrApollo.query({
|
|
52
|
+
query: GetAllTrustedPartiesQuery,
|
|
53
|
+
variables: {
|
|
54
|
+
userId: user.id,
|
|
55
|
+
isExpired: false,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
parties: (yield Promise.all(tps.edges.map((x) => this.mapTrustedParty(x.node)))).filter((x) => x),
|
|
60
|
+
invites: (yield Promise.all(invites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
62
|
+
}))))
|
|
63
|
+
.filter((x) => x.status !== TrustedPartyInviteStatus.Completed)
|
|
64
|
+
.filter((x) => x.status !== TrustedPartyInviteStatus.Invited || x.actionRequired),
|
|
65
|
+
sentInvites: (yield Promise.all(sentInvites.edges.map((x) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
return this.mapInvite(yield this.keyExchangeService.decryptKeyExchange(x.node));
|
|
67
|
+
})))).filter((x) => x.status !== TrustedPartyInviteStatus.Completed),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
getTrustedParty(partyId) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const { tp } = yield this.lrApollo.query({
|
|
74
|
+
query: GetTrustedPartyQuery,
|
|
75
|
+
variables: { partyId },
|
|
76
|
+
});
|
|
77
|
+
return yield this.mapTrustedParty(tp);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
getTrustedPartyRoles(roleType = TrustedPartyRoleType.General) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
if (!this.trustedPartyRoles) {
|
|
83
|
+
this.trustedPartyRoles = yield this.http
|
|
84
|
+
.get('/assets/meta/trusted-party-roles.json')
|
|
85
|
+
.toPromise();
|
|
86
|
+
}
|
|
87
|
+
return Promise.resolve(this.trustedPartyRoles.filter((x) => x.roleType === roleType));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
findByEmail(email) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
try {
|
|
93
|
+
const user = yield this.userService.getUserByEmail(email);
|
|
94
|
+
return user
|
|
95
|
+
? {
|
|
96
|
+
id: user.id,
|
|
97
|
+
email,
|
|
98
|
+
username: user.username,
|
|
99
|
+
isTrustedParty: user.haveTp,
|
|
100
|
+
isMe: user.isCurrentUser,
|
|
101
|
+
}
|
|
102
|
+
: null;
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
inviteTrustedParty(invite) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
const params = {
|
|
112
|
+
responderUsername: invite.party.username,
|
|
113
|
+
email: invite.party.email,
|
|
114
|
+
message: {
|
|
115
|
+
name: invite.party.name,
|
|
116
|
+
email: invite.party.email,
|
|
117
|
+
message: invite.party.message,
|
|
118
|
+
permissions: invite.permissions,
|
|
119
|
+
},
|
|
120
|
+
contactCard: {
|
|
121
|
+
plainOwnerCipherDataJson: null,
|
|
122
|
+
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
123
|
+
ownerPlainData: {
|
|
124
|
+
name: new ContactCardName(invite.mySharedDetails.name),
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
yield this.keyExchangeService.initiateOtk(params);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
cancelInvitation(inviteId) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
yield this.lrApollo.mutate({
|
|
134
|
+
mutation: CancelTrustedPartyInvitationMutation,
|
|
135
|
+
variables: {
|
|
136
|
+
input: {
|
|
137
|
+
id: inviteId,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
getInvitation(inviteId, inviteToken, key) {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
const exchange = yield this.keyExchangeService.getKeyExchange(inviteId, {
|
|
146
|
+
token: inviteToken,
|
|
147
|
+
otKeyK: key,
|
|
148
|
+
});
|
|
149
|
+
return this.mapInvite(exchange);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
acceptInvitation(invite) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
const params = {
|
|
155
|
+
id: invite.inviteId,
|
|
156
|
+
token: invite.inviteToken,
|
|
157
|
+
decryptedOtk: invite.decryptedOtk,
|
|
158
|
+
initiatorContactCard: null,
|
|
159
|
+
responderContactCard: {
|
|
160
|
+
plainOwnerCipherDataJson: null,
|
|
161
|
+
plainSharedCipherDataJson: invite.mySharedDetails,
|
|
162
|
+
ownerPlainData: {
|
|
163
|
+
name: new ContactCardName(invite.mySharedDetails.name),
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
const { tp } = yield this.keyExchangeService.respondOtk(params);
|
|
168
|
+
return tp.id;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
declineInvitation(inviteId, inviteToken) {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
yield this.lrApollo.mutate({
|
|
174
|
+
mutation: DeclineTrustedPartyInvitationMutation,
|
|
175
|
+
variables: {
|
|
176
|
+
input: {
|
|
177
|
+
id: inviteId,
|
|
178
|
+
token: inviteToken,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
confirmInvitation(confirm) {
|
|
185
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
const { tp } = yield this.keyExchangeService.completeOtk(confirm.inviteId, confirm.initiatorRootKeyCipher, confirm.initiatorOneTimePbkCipher, null);
|
|
187
|
+
return tp.id;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
removeTrustedParty(partyId) {
|
|
191
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
+
yield this.lrApollo.mutate({
|
|
193
|
+
mutation: DeleteTrustedPartyMutation,
|
|
194
|
+
variables: {
|
|
195
|
+
input: {
|
|
196
|
+
id: partyId,
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
setCategoryAccessLevel(categoryId, keyId, trustedParty, accessLevel) {
|
|
203
|
+
return accessLevel
|
|
204
|
+
? this.shareDirectory(categoryId, keyId, trustedParty, accessLevel)
|
|
205
|
+
: this.unshareDirectory(categoryId, trustedParty.id);
|
|
206
|
+
}
|
|
207
|
+
setRecordAccessLevel(recordId, keyId, trustedParty, accessLevel) {
|
|
208
|
+
return accessLevel
|
|
209
|
+
? this.shareDirectory(recordId, keyId, trustedParty, accessLevel)
|
|
210
|
+
: this.unshareDirectory(recordId, trustedParty.id);
|
|
211
|
+
}
|
|
212
|
+
shareDirectory(directoryId, keyId, trustedParty, accessLevel) {
|
|
213
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
+
const key = yield this.keyGraphService.getKey(keyId);
|
|
215
|
+
const wrappingKey = yield this.keyGraphService.getKey(trustedParty.userSharedKey.sharedKey.id);
|
|
216
|
+
const wrappedKey = yield this.encryptionService.encrypt(wrappingKey.jwk, key.jwk.toJSON(true));
|
|
217
|
+
yield this.lrApollo.mutate({
|
|
218
|
+
mutation: ShareCategoryMutation,
|
|
219
|
+
variables: {
|
|
220
|
+
input: {
|
|
221
|
+
id: directoryId,
|
|
222
|
+
tpId: trustedParty.id,
|
|
223
|
+
accessRole: accessLevel,
|
|
224
|
+
keyId: key.id,
|
|
225
|
+
wrappingKeyId: wrappingKey.id,
|
|
226
|
+
wrappedKey: JSON.stringify(wrappedKey),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
unshareDirectory(directoryId, trustedPartyId) {
|
|
233
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
234
|
+
yield this.lrApollo.mutate({
|
|
235
|
+
mutation: UnshareCategoryMutation,
|
|
236
|
+
variables: {
|
|
237
|
+
input: {
|
|
238
|
+
id: directoryId,
|
|
239
|
+
tpId: trustedPartyId,
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
mapTrustedParty(tp) {
|
|
246
|
+
var _a;
|
|
247
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
+
try {
|
|
249
|
+
const contactCard = tp.sharedContactCard &&
|
|
250
|
+
(yield this.sharedContactCardService.decryptTrustedPartyDetails(tp.sharedContactCard));
|
|
251
|
+
const myContactCard = tp.myContactCard &&
|
|
252
|
+
(yield this.sharedContactCardService.decryptSharedTrustedPartyDetails(tp.myContactCard));
|
|
253
|
+
return {
|
|
254
|
+
id: tp.id,
|
|
255
|
+
type: TrustedPartyType.User,
|
|
256
|
+
hasScenarios: !!tp.sharedScenarios.edges.length,
|
|
257
|
+
hasSharedVault: !!tp.sharedItems.directories.edges.length,
|
|
258
|
+
name: contactCard && contactCard.name && contactCard.name.name,
|
|
259
|
+
details: contactCard,
|
|
260
|
+
mySharedDetails: myContactCard,
|
|
261
|
+
userSharedKey: tp.currentUserSharedKey.userSharedKey,
|
|
262
|
+
username: tp.other.username,
|
|
263
|
+
features: {
|
|
264
|
+
sharedVault: {
|
|
265
|
+
hasAccess: (((_a = tp.other.features) === null || _a === void 0 ? void 0 : _a.shareVault) || ['noaccess'])[0] === 'access',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
console.error('Failed to decrypt Trusted Party.', e, tp);
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
mapInvite(exchange) {
|
|
277
|
+
var _a, _b;
|
|
278
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
const contactCard = exchange.contactCard;
|
|
280
|
+
const name = exchange.isInitiator
|
|
281
|
+
? (_a = exchange.myMessage) === null || _a === void 0 ? void 0 : _a.name : contactCard && contactCard.name && contactCard.name.name;
|
|
282
|
+
const email = exchange.isInitiator
|
|
283
|
+
? (_b = exchange.myMessage) === null || _b === void 0 ? void 0 : _b.email : (contactCard && contactCard.email) || exchange.responderEmailAddress;
|
|
284
|
+
return {
|
|
285
|
+
id: exchange.id,
|
|
286
|
+
type: TrustedPartyType.User,
|
|
287
|
+
status: exchange.state,
|
|
288
|
+
token: exchange.token,
|
|
289
|
+
tokenExpiry: exchange.tokenExpiryTime,
|
|
290
|
+
decryptedOtk: exchange.decryptedOtk,
|
|
291
|
+
name,
|
|
292
|
+
email,
|
|
293
|
+
isSender: exchange.isInitiator,
|
|
294
|
+
actionRequired: exchange.isInitiator
|
|
295
|
+
? exchange.initiatorActionRequired
|
|
296
|
+
: exchange.responderActionRequired,
|
|
297
|
+
rootKeyCipher: exchange.initiatorRootKeyCipher,
|
|
298
|
+
pbkCipher: exchange.otk.initiatorOneTimePbkCipher,
|
|
299
|
+
isExpired: exchange.isExpired,
|
|
300
|
+
details: contactCard,
|
|
301
|
+
message: exchange.message,
|
|
302
|
+
mySharedDetails: exchange.myContactCard,
|
|
303
|
+
mySharedMessage: exchange.myMessage,
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
TrustedPartyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TrustedPartyService_Factory() { return new TrustedPartyService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.LrApolloService), i0.ɵɵinject(i3.SharedContactCardService), i0.ɵɵinject(i4.UserService), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.KeyExchangeService), i0.ɵɵinject(i7.KeyGraphService), i0.ɵɵinject(i8.KeyService), i0.ɵɵinject(i9.KeyFactoryService), i0.ɵɵinject(i10.EncryptionService)); }, token: TrustedPartyService, providedIn: "root" });
|
|
309
|
+
TrustedPartyService.decorators = [
|
|
310
|
+
{ type: Injectable, args: [{
|
|
311
|
+
providedIn: 'root',
|
|
312
|
+
},] }
|
|
313
|
+
];
|
|
314
|
+
TrustedPartyService.ctorParameters = () => [
|
|
315
|
+
{ type: HttpClient },
|
|
316
|
+
{ type: LrApolloService },
|
|
317
|
+
{ type: SharedContactCardService },
|
|
318
|
+
{ type: UserService },
|
|
319
|
+
{ type: LifeReadyAuthService },
|
|
320
|
+
{ type: KeyExchangeService },
|
|
321
|
+
{ type: KeyGraphService },
|
|
322
|
+
{ type: KeyService },
|
|
323
|
+
{ type: KeyFactoryService },
|
|
324
|
+
{ type: EncryptionService }
|
|
325
|
+
];
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL2tjLWNsaWVudC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMscUNBQXFDLEVBQ3JDLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsdUJBQXVCLEdBQ3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQVFMLHdCQUF3QixFQUV4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFF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QXNCO2dCQUM5QyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUI7Z0JBQ2pELFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDN0IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDekIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhO2dCQUN2QyxlQUFlLEVBQUUsUUFBUSxDQUFDLFNBQVM7YUFDcEMsQ0FBQzs7S0FDSDs7OztZQTdWRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTdDUSxVQUFVO1lBU1YsZUFBZTtZQUNmLHdCQUF3QjtZQU14QixXQUFXO1lBTFgsb0JBQW9CO1lBUHBCLGtCQUFrQjtZQVVsQixlQUFlO1lBQ2YsVUFBVTtZQTBCVixpQkFBaUI7WUE1QmpCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEtleUV4Y2hhbmdlU2VydmljZSB9IGZyb20gJy4uL2FwaS9rZXktZXhjaGFuZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRGVjcnlwdGVkS2V5RXhjaGFuZ2UsXHJcbiAgUmVzcG9uZE90a0lucHV0LFxyXG59IGZyb20gJy4uL2FwaS9rZXktZXhjaGFuZ2UudHlwZXMnO1xyXG5pbXBvcnQgeyBMckFwb2xsb1NlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UgfSBmcm9tICcuLi9hcGkvc2hhcmVkLWNvbnRhY3QtY2FyZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlmZVJlYWR5QXV0aFNlcnZpY2UgfSBmcm9tICcuLi9hdXRoL2xpZmUtcmVhZHktYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWNjZXNzTGV2ZWwgfSBmcm9tICcuLi9jYXRlZ29yeS9jYXRlZ29yeS50eXBlcyc7XHJcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2VuY3J5cHRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEtleUdyYXBoU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZ3JhcGguc2VydmljZSc7XHJcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXJzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnRhY3RDYXJkTmFtZSB9IGZyb20gJy4uL3VzZXJzL3Byb2ZpbGUudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIENhbmNlbFRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbixcclxuICBEZWNsaW5lVHJ1c3RlZFBhcnR5SW52aXRhdGlvbk11dGF0aW9uLFxyXG4gIERlbGV0ZVRydXN0ZWRQYXJ0eU11dGF0aW9uLFxyXG4gIEdldEFsbFRydXN0ZWRQYXJ0aWVzUXVlcnksXHJcbiAgR2V0VHJ1c3RlZFBhcnRpZXNRdWVyeSxcclxuICBHZXRUcnVzdGVkUGFydHlRdWVyeSxcclxuICBTaGFyZUNhdGVnb3J5TXV0YXRpb24sXHJcbiAgVW5zaGFyZUNhdGVnb3J5TXV0YXRpb24sXHJcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LmdxbCc7XHJcbmltcG9ydCB7XHJcbiAgQWNjZXB0VHJ1c3RlZFBhcnR5SW52aXRlLFxyXG4gIENvbmZpcm1UcnVzdGVkUGFydHlJbnZpdGUsXHJcbiAgRm91bmRUcnVzdGVkUGFydHksXHJcbiAgSW52aXRlVHJ1c3RlZFBhcnR5LFxyXG4gIFRydXN0ZWRQYXJ0aWVzLFxyXG4gIFRydXN0ZWRQYXJ0eSxcclxuICBUcnVzdGVkUGFydHlJbnZpdGUsXHJcbiAgVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLFxyXG4gIFRydXN0ZWRQYXJ0eVJvbGUsXHJcbiAgVHJ1c3RlZFBhcnR5VHlwZSxcclxuICBUcnVzdGVkUGFydHlSb2xlVHlwZSxcclxufSBmcm9tICcuL3RydXN0ZWQtcGFydHkudHlwZXMnO1xyXG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZmFjdG9yeS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcnVzdGVkUGFydHlTZXJ2aWNlIHtcclxuICBwcml2YXRlIHRydXN0ZWRQYXJ0eVJvbGVzOiBUcnVzdGVkUGFydHlSb2xlW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBsckFwb2xsbzogTHJBcG9sbG9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaGFyZWRDb250YWN0Q2FyZFNlcnZpY2U6IFNoYXJlZENvbnRhY3RDYXJkU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTGlmZVJlYWR5QXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUV4Y2hhbmdlU2VydmljZTogS2V5RXhjaGFuZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlHcmFwaFNlcnZpY2U6IEtleUdyYXBoU2VydmljZSxcclxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcclxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFRydXN0ZWRQYXJ0aWVzKCk6IFByb21pc2U8VHJ1c3RlZFBhcnR5W10+IHtcclxuICAgIGNvbnN0IHsgdHBzIH0gPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PGFueT4oe1xyXG4gICAgICBxdWVyeTogR2V0VHJ1c3RlZFBhcnRpZXNRdWVyeSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICB0cHMuZWRnZXMubWFwKCh4KSA9PiB0aGlzLm1hcFRydXN0ZWRQYXJ0eSh4Lm5vZGUpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBbGxUcnVzdGVkUGFydGllcygpOiBQcm9taXNlPFRydXN0ZWRQYXJ0aWVzPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyKCk7XHJcbiAgICBjb25zdCB7IHRwcywgaW52aXRlcywgc2VudEludml0ZXMgfSA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XHJcbiAgICAgIHF1ZXJ5OiBHZXRBbGxUcnVzdGVkUGFydGllc1F1ZXJ5LFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICB1c2VySWQ6IHVzZXIuaWQsXHJcbiAgICAgICAgaXNFeHBpcmVkOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBhcnRpZXM6IChcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbDxUcnVzdGVkUGFydHk+KFxyXG4gICAgICAgICAgdHBzLmVkZ2VzLm1hcCgoeCkgPT4gdGhpcy5tYXBUcnVzdGVkUGFydHkoeC5ub2RlKSlcclxuICAgICAgICApXHJcbiAgICAgICkuZmlsdGVyKCh4KSA9PiB4KSxcclxuICAgICAgaW52aXRlczogKFxyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eUludml0ZT4oXHJcbiAgICAgICAgICBpbnZpdGVzLmVkZ2VzLm1hcChhc3luYyAoeCkgPT5cclxuICAgICAgICAgICAgdGhpcy5tYXBJbnZpdGUoXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UuZGVjcnlwdEtleUV4Y2hhbmdlKHgubm9kZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguc3RhdHVzICE9PSBUcnVzdGVkUGFydHlJbnZpdGVTdGF0dXMuQ29tcGxldGVkKVxyXG4gICAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgeC5zdGF0dXMgIT09IFRydXN0ZWRQYXJ0eUludml0ZVN0YXR1cy5JbnZpdGVkIHx8IHguYWN0aW9uUmVxdWlyZWRcclxuICAgICAgICApLFxyXG4gICAgICBzZW50SW52aXRlczogKFxyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsPFRydXN0ZWRQYXJ0eUludml0ZT4oXHJcbiAgICAgICAgICBzZW50SW52aXRlcy5lZGdlcy5tYXAoYXN5bmMgKHgpID0+XHJcbiAgICAgICAgICAgIHRoaXMubWFwSW52aXRlKFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMua2V5RXhjaGFuZ2VTZXJ2aWNlLmRlY3J5cHRLZXlFeGNoYW5nZSh4Lm5vZGUpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICkuZmlsdGVyKCh4KSA9PiB4LnN0YXR1cyAhPT0gVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLkNvbXBsZXRlZCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFRydXN0ZWRQYXJ0eShwYXJ0eUlkOiBzdHJpbmcpOiBQcm9taXNlPFRydXN0ZWRQYXJ0eT4ge1xyXG4gICAgY29uc3QgeyB0cCB9ID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IEdldFRydXN0ZWRQYXJ0eVF1ZXJ5LFxyXG4gICAgICB2YXJpYWJsZXM6IHsgcGFydHlJZCB9LFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5tYXBUcnVzdGVkUGFydHkodHApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFRydXN0ZWRQYXJ0eVJvbGVzKFxyXG4gICAgcm9sZVR5cGU6IFRydXN0ZWRQYXJ0eVJvbGVUeXBlID0gVHJ1c3RlZFBhcnR5Um9sZVR5cGUuR2VuZXJhbFxyXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5Um9sZVtdPiB7XHJcbiAgICBpZiAoIXRoaXMudHJ1c3RlZFBhcnR5Um9sZXMpIHtcclxuICAgICAgdGhpcy50cnVzdGVkUGFydHlSb2xlcyA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQ8VHJ1c3RlZFBhcnR5Um9sZVtdPignL2Fzc2V0cy9tZXRhL3RydXN0ZWQtcGFydHktcm9sZXMuanNvbicpXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcclxuICAgICAgdGhpcy50cnVzdGVkUGFydHlSb2xlcy5maWx0ZXIoKHgpID0+IHgucm9sZVR5cGUgPT09IHJvbGVUeXBlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBmaW5kQnlFbWFpbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxGb3VuZFRydXN0ZWRQYXJ0eT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlckJ5RW1haWwoZW1haWwpO1xyXG5cclxuICAgICAgcmV0dXJuIHVzZXJcclxuICAgICAgICA/IHtcclxuICAgICAgICAgICAgaWQ6IHVzZXIuaWQsXHJcbiAgICAgICAgICAgIGVtYWlsLFxyXG4gICAgICAgICAgICB1c2VybmFtZTogdXNlci51c2VybmFtZSxcclxuICAgICAgICAgICAgaXNUcnVzdGVkUGFydHk6IHVzZXIuaGF2ZVRwLFxyXG4gICAgICAgICAgICBpc01lOiB1c2VyLmlzQ3VycmVudFVzZXIsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbnZpdGVUcnVzdGVkUGFydHkoaW52aXRlOiBJbnZpdGVUcnVzdGVkUGFydHkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgcmVzcG9uZGVyVXNlcm5hbWU6IGludml0ZS5wYXJ0eS51c2VybmFtZSxcclxuICAgICAgZW1haWw6IGludml0ZS5wYXJ0eS5lbWFpbCxcclxuICAgICAgbWVzc2FnZToge1xyXG4gICAgICAgIG5hbWU6IGludml0ZS5wYXJ0eS5uYW1lLFxyXG4gICAgICAgIGVtYWlsOiBpbnZpdGUucGFydHkuZW1haWwsXHJcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLnBhcnR5Lm1lc3NhZ2UsXHJcbiAgICAgICAgcGVybWlzc2lvbnM6IGludml0ZS5wZXJtaXNzaW9ucyxcclxuICAgICAgfSxcclxuICAgICAgY29udGFjdENhcmQ6IHtcclxuICAgICAgICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IG51bGwsXHJcbiAgICAgICAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogaW52aXRlLm15U2hhcmVkRGV0YWlscyxcclxuICAgICAgICBvd25lclBsYWluRGF0YToge1xyXG4gICAgICAgICAgbmFtZTogbmV3IENvbnRhY3RDYXJkTmFtZShpbnZpdGUubXlTaGFyZWREZXRhaWxzLm5hbWUpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgYXdhaXQgdGhpcy5rZXlFeGNoYW5nZVNlcnZpY2UuaW5pdGlhdGVPdGsocGFyYW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxJbnZpdGF0aW9uKGludml0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcclxuICAgICAgbXV0YXRpb246IENhbmNlbFRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkOiBpbnZpdGVJZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0SW52aXRhdGlvbihcclxuICAgIGludml0ZUlkOiBzdHJpbmcsXHJcbiAgICBpbnZpdGVUb2tlbjogc3RyaW5nLFxyXG4gICAga2V5OiBzdHJpbmdcclxuICApOiBQcm9taXNlPFRydXN0ZWRQYXJ0eUludml0ZT4ge1xyXG4gICAgY29uc3QgZXhjaGFuZ2UgPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5nZXRLZXlFeGNoYW5nZShpbnZpdGVJZCwge1xyXG4gICAgICB0b2tlbjogaW52aXRlVG9rZW4sXHJcbiAgICAgIG90S2V5Szoga2V5LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwSW52aXRlKGV4Y2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhY2NlcHRJbnZpdGF0aW9uKFxyXG4gICAgaW52aXRlOiBBY2NlcHRUcnVzdGVkUGFydHlJbnZpdGVcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcGFyYW1zOiBSZXNwb25kT3RrSW5wdXQgPSB7XHJcbiAgICAgIGlkOiBpbnZpdGUuaW52aXRlSWQsXHJcbiAgICAgIHRva2VuOiBpbnZpdGUuaW52aXRlVG9rZW4sXHJcbiAgICAgIGRlY3J5cHRlZE90azogaW52aXRlLmRlY3J5cHRlZE90ayxcclxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmQ6IG51bGwsXHJcbiAgICAgIHJlc3BvbmRlckNvbnRhY3RDYXJkOiB7XHJcbiAgICAgICAgcGxhaW5Pd25lckNpcGhlckRhdGFKc29uOiBudWxsLFxyXG4gICAgICAgIHBsYWluU2hhcmVkQ2lwaGVyRGF0YUpzb246IGludml0ZS5teVNoYXJlZERldGFpbHMsXHJcbiAgICAgICAgb3duZXJQbGFpbkRhdGE6IHtcclxuICAgICAgICAgIG5hbWU6IG5ldyBDb250YWN0Q2FyZE5hbWUoaW52aXRlLm15U2hhcmVkRGV0YWlscy5uYW1lKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB7IHRwIH0gPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5yZXNwb25kT3RrKHBhcmFtcyk7XHJcblxyXG4gICAgcmV0dXJuIHRwLmlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlY2xpbmVJbnZpdGF0aW9uKFxyXG4gICAgaW52aXRlSWQ6IHN0cmluZyxcclxuICAgIGludml0ZVRva2VuOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcclxuICAgICAgbXV0YXRpb246IERlY2xpbmVUcnVzdGVkUGFydHlJbnZpdGF0aW9uTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBpZDogaW52aXRlSWQsXHJcbiAgICAgICAgICB0b2tlbjogaW52aXRlVG9rZW4sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNvbmZpcm1JbnZpdGF0aW9uKFxyXG4gICAgY29uZmlybTogQ29uZmlybVRydXN0ZWRQYXJ0eUludml0ZVxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IHRwIH0gPSBhd2FpdCB0aGlzLmtleUV4Y2hhbmdlU2VydmljZS5jb21wbGV0ZU90ayhcclxuICAgICAgY29uZmlybS5pbnZpdGVJZCxcclxuICAgICAgY29uZmlybS5pbml0aWF0b3JSb290S2V5Q2lwaGVyLFxyXG4gICAgICBjb25maXJtLmluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIsXHJcbiAgICAgIG51bGxcclxuICAgICk7XHJcbiAgICByZXR1cm4gdHAuaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlVHJ1c3RlZFBhcnR5KHBhcnR5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGUoe1xyXG4gICAgICBtdXRhdGlvbjogRGVsZXRlVHJ1c3RlZFBhcnR5TXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBpZDogcGFydHlJZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2F0ZWdvcnlBY2Nlc3NMZXZlbChcclxuICAgIGNhdGVnb3J5SWQ6IHN0cmluZyxcclxuICAgIGtleUlkOiBzdHJpbmcsXHJcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcclxuICAgIGFjY2Vzc0xldmVsPzogQWNjZXNzTGV2ZWxcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhY2Nlc3NMZXZlbFxyXG4gICAgICA/IHRoaXMuc2hhcmVEaXJlY3RvcnkoY2F0ZWdvcnlJZCwga2V5SWQsIHRydXN0ZWRQYXJ0eSwgYWNjZXNzTGV2ZWwpXHJcbiAgICAgIDogdGhpcy51bnNoYXJlRGlyZWN0b3J5KGNhdGVnb3J5SWQsIHRydXN0ZWRQYXJ0eS5pZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVjb3JkQWNjZXNzTGV2ZWwoXHJcbiAgICByZWNvcmRJZDogc3RyaW5nLFxyXG4gICAga2V5SWQ6IHN0cmluZyxcclxuICAgIHRydXN0ZWRQYXJ0eTogVHJ1c3RlZFBhcnR5LFxyXG4gICAgYWNjZXNzTGV2ZWw6IEFjY2Vzc0xldmVsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYWNjZXNzTGV2ZWxcclxuICAgICAgPyB0aGlzLnNoYXJlRGlyZWN0b3J5KHJlY29yZElkLCBrZXlJZCwgdHJ1c3RlZFBhcnR5LCBhY2Nlc3NMZXZlbClcclxuICAgICAgOiB0aGlzLnVuc2hhcmVEaXJlY3RvcnkocmVjb3JkSWQsIHRydXN0ZWRQYXJ0eS5pZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNoYXJlRGlyZWN0b3J5KFxyXG4gICAgZGlyZWN0b3J5SWQ6IHN0cmluZyxcclxuICAgIGtleUlkOiBzdHJpbmcsXHJcbiAgICB0cnVzdGVkUGFydHk6IFRydXN0ZWRQYXJ0eSxcclxuICAgIGFjY2Vzc0xldmVsOiBBY2Nlc3NMZXZlbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaFNlcnZpY2UuZ2V0S2V5KGtleUlkKTtcclxuICAgIGNvbnN0IHdyYXBwaW5nS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaFNlcnZpY2UuZ2V0S2V5KFxyXG4gICAgICB0cnVzdGVkUGFydHkudXNlclNoYXJlZEtleS5zaGFyZWRLZXkuaWRcclxuICAgICk7XHJcbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICB3cmFwcGluZ0tleS5qd2ssXHJcbiAgICAgIGtleS5qd2sudG9KU09OKHRydWUpXHJcbiAgICApO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcclxuICAgICAgbXV0YXRpb246IFNoYXJlQ2F0ZWdvcnlNdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkOiBkaXJlY3RvcnlJZCxcclxuICAgICAgICAgIHRwSWQ6IHRydXN0ZWRQYXJ0eS5pZCxcclxuICAgICAgICAgIGFjY2Vzc1JvbGU6IGFjY2Vzc0xldmVsLFxyXG4gICAgICAgICAga2V5SWQ6IGtleS5pZCxcclxuICAgICAgICAgIHdyYXBwaW5nS2V5SWQ6IHdyYXBwaW5nS2V5LmlkLFxyXG4gICAgICAgICAgd3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkod3JhcHBlZEtleSksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1bnNoYXJlRGlyZWN0b3J5KFxyXG4gICAgZGlyZWN0b3J5SWQ6IHN0cmluZyxcclxuICAgIHRydXN0ZWRQYXJ0eUlkOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlKHtcclxuICAgICAgbXV0YXRpb246IFVuc2hhcmVDYXRlZ29yeU11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgaWQ6IGRpcmVjdG9yeUlkLFxyXG4gICAgICAgICAgdHBJZDogdHJ1c3RlZFBhcnR5SWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG1hcFRydXN0ZWRQYXJ0eSh0cDogYW55KTogUHJvbWlzZTxUcnVzdGVkUGFydHk+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbnRhY3RDYXJkID1cclxuICAgICAgICB0cC5zaGFyZWRDb250YWN0Q2FyZCAmJlxyXG4gICAgICAgIChhd2FpdCB0aGlzLnNoYXJlZENvbnRhY3RDYXJkU2VydmljZS5kZWNyeXB0VHJ1c3RlZFBhcnR5RGV0YWlscyhcclxuICAgICAgICAgIHRwLnNoYXJlZENvbnRhY3RDYXJkXHJcbiAgICAgICAgKSk7XHJcbiAgICAgIGNvbnN0IG15Q29udGFjdENhcmQgPVxyXG4gICAgICAgIHRwLm15Q29udGFjdENhcmQgJiZcclxuICAgICAgICAoYXdhaXQgdGhpcy5zaGFyZWRDb250YWN0Q2FyZFNlcnZpY2UuZGVjcnlwdFNoYXJlZFRydXN0ZWRQYXJ0eURldGFpbHMoXHJcbiAgICAgICAgICB0cC5teUNvbnRhY3RDYXJkXHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiB0cC5pZCxcclxuICAgICAgICB0eXBlOiBUcnVzdGVkUGFydHlUeXBlLlVzZXIsIC8vIFRPRE86IHdoZW4gcGFydG5lcnNcclxuICAgICAgICBoYXNTY2VuYXJpb3M6ICEhdHAuc2hhcmVkU2NlbmFyaW9zLmVkZ2VzLmxlbmd0aCxcclxuICAgICAgICBoYXNTaGFyZWRWYXVsdDogISF0cC5zaGFyZWRJdGVtcy5kaXJlY3Rvcmllcy5lZGdlcy5sZW5ndGgsXHJcbiAgICAgICAgbmFtZTogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWUsXHJcbiAgICAgICAgZGV0YWlsczogY29udGFjdENhcmQsXHJcbiAgICAgICAgbXlTaGFyZWREZXRhaWxzOiBteUNvbnRhY3RDYXJkLFxyXG4gICAgICAgIHVzZXJTaGFyZWRLZXk6IHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXksXHJcbiAgICAgICAgdXNlcm5hbWU6IHRwLm90aGVyLnVzZXJuYW1lLFxyXG4gICAgICAgIGZlYXR1cmVzOiB7XHJcbiAgICAgICAgICBzaGFyZWRWYXVsdDoge1xyXG4gICAgICAgICAgICBoYXNBY2Nlc3M6XHJcbiAgICAgICAgICAgICAgKHRwLm90aGVyLmZlYXR1cmVzPy5zaGFyZVZhdWx0IHx8IFsnbm9hY2Nlc3MnXSlbMF0gPT09ICdhY2Nlc3MnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBUcnVzdGVkIFBhcnR5LicsIGUsIHRwKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG1hcEludml0ZShcclxuICAgIGV4Y2hhbmdlOiBEZWNyeXB0ZWRLZXlFeGNoYW5nZVxyXG4gICk6IFByb21pc2U8VHJ1c3RlZFBhcnR5SW52aXRlPiB7XHJcbiAgICBjb25zdCBjb250YWN0Q2FyZCA9IGV4Y2hhbmdlLmNvbnRhY3RDYXJkO1xyXG4gICAgY29uc3QgbmFtZSA9IGV4Y2hhbmdlLmlzSW5pdGlhdG9yXHJcbiAgICAgID8gZXhjaGFuZ2UubXlNZXNzYWdlPy5uYW1lXHJcbiAgICAgIDogY29udGFjdENhcmQgJiYgY29udGFjdENhcmQubmFtZSAmJiBjb250YWN0Q2FyZC5uYW1lLm5hbWU7XHJcbiAgICBjb25zdCBlbWFpbCA9IGV4Y2hhbmdlLmlzSW5pdGlhdG9yXHJcbiAgICAgID8gZXhjaGFuZ2UubXlNZXNzYWdlPy5lbWFpbFxyXG4gICAgICA6IChjb250YWN0Q2FyZCAmJiBjb250YWN0Q2FyZC5lbWFpbCkgfHwgZXhjaGFuZ2UucmVzcG9uZGVyRW1haWxBZGRyZXNzO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkOiBleGNoYW5nZS5pZCxcclxuICAgICAgdHlwZTogVHJ1c3RlZFBhcnR5VHlwZS5Vc2VyLCAvLyB0b2RvIHdoZW4gcGFydG5lcnNcclxuICAgICAgc3RhdHVzOiAoZXhjaGFuZ2Uuc3RhdGUgYXMgdW5rbm93bikgYXMgVHJ1c3RlZFBhcnR5SW52aXRlU3RhdHVzLFxyXG4gICAgICB0b2tlbjogZXhjaGFuZ2UudG9rZW4sXHJcbiAgICAgIHRva2VuRXhwaXJ5OiBleGNoYW5nZS50b2tlbkV4cGlyeVRpbWUsXHJcbiAgICAgIGRlY3J5cHRlZE90azogZXhjaGFuZ2UuZGVjcnlwdGVkT3RrLFxyXG4gICAgICBuYW1lLFxyXG4gICAgICBlbWFpbCxcclxuICAgICAgaXNTZW5kZXI6IGV4Y2hhbmdlLmlzSW5pdGlhdG9yLFxyXG4gICAgICBhY3Rpb25SZXF1aXJlZDogZXhjaGFuZ2UuaXNJbml0aWF0b3JcclxuICAgICAgICA/IGV4Y2hhbmdlLmluaXRpYXRvckFjdGlvblJlcXVpcmVkXHJcbiAgICAgICAgOiBleGNoYW5nZS5yZXNwb25kZXJBY3Rpb25SZXF1aXJlZCxcclxuICAgICAgcm9vdEtleUNpcGhlcjogZXhjaGFuZ2UuaW5pdGlhdG9yUm9vdEtleUNpcGhlcixcclxuICAgICAgcGJrQ2lwaGVyOiBleGNoYW5nZS5vdGsuaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcixcclxuICAgICAgaXNFeHBpcmVkOiBleGNoYW5nZS5pc0V4cGlyZWQsXHJcbiAgICAgIGRldGFpbHM6IGNvbnRhY3RDYXJkLFxyXG4gICAgICBtZXNzYWdlOiBleGNoYW5nZS5tZXNzYWdlLFxyXG4gICAgICBteVNoYXJlZERldGFpbHM6IGV4Y2hhbmdlLm15Q29udGFjdENhcmQsXHJcbiAgICAgIG15U2hhcmVkTWVzc2FnZTogZXhjaGFuZ2UubXlNZXNzYWdlLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
|