@secrecy/lib 1.0.0-dev.9 → 1.0.1

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 (133) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/BaseClient.d.ts +111 -0
  4. package/dist/BaseClient.js +506 -0
  5. package/{lib → dist}/PopupTools.d.ts +4 -4
  6. package/dist/PopupTools.js +195 -0
  7. package/{lib → dist}/ZeusThunder.d.ts +0 -0
  8. package/dist/ZeusThunder.js +65 -0
  9. package/dist/cache.d.ts +6 -0
  10. package/dist/cache.js +4 -0
  11. package/dist/client/SecrecyAppClient.d.ts +17 -0
  12. package/dist/client/SecrecyAppClient.js +226 -0
  13. package/dist/client/SecrecyCloudClient.d.ts +89 -0
  14. package/dist/client/SecrecyCloudClient.js +1405 -0
  15. package/dist/client/SecrecyDbClient.d.ts +21 -0
  16. package/dist/client/SecrecyDbClient.js +177 -0
  17. package/dist/client/SecrecyMailClient.d.ts +42 -0
  18. package/dist/client/SecrecyMailClient.js +1022 -0
  19. package/dist/client/SecrecyPayClient.d.ts +28 -0
  20. package/dist/client/SecrecyPayClient.js +68 -0
  21. package/dist/client/SecrecyWalletClient.d.ts +30 -0
  22. package/dist/client/SecrecyWalletClient.js +73 -0
  23. package/{lib → dist}/client/convert/file.d.ts +3 -3
  24. package/dist/client/convert/file.js +33 -0
  25. package/dist/client/convert/mail.d.ts +3 -0
  26. package/dist/client/convert/mail.js +42 -0
  27. package/dist/client/convert/node.d.ts +9 -0
  28. package/dist/client/convert/node.js +87 -0
  29. package/{lib → dist}/client/helpers.d.ts +9 -4
  30. package/dist/client/helpers.js +119 -0
  31. package/dist/client/index.d.ts +34 -0
  32. package/dist/client/index.js +46 -0
  33. package/{lib → dist}/client/storage.d.ts +0 -0
  34. package/dist/client/storage.js +12 -0
  35. package/dist/client/types/File.d.ts +14 -0
  36. package/dist/client/types/File.js +3 -0
  37. package/dist/client/types/Inputs.d.ts +16 -0
  38. package/dist/client/types/Inputs.js +3 -0
  39. package/dist/client/types/Node.d.ts +56 -0
  40. package/dist/client/types/Node.js +3 -0
  41. package/dist/client/types/UserAppNotifications.d.ts +6 -0
  42. package/dist/client/types/UserAppNotifications.js +3 -0
  43. package/dist/client/types/UserAppSettings.d.ts +5 -0
  44. package/dist/client/types/UserAppSettings.js +3 -0
  45. package/{lib → dist}/client/types/index.d.ts +25 -59
  46. package/dist/client/types/index.js +8 -0
  47. package/dist/client/types/selectors.d.ts +400 -0
  48. package/dist/client/types/selectors.js +135 -0
  49. package/{lib → dist}/crypto/file.d.ts +2 -2
  50. package/dist/crypto/file.js +195 -0
  51. package/{lib → dist}/crypto/index.d.ts +0 -0
  52. package/dist/crypto/index.js +45 -0
  53. package/dist/error.d.ts +33 -0
  54. package/dist/error.js +3 -0
  55. package/dist/index.d.ts +14 -0
  56. package/dist/index.js +10 -0
  57. package/{lib → dist}/minify/index.d.ts +0 -0
  58. package/dist/minify/index.js +23 -0
  59. package/{lib → dist}/minify/lz4.d.ts +0 -0
  60. package/dist/minify/lz4.js +539 -0
  61. package/{lib → dist}/sodium.d.ts +0 -0
  62. package/dist/sodium.js +6 -0
  63. package/{lib → dist}/utils/store-buddy.d.ts +1 -1
  64. package/dist/utils/store-buddy.js +58 -0
  65. package/{lib → dist}/utils/time.d.ts +0 -0
  66. package/dist/utils/time.js +12 -0
  67. package/{lib → dist/utils}/utils.d.ts +0 -0
  68. package/dist/utils/utils.js +47 -0
  69. package/{lib → dist}/worker/md5.d.ts +0 -0
  70. package/dist/worker/md5.js +24 -0
  71. package/{lib → dist}/worker/sodium.d.ts +0 -0
  72. package/dist/worker/sodium.js +118 -0
  73. package/{lib → dist}/worker/workerCodes.d.ts +0 -0
  74. package/dist/worker/workerCodes.js +255 -0
  75. package/{lib → dist}/zeus/const.d.ts +5 -0
  76. package/dist/zeus/const.js +1679 -0
  77. package/dist/zeus/index.d.ts +7941 -0
  78. package/dist/zeus/index.js +599 -0
  79. package/package.json +64 -54
  80. package/lib/BaseClient.d.ts +0 -266
  81. package/lib/BaseClient.js +0 -1332
  82. package/lib/PopupTools.js +0 -213
  83. package/lib/ZeusThunder.js +0 -115
  84. package/lib/cache.d.ts +0 -7
  85. package/lib/cache.js +0 -5
  86. package/lib/client/admin/index.d.ts +0 -10
  87. package/lib/client/admin/index.js +0 -145
  88. package/lib/client/convert/file.js +0 -39
  89. package/lib/client/convert/folder.d.ts +0 -8
  90. package/lib/client/convert/folder.js +0 -264
  91. package/lib/client/convert/mail.d.ts +0 -3
  92. package/lib/client/convert/mail.js +0 -46
  93. package/lib/client/convert/vFile.d.ts +0 -5
  94. package/lib/client/convert/vFile.js +0 -164
  95. package/lib/client/helpers.js +0 -116
  96. package/lib/client/index.d.ts +0 -169
  97. package/lib/client/index.js +0 -3803
  98. package/lib/client/storage.js +0 -12
  99. package/lib/client/types/File.d.ts +0 -21
  100. package/lib/client/types/File.js +0 -2
  101. package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
  102. package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
  103. package/lib/client/types/Folder.d.ts +0 -68
  104. package/lib/client/types/Folder.js +0 -7
  105. package/lib/client/types/Inputs.d.ts +0 -21
  106. package/lib/client/types/Inputs.js +0 -2
  107. package/lib/client/types/UserAppNotifications.d.ts +0 -6
  108. package/lib/client/types/UserAppNotifications.js +0 -2
  109. package/lib/client/types/UserAppSettings.d.ts +0 -7
  110. package/lib/client/types/UserAppSettings.js +0 -2
  111. package/lib/client/types/VFile.d.ts +0 -62
  112. package/lib/client/types/VFile.js +0 -4
  113. package/lib/client/types/index.js +0 -9
  114. package/lib/client/types/queries.d.ts +0 -535
  115. package/lib/client/types/queries.js +0 -192
  116. package/lib/crypto/file.js +0 -291
  117. package/lib/crypto/index.js +0 -37
  118. package/lib/index.d.ts +0 -12
  119. package/lib/index.js +0 -41
  120. package/lib/minify/index.js +0 -28
  121. package/lib/minify/lz4.js +0 -633
  122. package/lib/sodium.js +0 -28
  123. package/lib/utils/store-buddy.js +0 -69
  124. package/lib/utils/time.js +0 -22
  125. package/lib/utils.js +0 -188
  126. package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
  127. package/lib/worker/__mock__/sodium.worker.js +0 -57
  128. package/lib/worker/md5.js +0 -43
  129. package/lib/worker/sodium.js +0 -155
  130. package/lib/worker/workerCodes.js +0 -3
  131. package/lib/zeus/const.js +0 -1671
  132. package/lib/zeus/index.d.ts +0 -33302
  133. package/lib/zeus/index.js +0 -558
