@secrecy/lib 1.0.0-dev.64 → 1.0.0-dev.66

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