@lifeready/core 9.0.8 → 10.0.0

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.
Files changed (225) hide show
  1. package/fesm2022/lifeready-core.mjs +10522 -0
  2. package/fesm2022/lifeready-core.mjs.map +1 -0
  3. package/package.json +21 -16
  4. package/types/lifeready-core.d.ts +5329 -0
  5. package/bundles/lifeready-core.umd.js +0 -13231
  6. package/bundles/lifeready-core.umd.js.map +0 -1
  7. package/bundles/lifeready-core.umd.min.js +0 -2
  8. package/bundles/lifeready-core.umd.min.js.map +0 -1
  9. package/esm2015/lib/_common/ast.js +0 -41
  10. package/esm2015/lib/_common/deferred-promise.js +0 -24
  11. package/esm2015/lib/_common/exceptions.js +0 -186
  12. package/esm2015/lib/_common/index.js +0 -3
  13. package/esm2015/lib/_common/kc-lodash.js +0 -11
  14. package/esm2015/lib/_common/key.js +0 -28
  15. package/esm2015/lib/_common/queries.gql.js +0 -43
  16. package/esm2015/lib/_common/run-outside-angular.js +0 -80
  17. package/esm2015/lib/_common/storage.js +0 -28
  18. package/esm2015/lib/_common/types.js +0 -2
  19. package/esm2015/lib/_common/utils.js +0 -73
  20. package/esm2015/lib/api/lr-apollo.service.js +0 -47
  21. package/esm2015/lib/api/lr-graphql/index.js +0 -6
  22. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
  23. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
  24. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
  25. package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
  26. package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
  27. package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
  28. package/esm2015/lib/api/query-processor/index.js +0 -3
  29. package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
  30. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
  31. package/esm2015/lib/api/types/graphql.types.js +0 -8
  32. package/esm2015/lib/api/types/index.js +0 -3
  33. package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
  34. package/esm2015/lib/auth/auth.config.js +0 -57
  35. package/esm2015/lib/auth/auth.gql.private.js +0 -85
  36. package/esm2015/lib/auth/auth.service.js +0 -616
  37. package/esm2015/lib/auth/auth.types.js +0 -19
  38. package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
  39. package/esm2015/lib/contact-card/contact-card.service.js +0 -156
  40. package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
  41. package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
  42. package/esm2015/lib/encryption/encryption.service.js +0 -188
  43. package/esm2015/lib/file-upload/file-upload.service.js +0 -70
  44. package/esm2015/lib/file-upload/file-upload.types.js +0 -2
  45. package/esm2015/lib/idle/idle.service.js +0 -159
  46. package/esm2015/lib/idle/idle.types.js +0 -7
  47. package/esm2015/lib/item/item.gql.js +0 -166
  48. package/esm2015/lib/item/item.gql.private.js +0 -41
  49. package/esm2015/lib/item/item.service.js +0 -662
  50. package/esm2015/lib/item/item.types.js +0 -2
  51. package/esm2015/lib/key/key-factory.service.js +0 -226
  52. package/esm2015/lib/key/key-graph.service.js +0 -314
  53. package/esm2015/lib/key/key-meta.service.js +0 -153
  54. package/esm2015/lib/key/key.service.js +0 -124
  55. package/esm2015/lib/key/key.types.js +0 -16
  56. package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
  57. package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
  58. package/esm2015/lib/lbop/lbop.service.js +0 -351
  59. package/esm2015/lib/life-ready.config.js +0 -96
  60. package/esm2015/lib/life-ready.module.js +0 -42
  61. package/esm2015/lib/lock/lock.gql.js +0 -40
  62. package/esm2015/lib/lock/lock.service.js +0 -64
  63. package/esm2015/lib/notification/notification.gql.js +0 -43
  64. package/esm2015/lib/notification/notification.service.js +0 -118
  65. package/esm2015/lib/password/password.gql.js +0 -28
  66. package/esm2015/lib/password/password.service.js +0 -309
  67. package/esm2015/lib/persist/persist.service.js +0 -181
  68. package/esm2015/lib/plan/plan.gql.js +0 -91
  69. package/esm2015/lib/plan/plan.service.js +0 -191
  70. package/esm2015/lib/plan/plan.types.js +0 -2
  71. package/esm2015/lib/profile/profile-details.service.js +0 -261
  72. package/esm2015/lib/profile/profile.gql.js +0 -170
  73. package/esm2015/lib/profile/profile.service.js +0 -166
  74. package/esm2015/lib/profile/profile.types.js +0 -45
  75. package/esm2015/lib/register/register.service.js +0 -173
  76. package/esm2015/lib/register/register.types.js +0 -3
  77. package/esm2015/lib/reminder/reminder.gql.js +0 -27
  78. package/esm2015/lib/reminder/reminder.service.js +0 -85
  79. package/esm2015/lib/reminder/reminder.types.js +0 -2
  80. package/esm2015/lib/scenario/scenario.constants.js +0 -2
  81. package/esm2015/lib/scenario/scenario.controller.js +0 -34
  82. package/esm2015/lib/scenario/scenario.gql.js +0 -90
  83. package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
  84. package/esm2015/lib/scenario/scenario.service.js +0 -679
  85. package/esm2015/lib/scenario/scenario.types.js +0 -2
  86. package/esm2015/lib/server-config/server-config.gql.js +0 -9
  87. package/esm2015/lib/server-config/server-config.service.js +0 -41
  88. package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
  89. package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
  90. package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
  91. package/esm2015/lib/slip39/slip39.service.js +0 -167
  92. package/esm2015/lib/time/time.service.js +0 -152
  93. package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
  94. package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
  95. package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
  96. package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
  97. package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
  98. package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
  99. package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
  100. package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
  101. package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
  102. package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
  103. package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
  104. package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
  105. package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
  106. package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
  107. package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
  108. package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
  109. package/esm2015/lib/two-factor/two-factor.service.js +0 -74
  110. package/esm2015/lib/user/user.gql.js +0 -32
  111. package/esm2015/lib/user/user.service.js +0 -58
  112. package/esm2015/lib/user/user.types.js +0 -2
  113. package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
  114. package/esm2015/lifeready-core.js +0 -17
  115. package/esm2015/public-api.js +0 -60
  116. package/fesm2015/lifeready-core.js +0 -10970
  117. package/fesm2015/lifeready-core.js.map +0 -1
  118. package/lib/_common/ast.d.ts +0 -11
  119. package/lib/_common/deferred-promise.d.ts +0 -12
  120. package/lib/_common/exceptions.d.ts +0 -126
  121. package/lib/_common/index.d.ts +0 -2
  122. package/lib/_common/kc-lodash.d.ts +0 -5
  123. package/lib/_common/key.d.ts +0 -14
  124. package/lib/_common/queries.gql.d.ts +0 -4
  125. package/lib/_common/run-outside-angular.d.ts +0 -14
  126. package/lib/_common/storage.d.ts +0 -13
  127. package/lib/_common/types.d.ts +0 -15
  128. package/lib/_common/utils.d.ts +0 -12
  129. package/lib/api/lr-apollo.service.d.ts +0 -15
  130. package/lib/api/lr-graphql/index.d.ts +0 -5
  131. package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
  132. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
  133. package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
  134. package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
  135. package/lib/api/lr-graphql/lr.service.d.ts +0 -9
  136. package/lib/api/query-processor/common-processors.service.d.ts +0 -36
  137. package/lib/api/query-processor/index.d.ts +0 -2
  138. package/lib/api/query-processor/query-processor.service.d.ts +0 -18
  139. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
  140. package/lib/api/types/graphql.types.d.ts +0 -30
  141. package/lib/api/types/index.d.ts +0 -2
  142. package/lib/api/types/lr-graphql.types.d.ts +0 -807
  143. package/lib/auth/auth.config.d.ts +0 -5
  144. package/lib/auth/auth.gql.private.d.ts +0 -25
  145. package/lib/auth/auth.service.d.ts +0 -72
  146. package/lib/auth/auth.types.d.ts +0 -70
  147. package/lib/contact-card/contact-card.gql.d.ts +0 -7
  148. package/lib/contact-card/contact-card.service.d.ts +0 -53
  149. package/lib/contact-card/contact-card2.gql.d.ts +0 -25
  150. package/lib/contact-card/contact-card2.service.d.ts +0 -64
  151. package/lib/encryption/encryption.service.d.ts +0 -42
  152. package/lib/file-upload/file-upload.service.d.ts +0 -15
  153. package/lib/file-upload/file-upload.types.d.ts +0 -5
  154. package/lib/idle/idle.service.d.ts +0 -47
  155. package/lib/idle/idle.types.d.ts +0 -10
  156. package/lib/item/item.gql.d.ts +0 -134
  157. package/lib/item/item.gql.private.d.ts +0 -35
  158. package/lib/item/item.service.d.ts +0 -201
  159. package/lib/item/item.types.d.ts +0 -95
  160. package/lib/key/key-factory.service.d.ts +0 -40
  161. package/lib/key/key-graph.service.d.ts +0 -41
  162. package/lib/key/key-meta.service.d.ts +0 -51
  163. package/lib/key/key.service.d.ts +0 -36
  164. package/lib/key/key.types.d.ts +0 -86
  165. package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
  166. package/lib/key-exchange/key-exchange.service.d.ts +0 -179
  167. package/lib/lbop/lbop.service.d.ts +0 -99
  168. package/lib/life-ready.config.d.ts +0 -26
  169. package/lib/life-ready.module.d.ts +0 -5
  170. package/lib/lock/lock.gql.d.ts +0 -27
  171. package/lib/lock/lock.service.d.ts +0 -34
  172. package/lib/notification/notification.gql.d.ts +0 -37
  173. package/lib/notification/notification.service.d.ts +0 -64
  174. package/lib/password/password.gql.d.ts +0 -3
  175. package/lib/password/password.service.d.ts +0 -79
  176. package/lib/persist/persist.service.d.ts +0 -31
  177. package/lib/plan/plan.gql.d.ts +0 -69
  178. package/lib/plan/plan.service.d.ts +0 -111
  179. package/lib/plan/plan.types.d.ts +0 -16
  180. package/lib/profile/profile-details.service.d.ts +0 -20
  181. package/lib/profile/profile.gql.d.ts +0 -21
  182. package/lib/profile/profile.service.d.ts +0 -32
  183. package/lib/profile/profile.types.d.ts +0 -121
  184. package/lib/register/register.service.d.ts +0 -25
  185. package/lib/register/register.types.d.ts +0 -6
  186. package/lib/reminder/reminder.gql.d.ts +0 -23
  187. package/lib/reminder/reminder.service.d.ts +0 -33
  188. package/lib/reminder/reminder.types.d.ts +0 -17
  189. package/lib/scenario/scenario.constants.d.ts +0 -1
  190. package/lib/scenario/scenario.controller.d.ts +0 -10
  191. package/lib/scenario/scenario.gql.d.ts +0 -78
  192. package/lib/scenario/scenario.private.gql.d.ts +0 -16
  193. package/lib/scenario/scenario.service.d.ts +0 -655
  194. package/lib/scenario/scenario.types.d.ts +0 -64
  195. package/lib/server-config/server-config.gql.d.ts +0 -5
  196. package/lib/server-config/server-config.service.d.ts +0 -9
  197. package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
  198. package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
  199. package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
  200. package/lib/slip39/slip39.service.d.ts +0 -42
  201. package/lib/time/time.service.d.ts +0 -26
  202. package/lib/tp-assembly/tp-assembly.d.ts +0 -177
  203. package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
  204. package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
  205. package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
  206. package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
  207. package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
  208. package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
  209. package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
  210. package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
  211. package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
  212. package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
  213. package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
  214. package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
  215. package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
  216. package/lib/trusted-party/trusted-party.service.d.ts +0 -192
  217. package/lib/trusted-party/trusted-party.types.d.ts +0 -31
  218. package/lib/two-factor/two-factor.service.d.ts +0 -15
  219. package/lib/user/user.gql.d.ts +0 -8
  220. package/lib/user/user.service.d.ts +0 -9
  221. package/lib/user/user.types.d.ts +0 -16
  222. package/lib/web-crypto/web-crypto.service.d.ts +0 -5
  223. package/lifeready-core.d.ts +0 -16
  224. package/lifeready-core.metadata.json +0 -1
  225. package/public-api.d.ts +0 -56
