@secrecy/lib 1.6.0 → 1.6.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 (197) hide show
  1. package/dist/BaseClient-ca94a07f.d.ts +405 -0
  2. package/dist/BaseClient.cjs +2 -0
  3. package/dist/BaseClient.cjs.map +1 -0
  4. package/dist/BaseClient.d.ts +16 -111
  5. package/dist/BaseClient.js +2 -506
  6. package/dist/BaseClient.js.map +1 -0
  7. package/dist/PopupTools.cjs +2 -0
  8. package/dist/PopupTools.cjs.map +1 -0
  9. package/dist/PopupTools.d.ts +5 -4
  10. package/dist/PopupTools.js +2 -195
  11. package/dist/PopupTools.js.map +1 -0
  12. package/dist/ZeusThunder.cjs +2 -0
  13. package/dist/ZeusThunder.cjs.map +1 -0
  14. package/dist/ZeusThunder.d.ts +6 -2
  15. package/dist/ZeusThunder.js +2 -65
  16. package/dist/ZeusThunder.js.map +1 -0
  17. package/dist/cache.cjs +2 -0
  18. package/dist/cache.cjs.map +1 -0
  19. package/dist/cache.d.ts +22 -4
  20. package/dist/cache.js +2 -4
  21. package/dist/cache.js.map +1 -0
  22. package/dist/client/SecrecyAppClient.cjs +2 -0
  23. package/dist/client/SecrecyAppClient.cjs.map +1 -0
  24. package/dist/client/SecrecyAppClient.d.ts +16 -17
  25. package/dist/client/SecrecyAppClient.js +2 -226
  26. package/dist/client/SecrecyAppClient.js.map +1 -0
  27. package/dist/client/SecrecyCloudClient.cjs +2 -0
  28. package/dist/client/SecrecyCloudClient.cjs.map +1 -0
  29. package/dist/client/SecrecyCloudClient.d.ts +16 -89
  30. package/dist/client/SecrecyCloudClient.js +2 -1405
  31. package/dist/client/SecrecyCloudClient.js.map +1 -0
  32. package/dist/client/SecrecyDbClient.cjs +2 -0
  33. package/dist/client/SecrecyDbClient.cjs.map +1 -0
  34. package/dist/client/SecrecyDbClient.d.ts +16 -48
  35. package/dist/client/SecrecyDbClient.js +2 -419
  36. package/dist/client/SecrecyDbClient.js.map +1 -0
  37. package/dist/client/SecrecyMailClient.cjs +2 -0
  38. package/dist/client/SecrecyMailClient.cjs.map +1 -0
  39. package/dist/client/SecrecyMailClient.d.ts +16 -42
  40. package/dist/client/SecrecyMailClient.js +2 -1022
  41. package/dist/client/SecrecyMailClient.js.map +1 -0
  42. package/dist/client/SecrecyPayClient.cjs +2 -0
  43. package/dist/client/SecrecyPayClient.cjs.map +1 -0
  44. package/dist/client/SecrecyPayClient.d.ts +16 -28
  45. package/dist/client/SecrecyPayClient.js +2 -68
  46. package/dist/client/SecrecyPayClient.js.map +1 -0
  47. package/dist/client/SecrecyWalletClient.cjs +2 -0
  48. package/dist/client/SecrecyWalletClient.cjs.map +1 -0
  49. package/dist/client/SecrecyWalletClient.d.ts +16 -30
  50. package/dist/client/SecrecyWalletClient.js +2 -73
  51. package/dist/client/SecrecyWalletClient.js.map +1 -0
  52. package/dist/client/convert/file.cjs +2 -0
  53. package/dist/client/convert/file.cjs.map +1 -0
  54. package/dist/client/convert/file.d.ts +11 -5
  55. package/dist/client/convert/file.js +2 -33
  56. package/dist/client/convert/file.js.map +1 -0
  57. package/dist/client/convert/mail.cjs +2 -0
  58. package/dist/client/convert/mail.cjs.map +1 -0
  59. package/dist/client/convert/mail.d.ts +13 -3
  60. package/dist/client/convert/mail.js +2 -42
  61. package/dist/client/convert/mail.js.map +1 -0
  62. package/dist/client/convert/node.cjs +2 -0
  63. package/dist/client/convert/node.cjs.map +1 -0
  64. package/dist/client/convert/node.d.ts +18 -9
  65. package/dist/client/convert/node.js +2 -87
  66. package/dist/client/convert/node.js.map +1 -0
  67. package/dist/client/helpers.cjs +2 -0
  68. package/dist/client/helpers.cjs.map +1 -0
  69. package/dist/client/helpers.d.ts +16 -28
  70. package/dist/client/helpers.js +2 -119
  71. package/dist/client/helpers.js.map +1 -0
  72. package/dist/client/index.cjs +2 -0
  73. package/dist/client/index.cjs.map +1 -0
  74. package/dist/client/index.d.ts +16 -34
  75. package/dist/client/index.js +2 -46
  76. package/dist/client/index.js.map +1 -0
  77. package/dist/client/storage.cjs +2 -0
  78. package/dist/client/storage.cjs.map +1 -0
  79. package/dist/client/storage.d.ts +6 -3
  80. package/dist/client/storage.js +2 -12
  81. package/dist/client/storage.js.map +1 -0
  82. package/dist/client/types/File.cjs +1 -0
  83. package/dist/client/types/File.cjs.map +1 -0
  84. package/dist/client/types/File.d.ts +9 -5
  85. package/dist/client/types/File.js +1 -3
  86. package/dist/client/types/File.js.map +1 -0
  87. package/dist/client/types/Inputs.cjs +1 -0
  88. package/dist/client/types/Inputs.cjs.map +1 -0
  89. package/dist/client/types/Inputs.d.ts +6 -4
  90. package/dist/client/types/Inputs.js +1 -3
  91. package/dist/client/types/Inputs.js.map +1 -0
  92. package/dist/client/types/Node.cjs +1 -0
  93. package/dist/client/types/Node.cjs.map +1 -0
  94. package/dist/client/types/Node.d.ts +9 -56
  95. package/dist/client/types/Node.js +1 -3
  96. package/dist/client/types/Node.js.map +1 -0
  97. package/dist/client/types/UserAppNotifications.cjs +1 -0
  98. package/dist/client/types/UserAppNotifications.cjs.map +1 -0
  99. package/dist/client/types/UserAppNotifications.d.ts +3 -1
  100. package/dist/client/types/UserAppNotifications.js +1 -3
  101. package/dist/client/types/UserAppNotifications.js.map +1 -0
  102. package/dist/client/types/UserAppSettings.cjs +1 -0
  103. package/dist/client/types/UserAppSettings.cjs.map +1 -0
  104. package/dist/client/types/UserAppSettings.d.ts +3 -1
  105. package/dist/client/types/UserAppSettings.js +1 -3
  106. package/dist/client/types/UserAppSettings.js.map +1 -0
  107. package/dist/client/types/index.cjs +2 -0
  108. package/dist/client/types/index.cjs.map +1 -0
  109. package/dist/client/types/index.d.ts +86 -30
  110. package/dist/client/types/index.js +2 -8
  111. package/dist/client/types/index.js.map +1 -0
  112. package/dist/client/types/selectors.cjs +2 -0
  113. package/dist/client/types/selectors.cjs.map +1 -0
  114. package/dist/client/types/selectors.d.ts +7 -5
  115. package/dist/client/types/selectors.js +2 -135
  116. package/dist/client/types/selectors.js.map +1 -0
  117. package/dist/crypto/file.cjs +2 -0
  118. package/dist/crypto/file.cjs.map +1 -0
  119. package/dist/crypto/file.d.ts +8 -6
  120. package/dist/crypto/file.js +2 -195
  121. package/dist/crypto/file.js.map +1 -0
  122. package/dist/crypto/index.cjs +2 -0
  123. package/dist/crypto/index.cjs.map +1 -0
  124. package/dist/crypto/index.d.ts +11 -9
  125. package/dist/crypto/index.js +2 -45
  126. package/dist/crypto/index.js.map +1 -0
  127. package/dist/error.cjs +1 -0
  128. package/dist/error.cjs.map +1 -0
  129. package/dist/error.d.ts +13 -11
  130. package/dist/error.js +1 -3
  131. package/dist/error.js.map +1 -0
  132. package/dist/index.cjs +2 -0
  133. package/dist/index.cjs.map +1 -0
  134. package/dist/index.d.ts +19 -14
  135. package/dist/index.js +2 -10
  136. package/dist/index.js.map +1 -0
  137. package/dist/minify/index.cjs +2 -0
  138. package/dist/minify/index.cjs.map +1 -0
  139. package/dist/minify/index.d.ts +4 -2
  140. package/dist/minify/index.js +2 -23
  141. package/dist/minify/index.js.map +1 -0
  142. package/dist/minify/lz4.cjs +3 -0
  143. package/dist/minify/lz4.cjs.map +1 -0
  144. package/dist/minify/lz4.d.ts +7 -5
  145. package/dist/minify/lz4.js +2 -538
  146. package/dist/minify/lz4.js.map +1 -0
  147. package/dist/sodium.cjs +2 -0
  148. package/dist/sodium.cjs.map +1 -0
  149. package/dist/sodium.d.ts +5 -3
  150. package/dist/sodium.js +2 -6
  151. package/dist/sodium.js.map +1 -0
  152. package/dist/utils/encoders.cjs +2 -0
  153. package/dist/utils/encoders.cjs.map +1 -0
  154. package/dist/utils/encoders.d.ts +6 -4
  155. package/dist/utils/encoders.js +2 -18
  156. package/dist/utils/encoders.js.map +1 -0
  157. package/dist/utils/store-buddy.cjs +2 -0
  158. package/dist/utils/store-buddy.cjs.map +1 -0
  159. package/dist/utils/store-buddy.d.ts +4 -3
  160. package/dist/utils/store-buddy.js +2 -58
  161. package/dist/utils/store-buddy.js.map +1 -0
  162. package/dist/utils/time.cjs +2 -0
  163. package/dist/utils/time.cjs.map +1 -0
  164. package/dist/utils/time.d.ts +4 -2
  165. package/dist/utils/time.js +2 -12
  166. package/dist/utils/time.js.map +1 -0
  167. package/dist/utils/utils.cjs +2 -0
  168. package/dist/utils/utils.cjs.map +1 -0
  169. package/dist/utils/utils.d.ts +6 -4
  170. package/dist/utils/utils.js +2 -47
  171. package/dist/utils/utils.js.map +1 -0
  172. package/dist/worker/md5.cjs +2 -0
  173. package/dist/worker/md5.cjs.map +1 -0
  174. package/dist/worker/md5.d.ts +3 -1
  175. package/dist/worker/md5.js +2 -24
  176. package/dist/worker/md5.js.map +1 -0
  177. package/dist/worker/sodium.cjs +2 -0
  178. package/dist/worker/sodium.cjs.map +1 -0
  179. package/dist/worker/sodium.d.ts +6 -3
  180. package/dist/worker/sodium.js +2 -118
  181. package/dist/worker/sodium.js.map +1 -0
  182. package/dist/worker/workerCodes.cjs +254 -0
  183. package/dist/worker/workerCodes.cjs.map +1 -0
  184. package/dist/worker/workerCodes.d.ts +4 -2
  185. package/dist/worker/workerCodes.js +4 -5
  186. package/dist/worker/workerCodes.js.map +1 -0
  187. package/dist/zeus/const.cjs +2 -0
  188. package/dist/zeus/const.cjs.map +1 -0
  189. package/dist/zeus/const.d.ts +5 -3
  190. package/dist/zeus/const.js +2 -1846
  191. package/dist/zeus/const.js.map +1 -0
  192. package/dist/zeus/index.cjs +5 -0
  193. package/dist/zeus/index.cjs.map +1 -0
  194. package/dist/zeus/index.d.ts +91 -89
  195. package/dist/zeus/index.js +5 -642
  196. package/dist/zeus/index.js.map +1 -0
  197. package/package.json +2 -2