@@ -0,0 +1,1022 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
3
+ import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
+ /* eslint-disable @typescript-eslint/naming-convention */
7
+ import { generate } from "shortid";
8
+ import { filesCache, usersCache } from "../cache.js";
9
+ import { encryptCryptoBox, sodium } from "../index.js";
10
+ import { convertInternalMailToExternal } from "./convert/mail.js";
11
+ import { mailSelector } from "./types/selectors.js";
12
+ var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
13
+ var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
14
+ var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
15
+ export class SecrecyMailClient {
16
+ constructor(client, keys, thunder) {
17
+ Object.defineProperty(this, _client, {
18
+ writable: true,
19
+ value: void 0
20
+ });
21
+ Object.defineProperty(this, _keys, {
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ Object.defineProperty(this, _thunder, {
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ this._eachUser = async (files, subject, body, idOrMail) => {
30
+ let u = usersCache.get(idOrMail);
31
+ if (!u || !("publicKey" in u)) {
32
+ try {
33
+ const req = await _classPrivateFieldLooseBase(this, _client)[_client].user({
34
+ userId: idOrMail,
35
+ withPublicKey: true
36
+ });
37
+ if (!req) {
38
+ return null;
39
+ }
40
+ if (req.__typename !== "SuccessResponse") {
41
+ return null;
42
+ }
43
+ u = req.data;
44
+ } catch {
45
+ return null;
46
+ }
47
+ if (!u) {
48
+ return null;
49
+ }
50
+ }
51
+ if (!("publicKey" in u)) {
52
+ throw new Error(`User ${idOrMail} have no public key`);
53
+ }
54
+ const recipientsFiles = new Array();
55
+ for (const f of files) {
56
+ let fileInHistory = filesCache.get(f.id);
57
+ if (!fileInHistory) {
58
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
59
+ id: f.id
60
+ });
61
+ fileInHistory = filesCache.get(f.id);
62
+ if (!fileInHistory) {
63
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
64
+ }
65
+ }
66
+ const key = fileInHistory.key;
67
+ recipientsFiles.push({
68
+ id: f.id,
69
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
70
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
71
+ });
72
+ }
73
+ return {
74
+ recipientId: u.id,
75
+ body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
76
+ subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), u.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
77
+ files: recipientsFiles
78
+ };
79
+ };
80
+ _classPrivateFieldLooseBase(this, _client)[_client] = client;
81
+ _classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
82
+ _classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
83
+ }
84
+ async get(_ref) {
85
+ let {
86
+ id
87
+ } = _ref;
88
+ const {
89
+ mail
90
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
91
+ scalars: {
92
+ DateTime: {
93
+ decode: e => new Date(e),
94
+ encode: e => e.toISOString()
95
+ }
96
+ }
97
+ })({
98
+ mail: [{
99
+ id
100
+ }, {
101
+ "...on ErrorAccessDenied": {
102
+ __typename: true,
103
+ message: true
104
+ },
105
+ "...on QueryMailResponse": {
106
+ __typename: true,
107
+ mail: mailSelector
108
+ }
109
+ }]
110
+ });
111
+ if (!mail) {
112
+ return null;
113
+ }
114
+ if (mail.__typename === "ErrorAccessDenied") {
115
+ return mail;
116
+ }
117
+ if (!mail.mail) {
118
+ return null;
119
+ }
120
+ const result = convertInternalMailToExternal(mail.mail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
121
+ if (!result) {
122
+ return null;
123
+ }
124
+ return {
125
+ __typename: "SuccessResponse",
126
+ data: result
127
+ };
128
+ }
129
+ async recover(_ref2) {
130
+ let {
131
+ mailId
132
+ } = _ref2;
133
+ const {
134
+ recoverMail
135
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
136
+ recoverMail: [{
137
+ mailId
138
+ }, {
139
+ "...on ErrorAccessDenied": {
140
+ __typename: true,
141
+ message: true
142
+ },
143
+ "...on ErrorBasic": {
144
+ __typename: true,
145
+ message: true
146
+ },
147
+ "...on RecoverMailResponse": {
148
+ __typename: true,
149
+ recoverMail: true
150
+ }
151
+ }]
152
+ });
153
+ if (!recoverMail) {
154
+ return null;
155
+ }
156
+ if (recoverMail.__typename === "ErrorAccessDenied") {
157
+ return recoverMail;
158
+ }
159
+ if (recoverMail.__typename === "ErrorBasic") {
160
+ return recoverMail;
161
+ }
162
+ return {
163
+ __typename: "SuccessResponse",
164
+ data: recoverMail.recoverMail
165
+ };
166
+ }
167
+ async deletedMails(_ref3) {
168
+ let {
169
+ mailType
170
+ } = _ref3;
171
+ const {
172
+ deletedMails
173
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
174
+ scalars: {
175
+ DateTime: {
176
+ decode: e => new Date(e),
177
+ encode: e => e.toISOString()
178
+ }
179
+ }
180
+ })({
181
+ deletedMails: [{
182
+ mailType
183
+ }, {
184
+ "...on ErrorAccessDenied": {
185
+ __typename: true,
186
+ message: true
187
+ },
188
+ "...on DeletedMailsResponse": {
189
+ __typename: true,
190
+ deletedMails: mailSelector
191
+ }
192
+ }]
193
+ });
194
+ if (!deletedMails) {
195
+ return null;
196
+ }
197
+ if (deletedMails.__typename === "ErrorAccessDenied") {
198
+ return deletedMails;
199
+ }
200
+ const mails = new Array();
201
+ for (const m of deletedMails.deletedMails) {
202
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
203
+ if (mail) {
204
+ mails.push(mail);
205
+ }
206
+ }
207
+ return {
208
+ __typename: "SuccessResponse",
209
+ data: mails
210
+ };
211
+ }
212
+ async create(data, customMessage) {
213
+ const mail = await this.createDraft(data);
214
+ if (!mail) {
215
+ return {
216
+ __typename: "SuccessResponse",
217
+ data: false
218
+ };
219
+ }
220
+ if (mail.__typename === "ErrorBasic") {
221
+ return mail;
222
+ }
223
+ if (mail.__typename === "ErrorAccessDenied") {
224
+ return mail;
225
+ }
226
+ const result = await this.sendDraft(mail.data.mailIntegrityId, customMessage);
227
+ if (!result) {
228
+ return null;
229
+ }
230
+ if (result.__typename === "ErrorAccessDenied") {
231
+ return result;
232
+ }
233
+ if (result.__typename === "ErrorBasic") {
234
+ return result;
235
+ }
236
+ return {
237
+ __typename: "SuccessResponse",
238
+ data: result.data
239
+ };
240
+ }
241
+ async waitingReceivedMails() {
242
+ const {
243
+ user
244
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
245
+ user: [{}, {
246
+ "...on ErrorNotFound": {
247
+ __typename: true,
248
+ message: true
249
+ },
250
+ "...on UserResponse": {
251
+ __typename: true,
252
+ user: {
253
+ waitingReceivedMails: {
254
+ date: true,
255
+ attachmentsCount: true,
256
+ sender: {
257
+ id: true,
258
+ firstname: true,
259
+ lastname: true,
260
+ email: true,
261
+ publicKey: true
262
+ },
263
+ recipients: {
264
+ id: true,
265
+ firstname: true,
266
+ lastname: true,
267
+ email: true,
268
+ publicKey: true
269
+ },
270
+ temporaryRecipients: {
271
+ email: true
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }]
277
+ });
278
+ if (!user) {
279
+ return null;
280
+ }
281
+ if (user.__typename === "ErrorNotFound") {
282
+ return user;
283
+ }
284
+ if (!user.user) {
285
+ return null;
286
+ }
287
+ const result = user.user.waitingReceivedMails.map(m => _objectSpread(_objectSpread({
288
+ id: generate()
289
+ }, m), {}, {
290
+ date: new Date(m.date)
291
+ }));
292
+ return {
293
+ __typename: "SuccessResponse",
294
+ data: result
295
+ };
296
+ }
297
+ async updateDraft(draftId, _ref4) {
298
+ let {
299
+ body,
300
+ subject,
301
+ files,
302
+ recipientsIds,
303
+ replyTo
304
+ } = _ref4;
305
+ const drafts = await this.draftMails();
306
+ if (!drafts) {
307
+ return null;
308
+ }
309
+ if (drafts.__typename !== "SuccessResponse") {
310
+ return drafts;
311
+ }
312
+ const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
313
+ if (!draft) {
314
+ throw new Error(`Invalid draft ${draftId}`);
315
+ }
316
+ let hashKey = null;
317
+ let hash = null;
318
+ if (body || subject) {
319
+ hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
320
+ hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
321
+ body,
322
+ subject
323
+ }), hashKey, "hex");
324
+ }
325
+ const senderFiles = new Array();
326
+ if (files) {
327
+ for (const f of files) {
328
+ let file = filesCache.get(f.id);
329
+ if (!file) {
330
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
331
+ id: f.id
332
+ });
333
+ file = filesCache.get(f.id);
334
+ if (!file) {
335
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
336
+ }
337
+ }
338
+ senderFiles.push({
339
+ id: file.id,
340
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
341
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
342
+ });
343
+ }
344
+ }
345
+ const {
346
+ updateDraftMail
347
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
348
+ scalars: {
349
+ Json: {
350
+ encode: e => JSON.stringify(e),
351
+ decode: e => JSON.parse(e)
352
+ },
353
+ DateTime: {
354
+ decode: e => new Date(e),
355
+ encode: e => e.toISOString()
356
+ },
357
+ BigInt: {
358
+ decode: e => BigInt(e),
359
+ encode: e => e.toString()
360
+ }
361
+ }
362
+ })({
363
+ updateDraftMail: [{
364
+ draftId,
365
+ recipients: recipientsIds,
366
+ replyTo,
367
+ body: body ? sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
368
+ subject: subject ? sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)) : null,
369
+ senderFiles,
370
+ hash,
371
+ hashKey
372
+ }, {
373
+ "...on ErrorAccessDenied": {
374
+ __typename: true,
375
+ message: true
376
+ },
377
+ "...on ErrorBasic": {
378
+ __typename: true,
379
+ message: true
380
+ },
381
+ "...on UpdateDraftMailResponse": {
382
+ __typename: true,
383
+ updateDraftMail: mailSelector
384
+ }
385
+ }]
386
+ });
387
+ if (!updateDraftMail) {
388
+ return null;
389
+ }
390
+ if (updateDraftMail.__typename === "ErrorAccessDenied") {
391
+ return updateDraftMail;
392
+ }
393
+ if (updateDraftMail.__typename === "ErrorBasic") {
394
+ return updateDraftMail;
395
+ }
396
+ if (!updateDraftMail.updateDraftMail) {
397
+ return null;
398
+ }
399
+ const result = convertInternalMailToExternal(updateDraftMail.updateDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
400
+ return {
401
+ __typename: "SuccessResponse",
402
+ data: result
403
+ };
404
+ }
405
+ async deleteDraft(draftId) {
406
+ const {
407
+ deleteDraftMail
408
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
409
+ deleteDraftMail: [{
410
+ draftId
411
+ }, {
412
+ "...on ErrorAccessDenied": {
413
+ __typename: true,
414
+ message: true
415
+ },
416
+ "...on DeleteDraftMailResponse": {
417
+ __typename: true,
418
+ deleteDraftMail: true
419
+ }
420
+ }]
421
+ });
422
+ if (!deleteDraftMail) {
423
+ return null;
424
+ }
425
+ if (deleteDraftMail.__typename === "ErrorAccessDenied") {
426
+ return deleteDraftMail;
427
+ }
428
+ if (!deleteDraftMail.deleteDraftMail) {
429
+ return null;
430
+ }
431
+ return {
432
+ __typename: "SuccessResponse",
433
+ data: deleteDraftMail.deleteDraftMail ?? false
434
+ };
435
+ }
436
+ async deleteTrash(_ref5) {
437
+ let {
438
+ ids
439
+ } = _ref5;
440
+ const {
441
+ deleteMailTrash
442
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
443
+ deleteMailTrash: [{
444
+ ids
445
+ }, {
446
+ "...on ErrorAccessDenied": {
447
+ __typename: true,
448
+ message: true
449
+ },
450
+ "...on DeleteMailTrashResponse": {
451
+ __typename: true,
452
+ deleteMailTrash: true
453
+ }
454
+ }]
455
+ });
456
+ if (!deleteMailTrash) {
457
+ return null;
458
+ }
459
+ if (deleteMailTrash.__typename === "ErrorAccessDenied") {
460
+ return deleteMailTrash;
461
+ }
462
+ if (!deleteMailTrash.deleteMailTrash) {
463
+ return null;
464
+ }
465
+ return {
466
+ __typename: "SuccessResponse",
467
+ data: deleteMailTrash.deleteMailTrash
468
+ };
469
+ }
470
+ async emptyTrash() {
471
+ const {
472
+ emptyMailTrash
473
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
474
+ emptyMailTrash: {
475
+ "...on ErrorAccessDenied": {
476
+ __typename: true,
477
+ message: true
478
+ },
479
+ "...on EmptyMailTrashResponse": {
480
+ __typename: true,
481
+ emptyMailTrash: true
482
+ }
483
+ }
484
+ });
485
+ if (!emptyMailTrash) {
486
+ return null;
487
+ }
488
+ if (emptyMailTrash.__typename === "ErrorAccessDenied") {
489
+ return emptyMailTrash;
490
+ }
491
+ if (!emptyMailTrash.emptyMailTrash) {
492
+ return null;
493
+ }
494
+ return {
495
+ __typename: "SuccessResponse",
496
+ data: emptyMailTrash.emptyMailTrash
497
+ };
498
+ }
499
+ async delete(_ref6) {
500
+ let {
501
+ mailId
502
+ } = _ref6;
503
+ const {
504
+ deleteMail
505
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
506
+ deleteMail: [{
507
+ mailId
508
+ }, {
509
+ "...on ErrorAccessDenied": {
510
+ __typename: true,
511
+ message: true
512
+ },
513
+ "...on DeleteMailResponse": {
514
+ __typename: true,
515
+ deleteMail: true
516
+ }
517
+ }]
518
+ });
519
+ if (!deleteMail) {
520
+ return null;
521
+ }
522
+ if (deleteMail.__typename === "ErrorAccessDenied") {
523
+ return deleteMail;
524
+ }
525
+ return {
526
+ __typename: "SuccessResponse",
527
+ data: deleteMail.deleteMail
528
+ };
529
+ }
530
+ async sendDraft(draftId, customMessage) {
531
+ const drafts = await this.draftMails();
532
+ if (!drafts) {
533
+ return {
534
+ __typename: "SuccessResponse",
535
+ data: false
536
+ };
537
+ }
538
+ if (drafts.__typename !== "SuccessResponse") {
539
+ return {
540
+ __typename: "SuccessResponse",
541
+ data: false
542
+ };
543
+ }
544
+ const draft = drafts.data.find(d => d.mailIntegrityId === draftId);
545
+ if (!draft) {
546
+ return {
547
+ __typename: "SuccessResponse",
548
+ data: false
549
+ };
550
+ }
551
+ const recipients = new Array();
552
+ const temporaryRecipients = new Array();
553
+ for (const {
554
+ email
555
+ } of draft.temporaryRecipients) {
556
+ if (!email) {
557
+ continue;
558
+ }
559
+ const input = await this._eachUser(draft.files, draft.subject, draft.body, email);
560
+ if (!input) {
561
+ temporaryRecipients.push(email);
562
+ } else {
563
+ recipients.push(input);
564
+ }
565
+ }
566
+ for (const {
567
+ id
568
+ } of draft.recipients) {
569
+ const input = await this._eachUser(draft.files, draft.subject, draft.body, id);
570
+ if (!input) {
571
+ temporaryRecipients.push(id);
572
+ } else {
573
+ recipients.push(input);
574
+ }
575
+ }
576
+ const {
577
+ sendDraftMail
578
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
579
+ sendDraftMail: [{
580
+ temporaryRecipients,
581
+ recipients,
582
+ draftMailId: draft.mailIntegrityId,
583
+ customMessage
584
+ }, {
585
+ "...on ErrorAccessDenied": {
586
+ __typename: true,
587
+ message: true
588
+ },
589
+ "...on ErrorBasic": {
590
+ __typename: true,
591
+ message: true
592
+ },
593
+ "...on SendDraftMailResponse": {
594
+ __typename: true,
595
+ sendDraftMail: true
596
+ }
597
+ }]
598
+ });
599
+ if (!sendDraftMail) {
600
+ return null;
601
+ }
602
+ if (sendDraftMail.__typename === "ErrorAccessDenied") {
603
+ return sendDraftMail;
604
+ }
605
+ if (sendDraftMail.__typename === "ErrorBasic") {
606
+ return sendDraftMail;
607
+ }
608
+ if (!sendDraftMail.sendDraftMail) {
609
+ return null;
610
+ }
611
+ return {
612
+ __typename: "SuccessResponse",
613
+ data: sendDraftMail.sendDraftMail
614
+ };
615
+ }
616
+ async sendWaitingEmails() {
617
+ // TODO opti this
618
+ const mails = await this.sentMails();
619
+ if (!mails) {
620
+ return {
621
+ __typename: "SuccessResponse",
622
+ data: false
623
+ };
624
+ }
625
+ if (mails.__typename !== "SuccessResponse") {
626
+ return {
627
+ __typename: "SuccessResponse",
628
+ data: false
629
+ };
630
+ }
631
+ const filtered = mails.data.filter(m => m.temporaryRecipients.length > 0);
632
+ for (const mail of filtered) {
633
+ for (const {
634
+ email
635
+ } of mail.temporaryRecipients) {
636
+ if (!email) {
637
+ continue;
638
+ }
639
+ try {
640
+ const input = await this._eachUser(mail.files, mail.subject, mail.body, email);
641
+ if (!input) {
642
+ continue;
643
+ }
644
+ await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
645
+ sendOneMail: [{
646
+ mailIntegrityId: mail.mailIntegrityId,
647
+ recipient: input
648
+ }, {
649
+ "...on ErrorAccessDenied": {
650
+ __typename: true,
651
+ message: true
652
+ },
653
+ "...on ErrorBasic": {
654
+ __typename: true,
655
+ message: true
656
+ },
657
+ "...on RecoverNodeResponse": {
658
+ __typename: true,
659
+ recoverNode: true
660
+ }
661
+ }]
662
+ });
663
+ } catch {
664
+ continue;
665
+ }
666
+ }
667
+ }
668
+ return {
669
+ __typename: "SuccessResponse",
670
+ data: false
671
+ };
672
+ }
673
+ async createDraft(_ref7) {
674
+ let {
675
+ body,
676
+ subject,
677
+ files,
678
+ recipientsIds,
679
+ replyTo
680
+ } = _ref7;
681
+ const hashKey = sodium.randombytes_buf(sodium.crypto_generichash_KEYBYTES, "hex");
682
+ const hash = sodium.crypto_generichash(sodium.crypto_generichash_BYTES, JSON.stringify({
683
+ body,
684
+ subject
685
+ }), hashKey, "hex");
686
+ const senderFiles = new Array();
687
+ for (const f of files) {
688
+ let file = filesCache.get(f.id);
689
+ if (!file) {
690
+ await _classPrivateFieldLooseBase(this, _client)[_client].cloud.fileMetadata({
691
+ id: f.id
692
+ });
693
+ file = filesCache.get(f.id);
694
+ if (!file) {
695
+ throw new Error(`File ${f.name} (${f.id}) does not exists`);
696
+ }
697
+ }
698
+ senderFiles.push({
699
+ id: file.id,
700
+ fileKey: sodium.to_hex(encryptCryptoBox(sodium.from_string(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
701
+ name: sodium.to_hex(encryptCryptoBox(sodium.from_string(f.name), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
702
+ });
703
+ }
704
+ const {
705
+ createDraftMail
706
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
707
+ scalars: {
708
+ DateTime: {
709
+ decode: e => new Date(e),
710
+ encode: e => e.toISOString()
711
+ }
712
+ }
713
+ })({
714
+ createDraftMail: [{
715
+ recipients: recipientsIds,
716
+ replyTo,
717
+ body: sodium.to_hex(encryptCryptoBox(sodium.from_string(body), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
718
+ subject: sodium.to_hex(encryptCryptoBox(sodium.from_string(subject), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
719
+ senderFiles,
720
+ hash,
721
+ hashKey
722
+ }, {
723
+ "...on ErrorAccessDenied": {
724
+ __typename: true,
725
+ message: true
726
+ },
727
+ "...on ErrorBasic": {
728
+ __typename: true,
729
+ message: true
730
+ },
731
+ "...on CreateDraftMailResponse": {
732
+ __typename: true,
733
+ createDraftMail: mailSelector
734
+ }
735
+ }]
736
+ });
737
+ if (!createDraftMail) {
738
+ return null;
739
+ }
740
+ if (createDraftMail.__typename === "ErrorAccessDenied") {
741
+ return createDraftMail;
742
+ }
743
+ if (createDraftMail.__typename === "ErrorBasic") {
744
+ return createDraftMail;
745
+ }
746
+ if (!createDraftMail.createDraftMail) {
747
+ return null;
748
+ }
749
+ const result = convertInternalMailToExternal(createDraftMail.createDraftMail, _classPrivateFieldLooseBase(this, _keys)[_keys]);
750
+ return {
751
+ __typename: "SuccessResponse",
752
+ data: result
753
+ };
754
+ }
755
+ async read(_ref8) {
756
+ let {
757
+ mailId
758
+ } = _ref8;
759
+ const {
760
+ readMail
761
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
762
+ readMail: [{
763
+ mailId
764
+ }, {
765
+ "...on ErrorAccessDenied": {
766
+ __typename: true,
767
+ message: true
768
+ },
769
+ "...on ErrorBasic": {
770
+ __typename: true,
771
+ message: true
772
+ },
773
+ "...on ErrorNotFound": {
774
+ __typename: true,
775
+ message: true
776
+ },
777
+ "...on ReadMailResponse": {
778
+ __typename: true,
779
+ readMail: true
780
+ }
781
+ }]
782
+ });
783
+ if (!readMail) {
784
+ return null;
785
+ }
786
+ if (readMail.__typename === "ErrorAccessDenied") {
787
+ return readMail;
788
+ }
789
+ if (readMail.__typename === "ErrorBasic") {
790
+ return readMail;
791
+ }
792
+ if (readMail.__typename === "ErrorNotFound") {
793
+ return readMail;
794
+ }
795
+ if (!readMail.readMail) {
796
+ return null;
797
+ }
798
+ return {
799
+ __typename: "SuccessResponse",
800
+ data: readMail.readMail
801
+ };
802
+ }
803
+ async unread(_ref9) {
804
+ let {
805
+ mailId
806
+ } = _ref9;
807
+ const {
808
+ unreadMail
809
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
810
+ unreadMail: [{
811
+ mailId
812
+ }, {
813
+ "...on ErrorAccessDenied": {
814
+ __typename: true,
815
+ message: true
816
+ },
817
+ "...on ErrorBasic": {
818
+ __typename: true,
819
+ message: true
820
+ },
821
+ "...on ErrorNotFound": {
822
+ __typename: true,
823
+ message: true
824
+ },
825
+ "...on UnreadMailResponse": {
826
+ __typename: true,
827
+ unreadMail: true
828
+ }
829
+ }]
830
+ });
831
+ if (!unreadMail) {
832
+ return null;
833
+ }
834
+ if (unreadMail.__typename === "ErrorAccessDenied") {
835
+ return unreadMail;
836
+ }
837
+ if (unreadMail.__typename === "ErrorBasic") {
838
+ return unreadMail;
839
+ }
840
+ if (unreadMail.__typename === "ErrorNotFound") {
841
+ return unreadMail;
842
+ }
843
+ if (!unreadMail.unreadMail) {
844
+ return null;
845
+ }
846
+ return {
847
+ __typename: "SuccessResponse",
848
+ data: unreadMail.unreadMail
849
+ };
850
+ }
851
+ async receivedMails() {
852
+ const {
853
+ user
854
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
855
+ scalars: {
856
+ DateTime: {
857
+ decode: e => new Date(e),
858
+ encode: e => e.toISOString()
859
+ }
860
+ }
861
+ })({
862
+ user: [{}, {
863
+ "...on ErrorNotFound": {
864
+ __typename: true,
865
+ message: true
866
+ },
867
+ "...on UserResponse": {
868
+ __typename: true,
869
+ user: {
870
+ receivedMails: mailSelector
871
+ }
872
+ }
873
+ }]
874
+ });
875
+ if (!user) {
876
+ return null;
877
+ }
878
+ if (user.__typename === "ErrorNotFound") {
879
+ return user;
880
+ }
881
+ if (!user.user) {
882
+ return null;
883
+ }
884
+
885
+ // TODO get actual mails on this app only
886
+
887
+ const receivedMails = new Array();
888
+ for (const m of user.user.receivedMails) {
889
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
890
+ if (mail) {
891
+ receivedMails.push(mail);
892
+ }
893
+ }
894
+ return {
895
+ __typename: "SuccessResponse",
896
+ data: receivedMails
897
+ };
898
+ }
899
+ async sentMails() {
900
+ const {
901
+ user
902
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
903
+ scalars: {
904
+ DateTime: {
905
+ decode: e => new Date(e),
906
+ encode: e => e.toISOString()
907
+ }
908
+ }
909
+ })({
910
+ user: [{}, {
911
+ "...on ErrorNotFound": {
912
+ __typename: true,
913
+ message: true
914
+ },
915
+ "...on UserResponse": {
916
+ __typename: true,
917
+ user: {
918
+ sentMails: mailSelector
919
+ }
920
+ }
921
+ }]
922
+ });
923
+ if (!user) {
924
+ return null;
925
+ }
926
+ if (user.__typename === "ErrorNotFound") {
927
+ return user;
928
+ }
929
+ if (!user.user) {
930
+ return null;
931
+ }
932
+
933
+ // TODO get actual mails on this app only
934
+
935
+ const sentMails = new Array();
936
+ for (const m of user.user.sentMails) {
937
+ const mail = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
938
+ if (mail) {
939
+ sentMails.push(mail);
940
+ }
941
+ }
942
+ return {
943
+ __typename: "SuccessResponse",
944
+ data: sentMails
945
+ };
946
+ }
947
+ async draftMails() {
948
+ const {
949
+ user
950
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
951
+ scalars: {
952
+ DateTime: {
953
+ decode: e => new Date(e),
954
+ encode: e => e.toISOString()
955
+ }
956
+ }
957
+ })({
958
+ user: [{}, {
959
+ "...on ErrorNotFound": {
960
+ __typename: true,
961
+ message: true
962
+ },
963
+ "...on UserResponse": {
964
+ __typename: true,
965
+ user: {
966
+ draftMails: mailSelector
967
+ }
968
+ }
969
+ }]
970
+ });
971
+ if (!user) {
972
+ return null;
973
+ }
974
+ if (user.__typename === "ErrorNotFound") {
975
+ return user;
976
+ }
977
+ if (!user.user) {
978
+ return null;
979
+ }
980
+
981
+ // TODO get actual mails on this app only
982
+
983
+ const draftMails = new Array();
984
+ for (const m of user.user.draftMails) {
985
+ const draft = convertInternalMailToExternal(m, _classPrivateFieldLooseBase(this, _keys)[_keys]);
986
+ if (draft) {
987
+ draftMails.push(draft);
988
+ }
989
+ }
990
+ return {
991
+ __typename: "SuccessResponse",
992
+ data: draftMails
993
+ };
994
+ }
995
+ async unreadReceivedMailsCount() {
996
+ const {
997
+ unreadReceivedMailsCount
998
+ } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
999
+ unreadReceivedMailsCount: {
1000
+ "...on ErrorAccessDenied": {
1001
+ __typename: true,
1002
+ message: true
1003
+ },
1004
+ "...on UnreadReceivedMailsCountResponse": {
1005
+ __typename: true,
1006
+ count: true
1007
+ }
1008
+ }
1009
+ });
1010
+ if (!unreadReceivedMailsCount) {
1011
+ return null;
1012
+ }
1013
+ if (unreadReceivedMailsCount.__typename === "ErrorAccessDenied") {
1014
+ return unreadReceivedMailsCount;
1015
+ }
1016
+ return {
1017
+ __typename: "SuccessResponse",
1018
+ data: unreadReceivedMailsCount.count
1019
+ };
1020
+ }
1021
+ }
1022
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZW5lcmF0ZSIsImZpbGVzQ2FjaGUiLCJ1c2Vyc0NhY2hlIiwiZW5jcnlwdENyeXB0b0JveCIsInNvZGl1bSIsImNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsIiwibWFpbFNlbGVjdG9yIiwiU2VjcmVjeU1haWxDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwiX2VhY2hVc2VyIiwiZmlsZXMiLCJzdWJqZWN0IiwiYm9keSIsImlkT3JNYWlsIiwidSIsImdldCIsInJlcSIsInVzZXIiLCJ1c2VySWQiLCJ3aXRoUHVibGljS2V5IiwiX190eXBlbmFtZSIsImRhdGEiLCJFcnJvciIsInJlY2lwaWVudHNGaWxlcyIsIkFycmF5IiwiZiIsImZpbGVJbkhpc3RvcnkiLCJpZCIsImNsb3VkIiwiZmlsZU1ldGFkYXRhIiwibmFtZSIsImtleSIsInB1c2giLCJ0b19oZXgiLCJmcm9tX3N0cmluZyIsInB1YmxpY0tleSIsInByaXZhdGVLZXkiLCJmaWxlS2V5IiwiZnJvbV9oZXgiLCJyZWNpcGllbnRJZCIsIm1haWwiLCJzY2FsYXJzIiwiRGF0ZVRpbWUiLCJkZWNvZGUiLCJlIiwiRGF0ZSIsImVuY29kZSIsInRvSVNPU3RyaW5nIiwibWVzc2FnZSIsInJlc3VsdCIsInJlY292ZXIiLCJtYWlsSWQiLCJyZWNvdmVyTWFpbCIsImRlbGV0ZWRNYWlscyIsIm1haWxUeXBlIiwibWFpbHMiLCJtIiwiY3JlYXRlIiwiY3VzdG9tTWVzc2FnZSIsImNyZWF0ZURyYWZ0Iiwic2VuZERyYWZ0IiwibWFpbEludGVncml0eUlkIiwid2FpdGluZ1JlY2VpdmVkTWFpbHMiLCJkYXRlIiwiYXR0YWNobWVudHNDb3VudCIsInNlbmRlciIsImZpcnN0bmFtZSIsImxhc3RuYW1lIiwiZW1haWwiLCJyZWNpcGllbnRzIiwidGVtcG9yYXJ5UmVjaXBpZW50cyIsIm1hcCIsInVwZGF0ZURyYWZ0IiwiZHJhZnRJZCIsInJlY2lwaWVudHNJZHMiLCJyZXBseVRvIiwiZHJhZnRzIiwiZHJhZnRNYWlscyIsImRyYWZ0IiwiZmluZCIsImQiLCJoYXNoS2V5IiwiaGFzaCIsInJhbmRvbWJ5dGVzX2J1ZiIsImNyeXB0b19nZW5lcmljaGFzaF9LRVlCWVRFUyIsImNyeXB0b19nZW5lcmljaGFzaCIsImNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZW5kZXJGaWxlcyIsImZpbGUiLCJ1cGRhdGVEcmFmdE1haWwiLCJKc29uIiwicGFyc2UiLCJCaWdJbnQiLCJ0b1N0cmluZyIsImRlbGV0ZURyYWZ0IiwiZGVsZXRlRHJhZnRNYWlsIiwiZGVsZXRlVHJhc2giLCJpZHMiLCJkZWxldGVNYWlsVHJhc2giLCJlbXB0eVRyYXNoIiwiZW1wdHlNYWlsVHJhc2giLCJkZWxldGUiLCJkZWxldGVNYWlsIiwiaW5wdXQiLCJzZW5kRHJhZnRNYWlsIiwiZHJhZnRNYWlsSWQiLCJzZW5kV2FpdGluZ0VtYWlscyIsInNlbnRNYWlscyIsImZpbHRlcmVkIiwiZmlsdGVyIiwibGVuZ3RoIiwic2VuZE9uZU1haWwiLCJyZWNpcGllbnQiLCJyZWNvdmVyTm9kZSIsImNyZWF0ZURyYWZ0TWFpbCIsInJlYWQiLCJyZWFkTWFpbCIsInVucmVhZCIsInVucmVhZE1haWwiLCJyZWNlaXZlZE1haWxzIiwidW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50IiwiY291bnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lNYWlsQ2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2hvcnRpZFwiO1xuaW1wb3J0IHsgZmlsZXNDYWNoZSwgdXNlcnNDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFcnJvckFjY2Vzc0RlbmllZCwgRXJyb3JCYXNpYywgRXJyb3JOb3RGb3VuZCB9IGZyb20gXCIuLi9lcnJvci5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBTdWNjZXNzUmVzcG9uc2UsXG4gIEtleVBhaXIsXG4gIE5ld01haWwsXG4gIFNlY3JlY3lDbGllbnRcbn0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlbmNyeXB0Q3J5cHRvQm94LCBzb2RpdW0gfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpbFR5cGUsIFRodW5kZXIgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L21haWwuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRHJhZnRNYWlsLFxuICBNYWlsLFxuICBNYWlsRmlsZUlucHV0LFxuICBNYWlsUmVjaXBpZW50SW5wdXQsXG4gIFJlY2VpdmVkTWFpbCxcbiAgU2VudE1haWwsXG4gIFdhaXRpbmdSZWNlaXZlZE1haWxcbn0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IG1haWxTZWxlY3RvciB9IGZyb20gXCIuL3R5cGVzL3NlbGVjdG9ycy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VjcmVjeU1haWxDbGllbnQge1xuICAjY2xpZW50OiBTZWNyZWN5Q2xpZW50O1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gICN0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFNlY3JlY3lDbGllbnQsXG4gICAga2V5czogS2V5UGFpcixcbiAgICB0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPlxuICApIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy4ja2V5cyA9IGtleXM7XG4gICAgdGhpcy4jdGh1bmRlciA9IHRodW5kZXI7XG4gIH1cblxuICBhc3luYyBnZXQoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8TWFpbD4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIG1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFF1ZXJ5TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtYWlsOiBtYWlsU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghbWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIW1haWwubWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydEludGVybmFsTWFpbFRvRXh0ZXJuYWwobWFpbC5tYWlsLCB0aGlzLiNrZXlzKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWNvdmVyKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yQmFzaWMgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICByZWNvdmVyTWFpbDogW1xuICAgICAgICB7IG1haWxJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFJlY292ZXJNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlY292ZXJNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlY292ZXJNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck1haWw7XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVjb3Zlck1haWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZWNvdmVyTWFpbC5yZWNvdmVyTWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVkTWFpbHMoe1xuICAgIG1haWxUeXBlXG4gIH06IHtcbiAgICBtYWlsVHlwZTogTWFpbFR5cGU7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxNYWlsW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTWFpbHMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGRlbGV0ZWRNYWlsczogW1xuICAgICAgICB7IG1haWxUeXBlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZWRNYWlsc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVkTWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVkTWFpbHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkTWFpbHMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlZE1haWxzO1xuICAgIH1cblxuICAgIGNvbnN0IG1haWxzID0gbmV3IEFycmF5PE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgZGVsZXRlZE1haWxzLmRlbGV0ZWRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgbWFpbHMucHVzaChtYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG1haWxzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShcbiAgICBkYXRhOiBOZXdNYWlsLFxuICAgIGN1c3RvbU1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8U3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JCYXNpYyB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IG1haWwgPSBhd2FpdCB0aGlzLmNyZWF0ZURyYWZ0KGRhdGEpO1xuICAgIGlmICghbWFpbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBtYWlsO1xuICAgIH1cblxuICAgIGlmIChtYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIG1haWw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kRHJhZnQoXG4gICAgICBtYWlsLmRhdGEubWFpbEludGVncml0eUlkLFxuICAgICAgY3VzdG9tTWVzc2FnZVxuICAgICk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRpbmdSZWNlaXZlZE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFdhaXRpbmdSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICB3YWl0aW5nUmVjZWl2ZWRNYWlsczoge1xuICAgICAgICAgICAgICAgIGRhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHNDb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW5kZXI6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZmlyc3RuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbGFzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czoge1xuICAgICAgICAgICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBmaXJzdG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBsYXN0bmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcHVibGljS2V5OiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzOiB7XG4gICAgICAgICAgICAgICAgICBlbWFpbDogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHVzZXIudXNlci53YWl0aW5nUmVjZWl2ZWRNYWlscy5tYXAobSA9PiAoe1xuICAgICAgaWQ6IGdlbmVyYXRlKCksXG4gICAgICAuLi5tLFxuICAgICAgZGF0ZTogbmV3IERhdGUobS5kYXRlIGFzIHN0cmluZylcbiAgICB9KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyB1cGRhdGVEcmFmdChcbiAgICBkcmFmdElkOiBzdHJpbmcsXG4gICAgeyBib2R5LCBzdWJqZWN0LCBmaWxlcywgcmVjaXBpZW50c0lkcywgcmVwbHlUbyB9OiBQYXJ0aWFsPE5ld01haWw+XG4gICk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8RHJhZnRNYWlsPlxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgZHJhZnRzID0gYXdhaXQgdGhpcy5kcmFmdE1haWxzKCk7XG4gICAgaWYgKCFkcmFmdHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkcmFmdHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgcmV0dXJuIGRyYWZ0cztcbiAgICB9XG4gICAgY29uc3QgZHJhZnQgPSBkcmFmdHMuZGF0YS5maW5kKGQgPT4gZC5tYWlsSW50ZWdyaXR5SWQgPT09IGRyYWZ0SWQpO1xuICAgIGlmICghZHJhZnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkcmFmdCAke2RyYWZ0SWR9YCk7XG4gICAgfVxuICAgIGxldCBoYXNoS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzaDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGJvZHkgfHwgc3ViamVjdCkge1xuICAgICAgaGFzaEtleSA9IHNvZGl1bS5yYW5kb21ieXRlc19idWYoXG4gICAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfS0VZQllURVMsXG4gICAgICAgIFwiaGV4XCJcbiAgICAgICk7XG4gICAgICBoYXNoID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaChcbiAgICAgICAgc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaF9CWVRFUyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBib2R5LCBzdWJqZWN0IH0pLFxuICAgICAgICBoYXNoS2V5LFxuICAgICAgICBcImhleFwiXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZW5kZXJGaWxlcyA9IG5ldyBBcnJheTxNYWlsRmlsZUlucHV0PigpO1xuICAgIGlmIChmaWxlcykge1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5jbG91ZC5maWxlTWV0YWRhdGEoeyBpZDogZi5pZCB9KTtcbiAgICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmLm5hbWV9ICgke2YuaWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VuZGVyRmlsZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IGZpbGUuaWQsXG4gICAgICAgICAgZmlsZUtleTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmaWxlLmtleSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoZi5uYW1lKSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyB1cGRhdGVEcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1cGRhdGVEcmFmdE1haWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRyYWZ0SWQsXG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICAgID8gc29kaXVtLnRvX2hleChcbiAgICAgICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICAgICAgICA/IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhzdWJqZWN0KSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2VuZGVyRmlsZXMsXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBoYXNoS2V5XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlRHJhZnRNYWlsUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZURyYWZ0TWFpbDogbWFpbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZURyYWZ0TWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIXVwZGF0ZURyYWZ0TWFpbC51cGRhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKFxuICAgICAgdXBkYXRlRHJhZnRNYWlsLnVwZGF0ZURyYWZ0TWFpbCxcbiAgICAgIHRoaXMuI2tleXNcbiAgICApIGFzIERyYWZ0TWFpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURyYWZ0KFxuICAgIGRyYWZ0SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlRHJhZnRNYWlsIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkcmFmdElkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIERlbGV0ZURyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVEcmFmdE1haWw6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZGVsZXRlRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZURyYWZ0TWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIWRlbGV0ZURyYWZ0TWFpbC5kZWxldGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlRHJhZnRNYWlsLmRlbGV0ZURyYWZ0TWFpbCA/PyBmYWxzZVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVUcmFzaCh7XG4gICAgaWRzXG4gIH06IHtcbiAgICBpZHM6IEFycmF5PHN0cmluZz47XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTWFpbFRyYXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTWFpbFRyYXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU1haWxUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVNYWlsVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlTWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZGVsZXRlTWFpbFRyYXNoLmRlbGV0ZU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVNYWlsVHJhc2guZGVsZXRlTWFpbFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGVtcHR5VHJhc2goKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBlbXB0eU1haWxUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5TWFpbFRyYXNoOiB7XG4gICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIi4uLm9uIEVtcHR5TWFpbFRyYXNoUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZW1wdHlNYWlsVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eU1haWxUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVtcHR5TWFpbFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGVtcHR5TWFpbFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZW1wdHlNYWlsVHJhc2guZW1wdHlNYWlsVHJhc2hcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtYWlsSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU1haWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVNYWlsLmRlbGV0ZU1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2VuZERyYWZ0KFxuICAgIGRyYWZ0SWQ6IHN0cmluZyxcbiAgICBjdXN0b21NZXNzYWdlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGw+IHtcbiAgICBjb25zdCBkcmFmdHMgPSBhd2FpdCB0aGlzLmRyYWZ0TWFpbHMoKTtcblxuICAgIGlmICghZHJhZnRzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGRyYWZ0cy5fX3R5cGVuYW1lICE9PSBcIlN1Y2Nlc3NSZXNwb25zZVwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkcmFmdCA9IGRyYWZ0cy5kYXRhLmZpbmQoZCA9PiBkLm1haWxJbnRlZ3JpdHlJZCA9PT0gZHJhZnRJZCk7XG4gICAgaWYgKCFkcmFmdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBuZXcgQXJyYXk8TWFpbFJlY2lwaWVudElucHV0PigpO1xuXG4gICAgY29uc3QgdGVtcG9yYXJ5UmVjaXBpZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBkcmFmdC50ZW1wb3JhcnlSZWNpcGllbnRzKSB7XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgZHJhZnQuZmlsZXMsXG4gICAgICAgIGRyYWZ0LnN1YmplY3QsXG4gICAgICAgIGRyYWZ0LmJvZHksXG4gICAgICAgIGVtYWlsXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRlbXBvcmFyeVJlY2lwaWVudHMucHVzaChlbWFpbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNpcGllbnRzLnB1c2goaW5wdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyBpZCB9IG9mIGRyYWZ0LnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgdGhpcy5fZWFjaFVzZXIoXG4gICAgICAgIGRyYWZ0LmZpbGVzLFxuICAgICAgICBkcmFmdC5zdWJqZWN0LFxuICAgICAgICBkcmFmdC5ib2R5LFxuICAgICAgICBpZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLnB1c2goaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjaXBpZW50cy5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHNlbmREcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzZW5kRHJhZnRNYWlsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW1wb3JhcnlSZWNpcGllbnRzLFxuICAgICAgICAgIHJlY2lwaWVudHMsXG4gICAgICAgICAgZHJhZnRNYWlsSWQ6IGRyYWZ0Lm1haWxJbnRlZ3JpdHlJZCxcbiAgICAgICAgICBjdXN0b21NZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2VuZERyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBzZW5kRHJhZnRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNlbmREcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChzZW5kRHJhZnRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNlbmREcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHNlbmREcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBzZW5kRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmICghc2VuZERyYWZ0TWFpbC5zZW5kRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNlbmREcmFmdE1haWwuc2VuZERyYWZ0TWFpbFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzZW5kV2FpdGluZ0VtYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JCYXNpYyB8IG51bGxcbiAgPiB7XG4gICAgLy8gVE9ETyBvcHRpIHRoaXNcbiAgICBjb25zdCBtYWlscyA9IGF3YWl0IHRoaXMuc2VudE1haWxzKCk7XG5cbiAgICBpZiAoIW1haWxzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgICBkYXRhOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1haWxzLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1haWxzLmRhdGEuZmlsdGVyKG0gPT4gbS50ZW1wb3JhcnlSZWNpcGllbnRzLmxlbmd0aCA+IDApO1xuXG4gICAgZm9yIChjb25zdCBtYWlsIG9mIGZpbHRlcmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgZW1haWwgfSBvZiBtYWlsLnRlbXBvcmFyeVJlY2lwaWVudHMpIHtcbiAgICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLl9lYWNoVXNlcihcbiAgICAgICAgICAgIG1haWwuZmlsZXMsXG4gICAgICAgICAgICBtYWlsLnN1YmplY3QsXG4gICAgICAgICAgICBtYWlsLmJvZHksXG4gICAgICAgICAgICBlbWFpbFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgICAgIHNlbmRPbmVNYWlsOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYWlsSW50ZWdyaXR5SWQ6IG1haWwubWFpbEludGVncml0eUlkLFxuICAgICAgICAgICAgICAgIHJlY2lwaWVudDogaW5wdXRcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIuLi5vbiBSZWNvdmVyTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICByZWNvdmVyTm9kZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZURyYWZ0KHtcbiAgICBib2R5LFxuICAgIHN1YmplY3QsXG4gICAgZmlsZXMsXG4gICAgcmVjaXBpZW50c0lkcyxcbiAgICByZXBseVRvXG4gIH06IE5ld01haWwpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBoYXNoS2V5ID0gc29kaXVtLnJhbmRvbWJ5dGVzX2J1ZihcbiAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfS0VZQllURVMsXG4gICAgICBcImhleFwiXG4gICAgKTtcbiAgICBjb25zdCBoYXNoID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaChcbiAgICAgIHNvZGl1bS5jcnlwdG9fZ2VuZXJpY2hhc2hfQllURVMsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IGJvZHksIHN1YmplY3QgfSksXG4gICAgICBoYXNoS2V5LFxuICAgICAgXCJoZXhcIlxuICAgICk7XG4gICAgY29uc3Qgc2VuZGVyRmlsZXMgPSBuZXcgQXJyYXk8TWFpbEZpbGVJbnB1dD4oKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICAgIGxldCBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LmNsb3VkLmZpbGVNZXRhZGF0YSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZW5kZXJGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGZpbGUuaWQsXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmaWxlLmtleSksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgbmFtZTogc29kaXVtLnRvX2hleChcbiAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGYubmFtZSksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjcmVhdGVEcmFmdE1haWwgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGNyZWF0ZURyYWZ0TWFpbDogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVjaXBpZW50czogcmVjaXBpZW50c0lkcyxcbiAgICAgICAgICByZXBseVRvLFxuICAgICAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoYm9keSksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHN1YmplY3Q6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgICAgIHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIHNlbmRlckZpbGVzLFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgaGFzaEtleVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIENyZWF0ZURyYWZ0TWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBjcmVhdGVEcmFmdE1haWw6IG1haWxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFjcmVhdGVEcmFmdE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVEcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRHJhZnRNYWlsO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVEcmFmdE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEcmFmdE1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFjcmVhdGVEcmFmdE1haWwuY3JlYXRlRHJhZnRNYWlsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChcbiAgICAgIGNyZWF0ZURyYWZ0TWFpbC5jcmVhdGVEcmFmdE1haWwsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKSBhcyBEcmFmdE1haWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZWFkKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyByZWFkTWFpbCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHJlYWRNYWlsOiBbXG4gICAgICAgIHsgbWFpbElkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBSZWFkTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICByZWFkTWFpbDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmIChyZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmIChyZWFkTWFpbC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICghcmVhZE1haWwucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVhZE1haWwucmVhZE1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5yZWFkKHtcbiAgICBtYWlsSWRcbiAgfToge1xuICAgIG1haWxJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRNYWlsIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgdW5yZWFkTWFpbDogW1xuICAgICAgICB7IG1haWxJZCB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvckJhc2ljXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVW5yZWFkTWFpbFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1bnJlYWRNYWlsOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVucmVhZE1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVucmVhZE1haWw7XG4gICAgfVxuXG4gICAgaWYgKHVucmVhZE1haWwuX190eXBlbmFtZSA9PT0gXCJFcnJvckJhc2ljXCIpIHtcbiAgICAgIHJldHVybiB1bnJlYWRNYWlsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRNYWlsLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkTWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIXVucmVhZE1haWwudW5yZWFkTWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiB1bnJlYWRNYWlsLnVucmVhZE1haWxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVjZWl2ZWRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxSZWNlaXZlZE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHJlY2VpdmVkTWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCByZWNlaXZlZE1haWxzID0gbmV3IEFycmF5PFJlY2VpdmVkTWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIucmVjZWl2ZWRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgcmVjZWl2ZWRNYWlscy5wdXNoKG1haWwgYXMgUmVjZWl2ZWRNYWlsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY2VpdmVkTWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2VudE1haWxzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFNlbnRNYWlsW10+IHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1c2VyIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1c2VyOiBbXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFVzZXJSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBzZW50TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBzZW50TWFpbHMgPSBuZXcgQXJyYXk8U2VudE1haWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG0gb2YgdXNlci51c2VyLnNlbnRNYWlscykge1xuICAgICAgY29uc3QgbWFpbCA9IGNvbnZlcnRJbnRlcm5hbE1haWxUb0V4dGVybmFsKG0sIHRoaXMuI2tleXMpO1xuICAgICAgaWYgKG1haWwpIHtcbiAgICAgICAgc2VudE1haWxzLnB1c2gobWFpbCBhcyBTZW50TWFpbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBzZW50TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZHJhZnRNYWlscygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxEcmFmdE1haWxbXT4gfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIERhdGVUaW1lOiB7XG4gICAgICAgICAgZGVjb2RlOiAoZTogdW5rbm93bikgPT4gbmV3IERhdGUoZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIERhdGUpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXNlclJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIGRyYWZ0TWFpbHM6IG1haWxTZWxlY3RvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodXNlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VyLnVzZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRPRE8gZ2V0IGFjdHVhbCBtYWlscyBvbiB0aGlzIGFwcCBvbmx5XG5cbiAgICBjb25zdCBkcmFmdE1haWxzID0gbmV3IEFycmF5PERyYWZ0TWFpbD4oKTtcblxuICAgIGZvciAoY29uc3QgbSBvZiB1c2VyLnVzZXIuZHJhZnRNYWlscykge1xuICAgICAgY29uc3QgZHJhZnQgPSBjb252ZXJ0SW50ZXJuYWxNYWlsVG9FeHRlcm5hbChtLCB0aGlzLiNrZXlzKSBhcyBEcmFmdE1haWw7XG4gICAgICBpZiAoZHJhZnQpIHtcbiAgICAgICAgZHJhZnRNYWlscy5wdXNoKGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRyYWZ0TWFpbHNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50KCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPG51bWJlcj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICB1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQ6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gVW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50UmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgY291bnQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1bnJlYWRSZWNlaXZlZE1haWxzQ291bnQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogdW5yZWFkUmVjZWl2ZWRNYWlsc0NvdW50LmNvdW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VhY2hVc2VyID0gYXN5bmMgKFxuICAgIGZpbGVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBpZE9yTWFpbDogc3RyaW5nXG4gICk6IFByb21pc2U8TWFpbFJlY2lwaWVudElucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCB1ID0gdXNlcnNDYWNoZS5nZXQoaWRPck1haWwpO1xuXG4gICAgaWYgKCF1IHx8ICEoXCJwdWJsaWNLZXlcIiBpbiB1KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgdGhpcy4jY2xpZW50LnVzZXIoe1xuICAgICAgICAgIHVzZXJJZDogaWRPck1haWwsXG4gICAgICAgICAgd2l0aFB1YmxpY0tleTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXEpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxLl9fdHlwZW5hbWUgIT09IFwiU3VjY2Vzc1Jlc3BvbnNlXCIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB1ID0gcmVxLmRhdGE7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghdSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShcInB1YmxpY0tleVwiIGluIHUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXIgJHtpZE9yTWFpbH0gaGF2ZSBubyBwdWJsaWMga2V5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50c0ZpbGVzID0gbmV3IEFycmF5PE1haWxGaWxlSW5wdXQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICAgIGxldCBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICBpZiAoIWZpbGVJbkhpc3RvcnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LmNsb3VkLmZpbGVNZXRhZGF0YSh7IGlkOiBmLmlkIH0pO1xuICAgICAgICBmaWxlSW5IaXN0b3J5ID0gZmlsZXNDYWNoZS5nZXQoZi5pZCk7XG4gICAgICAgIGlmICghZmlsZUluSGlzdG9yeSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2YubmFtZX0gKCR7Zi5pZH0pIGRvZXMgbm90IGV4aXN0c2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBmaWxlSW5IaXN0b3J5LmtleTtcbiAgICAgIHJlY2lwaWVudHNGaWxlcy5wdXNoKHtcbiAgICAgICAgaWQ6IGYuaWQsXG4gICAgICAgIG5hbWU6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX3N0cmluZyhmLm5hbWUpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGZpbGVLZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNpcGllbnRJZDogdS5pZCxcbiAgICAgIGJvZHk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21fc3RyaW5nKGJvZHkpLFxuICAgICAgICAgIHUucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgc3ViamVjdDogc29kaXVtLnRvX2hleChcbiAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICBzb2RpdW0uZnJvbV9zdHJpbmcoc3ViamVjdCksXG4gICAgICAgICAgdS5wdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczogcmVjaXBpZW50c0ZpbGVzXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBLFNBQVNBLFFBQVEsUUFBUSxTQUFTO0FBQ2xDLFNBQVNDLFVBQVUsRUFBRUMsVUFBVSxRQUFRLGFBQWE7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