@@ -1,679 +0,0 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Injectable, Injector, NgZone } from '@angular/core';
3
- import { LrMergedMutation, LrMutation, LrService } from '../api/lr-graphql';
4
- import { AccessRoleChoice, mapEdges, ScenarioState, TpClaimApproverState, } from '../api/types';
5
- import { EncryptionService } from '../encryption/encryption.service';
6
- import { ItemService } from '../item/item.service';
7
- import { KeyGraphService } from '../key/key-graph.service';
8
- import { TpsKeysQuery } from '../tp-assembly/tp-assembly.private.gql';
9
- import { KcBadArgumentException, KcBadStateException, } from '../_common/exceptions';
10
- import { RunOutsideAngular } from '../_common/run-outside-angular';
11
- import { assertExactlyOne } from '../_common/utils';
12
- import { ScenarioAssemblyController } from './scenario.controller';
13
- import { ApproveScenarioClaimMutation, CancelScenarioClaimMutation, CreateScenarioClaimMutation, CreateScenarioMutation, DebugExpireScenarioClaimMutation, DeleteScenarioMutation, ReceiveScenarioClaimMutation, RejectScenarioClaimMutation, UpdateScenarioMutation, } from './scenario.gql';
14
- import { ScenarioQuery, SharedScenarioQuery } from './scenario.private.gql';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../key/key-graph.service";
17
- import * as i2 from "../item/item.service";
18
- import * as i3 from "./scenario.controller";
19
- import * as i4 from "../encryption/encryption.service";
20
- export function throwClaimIdMismatch() {
21
- throw new KcBadArgumentException('claimId does not match with the current claimId of the scenario');
22
- }
23
- export function throwClaimNotApproved() {
24
- throw new KcBadStateException('Scenario claim has not been approved');
25
- }
26
- let ScenarioService = class ScenarioService extends LrService {
27
- constructor(ngZone, injector, keyGraph, itemService, assemblyController, encryptionService) {
28
- super(injector);
29
- this.ngZone = ngZone;
30
- this.injector = injector;
31
- this.keyGraph = keyGraph;
32
- this.itemService = itemService;
33
- this.assemblyController = assemblyController;
34
- this.encryptionService = encryptionService;
35
- this.prepareAddReceiverDirectory = this.prepareReceiverDirectory;
36
- this.prepareUpdateReceiverDirectory = this.prepareReceiverDirectory;
37
- this.prepareAddReceiverFile = this.prepareReceiverFile;
38
- this.prepareUpdateReceiverFile = this.prepareReceiverFile;
39
- }
40
- // Scenarios
41
- createScenario(options) {
42
- return __awaiter(this, void 0, void 0, function* () {
43
- return this.mutate(this.createScenarioMutation(options));
44
- });
45
- }
46
- createScenarioMutation(options) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- const input = yield this.prepareCreateScenarioMutation(options);
49
- return new LrMutation({
50
- mutation: CreateScenarioMutation,
51
- variables: {
52
- input,
53
- },
54
- });
55
- });
56
- }
57
- updateScenario(options) {
58
- return __awaiter(this, void 0, void 0, function* () {
59
- return this.mutate(this.updateScenarioMutation(options));
60
- });
61
- }
62
- updateScenarioMutation(options) {
63
- return __awaiter(this, void 0, void 0, function* () {
64
- const scenario = (yield this.getScenario(options.scenarioId)).scenario;
65
- const input = yield this.prepareUpdateScenario(options, scenario);
66
- return new LrMutation({
67
- mutation: UpdateScenarioMutation,
68
- variables: {
69
- input,
70
- },
71
- });
72
- });
73
- }
74
- resetScenario(options) {
75
- return __awaiter(this, void 0, void 0, function* () {
76
- return this.mutate(this.resetScenarioMutation(options));
77
- });
78
- }
79
- resetScenarioMutation(options) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- const scenario = (yield this.getScenario(options.scenarioId)).scenario;
82
- const { assembly } = scenario;
83
- // Just need to do an update without changing approvers. This will recreate
84
- // all assembly keys.
85
- const updateSubAssemblies = mapEdges(assembly.subAssemblies).map((sa) => {
86
- const approverTps = mapEdges(sa.approvers).map((approver) => ({
87
- tpId: approver.tp.id,
88
- }));
89
- return {
90
- id: sa.id,
91
- quorum: sa.quorum,
92
- singleReject: sa.singleReject,
93
- subjectCipherDataClearJson: sa.subjectCipherDataClearJson,
94
- approverTps,
95
- };
96
- });
97
- const input = yield this.prepareUpdateScenario({
98
- scenarioId: options.scenarioId,
99
- enabled: options.enabled,
100
- updateAssembly: {
101
- quorum: assembly.quorum,
102
- singleReject: assembly.singleReject,
103
- updateSubAssemblies,
104
- },
105
- }, scenario);
106
- return new LrMutation({
107
- mutation: UpdateScenarioMutation,
108
- variables: {
109
- input,
110
- },
111
- });
112
- });
113
- }
114
- deleteScenario(scenarioId) {
115
- return __awaiter(this, void 0, void 0, function* () {
116
- return this.lrGraphQL.lrMutate(this.deleteScenarioMutation(scenarioId));
117
- });
118
- }
119
- deleteScenarioMutation(scenarioId) {
120
- return __awaiter(this, void 0, void 0, function* () {
121
- return new LrMutation({
122
- mutation: DeleteScenarioMutation,
123
- variables: { input: { scenarioId } },
124
- });
125
- });
126
- }
127
- // Claims
128
- createClaim(scenarioId) {
129
- return __awaiter(this, void 0, void 0, function* () {
130
- return this.mutate(this.createClaimMutation(scenarioId));
131
- });
132
- }
133
- createClaimMutation(scenarioId) {
134
- return __awaiter(this, void 0, void 0, function* () {
135
- return new LrMutation({
136
- mutation: CreateScenarioClaimMutation,
137
- variables: { input: { scenarioId } },
138
- });
139
- });
140
- }
141
- cancelClaim(claimId) {
142
- return __awaiter(this, void 0, void 0, function* () {
143
- return this.mutate(this.cancelClaimMutation(claimId));
144
- });
145
- }
146
- cancelClaimMutation(claimId) {
147
- return __awaiter(this, void 0, void 0, function* () {
148
- return new LrMutation({
149
- mutation: CancelScenarioClaimMutation,
150
- variables: { input: { claimId } },
151
- });
152
- });
153
- }
154
- rejectClaim(sharedScenarioId, claimId) {
155
- return __awaiter(this, void 0, void 0, function* () {
156
- return this.mutate(this.rejectClaimMutation(sharedScenarioId, claimId));
157
- });
158
- }
159
- rejectClaimMutation(sharedScenarioId, claimId) {
160
- return __awaiter(this, void 0, void 0, function* () {
161
- const mutations = yield this.prepareRejectClaimMutations(sharedScenarioId, claimId);
162
- return LrMergedMutation.create(yield Promise.all(mutations));
163
- });
164
- }
165
- approveClaim(sharedScenarioId, sharedClaimId) {
166
- return __awaiter(this, void 0, void 0, function* () {
167
- // TODO this needs a cast so the result is not ANY.
168
- return this.mutate(this.approveClaimMutation(sharedScenarioId, sharedClaimId));
169
- });
170
- }
171
- approveClaimMutation(sharedScenarioId, sharedClaimId) {
172
- return __awaiter(this, void 0, void 0, function* () {
173
- const mutations = yield this.prepareApproveClaimMutations(sharedScenarioId, sharedClaimId);
174
- return LrMergedMutation.create(yield Promise.all(mutations));
175
- });
176
- }
177
- receiveClaim(scenarioId, sharedClaimId) {
178
- return __awaiter(this, void 0, void 0, function* () {
179
- return this.mutate(this.receiveClaim2Mutation(scenarioId, sharedClaimId));
180
- });
181
- }
182
- receiveClaim2Mutation(scenarioId, sharedClaimId) {
183
- return __awaiter(this, void 0, void 0, function* () {
184
- return new LrMutation({
185
- mutation: ReceiveScenarioClaimMutation,
186
- variables: {
187
- input: yield this.prepareReceiveClaim2(scenarioId, sharedClaimId),
188
- },
189
- });
190
- });
191
- }
192
- debugExpireClaim(scenarioId) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- return this.mutate(this.debugExpireClaimMutation(scenarioId));
195
- });
196
- }
197
- debugExpireClaimMutation(scenarioId) {
198
- return __awaiter(this, void 0, void 0, function* () {
199
- return new LrMutation({
200
- mutation: DebugExpireScenarioClaimMutation,
201
- variables: {
202
- input: { scenarioId },
203
- },
204
- });
205
- });
206
- }
207
- // --------------------------------------------------------------------------------
208
- // --------------------------------------------------------------------------------
209
- // Helpers
210
- // --------------------------------------------------------------------------------
211
- // --------------------------------------------------------------------------------
212
- getScenario(scenarioId) {
213
- return __awaiter(this, void 0, void 0, function* () {
214
- return this.query({
215
- query: ScenarioQuery,
216
- variables: { scenarioId },
217
- });
218
- });
219
- }
220
- getSharedScenario(scenarioId, claimId) {
221
- return __awaiter(this, void 0, void 0, function* () {
222
- const ret = yield this.query({
223
- query: SharedScenarioQuery,
224
- variables: {
225
- scenarioId,
226
- },
227
- });
228
- if (claimId && ret.sharedScenario.sharedClaim.id !== claimId) {
229
- throwClaimIdMismatch();
230
- }
231
- return ret;
232
- });
233
- }
234
- getParticipantTpsKeys(options) {
235
- return __awaiter(this, void 0, void 0, function* () {
236
- const tpIds = options.map((x) => x.tpId);
237
- // This should contain all the TPs that we need to update the assembly.
238
- const tps = mapEdges((yield this.lrGraphQL.query({
239
- query: TpsKeysQuery,
240
- variables: {
241
- ids: tpIds,
242
- },
243
- })).tps);
244
- return tps;
245
- });
246
- }
247
- fillTpSharedKeyId(options, tps) {
248
- options.forEach((participant) => {
249
- if (!participant.tpSharedKeyId) {
250
- const tp = tps.find((x) => x.id === participant.tpId);
251
- participant.tpSharedKeyId =
252
- tp.currentUserSharedKey.userSharedKey.sharedKey.id;
253
- }
254
- });
255
- }
256
- prepareCreateScenarioMutation(options) {
257
- return __awaiter(this, void 0, void 0, function* () {
258
- const { assemblyKey, mutationInput: createAssembly } = yield this.assemblyController.prepareCreate(options.createAssembly);
259
- const createReceiversOptions = options.createReceivers || [];
260
- const createClaimantsOptions = options.createClaimants || [];
261
- // Fetch all the TPs so we don't have to pass in tpSharedKeyId
262
- const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
263
- const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
264
- this.fillTpSharedKeyId(creatParticipantsOptions, tps);
265
- const createReceivers = yield Promise.all(createReceiversOptions.map((receiver) => this.prepareCreateReceiver(receiver, assemblyKey)));
266
- const createClaimants = yield Promise.all(createClaimantsOptions.map((x) => this.prepareCreateClaimant(x)));
267
- return {
268
- enabled: options.enabled,
269
- inactiveSeconds: options.inactiveSeconds,
270
- createAssembly,
271
- createReceivers,
272
- createClaimants,
273
- };
274
- });
275
- }
276
- prepareUpdateScenario(options, scenario) {
277
- return __awaiter(this, void 0, void 0, function* () {
278
- let assemblyKey = yield this.keyGraph.getJwkKey(scenario.assembly.assemblyKey.id);
279
- const updateAssembly = options.updateAssembly
280
- ? yield (() => __awaiter(this, void 0, void 0, function* () {
281
- // Assembly key is always rotated when updating assembly.
282
- const result = yield this.assemblyController.prepareUpdate(options.updateAssembly, scenario.assembly);
283
- // Use new assembly key.
284
- assemblyKey = result.assemblyKey;
285
- return result.mutationInput;
286
- }))()
287
- : undefined;
288
- const createReceiversOptions = options.createReceivers || [];
289
- const createClaimantsOptions = options.createClaimants || [];
290
- // Fetch all the TPs so we don't have to pass in tpSharedKeyId
291
- const creatParticipantsOptions = createReceiversOptions.concat(createClaimantsOptions);
292
- const tps = yield this.getParticipantTpsKeys(creatParticipantsOptions);
293
- this.fillTpSharedKeyId(creatParticipantsOptions, tps);
294
- const createReceivers = options.createReceivers &&
295
- (yield Promise.all(options.createReceivers.map((x) => this.prepareCreateReceiver(x, assemblyKey))));
296
- const existingReceivers = mapEdges(scenario.receivers);
297
- let updateReceivers = options.updateReceivers
298
- ? yield Promise.all(options.updateReceivers.map((updateReceiver) => {
299
- // Find the receiver we are updating
300
- const existingReceiver = existingReceivers.find((x) => x.tp.id === updateReceiver.tpId);
301
- return this.prepareUpdateReceiver(updateReceiver, assemblyKey, existingReceiver);
302
- }))
303
- : [];
304
- // Fill in any missing receivers when updating assembly.
305
- if (options.updateAssembly) {
306
- // Filter out the receivers that will be deleted or already updated.
307
- const existing = existingReceivers.filter((existingReceiver) => !(options.deleteReceivers || []).includes(existingReceiver.tp.id) &&
308
- !updateReceivers.some((updateReceiver) => updateReceiver.tpId === existingReceiver.tp.id));
309
- updateReceivers = updateReceivers.concat(yield this.prepareExistingReceivers(existing, assemblyKey));
310
- }
311
- const createClaimants = options.createClaimants &&
312
- (yield Promise.all(options.createClaimants.map((x) => this.prepareCreateClaimant(x))));
313
- const existingClaimants = mapEdges(scenario.claimants);
314
- const updateClaimants = options.updateClaimants &&
315
- (yield Promise.all(options.updateClaimants.map((x) => {
316
- // Find the claimant we are updating
317
- const claimant = existingClaimants.find((existingClaimant) => existingClaimant.tp.id === x.tpId);
318
- return this.prepareUpdateClaimant(x, claimant.sharedKey.id);
319
- })));
320
- return {
321
- scenarioId: options.scenarioId,
322
- enabled: options.enabled,
323
- inactiveSeconds: options.inactiveSeconds,
324
- updateAssembly,
325
- createReceivers,
326
- updateReceivers,
327
- deleteReceivers: options.deleteReceivers,
328
- createClaimants,
329
- updateClaimants,
330
- deleteClaimants: options.deleteClaimants,
331
- };
332
- });
333
- }
334
- prepareReceiverItem(options) {
335
- return __awaiter(this, void 0, void 0, function* () {
336
- const { receiverItemOptions, receiverSharedKey, assemblyKey, directory, file, } = options;
337
- assertExactlyOne({ directory, file });
338
- const { accessRole } = receiverItemOptions;
339
- if (accessRole == AccessRoleChoice.DENY) {
340
- const ret = {
341
- accessRole,
342
- itemKeyId: null,
343
- wrappedItemKey: null,
344
- sharedCipherData: null,
345
- };
346
- if (directory) {
347
- // Cryptographic access to item is not required.
348
- return Object.assign(Object.assign({}, ret), { directoryId: directory.id });
349
- }
350
- else {
351
- return Object.assign(Object.assign({}, ret), { fileId: file.id });
352
- }
353
- }
354
- else {
355
- // TODO this should be batched
356
- let itemKey;
357
- if (directory) {
358
- itemKey = yield this.itemService.getDirectoryKey(directory.id, directory.keyId);
359
- }
360
- else {
361
- itemKey = yield this.itemService.getFileKey(file.id, file.keyId);
362
- }
363
- let wrappedItemKey = yield this.keyGraph.encryptToString(receiverSharedKey, itemKey.jwk.toJSON(true));
364
- const sharedCipherData = yield this.keyGraph.encryptToString(receiverSharedKey, receiverItemOptions.sharedCipherDataClearJson || '');
365
- wrappedItemKey = yield this.keyGraph.encryptToString(assemblyKey, wrappedItemKey);
366
- const ret = {
367
- accessRole,
368
- itemKeyId: itemKey.id,
369
- wrappedItemKey,
370
- sharedCipherData,
371
- };
372
- if (directory) {
373
- return Object.assign(Object.assign({}, ret), { directoryId: directory.id });
374
- }
375
- else {
376
- return Object.assign(Object.assign({}, ret), { fileId: file.id });
377
- }
378
- }
379
- });
380
- }
381
- prepareReceiverDirectory(options, receiverSharedKey, assemblyKey) {
382
- return __awaiter(this, void 0, void 0, function* () {
383
- return this.prepareReceiverItem({
384
- receiverItemOptions: options,
385
- receiverSharedKey,
386
- assemblyKey,
387
- directory: {
388
- id: options.directoryId,
389
- keyId: options.directoryKeyId,
390
- },
391
- });
392
- });
393
- }
394
- prepareReceiverFile(options, receiverSharedKey, assemblyKey) {
395
- return __awaiter(this, void 0, void 0, function* () {
396
- return this.prepareReceiverItem({
397
- receiverItemOptions: options,
398
- receiverSharedKey,
399
- assemblyKey,
400
- file: {
401
- id: options.fileId,
402
- keyId: options.fileKeyId,
403
- },
404
- });
405
- });
406
- }
407
- prepareCreateReceiver(options, assemblyKey) {
408
- return __awaiter(this, void 0, void 0, function* () {
409
- const { sharedKey, mutationInput } = yield this.prepareCreateParticipant(options);
410
- const addDirectories = options.addDirectories &&
411
- (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey.key, assemblyKey))));
412
- const addFiles = options.addFiles &&
413
- (yield Promise.all(options.addFiles.map((x) => this.prepareAddReceiverFile(x, sharedKey.key, assemblyKey))));
414
- return Object.assign(Object.assign({}, mutationInput), { addDirectories,
415
- addFiles });
416
- });
417
- }
418
- prepareUpdateReceiver(options, assemblyKey, existingReceiver) {
419
- return __awaiter(this, void 0, void 0, function* () {
420
- const sharedKeyId = existingReceiver.sharedKey.id;
421
- const deleteDirectoriesOptions = options.deleteDirectories || [];
422
- const updateDirectoriesOptions = options.updateDirectories || [];
423
- const deleteFilesOptions = options.deleteFiles || [];
424
- const updateFilesOptions = options.updateFiles || [];
425
- // Fill in any missing update directories
426
- mapEdges(existingReceiver.receiverItems.receiverDirectories).forEach((existingDirectory) => {
427
- if (deleteDirectoriesOptions.includes(existingDirectory.directory.id)) {
428
- return;
429
- }
430
- if (updateDirectoriesOptions.find((x) => x.directoryId === existingDirectory.directory.id)) {
431
- return;
432
- }
433
- updateDirectoriesOptions.push({
434
- accessRole: existingDirectory.accessRole,
435
- directoryId: existingDirectory.directory.id,
436
- directoryKeyId: existingDirectory.directory.keyId,
437
- sharedCipherDataClearJson: existingDirectory.sharedCipherDataClearJson,
438
- });
439
- });
440
- // Fill in any missing update files
441
- mapEdges(existingReceiver.receiverItems.receiverFiles).forEach((existingFile) => {
442
- if (deleteFilesOptions.includes(existingFile.file.id)) {
443
- return;
444
- }
445
- if (updateFilesOptions.find((x) => x.fileId === existingFile.file.id)) {
446
- return;
447
- }
448
- updateFilesOptions.push({
449
- accessRole: existingFile.accessRole,
450
- fileId: existingFile.file.id,
451
- fileKeyId: existingFile.file.keyId,
452
- sharedCipherDataClearJson: existingFile.sharedCipherDataClearJson,
453
- });
454
- });
455
- const { sharedKey, mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
456
- const addDirectories = options.addDirectories &&
457
- (yield Promise.all(options.addDirectories.map((x) => this.prepareAddReceiverDirectory(x, sharedKey, assemblyKey))));
458
- const addFiles = options.addFiles &&
459
- (yield Promise.all(options.addFiles.map((x) => this.prepareAddReceiverFile(x, sharedKey, assemblyKey))));
460
- const updateDirectories = yield Promise.all(updateDirectoriesOptions.map((x) => this.prepareUpdateReceiverDirectory(x, sharedKey, assemblyKey)));
461
- const updateFiles = yield Promise.all(updateFilesOptions.map((x) => this.prepareUpdateReceiverFile(x, sharedKey, assemblyKey)));
462
- return Object.assign(Object.assign({}, mutationInput), { addDirectories,
463
- addFiles,
464
- updateDirectories,
465
- updateFiles, deleteDirectories: options.deleteDirectories, deleteFiles: options.deleteFiles });
466
- });
467
- }
468
- prepareExistingReceiver(existingReceiver, assemblyKey) {
469
- return __awaiter(this, void 0, void 0, function* () {
470
- const updateDirectories = mapEdges(existingReceiver.receiverItems.receiverDirectories).map(({ accessRole, sharedCipherDataClearJson, directory }) => ({
471
- accessRole,
472
- sharedCipherDataClearJson,
473
- directoryId: directory.id,
474
- directoryKeyId: directory.keyId,
475
- }));
476
- const updateFiles = mapEdges(existingReceiver.receiverItems.receiverFiles).map(({ accessRole, sharedCipherDataClearJson, file }) => ({
477
- accessRole,
478
- sharedCipherDataClearJson,
479
- fileId: file.id,
480
- fileKeyId: file.keyId,
481
- }));
482
- // Fill it in with existing receiver.
483
- return this.prepareUpdateReceiver({
484
- tpId: existingReceiver.tp.id,
485
- sharedCipherDataClearJson: existingReceiver.sharedCipherDataClearJson,
486
- updateDirectories,
487
- updateFiles,
488
- }, assemblyKey, existingReceiver);
489
- });
490
- }
491
- prepareExistingReceivers(existingReceivers, assemblyKey) {
492
- return __awaiter(this, void 0, void 0, function* () {
493
- return Promise.all(existingReceivers.map((existingReceiver) => this.prepareExistingReceiver(existingReceiver, assemblyKey)));
494
- });
495
- }
496
- prepareCreateParticipant(options) {
497
- return __awaiter(this, void 0, void 0, function* () {
498
- const sharedKey = yield this.keyGraph.encryptWithNewKey(options.tpSharedKeyId, options.sharedCipherDataClearJson || '');
499
- return {
500
- sharedKey,
501
- mutationInput: {
502
- tpId: options.tpId,
503
- tpSharedKeyId: options.tpSharedKeyId,
504
- tpSharedKeyWrappedSharedKey: sharedKey.wrappedKey,
505
- sharedCipherData: sharedKey.cipher,
506
- },
507
- };
508
- });
509
- }
510
- prepareUpdateParticipant(options, sharedKeyId) {
511
- return __awaiter(this, void 0, void 0, function* () {
512
- const sharedKey = yield this.keyGraph.getJwkKey(sharedKeyId);
513
- const sharedCipherData = yield this.keyGraph.encryptToString(sharedKey, options.sharedCipherDataClearJson || '');
514
- return {
515
- sharedKey,
516
- mutationInput: {
517
- tpId: options.tpId,
518
- sharedKeyId,
519
- sharedCipherData,
520
- },
521
- };
522
- });
523
- }
524
- prepareCreateClaimant(options) {
525
- return __awaiter(this, void 0, void 0, function* () {
526
- const { mutationInput } = yield this.prepareCreateParticipant(options);
527
- return mutationInput;
528
- });
529
- }
530
- prepareUpdateClaimant(options, sharedKeyId) {
531
- return __awaiter(this, void 0, void 0, function* () {
532
- const { mutationInput } = yield this.prepareUpdateParticipant(options, sharedKeyId);
533
- return mutationInput;
534
- });
535
- }
536
- prepareReceiveClaim2(scenarioId, sharedClaimId) {
537
- return __awaiter(this, void 0, void 0, function* () {
538
- // Get all the shared items
539
- const sharedScenario = (yield this.getSharedScenario(scenarioId, sharedClaimId)).sharedScenario;
540
- if (sharedScenario.state !== ScenarioState.APPROVED) {
541
- throwClaimNotApproved();
542
- }
543
- const approvals = mapEdges(sharedScenario.sharedClaim.asClaimReceiver.approvals);
544
- const assemblyKey = yield this.recoverAssemblyKey(approvals);
545
- // Wrap assembly key with shared key.
546
- //???
547
- // This sharedKey is created just for this scenario. It's wrapped by the tpSharedKey.
548
- const sharedKey = yield this.keyGraph.getKey(sharedScenario.asReceiver.sharedKey.id);
549
- const sharedKeyWrappedAssemblyKey = yield this.keyGraph.encryptToString(sharedKey, assemblyKey.toJSON(true));
550
- return {
551
- scenarioClaimId: sharedClaimId,
552
- sharedKeyWrappedAssemblyKey,
553
- sharedKeyId: sharedKey.id,
554
- assemblyKeyId: sharedScenario.sharedClaim.asClaimReceiver.assemblyKeyId,
555
- };
556
- });
557
- }
558
- // async prepareReceiveClaim(scenarioId: string, sharedClaimId: string) {
559
- // // Get all the shared items
560
- // const sharedScenario = (
561
- // await this.getSharedScenario(scenarioId, sharedClaimId)
562
- // ).sharedScenario;
563
- // if (sharedScenario.state !== ScenarioState.APPROVED) {
564
- // throwClaimNotApproved();
565
- // }
566
- // const approvals = mapEdges(
567
- // sharedScenario.sharedClaim.asClaimReceiver.approvals
568
- // );
569
- // const assemblyKey = await this.recoverAssemblyKey(approvals);
570
- // // Decrypt all items
571
- // const receiverDirectories = await Promise.all(
572
- // sharedScenario.asReceiver.receiverItems.receiverDirectories.edges
573
- // .map((edge) => edge.node)
574
- // .map(async (receiverDirectory) => {
575
- // const wrappedItemKey = await this.encryptionService.decrypt(
576
- // assemblyKey,
577
- // receiverDirectory.wrappedItemKey
578
- // );
579
- // return {
580
- // receiverDirectoryId: receiverDirectory.id,
581
- // // Looks like receiverDirectory.wrappedItemKey has no other content in side it except a wrapped key.
582
- // // So we can turn this in to a doubly wrapped key and just release the assembly key.
583
- // receiverSharedKeyWrappedItemKey: wrappedItemKey, // the wrappedItemKey is already wrapped by receiverSharedKey
584
- // };
585
- // })
586
- // );
587
- // return {
588
- // scenarioClaimId: sharedClaimId,
589
- // receiverDirectories,
590
- // };
591
- // }
592
- recoverAssemblyKey(approvals) {
593
- return __awaiter(this, void 0, void 0, function* () {
594
- const partials = yield Promise.all(approvals.map((approval) => this.keyGraph.decryptFromString(approval.pxk.id, approval.receiverCipherPartialAssemblyKey)));
595
- return this.assemblyController.recoverAssemblyKey(partials);
596
- });
597
- }
598
- asClaimApprovers(sharedScenarioId, claimId, state) {
599
- return __awaiter(this, void 0, void 0, function* () {
600
- const sharedScenario = (yield this.getSharedScenario(sharedScenarioId, claimId)).sharedScenario;
601
- return mapEdges(sharedScenario.sharedClaim.claim.asClaimApprovers).filter((asClaimApprover) => asClaimApprover.state === state);
602
- });
603
- }
604
- prepareApproveClaimMutations(sharedScenarioId, claimId) {
605
- return __awaiter(this, void 0, void 0, function* () {
606
- // The current user may be acting as approvers in multiple sub-assemblies so
607
- // we approve them all.
608
- const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
609
- return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
610
- return new LrMutation({
611
- mutation: ApproveScenarioClaimMutation,
612
- variables: {
613
- input: yield this.prepareApproveClaim(asClaimApprover),
614
- },
615
- });
616
- }));
617
- });
618
- }
619
- prepareApproveClaim(asClaimApprover) {
620
- return __awaiter(this, void 0, void 0, function* () {
621
- const receiverApprovals = yield Promise.all(mapEdges(asClaimApprover.receiverApprovals).map((receiverApproval) => this.prepareReceiverApproval({
622
- receiverApprovalId: receiverApproval.id,
623
- receiverApprovalPxkId: receiverApproval.pxk.id,
624
- sharedCipherPartialAssemblyKeyClearJson: asClaimApprover.sharedCipherPartialAssemblyKeyClearJson,
625
- })));
626
- return {
627
- claimApproverId: asClaimApprover.id,
628
- receiverApprovals,
629
- };
630
- });
631
- }
632
- prepareReceiverApproval(options) {
633
- return __awaiter(this, void 0, void 0, function* () {
634
- return {
635
- receiverApprovalId: options.receiverApprovalId,
636
- // TODO allow sending of messages to receiver.
637
- receiverCipher: '',
638
- receiverCipherPartialAssemblyKey: yield this.keyGraph.encryptToString(options.receiverApprovalPxkId, options.sharedCipherPartialAssemblyKeyClearJson),
639
- };
640
- });
641
- }
642
- prepareRejectClaimMutations(sharedScenarioId, claimId) {
643
- return __awaiter(this, void 0, void 0, function* () {
644
- // The current user may be acting as approvers in multiple sub-assemblies so
645
- // we reject them all.
646
- const asClaimApprovers = yield this.asClaimApprovers(sharedScenarioId, claimId, TpClaimApproverState.CLAIMED);
647
- return asClaimApprovers.map((asClaimApprover) => __awaiter(this, void 0, void 0, function* () {
648
- return new LrMutation({
649
- mutation: RejectScenarioClaimMutation,
650
- variables: {
651
- input: { claimApproverId: asClaimApprover.id },
652
- },
653
- });
654
- }));
655
- });
656
- }
657
- };
658
- ScenarioService.SLIP39_PASSPHRASE = 'lifeready';
659
- ScenarioService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ScenarioService_Factory() { return new ScenarioService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyGraphService), i0.ɵɵinject(i2.ItemService), i0.ɵɵinject(i3.ScenarioAssemblyController), i0.ɵɵinject(i4.EncryptionService)); }, token: ScenarioService, providedIn: "root" });
660
- ScenarioService.decorators = [
661
- { type: Injectable, args: [{
662
- providedIn: 'root',
663
- },] }
664
- ];
665
- ScenarioService.ctorParameters = () => [
666
- { type: NgZone },
667
- { type: Injector },
668
- { type: KeyGraphService },
669
- { type: ItemService },
670
- { type: ScenarioAssemblyController },
671
- { type: EncryptionService }
672
- ];
673
- ScenarioService = __decorate([
674
- RunOutsideAngular({
675
- ngZoneName: 'ngZone',
676
- })
677
- ], ScenarioService);
678
- export { ScenarioService };
679
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmFyaW8uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9zY2VuYXJpby9zY2VuYXJpby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLFFBQVEsRUFHUixhQUFhLEVBR2Isb0JBQW9CLEdBRXJCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXRFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMsc0JBQXNCLEVBQ3RCLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0Isc0JBQXNCLEdBQ3ZCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFF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Q0YsQ0FBQztRQUNKLENBQUM7S0FBQTtJQUVhLDJCQUEyQixDQUN2QyxnQkFBd0IsRUFDeEIsT0FBZTs7WUFFZiw0RUFBNEU7WUFDNUUsc0JBQXNCO1lBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQ2xELGdCQUFnQixFQUNoQixPQUFPLEVBQ1Asb0JBQW9CLENBQUMsT0FBTyxDQUM3QixDQUFDO1lBRUYsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQ3pCLENBQU8sZUFBZSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQUEsSUFBSSxVQUFVLENBQUM7b0JBQ2IsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsU0FBUyxFQUFFO3dCQUNULEtBQUssRUFBRSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsRUFBRSxFQUFFO3FCQUMvQztpQkFDRixDQUFDLENBQUE7Y0FBQSxDQUNMLENBQUM7UUFDSixDQUFDO0tBQUE7Q0FDRixDQUFBO0FBLzRCZSxpQ0FBaUIsR0FBRyxXQUFXLENBQUM7OztZQWQvQyxVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQXRFOEIsTUFBTTtZQUFoQixRQUFRO1lBa0JwQixlQUFlO1lBRmYsV0FBVztZQVdYLDBCQUEwQjtZQVoxQixpQkFBaUI7O0FBd0RiLGVBQWU7SUFOM0IsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLGVBQWUsQ0EwNUIzQjtTQTE1QlksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEpXSyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBMck1lcmdlZE11dGF0aW9uLCBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQge1xuICBBY2Nlc3NSb2xlQ2hvaWNlLFxuICBKU09OT2JqZWN0LFxuICBtYXBFZGdlcyxcbiAgU2NlbmFyaW9Ob2RlLFxuICBTY2VuYXJpb1JlY2VpdmVyTm9kZSxcbiAgU2NlbmFyaW9TdGF0ZSxcbiAgU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlLFxuICBTaGFyZWRUcENsYWltQXBwcm92ZXJOb2RlLFxuICBUcENsYWltQXBwcm92ZXJTdGF0ZSxcbiAgVHBOb2RlLFxufSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJdGVtU2VydmljZSB9IGZyb20gJy4uL2l0ZW0vaXRlbS5zZXJ2aWNlJztcbmltcG9ydCB7IElkS2V5UGFpciB9IGZyb20gJy4uL2l0ZW0vaXRlbS50eXBlcyc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHBzS2V5c1F1ZXJ5IH0gZnJvbSAnLi4vdHAtYXNzZW1ibHkvdHAtYXNzZW1ibHkucHJpdmF0ZS5ncWwnO1xuaW1wb3J0IHsgUGFydGlhbEFzc2VtYmx5S2V5IH0gZnJvbSAnLi4vdHAtYXNzZW1ibHkvdHAtYXNzZW1ibHkudHlwZXMnO1xuaW1wb3J0IHtcbiAgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbixcbiAgS2NCYWRTdGF0ZUV4Y2VwdGlvbixcbn0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7IGFzc2VydEV4YWN0bHlPbmUgfSBmcm9tICcuLi9fY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyIH0gZnJvbSAnLi9zY2VuYXJpby5jb250cm9sbGVyJztcbmltcG9ydCB7XG4gIEFwcHJvdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gIENhbmNlbFNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgQ3JlYXRlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICBDcmVhdGVTY2VuYXJpb011dGF0aW9uLFxuICBEZWJ1Z0V4cGlyZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgRGVsZXRlU2NlbmFyaW9NdXRhdGlvbixcbiAgUmVjZWl2ZVNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgUmVqZWN0U2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxufSBmcm9tICcuL3NjZW5hcmlvLmdxbCc7XG5pbXBvcnQgeyBTY2VuYXJpb1F1ZXJ5LCBTaGFyZWRTY2VuYXJpb1F1ZXJ5IH0gZnJvbSAnLi9zY2VuYXJpby5wcml2YXRlLmdxbCc7XG5pbXBvcnQge1xuICBDcmVhdGVDbGFpbWFudE9wdGlvbnMsXG4gIENyZWF0ZVBhcnRpY2lwYW50T3B0aW9ucyxcbiAgQ3JlYXRlUmVjZWl2ZXJPcHRpb25zLFxuICBDcmVhdGVTY2VuYXJpb09wdGlvbnMsXG4gIFBhcnRpY2lwYW50T3B0aW9ucyxcbiAgUmVjZWl2ZXJEaXJlY3RvcnlPcHRpb25zLFxuICBSZWNlaXZlckZpbGVPcHRpb25zLFxuICBSZWNlaXZlckl0ZW1PcHRpb25zLFxuICBSZXNldFNjZW5hcmlvT3B0aW9ucyxcbiAgVXBkYXRlQ2xhaW1hbnRPcHRpb25zLFxuICBVcGRhdGVSZWNlaXZlck9wdGlvbnMsXG4gIFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcbn0gZnJvbSAnLi9zY2VuYXJpby50eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0NsYWltSWRNaXNtYXRjaCgpIHtcbiAgdGhyb3cgbmV3IEtjQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgJ2NsYWltSWQgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgY3VycmVudCBjbGFpbUlkIG9mIHRoZSBzY2VuYXJpbydcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93Q2xhaW1Ob3RBcHByb3ZlZCgpIHtcbiAgdGhyb3cgbmV3IEtjQmFkU3RhdGVFeGNlcHRpb24oJ1NjZW5hcmlvIGNsYWltIGhhcyBub3QgYmVlbiBhcHByb3ZlZCcpO1xufVxuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NlbmFyaW9TZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhc3NlbWJseUNvbnRyb2xsZXI6IFNjZW5hcmlvQXNzZW1ibHlDb250cm9sbGVyLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIFNMSVAzOV9QQVNTUEhSQVNFID0gJ2xpZmVyZWFkeSc7XG5cbiAgcHJpdmF0ZSBwcmVwYXJlQWRkUmVjZWl2ZXJEaXJlY3RvcnkgPSB0aGlzLnByZXBhcmVSZWNlaXZlckRpcmVjdG9yeTtcbiAgcHJpdmF0ZSBwcmVwYXJlVXBkYXRlUmVjZWl2ZXJEaXJlY3RvcnkgPSB0aGlzLnByZXBhcmVSZWNlaXZlckRpcmVjdG9yeTtcblxuICBwcml2YXRlIHByZXBhcmVBZGRSZWNlaXZlckZpbGUgPSB0aGlzLnByZXBhcmVSZWNlaXZlckZpbGU7XG4gIHByaXZhdGUgcHJlcGFyZVVwZGF0ZVJlY2VpdmVyRmlsZSA9IHRoaXMucHJlcGFyZVJlY2VpdmVyRmlsZTtcblxuICAvLyBTY2VuYXJpb3NcbiAgYXN5bmMgY3JlYXRlU2NlbmFyaW8ob3B0aW9uczogQ3JlYXRlU2NlbmFyaW9PcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IENyZWF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKTtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENyZWF0ZVNjZW5hcmlvTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlU2NlbmFyaW8ob3B0aW9uczogVXBkYXRlU2NlbmFyaW9PcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMudXBkYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucykge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gKGF3YWl0IHRoaXMuZ2V0U2NlbmFyaW8ob3B0aW9ucy5zY2VuYXJpb0lkKSkuc2NlbmFyaW87XG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVTY2VuYXJpbyhvcHRpb25zLCBzY2VuYXJpbyk7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVTY2VuYXJpb011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0U2NlbmFyaW8ob3B0aW9uczogUmVzZXRTY2VuYXJpb09wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZXNldFNjZW5hcmlvTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRTY2VuYXJpb011dGF0aW9uKG9wdGlvbnM6IFJlc2V0U2NlbmFyaW9PcHRpb25zKSB7XG4gICAgY29uc3Qgc2NlbmFyaW8gPSAoYXdhaXQgdGhpcy5nZXRTY2VuYXJpbyhvcHRpb25zLnNjZW5hcmlvSWQpKS5zY2VuYXJpbztcblxuICAgIGNvbnN0IHsgYXNzZW1ibHkgfSA9IHNjZW5hcmlvO1xuXG4gICAgLy8gSnVzdCBuZWVkIHRvIGRvIGFuIHVwZGF0ZSB3aXRob3V0IGNoYW5naW5nIGFwcHJvdmVycy4gVGhpcyB3aWxsIHJlY3JlYXRlXG4gICAgLy8gYWxsIGFzc2VtYmx5IGtleXMuXG4gICAgY29uc3QgdXBkYXRlU3ViQXNzZW1ibGllcyA9IG1hcEVkZ2VzKGFzc2VtYmx5LnN1YkFzc2VtYmxpZXMpLm1hcCgoc2EpID0+IHtcbiAgICAgIGNvbnN0IGFwcHJvdmVyVHBzID0gbWFwRWRnZXMoc2EuYXBwcm92ZXJzKS5tYXAoKGFwcHJvdmVyKSA9PiAoe1xuICAgICAgICB0cElkOiBhcHByb3Zlci50cC5pZCxcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNhLmlkLFxuICAgICAgICBxdW9ydW06IHNhLnF1b3J1bSxcbiAgICAgICAgc2luZ2xlUmVqZWN0OiBzYS5zaW5nbGVSZWplY3QsXG4gICAgICAgIHN1YmplY3RDaXBoZXJEYXRhQ2xlYXJKc29uOiBzYS5zdWJqZWN0Q2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgYXBwcm92ZXJUcHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVTY2VuYXJpbyhcbiAgICAgIHtcbiAgICAgICAgc2NlbmFyaW9JZDogb3B0aW9ucy5zY2VuYXJpb0lkLFxuICAgICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICAgIHVwZGF0ZUFzc2VtYmx5OiB7XG4gICAgICAgICAgcXVvcnVtOiBhc3NlbWJseS5xdW9ydW0sXG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiBhc3NlbWJseS5zaW5nbGVSZWplY3QsXG4gICAgICAgICAgdXBkYXRlU3ViQXNzZW1ibGllcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzY2VuYXJpb1xuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZVNjZW5hcmlvTXV0YXRpb24sIC8vIHVwZGF0aW5nIHNjZW5hcmlvIHJlc2V0cyBpdFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5sck11dGF0ZSh0aGlzLmRlbGV0ZVNjZW5hcmlvTXV0YXRpb24oc2NlbmFyaW9JZCkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2NlbmFyaW9NdXRhdGlvbihzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IERlbGV0ZVNjZW5hcmlvTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHsgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBDbGFpbXNcbiAgYXN5bmMgY3JlYXRlQ2xhaW0oc2NlbmFyaW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlQ2xhaW1NdXRhdGlvbihzY2VuYXJpb0lkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQ3JlYXRlU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IHNjZW5hcmlvSWQgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY2FuY2VsQ2xhaW0oY2xhaW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY2FuY2VsQ2xhaW1NdXRhdGlvbihjbGFpbUlkKSk7XG4gIH1cblxuICBhc3luYyBjYW5jZWxDbGFpbU11dGF0aW9uKGNsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQ2FuY2VsU2NlbmFyaW9DbGFpbU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGlucHV0OiB7IGNsYWltSWQgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVqZWN0Q2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBjbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZWplY3RDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQsIGNsYWltSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlamVjdENsYWltTXV0YXRpb24oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBjbGFpbUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLnByZXBhcmVSZWplY3RDbGFpbU11dGF0aW9ucyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkXG4gICAgKTtcbiAgICByZXR1cm4gTHJNZXJnZWRNdXRhdGlvbi5jcmVhdGUoYXdhaXQgUHJvbWlzZS5hbGwobXV0YXRpb25zKSk7XG4gIH1cblxuICBhc3luYyBhcHByb3ZlQ2xhaW0oc2hhcmVkU2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPIHRoaXMgbmVlZHMgYSBjYXN0IHNvIHRoZSByZXN1bHQgaXMgbm90IEFOWS5cbiAgICByZXR1cm4gdGhpcy5tdXRhdGUoXG4gICAgICB0aGlzLmFwcHJvdmVDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQsIHNoYXJlZENsYWltSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGFwcHJvdmVDbGFpbU11dGF0aW9uKHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZywgc2hhcmVkQ2xhaW1JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbXV0YXRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlQXBwcm92ZUNsYWltTXV0YXRpb25zKFxuICAgICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICAgIHNoYXJlZENsYWltSWRcbiAgICApO1xuICAgIHJldHVybiBMck1lcmdlZE11dGF0aW9uLmNyZWF0ZShhd2FpdCBQcm9taXNlLmFsbChtdXRhdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHJlY2VpdmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnJlY2VpdmVDbGFpbTJNdXRhdGlvbihzY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKSk7XG4gIH1cblxuICBhc3luYyByZWNlaXZlQ2xhaW0yTXV0YXRpb24oc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFJlY2VpdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZVJlY2VpdmVDbGFpbTIoc2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZCksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVidWdFeHBpcmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5kZWJ1Z0V4cGlyZUNsYWltTXV0YXRpb24oc2NlbmFyaW9JZCkpO1xuICB9XG5cbiAgYXN5bmMgZGVidWdFeHBpcmVDbGFpbU11dGF0aW9uKHNjZW5hcmlvSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogRGVidWdFeHBpcmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHsgc2NlbmFyaW9JZCB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEhlbHBlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBhc3luYyBnZXRTY2VuYXJpbyhzY2VuYXJpb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSh7XG4gICAgICBxdWVyeTogU2NlbmFyaW9RdWVyeSxcbiAgICAgIHZhcmlhYmxlczogeyBzY2VuYXJpb0lkIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFNoYXJlZFNjZW5hcmlvKHNjZW5hcmlvSWQ6IHN0cmluZywgY2xhaW1JZD86IHN0cmluZykge1xuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgcXVlcnk6IFNoYXJlZFNjZW5hcmlvUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgc2NlbmFyaW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoY2xhaW1JZCAmJiByZXQuc2hhcmVkU2NlbmFyaW8uc2hhcmVkQ2xhaW0uaWQgIT09IGNsYWltSWQpIHtcbiAgICAgIHRocm93Q2xhaW1JZE1pc21hdGNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFydGljaXBhbnRUcHNLZXlzKG9wdGlvbnM6IENyZWF0ZVBhcnRpY2lwYW50T3B0aW9uc1tdKSB7XG4gICAgY29uc3QgdHBJZHMgPSBvcHRpb25zLm1hcCgoeCkgPT4geC50cElkKTtcblxuICAgIC8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBUUHMgdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXNzZW1ibHkuXG4gICAgY29uc3QgdHBzID0gbWFwRWRnZXMoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcbiAgICAgICAgICBxdWVyeTogVHBzS2V5c1F1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgaWRzOiB0cElkcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKS50cHNcbiAgICApO1xuXG4gICAgcmV0dXJuIHRwcztcbiAgfVxuXG4gIHByaXZhdGUgZmlsbFRwU2hhcmVkS2V5SWQoXG4gICAgb3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zW10sXG4gICAgdHBzOiBUcE5vZGVbXVxuICApIHtcbiAgICBvcHRpb25zLmZvckVhY2goKHBhcnRpY2lwYW50KSA9PiB7XG4gICAgICBpZiAoIXBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQpIHtcbiAgICAgICAgY29uc3QgdHAgPSB0cHMuZmluZCgoeCkgPT4geC5pZCA9PT0gcGFydGljaXBhbnQudHBJZCk7XG4gICAgICAgIHBhcnRpY2lwYW50LnRwU2hhcmVkS2V5SWQgPVxuICAgICAgICAgIHRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlU2NlbmFyaW9NdXRhdGlvbihvcHRpb25zOiBDcmVhdGVTY2VuYXJpb09wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFzc2VtYmx5S2V5LCBtdXRhdGlvbklucHV0OiBjcmVhdGVBc3NlbWJseSB9ID1cbiAgICAgIGF3YWl0IHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnByZXBhcmVDcmVhdGUob3B0aW9ucy5jcmVhdGVBc3NlbWJseSk7XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgfHwgW107XG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzT3B0aW9ucyA9IG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzIHx8IFtdO1xuXG4gICAgLy8gRmV0Y2ggYWxsIHRoZSBUUHMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXNzIGluIHRwU2hhcmVkS2V5SWRcbiAgICBjb25zdCBjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMgPSBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLmNvbmNhdChcbiAgICAgIGNyZWF0ZUNsYWltYW50c09wdGlvbnNcbiAgICApO1xuXG4gICAgY29uc3QgdHBzID0gYXdhaXQgdGhpcy5nZXRQYXJ0aWNpcGFudFRwc0tleXMoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zKTtcblxuICAgIHRoaXMuZmlsbFRwU2hhcmVkS2V5SWQoY3JlYXRQYXJ0aWNpcGFudHNPcHRpb25zLCB0cHMpO1xuXG4gICAgY29uc3QgY3JlYXRlUmVjZWl2ZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVSZWNlaXZlcnNPcHRpb25zLm1hcCgocmVjZWl2ZXIpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHJlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjcmVhdGVDbGFpbWFudHNPcHRpb25zLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICBpbmFjdGl2ZVNlY29uZHM6IG9wdGlvbnMuaW5hY3RpdmVTZWNvbmRzLFxuICAgICAgY3JlYXRlQXNzZW1ibHksXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXG4gICAgICBjcmVhdGVDbGFpbWFudHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVVwZGF0ZVNjZW5hcmlvKFxuICAgIG9wdGlvbnM6IFVwZGF0ZVNjZW5hcmlvT3B0aW9ucyxcbiAgICBzY2VuYXJpbzogU2NlbmFyaW9Ob2RlXG4gICkge1xuICAgIGxldCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0SndrS2V5KFxuICAgICAgc2NlbmFyaW8uYXNzZW1ibHkuYXNzZW1ibHlLZXkuaWRcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlQXNzZW1ibHkgPSBvcHRpb25zLnVwZGF0ZUFzc2VtYmx5XG4gICAgICA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gQXNzZW1ibHkga2V5IGlzIGFsd2F5cyByb3RhdGVkIHdoZW4gdXBkYXRpbmcgYXNzZW1ibHkuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc3NlbWJseUNvbnRyb2xsZXIucHJlcGFyZVVwZGF0ZShcbiAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlQXNzZW1ibHksXG4gICAgICAgICAgICBzY2VuYXJpby5hc3NlbWJseVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gVXNlIG5ldyBhc3NlbWJseSBrZXkuXG4gICAgICAgICAgYXNzZW1ibHlLZXkgPSByZXN1bHQuYXNzZW1ibHlLZXk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5tdXRhdGlvbklucHV0O1xuICAgICAgICB9KSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNyZWF0ZVJlY2VpdmVyc09wdGlvbnMgPSBvcHRpb25zLmNyZWF0ZVJlY2VpdmVycyB8fCBbXTtcbiAgICBjb25zdCBjcmVhdGVDbGFpbWFudHNPcHRpb25zID0gb3B0aW9ucy5jcmVhdGVDbGFpbWFudHMgfHwgW107XG5cbiAgICAvLyBGZXRjaCBhbGwgdGhlIFRQcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhc3MgaW4gdHBTaGFyZWRLZXlJZFxuICAgIGNvbnN0IGNyZWF0UGFydGljaXBhbnRzT3B0aW9ucyA9IGNyZWF0ZVJlY2VpdmVyc09wdGlvbnMuY29uY2F0KFxuICAgICAgY3JlYXRlQ2xhaW1hbnRzT3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCB0cHMgPSBhd2FpdCB0aGlzLmdldFBhcnRpY2lwYW50VHBzS2V5cyhjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMpO1xuXG4gICAgdGhpcy5maWxsVHBTaGFyZWRLZXlJZChjcmVhdFBhcnRpY2lwYW50c09wdGlvbnMsIHRwcyk7XG5cbiAgICBjb25zdCBjcmVhdGVSZWNlaXZlcnMgPVxuICAgICAgb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy5jcmVhdGVSZWNlaXZlcnMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUNyZWF0ZVJlY2VpdmVyKHgsIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nUmVjZWl2ZXJzID0gbWFwRWRnZXMoc2NlbmFyaW8ucmVjZWl2ZXJzKTtcbiAgICBsZXQgdXBkYXRlUmVjZWl2ZXJzID0gb3B0aW9ucy51cGRhdGVSZWNlaXZlcnNcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgb3B0aW9ucy51cGRhdGVSZWNlaXZlcnMubWFwKCh1cGRhdGVSZWNlaXZlcikgPT4ge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgcmVjZWl2ZXIgd2UgYXJlIHVwZGF0aW5nXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1JlY2VpdmVyID0gZXhpc3RpbmdSZWNlaXZlcnMuZmluZChcbiAgICAgICAgICAgICAgKHgpID0+IHgudHAuaWQgPT09IHVwZGF0ZVJlY2VpdmVyLnRwSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcbiAgICAgICAgICAgICAgdXBkYXRlUmVjZWl2ZXIsXG4gICAgICAgICAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgICAgICAgICBleGlzdGluZ1JlY2VpdmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIDogW107XG5cbiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHJlY2VpdmVycyB3aGVuIHVwZGF0aW5nIGFzc2VtYmx5LlxuICAgIGlmIChvcHRpb25zLnVwZGF0ZUFzc2VtYmx5KSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSByZWNlaXZlcnMgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgb3IgYWxyZWFkeSB1cGRhdGVkLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBleGlzdGluZ1JlY2VpdmVycy5maWx0ZXIoXG4gICAgICAgIChleGlzdGluZ1JlY2VpdmVyKSA9PlxuICAgICAgICAgICEob3B0aW9ucy5kZWxldGVSZWNlaXZlcnMgfHwgW10pLmluY2x1ZGVzKGV4aXN0aW5nUmVjZWl2ZXIudHAuaWQpICYmXG4gICAgICAgICAgIXVwZGF0ZVJlY2VpdmVycy5zb21lKFxuICAgICAgICAgICAgKHVwZGF0ZVJlY2VpdmVyKSA9PiB1cGRhdGVSZWNlaXZlci50cElkID09PSBleGlzdGluZ1JlY2VpdmVyLnRwLmlkXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHVwZGF0ZVJlY2VpdmVycyA9IHVwZGF0ZVJlY2VpdmVycy5jb25jYXQoXG4gICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKGV4aXN0aW5nLCBhc3NlbWJseUtleSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlQ2xhaW1hbnRzID1cbiAgICAgIG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuY3JlYXRlQ2xhaW1hbnRzLm1hcCgoeCkgPT4gdGhpcy5wcmVwYXJlQ3JlYXRlQ2xhaW1hbnQoeCkpXG4gICAgICApKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW1hbnRzID0gbWFwRWRnZXMoc2NlbmFyaW8uY2xhaW1hbnRzKTtcbiAgICBjb25zdCB1cGRhdGVDbGFpbWFudHMgPVxuICAgICAgb3B0aW9ucy51cGRhdGVDbGFpbWFudHMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy51cGRhdGVDbGFpbWFudHMubWFwKCh4KSA9PiB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgY2xhaW1hbnQgd2UgYXJlIHVwZGF0aW5nXG4gICAgICAgICAgY29uc3QgY2xhaW1hbnQgPSBleGlzdGluZ0NsYWltYW50cy5maW5kKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2xhaW1hbnQpID0+IGV4aXN0aW5nQ2xhaW1hbnQudHAuaWQgPT09IHgudHBJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVVwZGF0ZUNsYWltYW50KHgsIGNsYWltYW50LnNoYXJlZEtleS5pZCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzY2VuYXJpb0lkOiBvcHRpb25zLnNjZW5hcmlvSWQsXG4gICAgICBlbmFibGVkOiBvcHRpb25zLmVuYWJsZWQsXG4gICAgICBpbmFjdGl2ZVNlY29uZHM6IG9wdGlvbnMuaW5hY3RpdmVTZWNvbmRzLFxuICAgICAgdXBkYXRlQXNzZW1ibHksXG4gICAgICBjcmVhdGVSZWNlaXZlcnMsXG4gICAgICB1cGRhdGVSZWNlaXZlcnMsXG4gICAgICBkZWxldGVSZWNlaXZlcnM6IG9wdGlvbnMuZGVsZXRlUmVjZWl2ZXJzLFxuICAgICAgY3JlYXRlQ2xhaW1hbnRzLFxuICAgICAgdXBkYXRlQ2xhaW1hbnRzLFxuICAgICAgZGVsZXRlQ2xhaW1hbnRzOiBvcHRpb25zLmRlbGV0ZUNsYWltYW50cyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjZWl2ZXJJdGVtKG9wdGlvbnM6IHtcbiAgICByZWNlaXZlckl0ZW1PcHRpb25zOiBSZWNlaXZlckl0ZW1PcHRpb25zO1xuICAgIHJlY2VpdmVyU2hhcmVkS2V5OiBKV0suS2V5O1xuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5O1xuICAgIGRpcmVjdG9yeT86IElkS2V5UGFpcjtcbiAgICBmaWxlPzogSWRLZXlQYWlyO1xuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVjZWl2ZXJJdGVtT3B0aW9ucyxcbiAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICBkaXJlY3RvcnksXG4gICAgICBmaWxlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgYXNzZXJ0RXhhY3RseU9uZSh7IGRpcmVjdG9yeSwgZmlsZSB9KTtcblxuICAgIGNvbnN0IHsgYWNjZXNzUm9sZSB9ID0gcmVjZWl2ZXJJdGVtT3B0aW9ucztcblxuICAgIGlmIChhY2Nlc3NSb2xlID09IEFjY2Vzc1JvbGVDaG9pY2UuREVOWSkge1xuICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBhY2Nlc3NSb2xlLFxuICAgICAgICBpdGVtS2V5SWQ6IG51bGwsXG4gICAgICAgIHdyYXBwZWRJdGVtS2V5OiBudWxsLFxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgaWYgKGRpcmVjdG9yeSkge1xuICAgICAgICAvLyBDcnlwdG9ncmFwaGljIGFjY2VzcyB0byBpdGVtIGlzIG5vdCByZXF1aXJlZC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGRpcmVjdG9yeS5pZCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmV0LFxuICAgICAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBiZSBiYXRjaGVkXG4gICAgICBsZXQgaXRlbUtleTtcbiAgICAgIGlmIChkaXJlY3RvcnkpIHtcbiAgICAgICAgaXRlbUtleSA9IGF3YWl0IHRoaXMuaXRlbVNlcnZpY2UuZ2V0RGlyZWN0b3J5S2V5KFxuICAgICAgICAgIGRpcmVjdG9yeS5pZCxcbiAgICAgICAgICBkaXJlY3Rvcnkua2V5SWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1LZXkgPSBhd2FpdCB0aGlzLml0ZW1TZXJ2aWNlLmdldEZpbGVLZXkoZmlsZS5pZCwgZmlsZS5rZXlJZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgICAgaXRlbUtleS5qd2sudG9KU09OKHRydWUpXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIHJlY2VpdmVyU2hhcmVkS2V5LFxuICAgICAgICByZWNlaXZlckl0ZW1PcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICAgICk7XG5cbiAgICAgIHdyYXBwZWRJdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgICB3cmFwcGVkSXRlbUtleVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBhY2Nlc3NSb2xlLFxuICAgICAgICBpdGVtS2V5SWQ6IGl0ZW1LZXkuaWQsXG4gICAgICAgIHdyYXBwZWRJdGVtS2V5LFxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhLFxuICAgICAgfTtcblxuICAgICAgaWYgKGRpcmVjdG9yeSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJldCxcbiAgICAgICAgICBkaXJlY3RvcnlJZDogZGlyZWN0b3J5LmlkLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXQsXG4gICAgICAgICAgZmlsZUlkOiBmaWxlLmlkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVJlY2VpdmVyRGlyZWN0b3J5KFxuICAgIG9wdGlvbnM6IFJlY2VpdmVyRGlyZWN0b3J5T3B0aW9ucyxcbiAgICByZWNlaXZlclNoYXJlZEtleTogSldLLktleSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUmVjZWl2ZXJJdGVtKHtcbiAgICAgIHJlY2VpdmVySXRlbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgZGlyZWN0b3J5OiB7XG4gICAgICAgIGlkOiBvcHRpb25zLmRpcmVjdG9yeUlkLFxuICAgICAgICBrZXlJZDogb3B0aW9ucy5kaXJlY3RvcnlLZXlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckZpbGUoXG4gICAgb3B0aW9uczogUmVjZWl2ZXJGaWxlT3B0aW9ucyxcbiAgICByZWNlaXZlclNoYXJlZEtleTogSldLLktleSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUmVjZWl2ZXJJdGVtKHtcbiAgICAgIHJlY2VpdmVySXRlbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICByZWNlaXZlclNoYXJlZEtleSxcbiAgICAgIGFzc2VtYmx5S2V5LFxuICAgICAgZmlsZToge1xuICAgICAgICBpZDogb3B0aW9ucy5maWxlSWQsXG4gICAgICAgIGtleUlkOiBvcHRpb25zLmZpbGVLZXlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVDcmVhdGVSZWNlaXZlcihcbiAgICBvcHRpb25zOiBDcmVhdGVSZWNlaXZlck9wdGlvbnMsXG4gICAgYXNzZW1ibHlLZXk6IEpXSy5LZXlcbiAgKSB7XG4gICAgY29uc3QgeyBzaGFyZWRLZXksIG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIGNvbnN0IGFkZEZpbGVzID1cbiAgICAgIG9wdGlvbnMuYWRkRmlsZXMgJiZcbiAgICAgIChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3B0aW9ucy5hZGRGaWxlcy5tYXAoKHgpID0+XG4gICAgICAgICAgdGhpcy5wcmVwYXJlQWRkUmVjZWl2ZXJGaWxlKHgsIHNoYXJlZEtleS5rZXksIGFzc2VtYmx5S2V5KVxuICAgICAgICApXG4gICAgICApKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tdXRhdGlvbklucHV0LFxuICAgICAgYWRkRGlyZWN0b3JpZXMsXG4gICAgICBhZGRGaWxlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlUmVjZWl2ZXIoXG4gICAgb3B0aW9uczogVXBkYXRlUmVjZWl2ZXJPcHRpb25zLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5LFxuICAgIGV4aXN0aW5nUmVjZWl2ZXI6IFNjZW5hcmlvUmVjZWl2ZXJOb2RlXG4gICkge1xuICAgIGNvbnN0IHNoYXJlZEtleUlkID0gZXhpc3RpbmdSZWNlaXZlci5zaGFyZWRLZXkuaWQ7XG5cbiAgICBjb25zdCBkZWxldGVEaXJlY3Rvcmllc09wdGlvbnMgPSBvcHRpb25zLmRlbGV0ZURpcmVjdG9yaWVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucyA9IG9wdGlvbnMudXBkYXRlRGlyZWN0b3JpZXMgfHwgW107XG5cbiAgICBjb25zdCBkZWxldGVGaWxlc09wdGlvbnMgPSBvcHRpb25zLmRlbGV0ZUZpbGVzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZUZpbGVzT3B0aW9ucyA9IG9wdGlvbnMudXBkYXRlRmlsZXMgfHwgW107XG5cbiAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHVwZGF0ZSBkaXJlY3Rvcmllc1xuICAgIG1hcEVkZ2VzKGV4aXN0aW5nUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckRpcmVjdG9yaWVzKS5mb3JFYWNoKFxuICAgICAgKGV4aXN0aW5nRGlyZWN0b3J5KSA9PiB7XG4gICAgICAgIGlmIChkZWxldGVEaXJlY3Rvcmllc09wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdEaXJlY3RvcnkuZGlyZWN0b3J5LmlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB1cGRhdGVEaXJlY3Rvcmllc09wdGlvbnMuZmluZChcbiAgICAgICAgICAgICh4KSA9PiB4LmRpcmVjdG9yeUlkID09PSBleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWRcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZURpcmVjdG9yaWVzT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhY2Nlc3NSb2xlOiBleGlzdGluZ0RpcmVjdG9yeS5hY2Nlc3NSb2xlLFxuICAgICAgICAgIGRpcmVjdG9yeUlkOiBleGlzdGluZ0RpcmVjdG9yeS5kaXJlY3RvcnkuaWQsXG4gICAgICAgICAgZGlyZWN0b3J5S2V5SWQ6IGV4aXN0aW5nRGlyZWN0b3J5LmRpcmVjdG9yeS5rZXlJZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOlxuICAgICAgICAgICAgZXhpc3RpbmdEaXJlY3Rvcnkuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEZpbGwgaW4gYW55IG1pc3NpbmcgdXBkYXRlIGZpbGVzXG4gICAgbWFwRWRnZXMoZXhpc3RpbmdSZWNlaXZlci5yZWNlaXZlckl0ZW1zLnJlY2VpdmVyRmlsZXMpLmZvckVhY2goXG4gICAgICAoZXhpc3RpbmdGaWxlKSA9PiB7XG4gICAgICAgIGlmIChkZWxldGVGaWxlc09wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdGaWxlLmZpbGUuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUZpbGVzT3B0aW9ucy5maW5kKCh4KSA9PiB4LmZpbGVJZCA9PT0gZXhpc3RpbmdGaWxlLmZpbGUuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlRmlsZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgIGFjY2Vzc1JvbGU6IGV4aXN0aW5nRmlsZS5hY2Nlc3NSb2xlLFxuICAgICAgICAgIGZpbGVJZDogZXhpc3RpbmdGaWxlLmZpbGUuaWQsXG4gICAgICAgICAgZmlsZUtleUlkOiBleGlzdGluZ0ZpbGUuZmlsZS5rZXlJZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOiBleGlzdGluZ0ZpbGUuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2hhcmVkS2V5LCBtdXRhdGlvbklucHV0IH0gPSBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzaGFyZWRLZXlJZFxuICAgICk7XG5cbiAgICBjb25zdCBhZGREaXJlY3RvcmllcyA9XG4gICAgICBvcHRpb25zLmFkZERpcmVjdG9yaWVzICYmXG4gICAgICAoYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wdGlvbnMuYWRkRGlyZWN0b3JpZXMubWFwKCh4KSA9PlxuICAgICAgICAgIHRoaXMucHJlcGFyZUFkZFJlY2VpdmVyRGlyZWN0b3J5KHgsIHNoYXJlZEtleSwgYXNzZW1ibHlLZXkpXG4gICAgICAgIClcbiAgICAgICkpO1xuXG4gICAgY29uc3QgYWRkRmlsZXMgPVxuICAgICAgb3B0aW9ucy5hZGRGaWxlcyAmJlxuICAgICAgKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvcHRpb25zLmFkZEZpbGVzLm1hcCgoeCkgPT5cbiAgICAgICAgICB0aGlzLnByZXBhcmVBZGRSZWNlaXZlckZpbGUoeCwgc2hhcmVkS2V5LCBhc3NlbWJseUtleSlcbiAgICAgICAgKVxuICAgICAgKSk7XG5cbiAgICBjb25zdCB1cGRhdGVEaXJlY3RvcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdXBkYXRlRGlyZWN0b3JpZXNPcHRpb25zLm1hcCgoeCkgPT5cbiAgICAgICAgdGhpcy5wcmVwYXJlVXBkYXRlUmVjZWl2ZXJEaXJlY3RvcnkoeCwgc2hhcmVkS2V5LCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlRmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHVwZGF0ZUZpbGVzT3B0aW9ucy5tYXAoKHgpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVVwZGF0ZVJlY2VpdmVyRmlsZSh4LCBzaGFyZWRLZXksIGFzc2VtYmx5S2V5KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubXV0YXRpb25JbnB1dCxcbiAgICAgIGFkZERpcmVjdG9yaWVzLFxuICAgICAgYWRkRmlsZXMsXG4gICAgICB1cGRhdGVEaXJlY3RvcmllcyxcbiAgICAgIHVwZGF0ZUZpbGVzLFxuICAgICAgZGVsZXRlRGlyZWN0b3JpZXM6IG9wdGlvbnMuZGVsZXRlRGlyZWN0b3JpZXMsXG4gICAgICBkZWxldGVGaWxlczogb3B0aW9ucy5kZWxldGVGaWxlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihcbiAgICBleGlzdGluZ1JlY2VpdmVyOiBTY2VuYXJpb1JlY2VpdmVyTm9kZSxcbiAgICBhc3NlbWJseUtleTogSldLLktleVxuICApIHtcbiAgICBjb25zdCB1cGRhdGVEaXJlY3RvcmllcyA9IG1hcEVkZ2VzKFxuICAgICAgZXhpc3RpbmdSZWNlaXZlci5yZWNlaXZlckl0ZW1zLnJlY2VpdmVyRGlyZWN0b3JpZXNcbiAgICApLm1hcCgoeyBhY2Nlc3NSb2xlLCBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLCBkaXJlY3RvcnkgfSkgPT4gKHtcbiAgICAgIGFjY2Vzc1JvbGUsXG4gICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgICAgZGlyZWN0b3J5SWQ6IGRpcmVjdG9yeS5pZCxcbiAgICAgIGRpcmVjdG9yeUtleUlkOiBkaXJlY3Rvcnkua2V5SWQsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgdXBkYXRlRmlsZXMgPSBtYXBFZGdlcyhcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckZpbGVzXG4gICAgKS5tYXAoKHsgYWNjZXNzUm9sZSwgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbiwgZmlsZSB9KSA9PiAoe1xuICAgICAgYWNjZXNzUm9sZSxcbiAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb24sXG4gICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICBmaWxlS2V5SWQ6IGZpbGUua2V5SWQsXG4gICAgfSkpO1xuXG4gICAgLy8gRmlsbCBpdCBpbiB3aXRoIGV4aXN0aW5nIHJlY2VpdmVyLlxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVcGRhdGVSZWNlaXZlcihcbiAgICAgIHtcbiAgICAgICAgdHBJZDogZXhpc3RpbmdSZWNlaXZlci50cC5pZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbjogZXhpc3RpbmdSZWNlaXZlci5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uLFxuICAgICAgICB1cGRhdGVEaXJlY3RvcmllcyxcbiAgICAgICAgdXBkYXRlRmlsZXMsXG4gICAgICB9LFxuICAgICAgYXNzZW1ibHlLZXksXG4gICAgICBleGlzdGluZ1JlY2VpdmVyXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUV4aXN0aW5nUmVjZWl2ZXJzKFxuICAgIGV4aXN0aW5nUmVjZWl2ZXJzOiBTY2VuYXJpb1JlY2VpdmVyTm9kZVtdLFxuICAgIGFzc2VtYmx5S2V5OiBKV0suS2V5XG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGV4aXN0aW5nUmVjZWl2ZXJzLm1hcCgoZXhpc3RpbmdSZWNlaXZlcikgPT5cbiAgICAgICAgdGhpcy5wcmVwYXJlRXhpc3RpbmdSZWNlaXZlcihleGlzdGluZ1JlY2VpdmVyLCBhc3NlbWJseUtleSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9uczogQ3JlYXRlUGFydGljaXBhbnRPcHRpb25zKSB7XG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0V2l0aE5ld0tleShcbiAgICAgIG9wdGlvbnMudHBTaGFyZWRLZXlJZCxcbiAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbiB8fCAnJ1xuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICB0cFNoYXJlZEtleUlkOiBvcHRpb25zLnRwU2hhcmVkS2V5SWQsXG4gICAgICAgIHRwU2hhcmVkS2V5V3JhcHBlZFNoYXJlZEtleTogc2hhcmVkS2V5LndyYXBwZWRLZXksXG4gICAgICAgIHNoYXJlZENpcGhlckRhdGE6IHNoYXJlZEtleS5jaXBoZXIsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVQYXJ0aWNpcGFudChcbiAgICBvcHRpb25zOiBQYXJ0aWNpcGFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEp3a0tleShzaGFyZWRLZXlJZCk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBvcHRpb25zLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24gfHwgJydcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZEtleSxcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcbiAgICAgICAgdHBJZDogb3B0aW9ucy50cElkLFxuICAgICAgICBzaGFyZWRLZXlJZCxcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZUNsYWltYW50KG9wdGlvbnM6IENyZWF0ZUNsYWltYW50T3B0aW9ucykge1xuICAgIGNvbnN0IHsgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlUGFydGljaXBhbnQob3B0aW9ucyk7XG4gICAgcmV0dXJuIG11dGF0aW9uSW5wdXQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVVcGRhdGVDbGFpbWFudChcbiAgICBvcHRpb25zOiBVcGRhdGVDbGFpbWFudE9wdGlvbnMsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCB7IG11dGF0aW9uSW5wdXQgfSA9IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZVBhcnRpY2lwYW50KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNoYXJlZEtleUlkXG4gICAgKTtcblxuICAgIHJldHVybiBtdXRhdGlvbklucHV0O1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVJlY2VpdmVDbGFpbTIoc2NlbmFyaW9JZDogc3RyaW5nLCBzaGFyZWRDbGFpbUlkOiBzdHJpbmcpIHtcbiAgICAvLyBHZXQgYWxsIHRoZSBzaGFyZWQgaXRlbXNcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2NlbmFyaW9JZCwgc2hhcmVkQ2xhaW1JZClcbiAgICApLnNoYXJlZFNjZW5hcmlvO1xuXG4gICAgaWYgKHNoYXJlZFNjZW5hcmlvLnN0YXRlICE9PSBTY2VuYXJpb1N0YXRlLkFQUFJPVkVEKSB7XG4gICAgICB0aHJvd0NsYWltTm90QXBwcm92ZWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHByb3ZhbHMgPSBtYXBFZGdlcyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmFzQ2xhaW1SZWNlaXZlci5hcHByb3ZhbHNcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZW1ibHlLZXkgPSBhd2FpdCB0aGlzLnJlY292ZXJBc3NlbWJseUtleShhcHByb3ZhbHMpO1xuXG4gICAgLy8gV3JhcCBhc3NlbWJseSBrZXkgd2l0aCBzaGFyZWQga2V5LlxuICAgIC8vPz8/XG4gICAgLy8gVGhpcyBzaGFyZWRLZXkgaXMgY3JlYXRlZCBqdXN0IGZvciB0aGlzIHNjZW5hcmlvLiBJdCdzIHdyYXBwZWQgYnkgdGhlIHRwU2hhcmVkS2V5LlxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgc2hhcmVkU2NlbmFyaW8uYXNSZWNlaXZlci5zaGFyZWRLZXkuaWRcbiAgICApO1xuXG4gICAgY29uc3Qgc2hhcmVkS2V5V3JhcHBlZEFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICBhc3NlbWJseUtleS50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjZW5hcmlvQ2xhaW1JZDogc2hhcmVkQ2xhaW1JZCxcbiAgICAgIHNoYXJlZEtleVdyYXBwZWRBc3NlbWJseUtleSxcbiAgICAgIHNoYXJlZEtleUlkOiBzaGFyZWRLZXkuaWQsXG4gICAgICBhc3NlbWJseUtleUlkOiBzaGFyZWRTY2VuYXJpby5zaGFyZWRDbGFpbS5hc0NsYWltUmVjZWl2ZXIuYXNzZW1ibHlLZXlJZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gYXN5bmMgcHJlcGFyZVJlY2VpdmVDbGFpbShzY2VuYXJpb0lkOiBzdHJpbmcsIHNoYXJlZENsYWltSWQ6IHN0cmluZykge1xuICAvLyAgIC8vIEdldCBhbGwgdGhlIHNoYXJlZCBpdGVtc1xuICAvLyAgIGNvbnN0IHNoYXJlZFNjZW5hcmlvID0gKFxuICAvLyAgICAgYXdhaXQgdGhpcy5nZXRTaGFyZWRTY2VuYXJpbyhzY2VuYXJpb0lkLCBzaGFyZWRDbGFpbUlkKVxuICAvLyAgICkuc2hhcmVkU2NlbmFyaW87XG5cbiAgLy8gICBpZiAoc2hhcmVkU2NlbmFyaW8uc3RhdGUgIT09IFNjZW5hcmlvU3RhdGUuQVBQUk9WRUQpIHtcbiAgLy8gICAgIHRocm93Q2xhaW1Ob3RBcHByb3ZlZCgpO1xuICAvLyAgIH1cblxuICAvLyAgIGNvbnN0IGFwcHJvdmFscyA9IG1hcEVkZ2VzKFxuICAvLyAgICAgc2hhcmVkU2NlbmFyaW8uc2hhcmVkQ2xhaW0uYXNDbGFpbVJlY2VpdmVyLmFwcHJvdmFsc1xuICAvLyAgICk7XG5cbiAgLy8gICBjb25zdCBhc3NlbWJseUtleSA9IGF3YWl0IHRoaXMucmVjb3ZlckFzc2VtYmx5S2V5KGFwcHJvdmFscyk7XG5cbiAgLy8gICAvLyBEZWNyeXB0IGFsbCBpdGVtc1xuICAvLyAgIGNvbnN0IHJlY2VpdmVyRGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgLy8gICAgIHNoYXJlZFNjZW5hcmlvLmFzUmVjZWl2ZXIucmVjZWl2ZXJJdGVtcy5yZWNlaXZlckRpcmVjdG9yaWVzLmVkZ2VzXG4gIC8vICAgICAgIC5tYXAoKGVkZ2UpID0+IGVkZ2Uubm9kZSlcbiAgLy8gICAgICAgLm1hcChhc3luYyAocmVjZWl2ZXJEaXJlY3RvcnkpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcbiAgLy8gICAgICAgICAgIGFzc2VtYmx5S2V5LFxuICAvLyAgICAgICAgICAgcmVjZWl2ZXJEaXJlY3Rvcnkud3JhcHBlZEl0ZW1LZXlcbiAgLy8gICAgICAgICApO1xuXG4gIC8vICAgICAgICAgcmV0dXJuIHtcbiAgLy8gICAgICAgICAgIHJlY2VpdmVyRGlyZWN0b3J5SWQ6IHJlY2VpdmVyRGlyZWN0b3J5LmlkLFxuICAvLyAgICAgICAgICAgLy8gTG9va3MgbGlrZSByZWNlaXZlckRpcmVjdG9yeS53cmFwcGVkSXRlbUtleSBoYXMgbm8gb3RoZXIgY29udGVudCBpbiBzaWRlIGl0IGV4Y2VwdCBhIHdyYXBwZWQga2V5LlxuICAvLyAgICAgICAgICAgLy8gU28gd2UgY2FuIHR1cm4gdGhpcyBpbiB0byBhIGRvdWJseSB3cmFwcGVkIGtleSBhbmQganVzdCByZWxlYXNlIHRoZSBhc3NlbWJseSBrZXkuXG5cbiAgLy8gICAgICAgICAgIHJlY2VpdmVyU2hhcmVkS2V5V3JhcHBlZEl0ZW1LZXk6IHdyYXBwZWRJdGVtS2V5LCAvLyB0aGUgd3JhcHBlZEl0ZW1LZXkgaXMgYWxyZWFkeSB3cmFwcGVkIGJ5IHJlY2VpdmVyU2hhcmVkS2V5XG4gIC8vICAgICAgICAgfTtcbiAgLy8gICAgICAgfSlcbiAgLy8gICApO1xuXG4gIC8vICAgcmV0dXJuIHtcbiAgLy8gICAgIHNjZW5hcmlvQ2xhaW1JZDogc2hhcmVkQ2xhaW1JZCxcbiAgLy8gICAgIHJlY2VpdmVyRGlyZWN0b3JpZXMsXG4gIC8vICAgfTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlckFzc2VtYmx5S2V5KFxuICAgIGFwcHJvdmFsczogU2hhcmVkU2NlbmFyaW9DbGFpbVJlY2VpdmVkQXBwcm92YWxOb2RlW11cbiAgKSB7XG4gICAgY29uc3QgcGFydGlhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwcHJvdmFscy5tYXAoKGFwcHJvdmFsKSA9PlxuICAgICAgICB0aGlzLmtleUdyYXBoLmRlY3J5cHRGcm9tU3RyaW5nPFBhcnRpYWxBc3NlbWJseUtleT4oXG4gICAgICAgICAgYXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIGFwcHJvdmFsLnJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuYXNzZW1ibHlDb250cm9sbGVyLnJlY292ZXJBc3NlbWJseUtleShwYXJ0aWFscyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFzQ2xhaW1BcHByb3ZlcnMoXG4gICAgc2hhcmVkU2NlbmFyaW9JZCxcbiAgICBjbGFpbUlkLFxuICAgIHN0YXRlOiBUcENsYWltQXBwcm92ZXJTdGF0ZVxuICApIHtcbiAgICBjb25zdCBzaGFyZWRTY2VuYXJpbyA9IChcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2hhcmVkU2NlbmFyaW8oc2hhcmVkU2NlbmFyaW9JZCwgY2xhaW1JZClcbiAgICApLnNoYXJlZFNjZW5hcmlvO1xuXG4gICAgcmV0dXJuIG1hcEVkZ2VzKHNoYXJlZFNjZW5hcmlvLnNoYXJlZENsYWltLmNsYWltLmFzQ2xhaW1BcHByb3ZlcnMpLmZpbHRlcihcbiAgICAgIChhc0NsYWltQXBwcm92ZXIpID0+IGFzQ2xhaW1BcHByb3Zlci5zdGF0ZSA9PT0gc3RhdGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltTXV0YXRpb25zKFxuICAgIHNoYXJlZFNjZW5hcmlvSWQ6IHN0cmluZyxcbiAgICBjbGFpbUlkOiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdXNlciBtYXkgYmUgYWN0aW5nIGFzIGFwcHJvdmVycyBpbiBtdWx0aXBsZSBzdWItYXNzZW1ibGllcyBzb1xuICAgIC8vIHdlIGFwcHJvdmUgdGhlbSBhbGwuXG4gICAgY29uc3QgYXNDbGFpbUFwcHJvdmVycyA9IGF3YWl0IHRoaXMuYXNDbGFpbUFwcHJvdmVycyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkLFxuICAgICAgVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICByZXR1cm4gYXNDbGFpbUFwcHJvdmVycy5tYXAoXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IEFwcHJvdmVTY2VuYXJpb0NsYWltTXV0YXRpb24sXG4gICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICBpbnB1dDogYXdhaXQgdGhpcy5wcmVwYXJlQXBwcm92ZUNsYWltKGFzQ2xhaW1BcHByb3ZlciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZUNsYWltKFxuICAgIGFzQ2xhaW1BcHByb3ZlcjogU2hhcmVkVHBDbGFpbUFwcHJvdmVyTm9kZVxuICApIHtcbiAgICBjb25zdCByZWNlaXZlckFwcHJvdmFscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFwRWRnZXMoYXNDbGFpbUFwcHJvdmVyLnJlY2VpdmVyQXBwcm92YWxzKS5tYXAoKHJlY2VpdmVyQXBwcm92YWwpID0+XG4gICAgICAgIHRoaXMucHJlcGFyZVJlY2VpdmVyQXBwcm92YWwoe1xuICAgICAgICAgIHJlY2VpdmVyQXBwcm92YWxJZDogcmVjZWl2ZXJBcHByb3ZhbC5pZCxcbiAgICAgICAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHJlY2VpdmVyQXBwcm92YWwucHhrLmlkLFxuICAgICAgICAgIHNoYXJlZENpcGhlclBhcnRpYWxBc3NlbWJseUtleUNsZWFySnNvbjpcbiAgICAgICAgICAgIGFzQ2xhaW1BcHByb3Zlci5zaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb24sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbUFwcHJvdmVySWQ6IGFzQ2xhaW1BcHByb3Zlci5pZCxcbiAgICAgIHJlY2VpdmVyQXBwcm92YWxzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNlaXZlckFwcHJvdmFsKG9wdGlvbnM6IHtcbiAgICByZWNlaXZlckFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICByZWNlaXZlckFwcHJvdmFsUHhrSWQ6IHN0cmluZztcbiAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXlDbGVhckpzb246IEpTT05PYmplY3Q7XG4gIH0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVjZWl2ZXJBcHByb3ZhbElkOiBvcHRpb25zLnJlY2VpdmVyQXBwcm92YWxJZCxcbiAgICAgIC8vIFRPRE8gYWxsb3cgc2VuZGluZyBvZiBtZXNzYWdlcyB0byByZWNlaXZlci5cbiAgICAgIHJlY2VpdmVyQ2lwaGVyOiAnJyxcbiAgICAgIHJlY2VpdmVyQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5OiBhd2FpdCB0aGlzLmtleUdyYXBoLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgb3B0aW9ucy5yZWNlaXZlckFwcHJvdmFsUHhrSWQsXG4gICAgICAgIG9wdGlvbnMuc2hhcmVkQ2lwaGVyUGFydGlhbEFzc2VtYmx5S2V5Q2xlYXJKc29uXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWplY3RDbGFpbU11dGF0aW9ucyhcbiAgICBzaGFyZWRTY2VuYXJpb0lkOiBzdHJpbmcsXG4gICAgY2xhaW1JZDogc3RyaW5nXG4gICkge1xuICAgIC8vIFRoZSBjdXJyZW50IHVzZXIgbWF5IGJlIGFjdGluZyBhcyBhcHByb3ZlcnMgaW4gbXVsdGlwbGUgc3ViLWFzc2VtYmxpZXMgc29cbiAgICAvLyB3ZSByZWplY3QgdGhlbSBhbGwuXG4gICAgY29uc3QgYXNDbGFpbUFwcHJvdmVycyA9IGF3YWl0IHRoaXMuYXNDbGFpbUFwcHJvdmVycyhcbiAgICAgIHNoYXJlZFNjZW5hcmlvSWQsXG4gICAgICBjbGFpbUlkLFxuICAgICAgVHBDbGFpbUFwcHJvdmVyU3RhdGUuQ0xBSU1FRFxuICAgICk7XG5cbiAgICByZXR1cm4gYXNDbGFpbUFwcHJvdmVycy5tYXAoXG4gICAgICBhc3luYyAoYXNDbGFpbUFwcHJvdmVyKSA9PlxuICAgICAgICBuZXcgTHJNdXRhdGlvbih7XG4gICAgICAgICAgbXV0YXRpb246IFJlamVjdFNjZW5hcmlvQ2xhaW1NdXRhdGlvbixcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGlucHV0OiB7IGNsYWltQXBwcm92ZXJJZDogYXNDbGFpbUFwcHJvdmVyLmlkIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=