@@ -1,1405 +1,2 @@
1
- import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase";
2
- import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey";
3
- /* eslint-disable @typescript-eslint/naming-convention */
4
-
5
- import axios from "axios";
6
- import ky from "ky";
7
- import { encryptName } from "../index.js";
8
- import { nodesCache, filesCache } from "../cache.js";
9
- import { secretstreamKeygen } from "../crypto/file.js";
10
- import { decryptCryptoBox } from "../crypto/index.js";
11
- import { encryptCryptoBox } from "../crypto/index.js";
12
- import { compress, uncompress } from "../minify/index.js";
13
- import { sodium } from "../sodium.js";
14
- import { enumerate, chunks, promiseAllLimit, concatenate } from "../utils/utils.js";
15
- import { md5 } from "../worker/md5.js";
16
- import { decrypt, encrypt } from "../worker/sodium.js";
17
- import { gqlFileToExternal } from "./convert/file.js";
18
- import { gqlNodeFullToInternalFull, gqlNodeToExternal, gqlNodeToExternalNodeFull, internalNodeToNode } from "./convert/node.js";
19
- import { fileSelector, nodeFullSelector, nodeSelector } from "./types/selectors.js";
20
- // import { md5 } from "../worker/index.js";
21
- // import { firstValueFrom, of } from "rxjs";
22
- var _client = /*#__PURE__*/_classPrivateFieldLooseKey("client");
23
- var _keys = /*#__PURE__*/_classPrivateFieldLooseKey("keys");
24
- var _thunder = /*#__PURE__*/_classPrivateFieldLooseKey("thunder");
25
- export class SecrecyCloudClient {
26
- constructor(client, keys, thunder) {
27
- Object.defineProperty(this, _client, {
28
- writable: true,
29
- value: void 0
30
- });
31
- Object.defineProperty(this, _keys, {
32
- writable: true,
33
- value: void 0
34
- });
35
- Object.defineProperty(this, _thunder, {
36
- writable: true,
37
- value: void 0
38
- });
39
- this.perNode = async (nodeId, publicKey) => {
40
- let node = nodesCache.get(nodeId);
41
- if (!node) {
42
- await this.node({
43
- id: nodeId
44
- });
45
- node = nodesCache.get(nodeId);
46
- if (!node) {
47
- return null;
48
- }
49
- }
50
- const nameKey = node.access?.nameKey;
51
- if (!nameKey) {
52
- return null;
53
- }
54
- return {
55
- id: node.id,
56
- nameKey: sodium.to_hex(encryptCryptoBox(sodium.from_hex(nameKey), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey)),
57
- files: "history" in node ? node.history.map(f => ({
58
- id: f.id,
59
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(f.key), publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
60
- })) : []
61
- };
62
- };
63
- _classPrivateFieldLooseBase(this, _client)[_client] = client;
64
- _classPrivateFieldLooseBase(this, _keys)[_keys] = keys;
65
- _classPrivateFieldLooseBase(this, _thunder)[_thunder] = thunder;
66
- }
67
- async addFileToHistory(_ref) {
68
- let {
69
- fileId,
70
- nodeId
71
- } = _ref;
72
- const {
73
- addFileToHistory
74
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
75
- addFileToHistory: [{
76
- fileId,
77
- nodeId
78
- }, {
79
- "...on ErrorAccessDenied": {
80
- __typename: true,
81
- message: true
82
- },
83
- "...on ErrorNotExist": {
84
- __typename: true,
85
- message: true
86
- },
87
- "...on AddFileToHistoryResponse": {
88
- __typename: true,
89
- addFileToHistory: nodeFullSelector
90
- }
91
- }]
92
- });
93
- if (!addFileToHistory) {
94
- return null;
95
- }
96
- if (addFileToHistory.__typename === "ErrorAccessDenied") {
97
- return addFileToHistory;
98
- }
99
- if (addFileToHistory.__typename === "ErrorNotExist") {
100
- return addFileToHistory;
101
- }
102
- const node = await gqlNodeFullToInternalFull(addFileToHistory.addFileToHistory, _classPrivateFieldLooseBase(this, _keys)[_keys]);
103
- const file = node.history.find(f => f.id === fileId);
104
- if (file) {
105
- const users = node.users.filter(_ref2 => {
106
- let [u] = _ref2;
107
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
108
- });
109
- const input = {
110
- fileId: file.id,
111
- users: users.map(_ref3 => {
112
- let [u] = _ref3;
113
- return {
114
- id: u.id,
115
- key: sodium.to_hex(encryptCryptoBox(sodium.from_hex(file.key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey))
116
- };
117
- })
118
- };
119
- await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
120
- shareFileInHistory: [{
121
- input,
122
- nodeId
123
- }, {
124
- "...on ErrorAccessDenied": {
125
- __typename: true,
126
- message: true
127
- },
128
- "...on ErrorNotFound": {
129
- __typename: true,
130
- message: true
131
- },
132
- "...on ShareFileInHistoryResponse": {
133
- __typename: true,
134
- shareFileInHistory: true
135
- }
136
- }]
137
- });
138
- }
139
- const result = internalNodeToNode(node);
140
- return {
141
- __typename: "SuccessResponse",
142
- data: result
143
- };
144
- }
145
- async uploadFile(_ref4) {
146
- let {
147
- file,
148
- encryptProgress,
149
- uploadProgress,
150
- signal
151
- } = _ref4;
152
- const fileKey = secretstreamKeygen();
153
- const fileBuffer = file instanceof File ? new Uint8Array(await file.arrayBuffer()) : file;
154
- const compressed = compress(fileBuffer);
155
- const {
156
- data: encryptedFile,
157
- md5: md5File,
158
- md5Encrypted
159
- } = await encrypt(fileKey, compressed, encryptProgress, signal);
160
- const encryptedFileKey = encryptCryptoBox(fileKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
161
- const {
162
- uploadFile
163
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation", {
164
- scalars: {
165
- Json: {
166
- encode: e => JSON.stringify(e),
167
- decode: e => JSON.parse(e)
168
- },
169
- DateTime: {
170
- decode: e => new Date(e),
171
- encode: e => e.toISOString()
172
- },
173
- BigInt: {
174
- decode: e => BigInt(e),
175
- encode: e => e.toString()
176
- }
177
- }
178
- })({
179
- uploadFile: [{
180
- fileSize: encryptedFile.byteLength,
181
- fileSizeBefore: fileBuffer.byteLength,
182
- fileKey: sodium.to_hex(encryptedFileKey),
183
- md5Encrypted,
184
- md5: md5File
185
- }, {
186
- "...on ErrorAccessDenied": {
187
- __typename: true,
188
- message: true
189
- },
190
- "...on ErrorLimit": {
191
- __typename: true,
192
- message: true
193
- },
194
- "...on ErrorNotFound": {
195
- __typename: true,
196
- message: true
197
- },
198
- "...on UploadFileResponse": {
199
- __typename: true,
200
- uploadFile: {
201
- fileId: true,
202
- filePartSize: true,
203
- parts: {
204
- fields: true,
205
- order: true,
206
- url: true
207
- }
208
- }
209
- }
210
- }]
211
- });
212
- if (!uploadFile) {
213
- return null;
214
- }
215
- if (uploadFile.__typename === "ErrorAccessDenied") {
216
- return uploadFile;
217
- }
218
- if (uploadFile.__typename === "ErrorLimit") {
219
- return uploadFile;
220
- }
221
- if (uploadFile.__typename === "ErrorNotFound") {
222
- return uploadFile;
223
- }
224
- if (!uploadFile.uploadFile) {
225
- return null;
226
- }
227
- uploadProgress?.({
228
- total: encryptedFile.byteLength,
229
- current: 0,
230
- percent: 0
231
- });
232
- if (uploadFile.uploadFile.parts.length === 0) {
233
- uploadProgress?.({
234
- total: encryptedFile.byteLength,
235
- current: encryptedFile.byteLength,
236
- percent: 1
237
- });
238
- return {
239
- __typename: "SuccessResponse",
240
- data: uploadFile.uploadFile.fileId
241
- };
242
- }
243
- const uploadPartEnded = async (md5, order) => {
244
- if (!uploadFile.uploadFile) {
245
- return null;
246
- }
247
- const {
248
- uploadFilePartEnd
249
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
250
- uploadFilePartEnd: [{
251
- fileId: uploadFile.uploadFile.fileId,
252
- md5,
253
- order
254
- }, {
255
- "...on ErrorAccessDenied": {
256
- __typename: true,
257
- message: true
258
- },
259
- "...on UploadFilePartEndResponse": {
260
- __typename: true,
261
- uploadFilePartEnd: true
262
- }
263
- }]
264
- });
265
- if (!uploadFilePartEnd) {
266
- return null;
267
- }
268
- if (uploadFilePartEnd.__typename === "ErrorAccessDenied") {
269
- return uploadFilePartEnd;
270
- }
271
- return {
272
- __typename: "SuccessResponse",
273
- data: uploadFilePartEnd.uploadFilePartEnd
274
- };
275
- };
276
- const uploadEnded = async () => {
277
- if (!uploadFile.uploadFile) {
278
- return null;
279
- }
280
- const {
281
- uploadFileEnd
282
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
283
- uploadFileEnd: [{
284
- fileId: uploadFile.uploadFile.fileId
285
- }, {
286
- "...on ErrorAccessDenied": {
287
- __typename: true,
288
- message: true
289
- },
290
- "...on ErrorNotFound": {
291
- __typename: true,
292
- message: true
293
- },
294
- "...on UploadFileEndResponse": {
295
- __typename: true,
296
- uploadFileEnd: true
297
- }
298
- }]
299
- });
300
- if (!uploadFileEnd) {
301
- return null;
302
- }
303
- if (uploadFileEnd.__typename === "ErrorAccessDenied") {
304
- return uploadFileEnd;
305
- }
306
- if (uploadFileEnd.__typename === "ErrorNotFound") {
307
- return uploadFileEnd;
308
- }
309
- if (!uploadFileEnd.uploadFileEnd) {
310
- return null;
311
- }
312
- return {
313
- __typename: "SuccessResponse",
314
- data: uploadFileEnd.uploadFileEnd
315
- };
316
- };
317
- const chunkParts = new Array();
318
- for (const [index, chunk] of enumerate(chunks(encryptedFile, Number(uploadFile.uploadFile.filePartSize)))) {
319
- chunkParts.push({
320
- order: index + 1,
321
- data: chunk,
322
- md5: await md5(chunk)
323
- });
324
- }
325
- const progressParts = {};
326
- const onProgress = (part, progressEvent) => {
327
- progressParts[part] = progressEvent;
328
- const current = Object.values(progressParts).reduce((prv, cur) => prv + cur.loaded, 0);
329
- uploadProgress?.({
330
- percent: current / encryptedFile.byteLength,
331
- total: encryptedFile.byteLength,
332
- current
333
- });
334
- };
335
- const byPart = async part => {
336
- if (!uploadFile.uploadFile) {
337
- return;
338
- }
339
- const formData = new FormData();
340
- const chunk = chunkParts.find(p => p.order === part.order);
341
- if (!chunk) {
342
- return;
343
- }
344
- for (const [key, value] of Object.entries(part.fields)) {
345
- formData.append(key, value);
346
- }
347
- formData.append("file", new Blob([chunk.data]), `${uploadFile.uploadFile.fileId}-${chunk.order}`);
348
- await axios.post(part.url, formData, {
349
- onUploadProgress: progressEvent => onProgress(part.order, progressEvent),
350
- signal
351
- });
352
- await uploadPartEnded(chunk.md5, chunk.order);
353
- // if ((e as any).response.status === 0) {
354
- // // TODO https://github.com/sindresorhus/ky/issues/305
355
- // } else {
356
- // throw e;
357
- // }
358
- };
359
-
360
- if (!uploadFile.uploadFile) {
361
- return null;
362
- }
363
- await promiseAllLimit(3, uploadFile.uploadFile.parts.map(p => () => byPart(p)));
364
- const result = await uploadEnded();
365
- if (!result) {
366
- return null;
367
- }
368
- if (result.__typename === "ErrorAccessDenied") {
369
- return result;
370
- }
371
- if (result.__typename === "ErrorNotFound") {
372
- return result;
373
- }
374
- return {
375
- __typename: "SuccessResponse",
376
- data: result.data
377
- };
378
- }
379
- async uploadFileInCloud(_ref5) {
380
- let {
381
- file,
382
- name,
383
- nodeId,
384
- encryptProgress,
385
- uploadProgress,
386
- signal
387
- } = _ref5;
388
- const fileId = await this.uploadFile({
389
- file,
390
- encryptProgress,
391
- uploadProgress,
392
- signal
393
- });
394
- if (!fileId) {
395
- return null;
396
- }
397
- if (fileId.__typename === "ErrorAccessDenied") {
398
- return fileId;
399
- }
400
- if (fileId.__typename === "ErrorLimit") {
401
- return fileId;
402
- }
403
- if (fileId.__typename === "ErrorNotFound") {
404
- return fileId;
405
- }
406
- const result = await this.saveInCloud({
407
- fileId: fileId.data,
408
- name,
409
- nodeId
410
- });
411
- if (!result) {
412
- return null;
413
- }
414
- if (result.__typename === "ErrorAccessDenied") {
415
- return result;
416
- }
417
- if (result.__typename === "ErrorBasic") {
418
- return result;
419
- }
420
- if (result.__typename === "ErrorLimit") {
421
- return result;
422
- }
423
- if (result.__typename === "ErrorNotFound") {
424
- return result;
425
- }
426
- if (result.__typename === "ErrorNotExist") {
427
- return result;
428
- }
429
- return {
430
- __typename: "SuccessResponse",
431
- data: result.data
432
- };
433
- }
434
- async deletedNodes() {
435
- const {
436
- deletedNodes
437
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
438
- deletedNodes: {
439
- "...on ErrorAccessDenied": {
440
- __typename: true,
441
- message: true
442
- },
443
- "...on DeletedNodesResponse": {
444
- __typename: true,
445
- deletedNodes: nodeSelector
446
- }
447
- }
448
- });
449
- if (!deletedNodes) {
450
- return null;
451
- }
452
- if (deletedNodes.__typename === "ErrorAccessDenied") {
453
- return deletedNodes;
454
- }
455
- const nodes = new Array();
456
- for (const node of deletedNodes.deletedNodes) {
457
- nodes.push(await gqlNodeToExternal(node, _classPrivateFieldLooseBase(this, _keys)[_keys]));
458
- }
459
- return {
460
- __typename: "SuccessResponse",
461
- data: nodes
462
- };
463
- }
464
- async sharedNodes() {
465
- const {
466
- sharedNodes
467
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
468
- sharedNodes: {
469
- "...on ErrorAccessDenied": {
470
- __typename: true,
471
- message: true
472
- },
473
- "...on SharedNodesResponse": {
474
- __typename: true,
475
- sharedNodes: nodeSelector
476
- }
477
- }
478
- });
479
- if (!sharedNodes) {
480
- return null;
481
- }
482
- if (sharedNodes.__typename === "ErrorAccessDenied") {
483
- return sharedNodes;
484
- }
485
- const nodes = new Array();
486
- for (const folder of sharedNodes.sharedNodes) {
487
- nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
488
- }
489
- return {
490
- __typename: "SuccessResponse",
491
- data: nodes
492
- };
493
- }
494
- async nodesSharedWithMe(type) {
495
- const {
496
- nodesSharedWithMe
497
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
498
- nodesSharedWithMe: [{
499
- type
500
- }, {
501
- "...on ErrorAccessDenied": {
502
- __typename: true,
503
- message: true
504
- },
505
- "...on NodesSharedWithMeResponse": {
506
- __typename: true,
507
- nodesSharedWithMe: nodeSelector
508
- }
509
- }]
510
- });
511
- if (!nodesSharedWithMe) {
512
- return null;
513
- }
514
- if (nodesSharedWithMe.__typename === "ErrorAccessDenied") {
515
- return nodesSharedWithMe;
516
- }
517
- const nodes = new Array();
518
- for (const folder of nodesSharedWithMe.nodesSharedWithMe) {
519
- nodes.push(await gqlNodeToExternal(folder, _classPrivateFieldLooseBase(this, _keys)[_keys]));
520
- }
521
- return {
522
- __typename: "SuccessResponse",
523
- data: nodes
524
- };
525
- }
526
- async deleteNodeSharing(_ref6) {
527
- let {
528
- nodeId,
529
- userId
530
- } = _ref6;
531
- const {
532
- deleteNodeSharing
533
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
534
- deleteNodeSharing: [{
535
- nodeId,
536
- userId
537
- }, {
538
- "...on ErrorAccessDenied": {
539
- __typename: true,
540
- message: true
541
- },
542
- "...on DeleteNodeSharingResponse": {
543
- __typename: true,
544
- deleteNodeSharing: true
545
- }
546
- }]
547
- });
548
- if (!deleteNodeSharing) {
549
- return null;
550
- }
551
- if (deleteNodeSharing.__typename === "ErrorAccessDenied") {
552
- return deleteNodeSharing;
553
- }
554
- return {
555
- __typename: "SuccessResponse",
556
- data: deleteNodeSharing.deleteNodeSharing
557
- };
558
- }
559
- async duplicateNode(_ref7) {
560
- let {
561
- nodeId,
562
- folderId,
563
- customName
564
- } = _ref7;
565
- let node = nodesCache.get(nodeId);
566
- if (!node) {
567
- await this.node({
568
- id: nodeId
569
- });
570
- node = nodesCache.get(nodeId);
571
- if (!node) {
572
- throw new Error(`Node (${nodeId}) does not exists`);
573
- }
574
- }
575
- if (!node.access?.nameKey) {
576
- throw new Error(`Can't have access to node ${nodeId}`);
577
- }
578
- customName = customName ? await encryptName(customName, node.access.nameKey) : null;
579
- const {
580
- duplicateNode
581
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
582
- duplicateNode: [{
583
- nodeId,
584
- folderId,
585
- customName
586
- }, {
587
- "...on ErrorAccessDenied": {
588
- __typename: true,
589
- message: true
590
- },
591
- "...on ErrorNotFound": {
592
- __typename: true,
593
- message: true
594
- },
595
- "...on DuplicateNodeResponse": {
596
- __typename: true,
597
- duplicateNode: true
598
- }
599
- }]
600
- });
601
- if (!duplicateNode) {
602
- return null;
603
- }
604
- if (duplicateNode.__typename === "ErrorAccessDenied") {
605
- return duplicateNode;
606
- }
607
- if (duplicateNode.__typename === "ErrorNotFound") {
608
- return duplicateNode;
609
- }
610
- return {
611
- __typename: "SuccessResponse",
612
- data: duplicateNode.duplicateNode
613
- };
614
- }
615
- async deleteNodeCloudTrash(_ref8) {
616
- let {
617
- ids
618
- } = _ref8;
619
- const {
620
- deleteNodeCloudTrash
621
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
622
- deleteNodeCloudTrash: [{
623
- ids
624
- }, {
625
- "...on ErrorAccessDenied": {
626
- __typename: true,
627
- message: true
628
- },
629
- "...on DeleteNodeCloudTrashResponse": {
630
- __typename: true,
631
- deleteNodeCloudTrash: true
632
- }
633
- }]
634
- });
635
- if (!deleteNodeCloudTrash) {
636
- return null;
637
- }
638
- if (deleteNodeCloudTrash.__typename === "ErrorAccessDenied") {
639
- return deleteNodeCloudTrash;
640
- }
641
- return {
642
- __typename: "SuccessResponse",
643
- data: deleteNodeCloudTrash.deleteNodeCloudTrash ?? false
644
- };
645
- }
646
- async createFolder(_ref9) {
647
- let {
648
- name,
649
- parentFolderId
650
- } = _ref9;
651
- const key = secretstreamKeygen();
652
- const encryptedName = await encryptName(name, sodium.to_hex(key));
653
- const encryptedKey = encryptCryptoBox(key, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
654
- const {
655
- createFolder
656
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
657
- createFolder: [{
658
- name: encryptedName,
659
- parentFolderId,
660
- key: sodium.to_hex(encryptedKey)
661
- }, {
662
- "...on ErrorAccessDenied": {
663
- __typename: true,
664
- message: true
665
- },
666
- "...on ErrorNotExist": {
667
- __typename: true,
668
- message: true
669
- },
670
- "...on CreateFolderResponse": {
671
- __typename: true,
672
- createFolder: nodeFullSelector
673
- }
674
- }]
675
- });
676
- if (!createFolder) {
677
- //throw new Error(`Can't create folder`);
678
- return null;
679
- }
680
- if (createFolder.__typename === "ErrorAccessDenied") {
681
- return createFolder;
682
- }
683
- if (createFolder.__typename === "ErrorNotExist") {
684
- return createFolder;
685
- }
686
- if (!createFolder.createFolder) {
687
- return null;
688
- }
689
- const folder = await gqlNodeToExternalNodeFull(createFolder.createFolder, _classPrivateFieldLooseBase(this, _keys)[_keys]);
690
- const users = folder.parent?.users?.filter(_ref10 => {
691
- let [u] = _ref10;
692
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
693
- }) ?? [];
694
- if (users.length) {
695
- await Promise.all(users.map(_ref11 => {
696
- let [u, rights] = _ref11;
697
- return this.shareNode({
698
- nodeId: folder.id,
699
- rights,
700
- userId: u.id
701
- });
702
- }));
703
- }
704
- return {
705
- __typename: "SuccessResponse",
706
- data: folder
707
- };
708
- }
709
- async node(_temp) {
710
- let {
711
- id,
712
- deleted
713
- } = _temp === void 0 ? {} : _temp;
714
- const {
715
- node
716
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
717
- node: [{
718
- deleted,
719
- id
720
- }, {
721
- "...on ErrorAccessDenied": {
722
- __typename: true,
723
- message: true
724
- },
725
- "...on NodeResponse": {
726
- __typename: true,
727
- node: nodeFullSelector
728
- }
729
- }]
730
- });
731
- if (!node) {
732
- return null;
733
- }
734
- if (node.__typename === "ErrorAccessDenied") {
735
- return node;
736
- }
737
- if (!node.node) {
738
- return null;
739
- }
740
- const result = await gqlNodeToExternalNodeFull(node.node, _classPrivateFieldLooseBase(this, _keys)[_keys]);
741
- return {
742
- __typename: "SuccessResponse",
743
- data: result
744
- };
745
- }
746
- async fileMetadata(_ref12) {
747
- let {
748
- id
749
- } = _ref12;
750
- const {
751
- file
752
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query")({
753
- file: [{
754
- id
755
- }, {
756
- "...on ErrorAccessDenied": {
757
- __typename: true,
758
- message: true
759
- },
760
- "...on FileQueryResponse": {
761
- __typename: true,
762
- file: fileSelector
763
- }
764
- }]
765
- });
766
- if (!file) {
767
- return null;
768
- }
769
- if (file.__typename === "ErrorAccessDenied") {
770
- return file;
771
- }
772
- if (!file.file) {
773
- return null;
774
- }
775
- const result = gqlFileToExternal(file.file, _classPrivateFieldLooseBase(this, _keys)[_keys]);
776
- return {
777
- __typename: "SuccessResponse",
778
- data: result
779
- };
780
- }
781
- async shareNode(_ref13) {
782
- let {
783
- nodeId,
784
- userId,
785
- rights
786
- } = _ref13;
787
- const user = await _classPrivateFieldLooseBase(this, _client)[_client].user({
788
- userId,
789
- withPublicKey: true
790
- });
791
- if (!user) {
792
- return user;
793
- }
794
- if (user.__typename === "ErrorNotFound") {
795
- return user;
796
- }
797
- const {
798
- shareNode
799
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
800
- shareNode: [{
801
- nodeId,
802
- userId
803
- }, {
804
- "...on ErrorAccessDenied": {
805
- __typename: true,
806
- message: true
807
- },
808
- "...on ErrorNotFound": {
809
- __typename: true,
810
- message: true
811
- },
812
- "...on ShareNodeResponse": {
813
- __typename: true,
814
- nodes: true
815
- }
816
- }]
817
- });
818
- if (!shareNode) {
819
- return null;
820
- }
821
- if (shareNode.__typename === "ErrorAccessDenied") {
822
- return shareNode;
823
- }
824
- if (shareNode.__typename === "ErrorNotFound") {
825
- return shareNode;
826
- }
827
- const shareNodes = {
828
- nodes: []
829
- };
830
- for (const id of shareNode.nodes) {
831
- const nameKey = await this.perNode(id, user.data.publicKey);
832
- if (nameKey) {
833
- shareNodes.nodes.push(nameKey);
834
- }
835
- }
836
- const {
837
- shareNodeFinish
838
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
839
- shareNodeFinish: [{
840
- rights,
841
- userId,
842
- shareNodes
843
- }, {
844
- "...on ErrorAccessDenied": {
845
- __typename: true,
846
- message: true
847
- },
848
- "...on ErrorNotFound": {
849
- __typename: true,
850
- message: true
851
- },
852
- "...on ShareNodeFinishResponse": {
853
- __typename: true,
854
- shareNodeFinish: true
855
- }
856
- }]
857
- });
858
- if (!shareNodeFinish) {
859
- return null;
860
- }
861
- if (shareNodeFinish.__typename === "ErrorAccessDenied") {
862
- return shareNodeFinish;
863
- }
864
- if (shareNodeFinish.__typename === "ErrorNotFound") {
865
- return shareNodeFinish;
866
- }
867
- return {
868
- __typename: "SuccessResponse",
869
- data: shareNodeFinish.shareNodeFinish ?? false
870
- };
871
- }
872
- async updateNode(_ref14) {
873
- let {
874
- nodeId,
875
- name,
876
- isFavorite,
877
- deletedAt
878
- } = _ref14;
879
- let node = nodesCache.get(nodeId);
880
- if (!node) {
881
- await this.node({
882
- id: nodeId
883
- });
884
- node = nodesCache.get(nodeId);
885
- if (!node) {
886
- throw `Can't find Node ${nodeId}`;
887
- }
888
- }
889
- if (!node.access?.nameKey) {
890
- throw new Error(`Can't have access to node ${nodeId}`);
891
- }
892
- name = name ? node.access?.nameKey ? await encryptName(name, node.access.nameKey) : name : null;
893
- const {
894
- updateNode
895
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
896
- updateNode: [{
897
- nodeId,
898
- name,
899
- isFavorite,
900
- deletedAt
901
- }, {
902
- "...on ErrorAccessDenied": {
903
- __typename: true,
904
- message: true
905
- },
906
- "...on ErrorNotExist": {
907
- __typename: true,
908
- message: true
909
- },
910
- "...on UpdateNodeResponse": {
911
- __typename: true,
912
- updateNode: nodeFullSelector
913
- }
914
- }]
915
- });
916
- if (!updateNode) {
917
- return null;
918
- }
919
- if (updateNode.__typename === "ErrorAccessDenied") {
920
- return updateNode;
921
- }
922
- if (updateNode.__typename === "ErrorNotExist") {
923
- return updateNode;
924
- }
925
- if (!updateNode.updateNode) {
926
- return null;
927
- }
928
- const result = await gqlNodeToExternalNodeFull(updateNode.updateNode, _classPrivateFieldLooseBase(this, _keys)[_keys]);
929
- return {
930
- __typename: "SuccessResponse",
931
- data: result
932
- };
933
- }
934
- async fileContent(_ref15) {
935
- let {
936
- fileId,
937
- onDownloadProgress,
938
- progressDecrypt,
939
- signal
940
- } = _ref15;
941
- const {
942
- fileContent
943
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("query", {
944
- scalars: {
945
- Bytes: {
946
- decode: e => {
947
- console.log(e, typeof e);
948
- return Uint8Array.from([1, 2, 3]);
949
- },
950
- encode: e => e.toString()
951
- }
952
- }
953
- })({
954
- fileContent: [{
955
- fileId
956
- }, {
957
- "...on ErrorAccessDenied": {
958
- __typename: true,
959
- message: true
960
- },
961
- "...on ErrorBasic": {
962
- __typename: true,
963
- message: true
964
- },
965
- "...on FileContentResponse": {
966
- __typename: true,
967
- file: {
968
- "...on FileContentCloud": {
969
- __typename: true,
970
- parts: {
971
- contentUrl: true,
972
- order: true,
973
- md5: true
974
- },
975
- key: true,
976
- publicKey: true,
977
- totalSize: true,
978
- md5: true,
979
- md5Encrypted: true
980
- },
981
- "...on FileContentLite": {
982
- __typename: true,
983
- content: true,
984
- id: true,
985
- key: true,
986
- publicKey: true,
987
- md5: true,
988
- md5Encrypted: true,
989
- totalSize: true
990
- },
991
- "...on FileContentReceivedMail": {
992
- __typename: true,
993
- maybeParts: {
994
- contentUrl: true,
995
- order: true,
996
- md5: true
997
- },
998
- maybeContent: true,
999
- key: true,
1000
- senderPublicKey: true,
1001
- totalSize: true,
1002
- md5: true,
1003
- md5Encrypted: true
1004
- },
1005
- "...on FileContentSentMail": {
1006
- __typename: true,
1007
- maybeParts: {
1008
- contentUrl: true,
1009
- order: true,
1010
- md5: true
1011
- },
1012
- maybeContent: true,
1013
- key: true,
1014
- totalSize: true,
1015
- md5: true,
1016
- md5Encrypted: true
1017
- }
1018
- }
1019
- }
1020
- }]
1021
- });
1022
- if (!fileContent) {
1023
- return null;
1024
- }
1025
- if (fileContent.__typename === "ErrorAccessDenied") {
1026
- return fileContent;
1027
- }
1028
- if (fileContent.__typename === "ErrorBasic") {
1029
- return fileContent;
1030
- }
1031
- const file = fileContent.file;
1032
- if (!file) {
1033
- return null;
1034
- }
1035
- const progressParts = {};
1036
- const onProgress = (part, progressEvent) => {
1037
- progressParts[part] = progressEvent;
1038
- const transferredBytes = Object.values(progressParts).reduce((prv, cur) => prv + cur.transferredBytes, 0);
1039
- const totalBytes = Number(file.totalSize);
1040
- onDownloadProgress?.({
1041
- percent: transferredBytes / totalBytes,
1042
- totalBytes,
1043
- transferredBytes
1044
- });
1045
- };
1046
- const encryptedContentFromParts = async fileParts => {
1047
- const parts = new Array();
1048
- const byPart = async part => {
1049
- const buf = new Uint8Array(await ky.get(part.contentUrl, {
1050
- timeout: false,
1051
- onDownloadProgress: pr => onProgress(part.order, pr),
1052
- signal: signal
1053
- }).arrayBuffer());
1054
- const md5Part = await md5(buf);
1055
- if (md5Part !== part.md5) {
1056
- throw new Error(`Invalid md5 for part ${part.order} of file ${fileId}`);
1057
- }
1058
- parts.push({
1059
- data: buf,
1060
- order: part.order
1061
- });
1062
- };
1063
- await promiseAllLimit(3, fileParts.map(p => () => byPart(p)));
1064
- return concatenate(...parts.sort((a, b) => a.order - b.order).map(p => p.data));
1065
- };
1066
- const finalize = async encryptedContent => {
1067
- // const md5Encrypted = await firstValueFrom(md5(of(encryptedContent)));
1068
- const md5Encrypted = await md5(encryptedContent);
1069
- if (md5Encrypted !== file.md5Encrypted) {
1070
- throw new Error(`Encrypted content does not match`);
1071
- }
1072
- const key = decryptCryptoBox(sodium.from_hex(file.key), file.__typename === "FileContentReceivedMail" ? file.senderPublicKey : file.__typename === "FileContentCloud" ? file.publicKey : _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1073
- const src = await decrypt(key, encryptedContent, progressDecrypt, signal);
1074
-
1075
- // const md5Content = await firstValueFrom(md5(of(src)));
1076
- const md5Content = await md5(src);
1077
- if (md5Content !== file.md5) {
1078
- throw new Error(`Content does not match`);
1079
- }
1080
- return uncompress(src);
1081
- };
1082
- const encryptedContent = file.__typename === "FileContentLite" ? file.content : file.__typename === "FileContentCloud" ? await encryptedContentFromParts(file.parts) : file.maybeContent ? file.maybeContent : file.maybeParts ? await encryptedContentFromParts(file.maybeParts) : null;
1083
- if (!encryptedContent) {
1084
- return null;
1085
- }
1086
- return {
1087
- __typename: "SuccessResponse",
1088
- data: await finalize(encryptedContent)
1089
- };
1090
- }
1091
- async deleteFile(_ref16) {
1092
- let {
1093
- fileId,
1094
- nodeId
1095
- } = _ref16;
1096
- const {
1097
- deleteFile
1098
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1099
- deleteFile: [{
1100
- fileId,
1101
- nodeId
1102
- }, {
1103
- "...on ErrorAccessDenied": {
1104
- __typename: true,
1105
- message: true
1106
- },
1107
- "...on ErrorNotExist": {
1108
- __typename: true,
1109
- message: true
1110
- },
1111
- "...on DeleteFileResponse": {
1112
- __typename: true,
1113
- deleteFile: true
1114
- }
1115
- }]
1116
- });
1117
- if (!deleteFile) {
1118
- return null;
1119
- }
1120
- if (deleteFile.__typename === "ErrorAccessDenied") {
1121
- return deleteFile;
1122
- }
1123
- if (deleteFile.__typename === "ErrorNotExist") {
1124
- return deleteFile;
1125
- }
1126
- return {
1127
- __typename: "SuccessResponse",
1128
- data: deleteFile.deleteFile
1129
- };
1130
- }
1131
- async deleteNode(_ref17) {
1132
- let {
1133
- nodeId
1134
- } = _ref17;
1135
- const {
1136
- deleteNode
1137
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1138
- deleteNode: [{
1139
- id: nodeId
1140
- }, {
1141
- "...on ErrorAccessDenied": {
1142
- __typename: true,
1143
- message: true
1144
- },
1145
- "...on DeleteNodeResponse": {
1146
- __typename: true,
1147
- deleteNode: true
1148
- }
1149
- }]
1150
- });
1151
- if (!deleteNode) {
1152
- return null;
1153
- }
1154
- if (deleteNode.__typename === "ErrorAccessDenied") {
1155
- return deleteNode;
1156
- }
1157
- return {
1158
- __typename: "SuccessResponse",
1159
- data: deleteNode.deleteNode
1160
- };
1161
- }
1162
- async emptyTrash() {
1163
- const {
1164
- emptyCloudTrash
1165
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1166
- emptyCloudTrash: {
1167
- "...on ErrorAccessDenied": {
1168
- __typename: true,
1169
- message: true
1170
- },
1171
- "...on EmptyCloudTrashResponse": {
1172
- __typename: true,
1173
- emptyCloudTrash: true
1174
- }
1175
- }
1176
- });
1177
- if (!emptyCloudTrash) {
1178
- return null;
1179
- }
1180
- if (emptyCloudTrash.__typename === "ErrorAccessDenied") {
1181
- return emptyCloudTrash;
1182
- }
1183
- if (!emptyCloudTrash.emptyCloudTrash) {
1184
- return null;
1185
- }
1186
- return {
1187
- __typename: "SuccessResponse",
1188
- data: emptyCloudTrash.emptyCloudTrash
1189
- };
1190
- }
1191
- async recoverNode(id) {
1192
- const {
1193
- recoverNode
1194
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1195
- recoverNode: [{
1196
- id
1197
- }, {
1198
- "...on ErrorAccessDenied": {
1199
- __typename: true,
1200
- message: true
1201
- },
1202
- "...on ErrorNotExist": {
1203
- __typename: true,
1204
- message: true
1205
- },
1206
- "...on RecoverNodeResponse": {
1207
- __typename: true,
1208
- recoverNode: true
1209
- }
1210
- }]
1211
- });
1212
- if (!recoverNode) {
1213
- return null;
1214
- }
1215
- if (recoverNode.__typename === "ErrorAccessDenied") {
1216
- return recoverNode;
1217
- }
1218
- if (recoverNode.__typename === "ErrorNotExist") {
1219
- return recoverNode;
1220
- }
1221
- return {
1222
- __typename: "SuccessResponse",
1223
- data: recoverNode.recoverNode ?? false
1224
- };
1225
- }
1226
- async moveNodes(_ref18) {
1227
- let {
1228
- nodeIds,
1229
- parentNodeId
1230
- } = _ref18;
1231
- const {
1232
- moveNodes
1233
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1234
- moveNodes: [{
1235
- nodeIds,
1236
- parentNodeId
1237
- }, {
1238
- "...on ErrorAccessDenied": {
1239
- __typename: true,
1240
- message: true
1241
- },
1242
- "...on MoveNodesResponse": {
1243
- __typename: true,
1244
- moveNodes: true
1245
- }
1246
- }]
1247
- });
1248
- if (!moveNodes) {
1249
- return null;
1250
- }
1251
- if (moveNodes.__typename === "ErrorAccessDenied") {
1252
- return moveNodes;
1253
- }
1254
- return {
1255
- __typename: "SuccessResponse",
1256
- data: moveNodes.moveNodes ?? false
1257
- };
1258
- }
1259
- async saveInCloud(_ref19) {
1260
- let {
1261
- fileId,
1262
- name,
1263
- nodeId
1264
- } = _ref19;
1265
- if (nodeId && !nodesCache.has(nodeId)) {
1266
- await this.node({
1267
- id: nodeId
1268
- });
1269
- if (!nodesCache.has(nodeId)) {
1270
- return {
1271
- __typename: "ErrorBasic",
1272
- message: `The node ${nodeId} does not exists`
1273
- };
1274
- }
1275
- }
1276
- let key = "";
1277
- const file = filesCache.get(fileId);
1278
- if (!file) {
1279
- await this.fileMetadata({
1280
- id: fileId
1281
- });
1282
- const file = filesCache.get(fileId) ?? null;
1283
- if (!file) {
1284
- const receivedMails = await _classPrivateFieldLooseBase(this, _client)[_client].mail.receivedMails();
1285
- if (!receivedMails) {
1286
- return null;
1287
- }
1288
- if (receivedMails.__typename !== "SuccessResponse") {
1289
- return null;
1290
- }
1291
- const mail = receivedMails.data.find(m => m.files.some(f => f.id === fileId));
1292
- if (!mail) {
1293
- return {
1294
- __typename: "ErrorBasic",
1295
- message: `Can't find mail with the file ${fileId}`
1296
- };
1297
- }
1298
- const fileMail = mail.files.find(f => f.id === fileId);
1299
- if (!fileMail) {
1300
- return {
1301
- __typename: "ErrorBasic",
1302
- message: `Can't find mail with the file ${fileId}`
1303
- };
1304
- }
1305
- const fileKey = decryptCryptoBox(sodium.from_hex(fileMail.key), mail.sender.publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey);
1306
- key = sodium.to_hex(fileKey);
1307
- } else {
1308
- key = file.key;
1309
- }
1310
- } else {
1311
- key = file.key;
1312
- }
1313
- if (key === "") {
1314
- return {
1315
- __typename: "ErrorBasic",
1316
- message: "Unexpected error 3"
1317
- };
1318
- }
1319
- key = sodium.to_hex(encryptCryptoBox(sodium.from_hex(key), _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1320
- const nameKey = secretstreamKeygen();
1321
- const encryptedName = await encryptName(name, sodium.to_hex(nameKey));
1322
- const encryptedNameKey = sodium.to_hex(encryptCryptoBox(nameKey, _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey, _classPrivateFieldLooseBase(this, _keys)[_keys].privateKey));
1323
- const {
1324
- saveInCloud
1325
- } = await _classPrivateFieldLooseBase(this, _thunder)[_thunder]("mutation")({
1326
- saveInCloud: [{
1327
- fileId,
1328
- key,
1329
- nodeId,
1330
- filename: encryptedName,
1331
- nameKey: encryptedNameKey
1332
- }, {
1333
- "...on ErrorAccessDenied": {
1334
- __typename: true,
1335
- message: true
1336
- },
1337
- "...on ErrorNotFound": {
1338
- __typename: true,
1339
- message: true
1340
- },
1341
- "...on ErrorLimit": {
1342
- __typename: true,
1343
- message: true
1344
- },
1345
- "...on ErrorBasic": {
1346
- __typename: true,
1347
- message: true
1348
- },
1349
- "...on ErrorNotExist": {
1350
- __typename: true,
1351
- message: true
1352
- },
1353
- "...on SaveInCloudResponse": {
1354
- __typename: true,
1355
- saveInCloud: nodeFullSelector
1356
- }
1357
- }]
1358
- });
1359
- if (!saveInCloud) {
1360
- return null;
1361
- }
1362
- if (saveInCloud.__typename === "ErrorAccessDenied") {
1363
- return saveInCloud;
1364
- }
1365
- if (saveInCloud.__typename === "ErrorNotFound") {
1366
- return saveInCloud;
1367
- }
1368
- if (saveInCloud.__typename === "ErrorLimit") {
1369
- return saveInCloud;
1370
- }
1371
- if (saveInCloud.__typename === "ErrorBasic") {
1372
- return saveInCloud;
1373
- }
1374
- if (saveInCloud.__typename === "ErrorNotExist") {
1375
- return saveInCloud;
1376
- }
1377
- if (!saveInCloud.saveInCloud) {
1378
- return null;
1379
- }
1380
- const node = await gqlNodeToExternalNodeFull(saveInCloud.saveInCloud, _classPrivateFieldLooseBase(this, _keys)[_keys]);
1381
- const me = node.parent?.users.find(_ref20 => {
1382
- let [u] = _ref20;
1383
- return u.publicKey === _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1384
- });
1385
- if (me && ["admin", "write"].includes(me[1])) {
1386
- const others = node.parent?.users.filter(_ref21 => {
1387
- let [u] = _ref21;
1388
- return u.publicKey !== _classPrivateFieldLooseBase(this, _keys)[_keys].publicKey;
1389
- }) ?? [];
1390
- await Promise.all(others.map(_ref22 => {
1391
- let [u, rights] = _ref22;
1392
- return this.shareNode({
1393
- nodeId: node.id,
1394
- rights,
1395
- userId: u.id
1396
- });
1397
- }));
1398
- }
1399
- return {
1400
- __typename: "SuccessResponse",
1401
- data: node
1402
- };
1403
- }
1404
- }
1405
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJheGlvcyIsImt5IiwiZW5jcnlwdE5hbWUiLCJub2Rlc0NhY2hlIiwiZmlsZXNDYWNoZSIsInNlY3JldHN0cmVhbUtleWdlbiIsImRlY3J5cHRDcnlwdG9Cb3giLCJlbmNyeXB0Q3J5cHRvQm94IiwiY29tcHJlc3MiLCJ1bmNvbXByZXNzIiwic29kaXVtIiwiZW51bWVyYXRlIiwiY2h1bmtzIiwicHJvbWlzZUFsbExpbWl0IiwiY29uY2F0ZW5hdGUiLCJtZDUiLCJkZWNyeXB0IiwiZW5jcnlwdCIsImdxbEZpbGVUb0V4dGVybmFsIiwiZ3FsTm9kZUZ1bGxUb0ludGVybmFsRnVsbCIsImdxbE5vZGVUb0V4dGVybmFsIiwiZ3FsTm9kZVRvRXh0ZXJuYWxOb2RlRnVsbCIsImludGVybmFsTm9kZVRvTm9kZSIsImZpbGVTZWxlY3RvciIsIm5vZGVGdWxsU2VsZWN0b3IiLCJub2RlU2VsZWN0b3IiLCJTZWNyZWN5Q2xvdWRDbGllbnQiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImtleXMiLCJ0aHVuZGVyIiwicGVyTm9kZSIsIm5vZGVJZCIsInB1YmxpY0tleSIsIm5vZGUiLCJnZXQiLCJpZCIsIm5hbWVLZXkiLCJhY2Nlc3MiLCJ0b19oZXgiLCJmcm9tX2hleCIsInByaXZhdGVLZXkiLCJmaWxlcyIsImhpc3RvcnkiLCJtYXAiLCJmIiwia2V5IiwiYWRkRmlsZVRvSGlzdG9yeSIsImZpbGVJZCIsIl9fdHlwZW5hbWUiLCJtZXNzYWdlIiwiZmlsZSIsImZpbmQiLCJ1c2VycyIsImZpbHRlciIsInUiLCJpbnB1dCIsInNoYXJlRmlsZUluSGlzdG9yeSIsInJlc3VsdCIsImRhdGEiLCJ1cGxvYWRGaWxlIiwiZW5jcnlwdFByb2dyZXNzIiwidXBsb2FkUHJvZ3Jlc3MiLCJzaWduYWwiLCJmaWxlS2V5IiwiZmlsZUJ1ZmZlciIsIkZpbGUiLCJVaW50OEFycmF5IiwiYXJyYXlCdWZmZXIiLCJjb21wcmVzc2VkIiwiZW5jcnlwdGVkRmlsZSIsIm1kNUZpbGUiLCJtZDVFbmNyeXB0ZWQiLCJlbmNyeXB0ZWRGaWxlS2V5Iiwic2NhbGFycyIsIkpzb24iLCJlbmNvZGUiLCJlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRlY29kZSIsInBhcnNlIiwiRGF0ZVRpbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJCaWdJbnQiLCJ0b1N0cmluZyIsImZpbGVTaXplIiwiYnl0ZUxlbmd0aCIsImZpbGVTaXplQmVmb3JlIiwiZmlsZVBhcnRTaXplIiwicGFydHMiLCJmaWVsZHMiLCJvcmRlciIsInVybCIsInRvdGFsIiwiY3VycmVudCIsInBlcmNlbnQiLCJsZW5ndGgiLCJ1cGxvYWRQYXJ0RW5kZWQiLCJ1cGxvYWRGaWxlUGFydEVuZCIsInVwbG9hZEVuZGVkIiwidXBsb2FkRmlsZUVuZCIsImNodW5rUGFydHMiLCJBcnJheSIsImluZGV4IiwiY2h1bmsiLCJOdW1iZXIiLCJwdXNoIiwicHJvZ3Jlc3NQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJwYXJ0IiwicHJvZ3Jlc3NFdmVudCIsIk9iamVjdCIsInZhbHVlcyIsInJlZHVjZSIsInBydiIsImN1ciIsImxvYWRlZCIsImJ5UGFydCIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJwIiwidmFsdWUiLCJlbnRyaWVzIiwiYXBwZW5kIiwiQmxvYiIsInBvc3QiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkRmlsZUluQ2xvdWQiLCJuYW1lIiwic2F2ZUluQ2xvdWQiLCJkZWxldGVkTm9kZXMiLCJub2RlcyIsInNoYXJlZE5vZGVzIiwiZm9sZGVyIiwibm9kZXNTaGFyZWRXaXRoTWUiLCJ0eXBlIiwiZGVsZXRlTm9kZVNoYXJpbmciLCJ1c2VySWQiLCJkdXBsaWNhdGVOb2RlIiwiZm9sZGVySWQiLCJjdXN0b21OYW1lIiwiRXJyb3IiLCJkZWxldGVOb2RlQ2xvdWRUcmFzaCIsImlkcyIsImNyZWF0ZUZvbGRlciIsInBhcmVudEZvbGRlcklkIiwiZW5jcnlwdGVkTmFtZSIsImVuY3J5cHRlZEtleSIsInBhcmVudCIsIlByb21pc2UiLCJhbGwiLCJyaWdodHMiLCJzaGFyZU5vZGUiLCJkZWxldGVkIiwiZmlsZU1ldGFkYXRhIiwidXNlciIsIndpdGhQdWJsaWNLZXkiLCJzaGFyZU5vZGVzIiwic2hhcmVOb2RlRmluaXNoIiwidXBkYXRlTm9kZSIsImlzRmF2b3JpdGUiLCJkZWxldGVkQXQiLCJmaWxlQ29udGVudCIsIm9uRG93bmxvYWRQcm9ncmVzcyIsInByb2dyZXNzRGVjcnlwdCIsIkJ5dGVzIiwiY29uc29sZSIsImxvZyIsImZyb20iLCJjb250ZW50VXJsIiwidG90YWxTaXplIiwiY29udGVudCIsIm1heWJlUGFydHMiLCJtYXliZUNvbnRlbnQiLCJzZW5kZXJQdWJsaWNLZXkiLCJ0cmFuc2ZlcnJlZEJ5dGVzIiwidG90YWxCeXRlcyIsImVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMiLCJmaWxlUGFydHMiLCJidWYiLCJ0aW1lb3V0IiwicHIiLCJtZDVQYXJ0Iiwic29ydCIsImEiLCJiIiwiZmluYWxpemUiLCJlbmNyeXB0ZWRDb250ZW50Iiwic3JjIiwibWQ1Q29udGVudCIsImRlbGV0ZUZpbGUiLCJkZWxldGVOb2RlIiwiZW1wdHlUcmFzaCIsImVtcHR5Q2xvdWRUcmFzaCIsInJlY292ZXJOb2RlIiwibW92ZU5vZGVzIiwibm9kZUlkcyIsInBhcmVudE5vZGVJZCIsImhhcyIsInJlY2VpdmVkTWFpbHMiLCJtYWlsIiwibSIsInNvbWUiLCJmaWxlTWFpbCIsInNlbmRlciIsImVuY3J5cHRlZE5hbWVLZXkiLCJmaWxlbmFtZSIsIm1lIiwiaW5jbHVkZXMiLCJvdGhlcnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L1NlY3JlY3lDbG91ZENsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbmltcG9ydCB0eXBlIHsgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQga3kgZnJvbSBcImt5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIERvd25sb2FkUHJvZ3Jlc3MsXG4gIFByb2dyZXNzQ2FsbGJhY2ssXG4gIFNlY3JlY3lDbGllbnQsXG4gIFN1Y2Nlc3NSZXNwb25zZVxufSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVuY3J5cHROYW1lIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBub2Rlc0NhY2hlLCBmaWxlc0NhY2hlIH0gZnJvbSBcIi4uL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBzZWNyZXRzdHJlYW1LZXlnZW4gfSBmcm9tIFwiLi4vY3J5cHRvL2ZpbGUuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5UGFpciB9IGZyb20gXCIuLi9jcnlwdG8vaW5kZXguanNcIjtcbmltcG9ydCB7IGRlY3J5cHRDcnlwdG9Cb3ggfSBmcm9tIFwiLi4vY3J5cHRvL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlbmNyeXB0Q3J5cHRvQm94IH0gZnJvbSBcIi4uL2NyeXB0by9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFcnJvckFjY2Vzc0RlbmllZCxcbiAgRXJyb3JCYXNpYyxcbiAgRXJyb3JMaW1pdCxcbiAgRXJyb3JOb3RFeGlzdCxcbiAgRXJyb3JOb3RGb3VuZFxufSBmcm9tIFwiLi4vZXJyb3IuanNcIjtcbmltcG9ydCB7IGNvbXByZXNzLCB1bmNvbXByZXNzIH0gZnJvbSBcIi4uL21pbmlmeS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgc29kaXVtIH0gZnJvbSBcIi4uL3NvZGl1bS5qc1wiO1xuaW1wb3J0IHtcbiAgZW51bWVyYXRlLFxuICBjaHVua3MsXG4gIHByb21pc2VBbGxMaW1pdCxcbiAgY29uY2F0ZW5hdGVcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBtZDUgfSBmcm9tIFwiLi4vd29ya2VyL21kNS5qc1wiO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCB9IGZyb20gXCIuLi93b3JrZXIvc29kaXVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUeXBlLCBSaWdodHMsIFRodW5kZXIgfSBmcm9tIFwiLi4vemV1cy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ3FsRmlsZVRvRXh0ZXJuYWwgfSBmcm9tIFwiLi9jb252ZXJ0L2ZpbGUuanNcIjtcbmltcG9ydCB7XG4gIGdxbE5vZGVGdWxsVG9JbnRlcm5hbEZ1bGwsXG4gIGdxbE5vZGVUb0V4dGVybmFsLFxuICBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsLFxuICBpbnRlcm5hbE5vZGVUb05vZGVcbn0gZnJvbSBcIi4vY29udmVydC9ub2RlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpbGVDb250ZW50UGFydCxcbiAgRmlsZU1ldGFkYXRhLFxuICBGaWxlUGFydFJlc3BvbnNlLFxuICBOYW1lS2V5SW5wdXQsXG4gIE5vZGUsXG4gIE5vZGVGdWxsLFxuICBTaGFyZUZpbGVJbkhpc3RvcnlJbnB1dCxcbiAgU2hhcmVOb2Rlc0lucHV0XG59IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQge1xuICBmaWxlU2VsZWN0b3IsXG4gIG5vZGVGdWxsU2VsZWN0b3IsXG4gIG5vZGVTZWxlY3RvclxufSBmcm9tIFwiLi90eXBlcy9zZWxlY3RvcnMuanNcIjtcbi8vIGltcG9ydCB7IG1kNSB9IGZyb20gXCIuLi93b3JrZXIvaW5kZXguanNcIjtcbi8vIGltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZWNyZWN5Q2xvdWRDbGllbnQge1xuICAjY2xpZW50OiBTZWNyZWN5Q2xpZW50O1xuXG4gICNrZXlzOiBLZXlQYWlyO1xuXG4gICN0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFNlY3JlY3lDbGllbnQsXG4gICAga2V5czogS2V5UGFpcixcbiAgICB0aHVuZGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBUaHVuZGVyPlxuICApIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy4ja2V5cyA9IGtleXM7XG4gICAgdGhpcy4jdGh1bmRlciA9IHRodW5kZXI7XG4gIH1cblxuICBhc3luYyBhZGRGaWxlVG9IaXN0b3J5KHtcbiAgICBmaWxlSWQsXG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGU+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGFkZEZpbGVUb0hpc3RvcnkgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBhZGRGaWxlVG9IaXN0b3J5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQWRkRmlsZVRvSGlzdG9yeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBhZGRGaWxlVG9IaXN0b3J5OiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZEZpbGVUb0hpc3RvcnkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChhZGRGaWxlVG9IaXN0b3J5Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGFkZEZpbGVUb0hpc3Rvcnk7XG4gICAgfVxuXG4gICAgaWYgKGFkZEZpbGVUb0hpc3RvcnkuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBhZGRGaWxlVG9IaXN0b3J5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlRnVsbFRvSW50ZXJuYWxGdWxsKFxuICAgICAgYWRkRmlsZVRvSGlzdG9yeS5hZGRGaWxlVG9IaXN0b3J5LFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG4gICAgY29uc3QgZmlsZSA9IG5vZGUuaGlzdG9yeS5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgdXNlcnMgPSBub2RlLnVzZXJzLmZpbHRlcihcbiAgICAgICAgKFt1XSkgPT4gdS5wdWJsaWNLZXkgIT09IHRoaXMuI2tleXMucHVibGljS2V5XG4gICAgICApO1xuICAgICAgY29uc3QgaW5wdXQ6IFNoYXJlRmlsZUluSGlzdG9yeUlucHV0ID0ge1xuICAgICAgICBmaWxlSWQ6IGZpbGUuaWQsXG4gICAgICAgIHVzZXJzOiB1c2Vycy5tYXAoKFt1XSkgPT4gKHtcbiAgICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgICAgICBzb2RpdW0uZnJvbV9oZXgoZmlsZS5rZXkpLFxuICAgICAgICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICAgIHNoYXJlRmlsZUluSGlzdG9yeTogW1xuICAgICAgICAgIHsgaW5wdXQsIG5vZGVJZCB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gU2hhcmVGaWxlSW5IaXN0b3J5UmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBzaGFyZUZpbGVJbkhpc3Rvcnk6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBpbnRlcm5hbE5vZGVUb05vZGUobm9kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiByZXN1bHRcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZSh7XG4gICAgZmlsZSxcbiAgICBlbmNyeXB0UHJvZ3Jlc3MsXG4gICAgdXBsb2FkUHJvZ3Jlc3MsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlOiBnbG9iYWxUaGlzLkZpbGUgfCBVaW50OEFycmF5O1xuICAgIGVuY3J5cHRQcm9ncmVzcz86IFByb2dyZXNzQ2FsbGJhY2s7XG4gICAgdXBsb2FkUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxcbiAgICB8IFN1Y2Nlc3NSZXNwb25zZTxzdHJpbmc+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlS2V5ID0gc2VjcmV0c3RyZWFtS2V5Z2VuKCk7XG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9XG4gICAgICBmaWxlIGluc3RhbmNlb2YgRmlsZSA/IG5ldyBVaW50OEFycmF5KGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSkgOiBmaWxlO1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBjb21wcmVzcyhmaWxlQnVmZmVyKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IGVuY3J5cHRlZEZpbGUsXG4gICAgICBtZDU6IG1kNUZpbGUsXG4gICAgICBtZDVFbmNyeXB0ZWRcbiAgICB9ID0gYXdhaXQgZW5jcnlwdChmaWxlS2V5LCBjb21wcmVzc2VkLCBlbmNyeXB0UHJvZ3Jlc3MsIHNpZ25hbCk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRGaWxlS2V5ID0gZW5jcnlwdENyeXB0b0JveChcbiAgICAgIGZpbGVLZXksXG4gICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICk7XG5cbiAgICBjb25zdCB7IHVwbG9hZEZpbGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiLCB7XG4gICAgICBzY2FsYXJzOiB7XG4gICAgICAgIEpzb246IHtcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICBkZWNvZGU6IChlOiB1bmtub3duKSA9PiBKU09OLnBhcnNlKGUgYXMgc3RyaW5nKVxuICAgICAgICB9LFxuICAgICAgICBEYXRlVGltZToge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IG5ldyBEYXRlKGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlbmNvZGU6IChlOiB1bmtub3duKSA9PiAoZSBhcyBEYXRlKS50b0lTT1N0cmluZygpXG4gICAgICAgIH0sXG4gICAgICAgIEJpZ0ludDoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IEJpZ0ludChlIGFzIHN0cmluZyksXG4gICAgICAgICAgZW5jb2RlOiAoZTogdW5rbm93bikgPT4gKGUgYXMgYmlnaW50KS50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICB1cGxvYWRGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlU2l6ZTogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICAgIGZpbGVTaXplQmVmb3JlOiBmaWxlQnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgZmlsZUtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRGaWxlS2V5KSxcbiAgICAgICAgICBtZDVFbmNyeXB0ZWQsXG4gICAgICAgICAgbWQ1OiBtZDVGaWxlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTGltaXRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHVwbG9hZEZpbGU6IHtcbiAgICAgICAgICAgICAgZmlsZUlkOiB0cnVlLFxuICAgICAgICAgICAgICBmaWxlUGFydFNpemU6IHRydWUsXG4gICAgICAgICAgICAgIHBhcnRzOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHVybDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGxvYWRGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwbG9hZEZpbGU7XG4gICAgfVxuXG4gICAgaWYgKHVwbG9hZEZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiB1cGxvYWRGaWxlO1xuICAgIH1cblxuICAgIGlmICh1cGxvYWRGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXBsb2FkRmlsZTtcbiAgICB9XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdXBsb2FkUHJvZ3Jlc3M/Lih7XG4gICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgY3VycmVudDogMCxcbiAgICAgIHBlcmNlbnQ6IDBcbiAgICB9KTtcblxuICAgIGlmICh1cGxvYWRGaWxlLnVwbG9hZEZpbGUucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB1cGxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgdG90YWw6IGVuY3J5cHRlZEZpbGUuYnl0ZUxlbmd0aCxcbiAgICAgICAgY3VycmVudDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBwZXJjZW50OiAxXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGxvYWRQYXJ0RW5kZWQgPSBhc3luYyAoXG4gICAgICBtZDU6IHN0cmluZyxcbiAgICAgIG9yZGVyOiBudW1iZXJcbiAgICApOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4gPT4ge1xuICAgICAgaWYgKCF1cGxvYWRGaWxlLnVwbG9hZEZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHVwbG9hZEZpbGVQYXJ0RW5kIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgICB1cGxvYWRGaWxlUGFydEVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZCxcbiAgICAgICAgICAgIG1kNSxcbiAgICAgICAgICAgIG9yZGVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiLi4ub24gVXBsb2FkRmlsZVBhcnRFbmRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIHVwbG9hZEZpbGVQYXJ0RW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlUGFydEVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwbG9hZEZpbGVQYXJ0RW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgICByZXR1cm4gdXBsb2FkRmlsZVBhcnRFbmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICAgIGRhdGE6IHVwbG9hZEZpbGVQYXJ0RW5kLnVwbG9hZEZpbGVQYXJ0RW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCB1cGxvYWRFbmRlZCA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgU3VjY2Vzc1Jlc3BvbnNlPHN0cmluZz4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90Rm91bmQgfCBudWxsXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXBsb2FkRmlsZUVuZCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgICAgdXBsb2FkRmlsZUVuZDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIuLi5vbiBVcGxvYWRGaWxlRW5kUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgICB1cGxvYWRGaWxlRW5kOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF1cGxvYWRGaWxlRW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodXBsb2FkRmlsZUVuZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHVwbG9hZEZpbGVFbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGxvYWRGaWxlRW5kLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICAgIHJldHVybiB1cGxvYWRGaWxlRW5kO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwbG9hZEZpbGVFbmQudXBsb2FkRmlsZUVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgICAgZGF0YTogdXBsb2FkRmlsZUVuZC51cGxvYWRGaWxlRW5kXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBjaHVua1BhcnRzID0gbmV3IEFycmF5PHtcbiAgICAgIG9yZGVyOiBudW1iZXI7XG4gICAgICBkYXRhOiBVaW50OEFycmF5O1xuICAgICAgbWQ1OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjaHVua10gb2YgZW51bWVyYXRlKFxuICAgICAgY2h1bmtzKGVuY3J5cHRlZEZpbGUsIE51bWJlcih1cGxvYWRGaWxlLnVwbG9hZEZpbGUuZmlsZVBhcnRTaXplKSlcbiAgICApKSB7XG4gICAgICBjaHVua1BhcnRzLnB1c2goe1xuICAgICAgICBvcmRlcjogaW5kZXggKyAxLFxuICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgbWQ1OiBhd2FpdCBtZDUoY2h1bmspXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmVzc1BhcnRzOiBSZWNvcmQ8bnVtYmVyLCBBeGlvc1Byb2dyZXNzRXZlbnQ+ID0ge307XG4gICAgY29uc3Qgb25Qcm9ncmVzcyA9IChcbiAgICAgIHBhcnQ6IG51bWJlcixcbiAgICAgIHByb2dyZXNzRXZlbnQ6IEF4aW9zUHJvZ3Jlc3NFdmVudFxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLmxvYWRlZCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHVwbG9hZFByb2dyZXNzPy4oe1xuICAgICAgICBwZXJjZW50OiBjdXJyZW50IC8gZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICB0b3RhbDogZW5jcnlwdGVkRmlsZS5ieXRlTGVuZ3RoLFxuICAgICAgICBjdXJyZW50XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnlQYXJ0ID0gYXN5bmMgKHBhcnQ6IEZpbGVQYXJ0UmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghdXBsb2FkRmlsZS51cGxvYWRGaWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBjb25zdCBjaHVuayA9IGNodW5rUGFydHMuZmluZChwID0+IHAub3JkZXIgPT09IHBhcnQub3JkZXIpO1xuICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJ0LmZpZWxkcykpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICBcImZpbGVcIixcbiAgICAgICAgbmV3IEJsb2IoW2NodW5rLmRhdGFdKSxcbiAgICAgICAgYCR7dXBsb2FkRmlsZS51cGxvYWRGaWxlLmZpbGVJZH0tJHtjaHVuay5vcmRlcn1gXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBheGlvcy5wb3N0KHBhcnQudXJsLCBmb3JtRGF0YSwge1xuICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBwcm9ncmVzc0V2ZW50ID0+XG4gICAgICAgICAgb25Qcm9ncmVzcyhwYXJ0Lm9yZGVyLCBwcm9ncmVzc0V2ZW50KSxcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdXBsb2FkUGFydEVuZGVkKGNodW5rLm1kNSwgY2h1bmsub3JkZXIpO1xuICAgICAgLy8gaWYgKChlIGFzIGFueSkucmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7XG4gICAgICAvLyAgIC8vIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9reS9pc3N1ZXMvMzA1XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aHJvdyBlO1xuICAgICAgLy8gfVxuICAgIH07XG5cbiAgICBpZiAoIXVwbG9hZEZpbGUudXBsb2FkRmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZUFsbExpbWl0KFxuICAgICAgMyxcbiAgICAgIHVwbG9hZEZpbGUudXBsb2FkRmlsZS5wYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwbG9hZEVuZGVkKCk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGVJbkNsb3VkKHtcbiAgICBmaWxlLFxuICAgIG5hbWUsXG4gICAgbm9kZUlkLFxuICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICB1cGxvYWRQcm9ncmVzcyxcbiAgICBzaWduYWxcbiAgfToge1xuICAgIGZpbGU6IGdsb2JhbFRoaXMuRmlsZSB8IFVpbnQ4QXJyYXk7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5vZGVJZD86IHN0cmluZztcbiAgICBlbmNyeXB0UHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIHVwbG9hZFByb2dyZXNzPzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgfCBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+XG4gICAgfCBFcnJvckFjY2Vzc0RlbmllZFxuICAgIHwgRXJyb3JMaW1pdFxuICAgIHwgRXJyb3JOb3RGb3VuZFxuICAgIHwgRXJyb3JCYXNpY1xuICAgIHwgRXJyb3JOb3RFeGlzdFxuICAgIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGUoe1xuICAgICAgZmlsZSxcbiAgICAgIGVuY3J5cHRQcm9ncmVzcyxcbiAgICAgIHVwbG9hZFByb2dyZXNzLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG5cbiAgICBpZiAoIWZpbGVJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBmaWxlSWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVJZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIGZpbGVJZDtcbiAgICB9XG5cbiAgICBpZiAoZmlsZUlkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gZmlsZUlkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2F2ZUluQ2xvdWQoe1xuICAgICAgZmlsZUlkOiBmaWxlSWQuZGF0YSxcbiAgICAgIG5hbWUsXG4gICAgICBub2RlSWRcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JCYXNpY1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuX190eXBlbmFtZSA9PT0gXCJFcnJvckxpbWl0XCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RFeGlzdFwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogcmVzdWx0LmRhdGFcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlZE5vZGVzKCk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVbXT4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGxcbiAgPiB7XG4gICAgY29uc3QgeyBkZWxldGVkTm9kZXMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBkZWxldGVkTm9kZXM6IHtcbiAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiLi4ub24gRGVsZXRlZE5vZGVzUmVzcG9uc2VcIjoge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgZGVsZXRlZE5vZGVzOiBub2RlU2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVkTm9kZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVkTm9kZXMuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZGVsZXRlZE5vZGVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZGVsZXRlZE5vZGVzLmRlbGV0ZWROb2Rlcykge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChub2RlLCB0aGlzLiNrZXlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBub2Rlc1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzaGFyZWROb2RlcygpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxOb2RlW10+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgc2hhcmVkTm9kZXMgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBzaGFyZWROb2Rlczoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBTaGFyZWROb2Rlc1Jlc3BvbnNlXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIHNoYXJlZE5vZGVzOiBub2RlU2VsZWN0b3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFzaGFyZWROb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlZE5vZGVzLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlZE5vZGVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5PE5vZGU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBzaGFyZWROb2Rlcy5zaGFyZWROb2Rlcykge1xuICAgICAgbm9kZXMucHVzaChhd2FpdCBncWxOb2RlVG9FeHRlcm5hbChmb2xkZXIsIHRoaXMuI2tleXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVzXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vZGVzU2hhcmVkV2l0aE1lKFxuICAgIHR5cGU/OiBOb2RlVHlwZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZVtdPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9kZXNTaGFyZWRXaXRoTWUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJxdWVyeVwiKSh7XG4gICAgICBub2Rlc1NoYXJlZFdpdGhNZTogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBOb2Rlc1NoYXJlZFdpdGhNZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBub2Rlc1NoYXJlZFdpdGhNZTogbm9kZVNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZXNTaGFyZWRXaXRoTWUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZXNTaGFyZWRXaXRoTWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgQXJyYXk8Tm9kZT4oKTtcblxuICAgIGZvciAoY29uc3QgZm9sZGVyIG9mIG5vZGVzU2hhcmVkV2l0aE1lLm5vZGVzU2hhcmVkV2l0aE1lKSB7XG4gICAgICBub2Rlcy5wdXNoKGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsKGZvbGRlciwgdGhpcy4ja2V5cykpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogbm9kZXNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZVNoYXJpbmcoe1xuICAgIG5vZGVJZCxcbiAgICB1c2VySWRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVTaGFyaW5nIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZVNoYXJpbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICB1c2VySWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZVNoYXJpbmdSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlTm9kZVNoYXJpbmc6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZGVsZXRlTm9kZVNoYXJpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlU2hhcmluZy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVOb2RlU2hhcmluZztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IGRlbGV0ZU5vZGVTaGFyaW5nLmRlbGV0ZU5vZGVTaGFyaW5nXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGR1cGxpY2F0ZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICBmb2xkZXJJZCxcbiAgICBjdXN0b21OYW1lXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBmb2xkZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgY3VzdG9tTmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RGb3VuZCB8IG51bGxcbiAgPiB7XG4gICAgbGV0IG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAoJHtub2RlSWR9KSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub2RlLmFjY2Vzcz8ubmFtZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBoYXZlIGFjY2VzcyB0byBub2RlICR7bm9kZUlkfWApO1xuICAgIH1cbiAgICBjdXN0b21OYW1lID0gY3VzdG9tTmFtZVxuICAgICAgPyBhd2FpdCBlbmNyeXB0TmFtZShjdXN0b21OYW1lLCBub2RlLmFjY2Vzcy5uYW1lS2V5KVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgeyBkdXBsaWNhdGVOb2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZHVwbGljYXRlTm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgIGZvbGRlcklkLFxuICAgICAgICAgIGN1c3RvbU5hbWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEdXBsaWNhdGVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGR1cGxpY2F0ZU5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghZHVwbGljYXRlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGR1cGxpY2F0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZHVwbGljYXRlTm9kZTtcbiAgICB9XG5cbiAgICBpZiAoZHVwbGljYXRlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIGR1cGxpY2F0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkdXBsaWNhdGVOb2RlLmR1cGxpY2F0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlTm9kZUNsb3VkVHJhc2goe1xuICAgIGlkc1xuICB9OiB7XG4gICAgaWRzOiBBcnJheTxzdHJpbmc+O1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IG51bGw+IHtcbiAgICBjb25zdCB7IGRlbGV0ZU5vZGVDbG91ZFRyYXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgZGVsZXRlTm9kZUNsb3VkVHJhc2g6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBEZWxldGVOb2RlQ2xvdWRUcmFzaFJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlQ2xvdWRUcmFzaDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWxldGVOb2RlQ2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZU5vZGVDbG91ZFRyYXNoLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGVDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlTm9kZUNsb3VkVHJhc2guZGVsZXRlTm9kZUNsb3VkVHJhc2ggPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRm9sZGVyKHtcbiAgICBuYW1lLFxuICAgIHBhcmVudEZvbGRlcklkXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGFyZW50Rm9sZGVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICB9KTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCBrZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChrZXkpKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRLZXkgPSBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAga2V5LFxuICAgICAgdGhpcy4ja2V5cy5wdWJsaWNLZXksXG4gICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICApO1xuICAgIGNvbnN0IHsgY3JlYXRlRm9sZGVyIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgY3JlYXRlRm9sZGVyOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBlbmNyeXB0ZWROYW1lLFxuICAgICAgICAgIHBhcmVudEZvbGRlcklkLFxuICAgICAgICAgIGtleTogc29kaXVtLnRvX2hleChlbmNyeXB0ZWRLZXkpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gQ3JlYXRlRm9sZGVyUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcjogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghY3JlYXRlRm9sZGVyKSB7XG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGZvbGRlcmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBjcmVhdGVGb2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUZvbGRlci5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUZvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWNyZWF0ZUZvbGRlci5jcmVhdGVGb2xkZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwoXG4gICAgICBjcmVhdGVGb2xkZXIuY3JlYXRlRm9sZGVyLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VycyA9XG4gICAgICBmb2xkZXIucGFyZW50Py51c2Vycz8uZmlsdGVyKFxuICAgICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSAhPT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICAgICkgPz8gW107XG5cbiAgICBpZiAodXNlcnMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdXNlcnMubWFwKChbdSwgcmlnaHRzXSkgPT5cbiAgICAgICAgICB0aGlzLnNoYXJlTm9kZSh7XG4gICAgICAgICAgICBub2RlSWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIHJpZ2h0cyxcbiAgICAgICAgICAgIHVzZXJJZDogdS5pZFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBmb2xkZXJcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm9kZSh7XG4gICAgaWQsXG4gICAgZGVsZXRlZFxuICB9OiB7XG4gICAgaWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGRlbGV0ZWQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSA9IHt9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8Tm9kZUZ1bGw+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBudWxsPiB7XG4gICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIikoe1xuICAgICAgbm9kZTogW1xuICAgICAgICB7IGRlbGV0ZWQsIGlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIE5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbm9kZTogbm9kZUZ1bGxTZWxlY3RvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaWYgKCFub2RlLm5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdxbE5vZGVUb0V4dGVybmFsTm9kZUZ1bGwobm9kZS5ub2RlLCB0aGlzLiNrZXlzKTtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmaWxlTWV0YWRhdGEoe1xuICAgIGlkXG4gIH06IHtcbiAgICBpZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTdWNjZXNzUmVzcG9uc2U8RmlsZU1ldGFkYXRhPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZmlsZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcInF1ZXJ5XCIpKHtcbiAgICAgIGZpbGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEZpbGVRdWVyeVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBmaWxlOiBmaWxlU2VsZWN0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChmaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlLmZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGdxbEZpbGVUb0V4dGVybmFsKGZpbGUuZmlsZSwgdGhpcy4ja2V5cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzaGFyZU5vZGUoe1xuICAgIG5vZGVJZCxcbiAgICB1c2VySWQsXG4gICAgcmlnaHRzXG4gIH06IHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICByaWdodHM6IFJpZ2h0cztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEZvdW5kIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy4jY2xpZW50LnVzZXIoeyB1c2VySWQsIHdpdGhQdWJsaWNLZXk6IHRydWUgfSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmICh1c2VyLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNoYXJlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHNoYXJlTm9kZTogW1xuICAgICAgICB7IG5vZGVJZCwgdXNlcklkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90Rm91bmRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gU2hhcmVOb2RlUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyZU5vZGVzOiBTaGFyZU5vZGVzSW5wdXQgPSB7XG4gICAgICBub2RlczogW11cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBpZCBvZiBzaGFyZU5vZGUubm9kZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVLZXkgPSBhd2FpdCB0aGlzLnBlck5vZGUoaWQsIHVzZXIuZGF0YS5wdWJsaWNLZXkpO1xuICAgICAgaWYgKG5hbWVLZXkpIHtcbiAgICAgICAgc2hhcmVOb2Rlcy5ub2Rlcy5wdXNoKG5hbWVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhcmVOb2RlRmluaXNoIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgc2hhcmVOb2RlRmluaXNoOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByaWdodHMsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHNoYXJlTm9kZXNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JOb3RGb3VuZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBTaGFyZU5vZGVGaW5pc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgc2hhcmVOb2RlRmluaXNoOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNoYXJlTm9kZUZpbmlzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZUZpbmlzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBzaGFyZU5vZGVGaW5pc2g7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJlTm9kZUZpbmlzaC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90Rm91bmRcIikge1xuICAgICAgcmV0dXJuIHNoYXJlTm9kZUZpbmlzaDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHNoYXJlTm9kZUZpbmlzaC5zaGFyZU5vZGVGaW5pc2ggPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlTm9kZSh7XG4gICAgbm9kZUlkLFxuICAgIG5hbWUsXG4gICAgaXNGYXZvcml0ZSxcbiAgICBkZWxldGVkQXRcbiAgfToge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGlzRmF2b3JpdGU/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkZWxldGVkQXQ/OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgRXJyb3JOb3RFeGlzdCB8IG51bGxcbiAgPiB7XG4gICAgbGV0IG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHRocm93IGBDYW4ndCBmaW5kIE5vZGUgJHtub2RlSWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5vZGUuYWNjZXNzPy5uYW1lS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGhhdmUgYWNjZXNzIHRvIG5vZGUgJHtub2RlSWR9YCk7XG4gICAgfVxuXG4gICAgbmFtZSA9IG5hbWVcbiAgICAgID8gbm9kZS5hY2Nlc3M/Lm5hbWVLZXlcbiAgICAgICAgPyBhd2FpdCBlbmNyeXB0TmFtZShuYW1lLCBub2RlLmFjY2Vzcy5uYW1lS2V5KVxuICAgICAgICA6IG5hbWVcbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IHsgdXBkYXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIHVwZGF0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGlzRmF2b3JpdGUsXG4gICAgICAgICAgZGVsZXRlZEF0XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gVXBkYXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICB1cGRhdGVOb2RlOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXVwZGF0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZU5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiB1cGRhdGVOb2RlO1xuICAgIH1cblxuICAgIGlmICghdXBkYXRlTm9kZS51cGRhdGVOb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgdXBkYXRlTm9kZS51cGRhdGVOb2RlLFxuICAgICAgdGhpcy4ja2V5c1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlc3VsdFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmaWxlQ29udGVudCh7XG4gICAgZmlsZUlkLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBwcm9ncmVzc0RlY3J5cHQsXG4gICAgc2lnbmFsXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M/OiAocHJvZ3Jlc3M6IERvd25sb2FkUHJvZ3Jlc3MpID0+IHZvaWQ7XG4gICAgcHJvZ3Jlc3NEZWNyeXB0PzogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPFVpbnQ4QXJyYXk+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvckJhc2ljIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGZpbGVDb250ZW50IH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwicXVlcnlcIiwge1xuICAgICAgc2NhbGFyczoge1xuICAgICAgICBCeXRlczoge1xuICAgICAgICAgIGRlY29kZTogKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUsIHR5cGVvZiBlKTtcbiAgICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oWzEsIDIsIDNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuY29kZTogKGU6IHVua25vd24pID0+IChlIGFzIFVpbnQ4QXJyYXkpLnRvU3RyaW5nKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKHtcbiAgICAgIGZpbGVDb250ZW50OiBbXG4gICAgICAgIHsgZmlsZUlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQmFzaWNcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgZmlsZToge1xuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50Q2xvdWRcIjoge1xuICAgICAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG1kNTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAga2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIi4uLm9uIEZpbGVDb250ZW50TGl0ZVwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1OiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b3RhbFNpemU6IHRydWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCIuLi5vbiBGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VuZGVyUHVibGljS2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDU6IHRydWUsXG4gICAgICAgICAgICAgICAgbWQ1RW5jcnlwdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiLi4ub24gRmlsZUNvbnRlbnRTZW50TWFpbFwiOiB7XG4gICAgICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXliZVBhcnRzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50VXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICBtZDU6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1heWJlQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBrZXk6IHRydWUsXG4gICAgICAgICAgICAgICAgdG90YWxTaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1kNTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZDVFbmNyeXB0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgaWYgKCFmaWxlQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVDb250ZW50Ll9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChmaWxlQ29udGVudC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIGZpbGVDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBmaWxlQ29udGVudC5maWxlO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3Jlc3NQYXJ0czogUmVjb3JkPG51bWJlciwgRG93bmxvYWRQcm9ncmVzcz4gPSB7fTtcbiAgICBjb25zdCBvblByb2dyZXNzID0gKFxuICAgICAgcGFydDogbnVtYmVyLFxuICAgICAgcHJvZ3Jlc3NFdmVudDogRG93bmxvYWRQcm9ncmVzc1xuICAgICk6IHZvaWQgPT4ge1xuICAgICAgcHJvZ3Jlc3NQYXJ0c1twYXJ0XSA9IHByb2dyZXNzRXZlbnQ7XG4gICAgICBjb25zdCB0cmFuc2ZlcnJlZEJ5dGVzID0gT2JqZWN0LnZhbHVlcyhwcm9ncmVzc1BhcnRzKS5yZWR1Y2UoXG4gICAgICAgIChwcnYsIGN1cikgPT4gcHJ2ICsgY3VyLnRyYW5zZmVycmVkQnl0ZXMsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBjb25zdCB0b3RhbEJ5dGVzID0gTnVtYmVyKGZpbGUudG90YWxTaXplKTtcbiAgICAgIG9uRG93bmxvYWRQcm9ncmVzcz8uKHtcbiAgICAgICAgcGVyY2VudDogdHJhbnNmZXJyZWRCeXRlcyAvIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIHRyYW5zZmVycmVkQnl0ZXNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50RnJvbVBhcnRzID0gYXN5bmMgKFxuICAgICAgZmlsZVBhcnRzOiBGaWxlQ29udGVudFBhcnRbXVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBuZXcgQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyBvcmRlcjogbnVtYmVyIH0+KCk7XG5cbiAgICAgIGNvbnN0IGJ5UGFydCA9IGFzeW5jIChwYXJ0OiBGaWxlQ29udGVudFBhcnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICAgICAgYXdhaXQga3lcbiAgICAgICAgICAgIC5nZXQocGFydC5jb250ZW50VXJsLCB7XG4gICAgICAgICAgICAgIHRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHByID0+IG9uUHJvZ3Jlc3MocGFydC5vcmRlciwgcHIpLFxuICAgICAgICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1kNVBhcnQgPSBhd2FpdCBtZDUoYnVmKTtcbiAgICAgICAgaWYgKG1kNVBhcnQgIT09IHBhcnQubWQ1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbWQ1IGZvciBwYXJ0ICR7cGFydC5vcmRlcn0gb2YgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBidWYsXG4gICAgICAgICAgb3JkZXI6IHBhcnQub3JkZXJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBwcm9taXNlQWxsTGltaXQoXG4gICAgICAgIDMsXG4gICAgICAgIGZpbGVQYXJ0cy5tYXAocCA9PiAoKTogUHJvbWlzZTx2b2lkPiA9PiBieVBhcnQocCkpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY29uY2F0ZW5hdGUoXG4gICAgICAgIC4uLnBhcnRzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAocCA9PiBwLmRhdGEpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBmaW5hbGl6ZSA9IGFzeW5jIChcbiAgICAgIGVuY3J5cHRlZENvbnRlbnQ6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgIC8vIGNvbnN0IG1kNUVuY3J5cHRlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1kNShvZihlbmNyeXB0ZWRDb250ZW50KSkpO1xuICAgICAgY29uc3QgbWQ1RW5jcnlwdGVkID0gYXdhaXQgbWQ1KGVuY3J5cHRlZENvbnRlbnQpO1xuXG4gICAgICBpZiAobWQ1RW5jcnlwdGVkICE9PSBmaWxlLm1kNUVuY3J5cHRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY3J5cHRlZCBjb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChmaWxlLmtleSksXG4gICAgICAgIGZpbGUuX190eXBlbmFtZSA9PT0gXCJGaWxlQ29udGVudFJlY2VpdmVkTWFpbFwiXG4gICAgICAgICAgPyBmaWxlLnNlbmRlclB1YmxpY0tleVxuICAgICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICAgID8gZmlsZS5wdWJsaWNLZXlcbiAgICAgICAgICA6IHRoaXMuI2tleXMucHVibGljS2V5LFxuICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNyYyA9IGF3YWl0IGRlY3J5cHQoa2V5LCBlbmNyeXB0ZWRDb250ZW50LCBwcm9ncmVzc0RlY3J5cHQsIHNpZ25hbCk7XG5cbiAgICAgIC8vIGNvbnN0IG1kNUNvbnRlbnQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShtZDUob2Yoc3JjKSkpO1xuICAgICAgY29uc3QgbWQ1Q29udGVudCA9IGF3YWl0IG1kNShzcmMpO1xuXG4gICAgICBpZiAobWQ1Q29udGVudCAhPT0gZmlsZS5tZDUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250ZW50IGRvZXMgbm90IG1hdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmNvbXByZXNzKHNyYyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnQgPVxuICAgICAgZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50TGl0ZVwiXG4gICAgICAgID8gZmlsZS5jb250ZW50XG4gICAgICAgIDogZmlsZS5fX3R5cGVuYW1lID09PSBcIkZpbGVDb250ZW50Q2xvdWRcIlxuICAgICAgICA/IGF3YWl0IGVuY3J5cHRlZENvbnRlbnRGcm9tUGFydHMoZmlsZS5wYXJ0cylcbiAgICAgICAgOiBmaWxlLm1heWJlQ29udGVudFxuICAgICAgICA/IGZpbGUubWF5YmVDb250ZW50XG4gICAgICAgIDogZmlsZS5tYXliZVBhcnRzXG4gICAgICAgID8gYXdhaXQgZW5jcnlwdGVkQ29udGVudEZyb21QYXJ0cyhmaWxlLm1heWJlUGFydHMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmICghZW5jcnlwdGVkQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBhd2FpdCBmaW5hbGl6ZShlbmNyeXB0ZWRDb250ZW50KVxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlKHtcbiAgICBmaWxlSWQsXG4gICAgbm9kZUlkXG4gIH06IHtcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8XG4gICAgU3VjY2Vzc1Jlc3BvbnNlPGJvb2xlYW4+IHwgRXJyb3JBY2Nlc3NEZW5pZWQgfCBFcnJvck5vdEV4aXN0IHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGRlbGV0ZUZpbGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBkZWxldGVGaWxlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgICAgbm9kZUlkXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlRmlsZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZUZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVGaWxlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZUZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGRlbGV0ZUZpbGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiBkZWxldGVGaWxlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGVuYW1lOiBcIlN1Y2Nlc3NSZXNwb25zZVwiLFxuICAgICAgZGF0YTogZGVsZXRlRmlsZS5kZWxldGVGaWxlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU5vZGUoe1xuICAgIG5vZGVJZFxuICB9OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgZGVsZXRlTm9kZSB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGRlbGV0ZU5vZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBub2RlSWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiLi4ub24gRXJyb3JBY2Nlc3NEZW5pZWRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRGVsZXRlTm9kZVJlc3BvbnNlXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVOb2RlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlbGV0ZU5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChkZWxldGVOb2RlLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JBY2Nlc3NEZW5pZWRcIikge1xuICAgICAgcmV0dXJuIGRlbGV0ZU5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBkZWxldGVOb2RlLmRlbGV0ZU5vZGVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZW1wdHlUcmFzaCgpOiBQcm9taXNlPFxuICAgIFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbFxuICA+IHtcbiAgICBjb25zdCB7IGVtcHR5Q2xvdWRUcmFzaCB9ID0gYXdhaXQgdGhpcy4jdGh1bmRlcihcIm11dGF0aW9uXCIpKHtcbiAgICAgIGVtcHR5Q2xvdWRUcmFzaDoge1xuICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCIuLi5vbiBFbXB0eUNsb3VkVHJhc2hSZXNwb25zZVwiOiB7XG4gICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICBlbXB0eUNsb3VkVHJhc2g6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFlbXB0eUNsb3VkVHJhc2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbXB0eUNsb3VkVHJhc2guX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gZW1wdHlDbG91ZFRyYXNoO1xuICAgIH1cblxuICAgIGlmICghZW1wdHlDbG91ZFRyYXNoLmVtcHR5Q2xvdWRUcmFzaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBlbXB0eUNsb3VkVHJhc2guZW1wdHlDbG91ZFRyYXNoXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlY292ZXJOb2RlKFxuICAgIGlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxcbiAgICBTdWNjZXNzUmVzcG9uc2U8Ym9vbGVhbj4gfCBFcnJvckFjY2Vzc0RlbmllZCB8IEVycm9yTm90RXhpc3QgfCBudWxsXG4gID4ge1xuICAgIGNvbnN0IHsgcmVjb3Zlck5vZGUgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICByZWNvdmVyTm9kZTogW1xuICAgICAgICB7IGlkIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIi4uLm9uIEVycm9yQWNjZXNzRGVuaWVkXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTm90RXhpc3RcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gUmVjb3Zlck5vZGVSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgcmVjb3Zlck5vZGU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGlmICghcmVjb3Zlck5vZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZWNvdmVyTm9kZS5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICBpZiAocmVjb3Zlck5vZGUuX190eXBlbmFtZSA9PT0gXCJFcnJvck5vdEV4aXN0XCIpIHtcbiAgICAgIHJldHVybiByZWNvdmVyTm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IHJlY292ZXJOb2RlLnJlY292ZXJOb2RlID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVOb2Rlcyh7XG4gICAgbm9kZUlkcyxcbiAgICBwYXJlbnROb2RlSWRcbiAgfToge1xuICAgIG5vZGVJZHM6IHN0cmluZ1tdO1xuICAgIHBhcmVudE5vZGVJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBQcm9taXNlPFN1Y2Nlc3NSZXNwb25zZTxib29sZWFuPiB8IEVycm9yQWNjZXNzRGVuaWVkIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbW92ZU5vZGVzIH0gPSBhd2FpdCB0aGlzLiN0aHVuZGVyKFwibXV0YXRpb25cIikoe1xuICAgICAgbW92ZU5vZGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICAgIHBhcmVudE5vZGVJZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBNb3ZlTm9kZXNSZXNwb25zZVwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbW92ZU5vZGVzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIW1vdmVOb2Rlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG1vdmVOb2Rlcy5fX3R5cGVuYW1lID09PSBcIkVycm9yQWNjZXNzRGVuaWVkXCIpIHtcbiAgICAgIHJldHVybiBtb3ZlTm9kZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZW5hbWU6IFwiU3VjY2Vzc1Jlc3BvbnNlXCIsXG4gICAgICBkYXRhOiBtb3ZlTm9kZXMubW92ZU5vZGVzID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVJbkNsb3VkKHtcbiAgICBmaWxlSWQsXG4gICAgbmFtZSxcbiAgICBub2RlSWRcbiAgfToge1xuICAgIGZpbGVJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBub2RlSWQ/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFxuICAgIHwgU3VjY2Vzc1Jlc3BvbnNlPE5vZGVGdWxsPlxuICAgIHwgRXJyb3JBY2Nlc3NEZW5pZWRcbiAgICB8IEVycm9yQmFzaWNcbiAgICB8IEVycm9yTGltaXRcbiAgICB8IEVycm9yTm90Rm91bmRcbiAgICB8IEVycm9yTm90RXhpc3RcbiAgICB8IG51bGxcbiAgPiB7XG4gICAgaWYgKG5vZGVJZCAmJiAhbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIGlmICghbm9kZXNDYWNoZS5oYXMobm9kZUlkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgbm9kZSAke25vZGVJZH0gZG9lcyBub3QgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBrZXkgPSBcIlwiO1xuXG4gICAgY29uc3QgZmlsZSA9IGZpbGVzQ2FjaGUuZ2V0KGZpbGVJZCk7XG5cbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU1ldGFkYXRhKHsgaWQ6IGZpbGVJZCB9KTtcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc0NhY2hlLmdldChmaWxlSWQpID8/IG51bGw7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVjZWl2ZWRNYWlscyA9IGF3YWl0IHRoaXMuI2NsaWVudC5tYWlsLnJlY2VpdmVkTWFpbHMoKTtcbiAgICAgICAgaWYgKCFyZWNlaXZlZE1haWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2VpdmVkTWFpbHMuX190eXBlbmFtZSAhPT0gXCJTdWNjZXNzUmVzcG9uc2VcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1haWwgPSByZWNlaXZlZE1haWxzLmRhdGEuZmluZChtID0+XG4gICAgICAgICAgbS5maWxlcy5zb21lKGYgPT4gZi5pZCA9PT0gZmlsZUlkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiBcIkVycm9yQmFzaWNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW4ndCBmaW5kIG1haWwgd2l0aCB0aGUgZmlsZSAke2ZpbGVJZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVNYWlsID0gbWFpbC5maWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZmlsZUlkKTtcblxuICAgICAgICBpZiAoIWZpbGVNYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IFwiRXJyb3JCYXNpY1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYENhbid0IGZpbmQgbWFpbCB3aXRoIHRoZSBmaWxlICR7ZmlsZUlkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZUtleSA9IGRlY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgICAgc29kaXVtLmZyb21faGV4KGZpbGVNYWlsLmtleSksXG4gICAgICAgICAgbWFpbC5zZW5kZXIucHVibGljS2V5LFxuICAgICAgICAgIHRoaXMuI2tleXMucHJpdmF0ZUtleVxuICAgICAgICApO1xuXG4gICAgICAgIGtleSA9IHNvZGl1bS50b19oZXgoZmlsZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX190eXBlbmFtZTogXCJFcnJvckJhc2ljXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBlcnJvciAzXCJcbiAgICAgIH07XG4gICAgfVxuXG4gICAga2V5ID0gc29kaXVtLnRvX2hleChcbiAgICAgIGVuY3J5cHRDcnlwdG9Cb3goXG4gICAgICAgIHNvZGl1bS5mcm9tX2hleChrZXkpLFxuICAgICAgICB0aGlzLiNrZXlzLnB1YmxpY0tleSxcbiAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWVLZXkgPSBzZWNyZXRzdHJlYW1LZXlnZW4oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWROYW1lID0gYXdhaXQgZW5jcnlwdE5hbWUobmFtZSwgc29kaXVtLnRvX2hleChuYW1lS2V5KSk7XG4gICAgY29uc3QgZW5jcnlwdGVkTmFtZUtleSA9IHNvZGl1bS50b19oZXgoXG4gICAgICBlbmNyeXB0Q3J5cHRvQm94KG5hbWVLZXksIHRoaXMuI2tleXMucHVibGljS2V5LCB0aGlzLiNrZXlzLnByaXZhdGVLZXkpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgc2F2ZUluQ2xvdWQgfSA9IGF3YWl0IHRoaXMuI3RodW5kZXIoXCJtdXRhdGlvblwiKSh7XG4gICAgICBzYXZlSW5DbG91ZDogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgZmlsZW5hbWU6IGVuY3J5cHRlZE5hbWUsXG4gICAgICAgICAgbmFtZUtleTogZW5jcnlwdGVkTmFtZUtleVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCIuLi5vbiBFcnJvckFjY2Vzc0RlbmllZFwiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEZvdW5kXCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIEVycm9yTGltaXRcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiLi4ub24gRXJyb3JCYXNpY1wiOiB7XG4gICAgICAgICAgICBfX3R5cGVuYW1lOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCIuLi5vbiBFcnJvck5vdEV4aXN0XCI6IHtcbiAgICAgICAgICAgIF9fdHlwZW5hbWU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIi4uLm9uIFNhdmVJbkNsb3VkUmVzcG9uc2VcIjoge1xuICAgICAgICAgICAgX190eXBlbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIHNhdmVJbkNsb3VkOiBub2RlRnVsbFNlbGVjdG9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBpZiAoIXNhdmVJbkNsb3VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2F2ZUluQ2xvdWQuX190eXBlbmFtZSA9PT0gXCJFcnJvckFjY2Vzc0RlbmllZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuXG4gICAgaWYgKHNhdmVJbkNsb3VkLl9fdHlwZW5hbWUgPT09IFwiRXJyb3JOb3RGb3VuZFwiKSB7XG4gICAgICByZXR1cm4gc2F2ZUluQ2xvdWQ7XG4gICAgfVxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTGltaXRcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yQmFzaWNcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmIChzYXZlSW5DbG91ZC5fX3R5cGVuYW1lID09PSBcIkVycm9yTm90RXhpc3RcIikge1xuICAgICAgcmV0dXJuIHNhdmVJbkNsb3VkO1xuICAgIH1cblxuICAgIGlmICghc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBncWxOb2RlVG9FeHRlcm5hbE5vZGVGdWxsKFxuICAgICAgc2F2ZUluQ2xvdWQuc2F2ZUluQ2xvdWQsXG4gICAgICB0aGlzLiNrZXlzXG4gICAgKTtcblxuICAgIGNvbnN0IG1lID0gbm9kZS5wYXJlbnQ/LnVzZXJzLmZpbmQoXG4gICAgICAoW3VdKSA9PiB1LnB1YmxpY0tleSA9PT0gdGhpcy4ja2V5cy5wdWJsaWNLZXlcbiAgICApO1xuXG4gICAgaWYgKG1lICYmIFtcImFkbWluXCIsIFwid3JpdGVcIl0uaW5jbHVkZXMobWVbMV0pKSB7XG4gICAgICBjb25zdCBvdGhlcnMgPVxuICAgICAgICBub2RlLnBhcmVudD8udXNlcnMuZmlsdGVyKFxuICAgICAgICAgIChbdV0pID0+IHUucHVibGljS2V5ICE9PSB0aGlzLiNrZXlzLnB1YmxpY0tleVxuICAgICAgICApID8/IFtdO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3RoZXJzLm1hcCgoW3UsIHJpZ2h0c10pID0+XG4gICAgICAgICAgdGhpcy5zaGFyZU5vZGUoe1xuICAgICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgcmlnaHRzLFxuICAgICAgICAgICAgdXNlcklkOiB1LmlkXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlbmFtZTogXCJTdWNjZXNzUmVzcG9uc2VcIixcbiAgICAgIGRhdGE6IG5vZGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJOb2RlID0gYXN5bmMgKFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHB1YmxpY0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TmFtZUtleUlucHV0IHwgbnVsbD4gPT4ge1xuICAgIGxldCBub2RlID0gbm9kZXNDYWNoZS5nZXQobm9kZUlkKTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgYXdhaXQgdGhpcy5ub2RlKHsgaWQ6IG5vZGVJZCB9KTtcbiAgICAgIG5vZGUgPSBub2Rlc0NhY2hlLmdldChub2RlSWQpO1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUtleSA9IG5vZGUuYWNjZXNzPy5uYW1lS2V5O1xuXG4gICAgaWYgKCFuYW1lS2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICBuYW1lS2V5OiBzb2RpdW0udG9faGV4KFxuICAgICAgICBlbmNyeXB0Q3J5cHRvQm94KFxuICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChuYW1lS2V5KSxcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgdGhpcy4ja2V5cy5wcml2YXRlS2V5XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBmaWxlczpcbiAgICAgICAgXCJoaXN0b3J5XCIgaW4gbm9kZVxuICAgICAgICAgID8gbm9kZS5oaXN0b3J5Lm1hcChmID0+ICh7XG4gICAgICAgICAgICAgIGlkOiBmLmlkLFxuICAgICAgICAgICAgICBrZXk6IHNvZGl1bS50b19oZXgoXG4gICAgICAgICAgICAgICAgZW5jcnlwdENyeXB0b0JveChcbiAgICAgICAgICAgICAgICAgIHNvZGl1bS5mcm9tX2hleChmLmtleSksXG4gICAgICAgICAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgICAgICAgICB0aGlzLiNrZXlzLnByaXZhdGVLZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAg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
1
+ import U from"axios";import L from"ky";import{encryptName as P}from"../index.js";import{nodesCache as N,filesCache as T}from"../cache.js";import{secretstreamKeygen as K}from"../crypto/file.js";import{decryptCryptoBox as I}from"../crypto/index.js";import{encryptCryptoBox as A}from"../crypto/index.js";import{compress as M,uncompress as z}from"../minify/index.js";import{sodium as p}from"../sodium.js";import{enumerate as H,chunks as $,promiseAllLimit as B,concatenate as q}from"../utils/utils.js";import{md5 as b}from"../worker/md5.js";import{decrypt as j,encrypt as O}from"../worker/sodium.js";import{gqlFileToExternal as W}from"./convert/file.js";import{gqlNodeFullToInternalFull as J,gqlNodeToExternal as v,gqlNodeToExternalNodeFull as C,internalNodeToNode as Q}from"./convert/node.js";import{fileSelector as G,nodeFullSelector as R,nodeSelector as k}from"./types/selectors.js";class pe{#t;#e;#r;constructor(e,t,r){this.#t=e,this.#e=t,this.#r=r}async addFileToHistory({fileId:e,nodeId:t}){const{addFileToHistory:r}=await this.#r("mutation")({addFileToHistory:[{fileId:e,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on AddFileToHistoryResponse":{__typename:!0,addFileToHistory:R}}]});if(!r)return null;if(r.__typename==="ErrorAccessDenied"||r.__typename==="ErrorNotExist")return r;const o=await J(r.addFileToHistory,this.#e),s=o.history.find(u=>u.id===e);if(s){const u=o.users.filter(([l])=>l.publicKey!==this.#e.publicKey),d={fileId:s.id,users:u.map(([l])=>({id:l.id,key:p.to_hex(A(p.from_hex(s.key),this.#e.publicKey,this.#e.privateKey))}))};await this.#r("mutation")({shareFileInHistory:[{input:d,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareFileInHistoryResponse":{__typename:!0,shareFileInHistory:!0}}]})}return{__typename:"SuccessResponse",data:Q(o)}}async uploadFile({file:e,encryptProgress:t,uploadProgress:r,signal:o}){const s=K(),n=e instanceof File?new Uint8Array(await e.arrayBuffer()):e,u=M(n),{data:d,md5:l,md5Encrypted:E}=await O(s,u,t,o),F=A(s,this.#e.publicKey,this.#e.privateKey),{uploadFile:i}=await this.#r("mutation",{scalars:{Json:{encode:a=>JSON.stringify(a),decode:a=>JSON.parse(a)},DateTime:{decode:a=>new Date(a),encode:a=>a.toISOString()},BigInt:{decode:a=>BigInt(a),encode:a=>a.toString()}}})({uploadFile:[{fileSize:d.byteLength,fileSizeBefore:n.byteLength,fileKey:p.to_hex(F),md5Encrypted:E,md5:l},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorLimit":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on UploadFileResponse":{__typename:!0,uploadFile:{fileId:!0,filePartSize:!0,parts:{fields:!0,order:!0,url:!0}}}}]});if(!i)return null;if(i.__typename==="ErrorAccessDenied"||i.__typename==="ErrorLimit"||i.__typename==="ErrorNotFound")return i;if(!i.uploadFile)return null;if(r?.({total:d.byteLength,current:0,percent:0}),i.uploadFile.parts.length===0)return r?.({total:d.byteLength,current:d.byteLength,percent:1}),{__typename:"SuccessResponse",data:i.uploadFile.fileId};const m=async(a,h)=>{if(!i.uploadFile)return null;const{uploadFilePartEnd:_}=await this.#r("mutation")({uploadFilePartEnd:[{fileId:i.uploadFile.fileId,md5:a,order:h},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on UploadFilePartEndResponse":{__typename:!0,uploadFilePartEnd:!0}}]});return _?_.__typename==="ErrorAccessDenied"?_:{__typename:"SuccessResponse",data:_.uploadFilePartEnd}:null},y=async()=>{if(!i.uploadFile)return null;const{uploadFileEnd:a}=await this.#r("mutation")({uploadFileEnd:[{fileId:i.uploadFile.fileId},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on UploadFileEndResponse":{__typename:!0,uploadFileEnd:!0}}]});return a?a.__typename==="ErrorAccessDenied"||a.__typename==="ErrorNotFound"?a:a.uploadFileEnd?{__typename:"SuccessResponse",data:a.uploadFileEnd}:null:null},c=new Array;for(const[a,h]of H($(d,Number(i.uploadFile.filePartSize))))c.push({order:a+1,data:h,md5:await b(h)});const f={},g=(a,h)=>{f[a]=h;const _=Object.values(f).reduce((w,x)=>w+x.loaded,0);r?.({percent:_/d.byteLength,total:d.byteLength,current:_})},D=async a=>{if(!i.uploadFile)return;const h=new FormData,_=c.find(w=>w.order===a.order);if(!!_){for(const[w,x]of Object.entries(a.fields))h.append(w,x);h.append("file",new Blob([_.data]),`${i.uploadFile.fileId}-${_.order}`),await U.post(a.url,h,{onUploadProgress:w=>g(a.order,w),signal:o}),await m(_.md5,_.order)}};if(!i.uploadFile)return null;await B(3,i.uploadFile.parts.map(a=>()=>D(a)));const S=await y();return S?S.__typename==="ErrorAccessDenied"||S.__typename==="ErrorNotFound"?S:{__typename:"SuccessResponse",data:S.data}:null}async uploadFileInCloud({file:e,name:t,nodeId:r,encryptProgress:o,uploadProgress:s,signal:n}){const u=await this.uploadFile({file:e,encryptProgress:o,uploadProgress:s,signal:n});if(!u)return null;if(u.__typename==="ErrorAccessDenied"||u.__typename==="ErrorLimit"||u.__typename==="ErrorNotFound")return u;const d=await this.saveInCloud({fileId:u.data,name:t,nodeId:r});return d?d.__typename==="ErrorAccessDenied"||d.__typename==="ErrorBasic"||d.__typename==="ErrorLimit"||d.__typename==="ErrorNotFound"||d.__typename==="ErrorNotExist"?d:{__typename:"SuccessResponse",data:d.data}:null}async deletedNodes(){const{deletedNodes:e}=await this.#r("query")({deletedNodes:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeletedNodesResponse":{__typename:!0,deletedNodes:k}}});if(!e)return null;if(e.__typename==="ErrorAccessDenied")return e;const t=new Array;for(const r of e.deletedNodes)t.push(await v(r,this.#e));return{__typename:"SuccessResponse",data:t}}async sharedNodes(){const{sharedNodes:e}=await this.#r("query")({sharedNodes:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on SharedNodesResponse":{__typename:!0,sharedNodes:k}}});if(!e)return null;if(e.__typename==="ErrorAccessDenied")return e;const t=new Array;for(const r of e.sharedNodes)t.push(await v(r,this.#e));return{__typename:"SuccessResponse",data:t}}async nodesSharedWithMe(e){const{nodesSharedWithMe:t}=await this.#r("query")({nodesSharedWithMe:[{type:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on NodesSharedWithMeResponse":{__typename:!0,nodesSharedWithMe:k}}]});if(!t)return null;if(t.__typename==="ErrorAccessDenied")return t;const r=new Array;for(const o of t.nodesSharedWithMe)r.push(await v(o,this.#e));return{__typename:"SuccessResponse",data:r}}async deleteNodeSharing({nodeId:e,userId:t}){const{deleteNodeSharing:r}=await this.#r("mutation")({deleteNodeSharing:[{nodeId:e,userId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeSharingResponse":{__typename:!0,deleteNodeSharing:!0}}]});return r?r.__typename==="ErrorAccessDenied"?r:{__typename:"SuccessResponse",data:r.deleteNodeSharing}:null}async duplicateNode({nodeId:e,folderId:t,customName:r}){let o=N.get(e);if(!o&&(await this.node({id:e}),o=N.get(e),!o))throw new Error(`Node (${e}) does not exists`);if(!o.access?.nameKey)throw new Error(`Can't have access to node ${e}`);r=r?await P(r,o.access.nameKey):null;const{duplicateNode:s}=await this.#r("mutation")({duplicateNode:[{nodeId:e,folderId:t,customName:r},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on DuplicateNodeResponse":{__typename:!0,duplicateNode:!0}}]});return s?s.__typename==="ErrorAccessDenied"||s.__typename==="ErrorNotFound"?s:{__typename:"SuccessResponse",data:s.duplicateNode}:null}async deleteNodeCloudTrash({ids:e}){const{deleteNodeCloudTrash:t}=await this.#r("mutation")({deleteNodeCloudTrash:[{ids:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeCloudTrashResponse":{__typename:!0,deleteNodeCloudTrash:!0}}]});return t?t.__typename==="ErrorAccessDenied"?t:{__typename:"SuccessResponse",data:t.deleteNodeCloudTrash??!1}:null}async createFolder({name:e,parentFolderId:t}){const r=K(),o=await P(e,p.to_hex(r)),s=A(r,this.#e.publicKey,this.#e.privateKey),{createFolder:n}=await this.#r("mutation")({createFolder:[{name:o,parentFolderId:t,key:p.to_hex(s)},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on CreateFolderResponse":{__typename:!0,createFolder:R}}]});if(!n)return null;if(n.__typename==="ErrorAccessDenied"||n.__typename==="ErrorNotExist")return n;if(!n.createFolder)return null;const u=await C(n.createFolder,this.#e),d=u.parent?.users?.filter(([l])=>l.publicKey!==this.#e.publicKey)??[];return d.length&&await Promise.all(d.map(([l,E])=>this.shareNode({nodeId:u.id,rights:E,userId:l.id}))),{__typename:"SuccessResponse",data:u}}async node({id:e,deleted:t}={}){const{node:r}=await this.#r("query")({node:[{deleted:t,id:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on NodeResponse":{__typename:!0,node:R}}]});return r?r.__typename==="ErrorAccessDenied"?r:r.node?{__typename:"SuccessResponse",data:await C(r.node,this.#e)}:null:null}async fileMetadata({id:e}){const{file:t}=await this.#r("query")({file:[{id:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on FileQueryResponse":{__typename:!0,file:G}}]});return t?t.__typename==="ErrorAccessDenied"?t:t.file?{__typename:"SuccessResponse",data:W(t.file,this.#e)}:null:null}async shareNode({nodeId:e,userId:t,rights:r}){const o=await this.#t.user({userId:t,withPublicKey:!0});if(!o||o.__typename==="ErrorNotFound")return o;const{shareNode:s}=await this.#r("mutation")({shareNode:[{nodeId:e,userId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareNodeResponse":{__typename:!0,nodes:!0}}]});if(!s)return null;if(s.__typename==="ErrorAccessDenied"||s.__typename==="ErrorNotFound")return s;const n={nodes:[]};for(const d of s.nodes){const l=await this.perNode(d,o.data.publicKey);l&&n.nodes.push(l)}const{shareNodeFinish:u}=await this.#r("mutation")({shareNodeFinish:[{rights:r,userId:t,shareNodes:n},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ShareNodeFinishResponse":{__typename:!0,shareNodeFinish:!0}}]});return u?u.__typename==="ErrorAccessDenied"||u.__typename==="ErrorNotFound"?u:{__typename:"SuccessResponse",data:u.shareNodeFinish??!1}:null}async updateNode({nodeId:e,name:t,isFavorite:r,deletedAt:o}){let s=N.get(e);if(!s&&(await this.node({id:e}),s=N.get(e),!s))throw`Can't find Node ${e}`;if(!s.access?.nameKey)throw new Error(`Can't have access to node ${e}`);t=t?s.access?.nameKey?await P(t,s.access.nameKey):t:null;const{updateNode:n}=await this.#r("mutation")({updateNode:[{nodeId:e,name:t,isFavorite:r,deletedAt:o},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on UpdateNodeResponse":{__typename:!0,updateNode:R}}]});return n?n.__typename==="ErrorAccessDenied"||n.__typename==="ErrorNotExist"?n:n.updateNode?{__typename:"SuccessResponse",data:await C(n.updateNode,this.#e)}:null:null}async fileContent({fileId:e,onDownloadProgress:t,progressDecrypt:r,signal:o}){const{fileContent:s}=await this.#r("query",{scalars:{Bytes:{decode:i=>(console.log(i,typeof i),Uint8Array.from([1,2,3])),encode:i=>i.toString()}}})({fileContent:[{fileId:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorBasic":{__typename:!0,message:!0},"...on FileContentResponse":{__typename:!0,file:{"...on FileContentCloud":{__typename:!0,parts:{contentUrl:!0,order:!0,md5:!0},key:!0,publicKey:!0,totalSize:!0,md5:!0,md5Encrypted:!0},"...on FileContentLite":{__typename:!0,content:!0,id:!0,key:!0,publicKey:!0,md5:!0,md5Encrypted:!0,totalSize:!0},"...on FileContentReceivedMail":{__typename:!0,maybeParts:{contentUrl:!0,order:!0,md5:!0},maybeContent:!0,key:!0,senderPublicKey:!0,totalSize:!0,md5:!0,md5Encrypted:!0},"...on FileContentSentMail":{__typename:!0,maybeParts:{contentUrl:!0,order:!0,md5:!0},maybeContent:!0,key:!0,totalSize:!0,md5:!0,md5Encrypted:!0}}}}]});if(!s)return null;if(s.__typename==="ErrorAccessDenied"||s.__typename==="ErrorBasic")return s;const n=s.file;if(!n)return null;const u={},d=(i,m)=>{u[i]=m;const y=Object.values(u).reduce((f,g)=>f+g.transferredBytes,0),c=Number(n.totalSize);t?.({percent:y/c,totalBytes:c,transferredBytes:y})},l=async i=>{const m=new Array,y=async c=>{const f=new Uint8Array(await L.get(c.contentUrl,{timeout:!1,onDownloadProgress:D=>d(c.order,D),signal:o}).arrayBuffer());if(await b(f)!==c.md5)throw new Error(`Invalid md5 for part ${c.order} of file ${e}`);m.push({data:f,order:c.order})};return await B(3,i.map(c=>()=>y(c))),q(...m.sort((c,f)=>c.order-f.order).map(c=>c.data))},E=async i=>{if(await b(i)!==n.md5Encrypted)throw new Error("Encrypted content does not match");const y=I(p.from_hex(n.key),n.__typename==="FileContentReceivedMail"?n.senderPublicKey:n.__typename==="FileContentCloud"?n.publicKey:this.#e.publicKey,this.#e.privateKey),c=await j(y,i,r,o);if(await b(c)!==n.md5)throw new Error("Content does not match");return z(c)},F=n.__typename==="FileContentLite"?n.content:n.__typename==="FileContentCloud"?await l(n.parts):n.maybeContent?n.maybeContent:n.maybeParts?await l(n.maybeParts):null;return F?{__typename:"SuccessResponse",data:await E(F)}:null}async deleteFile({fileId:e,nodeId:t}){const{deleteFile:r}=await this.#r("mutation")({deleteFile:[{fileId:e,nodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on DeleteFileResponse":{__typename:!0,deleteFile:!0}}]});return r?r.__typename==="ErrorAccessDenied"||r.__typename==="ErrorNotExist"?r:{__typename:"SuccessResponse",data:r.deleteFile}:null}async deleteNode({nodeId:e}){const{deleteNode:t}=await this.#r("mutation")({deleteNode:[{id:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on DeleteNodeResponse":{__typename:!0,deleteNode:!0}}]});return t?t.__typename==="ErrorAccessDenied"?t:{__typename:"SuccessResponse",data:t.deleteNode}:null}async emptyTrash(){const{emptyCloudTrash:e}=await this.#r("mutation")({emptyCloudTrash:{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on EmptyCloudTrashResponse":{__typename:!0,emptyCloudTrash:!0}}});return e?e.__typename==="ErrorAccessDenied"?e:e.emptyCloudTrash?{__typename:"SuccessResponse",data:e.emptyCloudTrash}:null:null}async recoverNode(e){const{recoverNode:t}=await this.#r("mutation")({recoverNode:[{id:e},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on RecoverNodeResponse":{__typename:!0,recoverNode:!0}}]});return t?t.__typename==="ErrorAccessDenied"||t.__typename==="ErrorNotExist"?t:{__typename:"SuccessResponse",data:t.recoverNode??!1}:null}async moveNodes({nodeIds:e,parentNodeId:t}){const{moveNodes:r}=await this.#r("mutation")({moveNodes:[{nodeIds:e,parentNodeId:t},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on MoveNodesResponse":{__typename:!0,moveNodes:!0}}]});return r?r.__typename==="ErrorAccessDenied"?r:{__typename:"SuccessResponse",data:r.moveNodes??!1}:null}async saveInCloud({fileId:e,name:t,nodeId:r}){if(r&&!N.has(r)&&(await this.node({id:r}),!N.has(r)))return{__typename:"ErrorBasic",message:`The node ${r} does not exists`};let o="";const s=T.get(e);if(s)o=s.key;else{await this.fileMetadata({id:e});const i=T.get(e)??null;if(i)o=i.key;else{const m=await this.#t.mail.receivedMails();if(!m||m.__typename!=="SuccessResponse")return null;const y=m.data.find(g=>g.files.some(D=>D.id===e));if(!y)return{__typename:"ErrorBasic",message:`Can't find mail with the file ${e}`};const c=y.files.find(g=>g.id===e);if(!c)return{__typename:"ErrorBasic",message:`Can't find mail with the file ${e}`};const f=I(p.from_hex(c.key),y.sender.publicKey,this.#e.privateKey);o=p.to_hex(f)}}if(o==="")return{__typename:"ErrorBasic",message:"Unexpected error 3"};o=p.to_hex(A(p.from_hex(o),this.#e.publicKey,this.#e.privateKey));const n=K(),u=await P(t,p.to_hex(n)),d=p.to_hex(A(n,this.#e.publicKey,this.#e.privateKey)),{saveInCloud:l}=await this.#r("mutation")({saveInCloud:[{fileId:e,key:o,nodeId:r,filename:u,nameKey:d},{"...on ErrorAccessDenied":{__typename:!0,message:!0},"...on ErrorNotFound":{__typename:!0,message:!0},"...on ErrorLimit":{__typename:!0,message:!0},"...on ErrorBasic":{__typename:!0,message:!0},"...on ErrorNotExist":{__typename:!0,message:!0},"...on SaveInCloudResponse":{__typename:!0,saveInCloud:R}}]});if(!l)return null;if(l.__typename==="ErrorAccessDenied"||l.__typename==="ErrorNotFound"||l.__typename==="ErrorLimit"||l.__typename==="ErrorBasic"||l.__typename==="ErrorNotExist")return l;if(!l.saveInCloud)return null;const E=await C(l.saveInCloud,this.#e),F=E.parent?.users.find(([i])=>i.publicKey===this.#e.publicKey);if(F&&["admin","write"].includes(F[1])){const i=E.parent?.users.filter(([m])=>m.publicKey!==this.#e.publicKey)??[];await Promise.all(i.map(([m,y])=>this.shareNode({nodeId:E.id,rights:y,userId:m.id})))}return{__typename:"SuccessResponse",data:E}}perNode=async(e,t)=>{let r=N.get(e);if(!r&&(await this.node({id:e}),r=N.get(e),!r))return null;const o=r.access?.nameKey;return o?{id:r.id,nameKey:p.to_hex(A(p.from_hex(o),t,this.#e.privateKey)),files:"history"in r?r.history.map(s=>({id:s.id,key:p.to_hex(A(p.from_hex(s.key),t,this.#e.privateKey))})):[]}:null}}export{pe as SecrecyCloudClient};
2
+ //# sourceMappingURL=SecrecyCloudClient.js.map