@wppconnect/server 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +98 -28
  3. package/dist/config/upload.js +1 -1
  4. package/dist/config.js +8 -2
  5. package/dist/controller/catalogController.js +296 -29
  6. package/dist/controller/deviceController.js +875 -30
  7. package/dist/controller/encryptController.js +14 -2
  8. package/dist/controller/groupController.js +343 -9
  9. package/dist/controller/labelsController.js +68 -1
  10. package/dist/controller/messageController.js +289 -40
  11. package/dist/controller/miscController.js +221 -0
  12. package/dist/controller/orderController.js +27 -3
  13. package/dist/controller/sessionController.js +313 -8
  14. package/dist/controller/statusController.js +53 -5
  15. package/dist/index.js +7 -7
  16. package/dist/mapper/index.js +2 -2
  17. package/dist/middleware/auth.js +16 -15
  18. package/dist/middleware/healthCheck.js +15 -1
  19. package/dist/middleware/statusConnection.js +2 -1
  20. package/dist/routes/index.js +741 -710
  21. package/dist/swagger-backup.json +21463 -0
  22. package/dist/swagger.js +100 -0
  23. package/dist/swagger.json +5132 -20462
  24. package/dist/types/express/index.d.js +2 -0
  25. package/dist/util/chatWootClient.js +49 -45
  26. package/dist/util/createSessionUtil.js +55 -45
  27. package/dist/util/db/mongodb/db.js +7 -7
  28. package/dist/util/functions.js +31 -23
  29. package/dist/util/getAllTokens.js +1 -1
  30. package/dist/util/logger.js +22 -22
  31. package/dist/util/manageSession.js +130 -0
  32. package/dist/util/sessionUtil.js +5 -3
  33. package/dist/util/tokenStore/FileTokenStore/FileTokenStore.js +7 -7
  34. package/dist/util/tokenStore/mongodbTokenStory.js +2 -3
  35. package/dist/util/tokenStore/redisTokenStory.js +25 -25
  36. package/docker-compose.yml +1 -1
  37. package/package.json +39 -32
  38. package/wppconnect_tokens/wppconnect.json +0 -0
  39. package/dist/types/Request.js +0 -2
  40. package/wppconnect_tokens/bugpromo.data.json +0 -1
@@ -13,6 +13,8 @@
13
13
 
14
14
 
15
15
 
16
+
17
+
16
18
  var _functions = require("../util/functions"); /*
17
19
  * Copyright 2021 WPPConnect Team
18
20
  *
@@ -27,7 +29,25 @@ var _functions = require("../util/functions"); /*
27
29
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28
30
  * See the License for the specific language governing permissions and
29
31
  * limitations under the License.
30
- */async function getProducts(req, res) {const { phone, qnt } = req.query;if (!phone) return res.status(401).send({ message: 'Please send the contact number you wish to return the products.' });try {const result = await req.client.getProducts(phone, qnt);
32
+ */async function getProducts(req, res) {/**
33
+ * #swagger.tags = ["Catalog & Bussiness"]
34
+ #swagger.autoBody=false
35
+ #swagger.security = [{
36
+ "bearerAuth": []
37
+ }]
38
+ #swagger.parameters["session"] = {
39
+ schema: 'NERDWHATS_AMERICA'
40
+ }
41
+ #swagger.parameters["phone"] = {
42
+ in: 'query',
43
+ schema: '5521999999999',
44
+ }
45
+ #swagger.parameters["qnt"] = {
46
+ in: 'query',
47
+ schema: '10',
48
+ }
49
+ */const { phone, qnt } = req.query;if (!phone) return res.status(401).send({ message: 'Please send the contact number you wish to return the products.' });try {const result = await req.client?.getProducts(phone, qnt
50
+ );
31
51
  res.status(201).json({ status: 'success', response: result });
32
52
  } catch (error) {
33
53
  res.status(500).json({
@@ -39,6 +59,24 @@ var _functions = require("../util/functions"); /*
39
59
  }
40
60
 
41
61
  async function getProductById(req, res) {
62
+ /**
63
+ * #swagger.tags = ["Catalog & Bussiness"]
64
+ #swagger.autoBody=false
65
+ #swagger.security = [{
66
+ "bearerAuth": []
67
+ }]
68
+ #swagger.parameters["session"] = {
69
+ schema: 'NERDWHATS_AMERICA'
70
+ }
71
+ #swagger.parameters["phone"] = {
72
+ in: 'query',
73
+ schema: '5521999999999',
74
+ }
75
+ #swagger.parameters["id"] = {
76
+ in: 'query',
77
+ schema: '10',
78
+ }
79
+ */
42
80
  const { phone, id } = req.query;
43
81
  if (!phone || !id)
44
82
  return res.status(401).send({
@@ -47,9 +85,9 @@ async function getProductById(req, res) {
47
85
 
48
86
  try {
49
87
  const result = await req.client.getProductById(
50
- phone,
51
- id);
52
-
88
+ phone,
89
+ id
90
+ );
53
91
  res.status(201).json({ status: 'success', response: result });
54
92
  } catch (error) {
55
93
  res.
@@ -58,6 +96,25 @@ async function getProductById(req, res) {
58
96
  }
59
97
  }
60
98
  async function editProduct(req, res) {
99
+ /**
100
+ * #swagger.tags = ["Catalog & Bussiness"]
101
+ #swagger.autoBody=false
102
+ #swagger.security = [{
103
+ "bearerAuth": []
104
+ }]
105
+ #swagger.parameters["session"] = {
106
+ schema: 'NERDWHATS_AMERICA'
107
+ }
108
+ #swagger.parameters["obj"] = {
109
+ in: 'body',
110
+ schema: {
111
+ $id: '<product_id>',
112
+ $options: {
113
+ $name: 'New name for product',
114
+ }
115
+ }
116
+ }
117
+ */
61
118
  const { id, options } = req.body;
62
119
  if (!id || !options)
63
120
  return res.status(401).send({
@@ -77,6 +134,22 @@ async function editProduct(req, res) {
77
134
  }
78
135
 
79
136
  async function delProducts(req, res) {
137
+ /**
138
+ * #swagger.tags = ["Catalog & Bussiness"]
139
+ #swagger.autoBody=false
140
+ #swagger.security = [{
141
+ "bearerAuth": []
142
+ }]
143
+ #swagger.parameters["session"] = {
144
+ schema: 'NERDWHATS_AMERICA'
145
+ }
146
+ #swagger.parameters["obj"] = {
147
+ in: 'body',
148
+ schema: {
149
+ $id: '<product_id>',
150
+ }
151
+ }
152
+ */
80
153
  const { id } = req.body;
81
154
  if (!id)
82
155
  return res.status(401).send({
@@ -96,6 +169,23 @@ async function delProducts(req, res) {
96
169
  }
97
170
 
98
171
  async function changeProductImage(req, res) {
172
+ /**
173
+ * #swagger.tags = ["Catalog & Bussiness"]
174
+ #swagger.autoBody=false
175
+ #swagger.security = [{
176
+ "bearerAuth": []
177
+ }]
178
+ #swagger.parameters["session"] = {
179
+ schema: 'NERDWHATS_AMERICA'
180
+ }
181
+ #swagger.parameters["obj"] = {
182
+ in: 'body',
183
+ schema: {
184
+ $id: '<product_id>',
185
+ $base64: '<base64_string>',
186
+ }
187
+ }
188
+ */
99
189
  const { id, base64 } = req.body;
100
190
  if (!id || !base64)
101
191
  return res.status(401).send({
@@ -115,6 +205,28 @@ async function changeProductImage(req, res) {
115
205
  }
116
206
 
117
207
  async function addProduct(req, res) {
208
+ /**
209
+ * #swagger.tags = ["Catalog & Bussiness"]
210
+ #swagger.autoBody=false
211
+ #swagger.security = [{
212
+ "bearerAuth": []
213
+ }]
214
+ #swagger.parameters["session"] = {
215
+ schema: 'NERDWHATS_AMERICA'
216
+ }
217
+ #swagger.parameters["obj"] = {
218
+ in: 'body',
219
+ schema: {
220
+ $name: 'Product name',
221
+ $image: '<base64_string>',
222
+ $description: 'Description for your product',
223
+ $price: '8890',
224
+ $url: 'http://link_for_your_product.com',
225
+ $retailerId: 'SKU001',
226
+ $currency: 'BRL',
227
+ }
228
+ }
229
+ */
118
230
  const {
119
231
  name,
120
232
  image,
@@ -131,15 +243,15 @@ async function addProduct(req, res) {
131
243
 
132
244
  try {
133
245
  const result = await req.client.createProduct(
134
- name,
135
- image,
136
- description,
137
- price,
138
- false,
139
- url,
140
- retailerId,
141
- currency);
142
-
246
+ name,
247
+ image,
248
+ description,
249
+ price,
250
+ false,
251
+ url,
252
+ retailerId,
253
+ currency
254
+ );
143
255
  res.status(201).json({ status: 'success', response: result });
144
256
  } catch (error) {
145
257
  console.log(error);
@@ -152,6 +264,23 @@ async function addProduct(req, res) {
152
264
  }
153
265
 
154
266
  async function addProductImage(req, res) {
267
+ /**
268
+ * #swagger.tags = ["Catalog & Bussiness"]
269
+ #swagger.autoBody=false
270
+ #swagger.security = [{
271
+ "bearerAuth": []
272
+ }]
273
+ #swagger.parameters["session"] = {
274
+ schema: 'NERDWHATS_AMERICA'
275
+ }
276
+ #swagger.parameters["obj"] = {
277
+ in: 'body',
278
+ schema: {
279
+ $id: '<product_id>',
280
+ $base64: '<base64_string>',
281
+ }
282
+ }
283
+ */
155
284
  const { id, base64 } = req.body;
156
285
  if (!id || !base64)
157
286
  return res.status(401).send({
@@ -171,6 +300,23 @@ async function addProductImage(req, res) {
171
300
  }
172
301
 
173
302
  async function removeProductImage(req, res) {
303
+ /**
304
+ * #swagger.tags = ["Catalog & Bussiness"]
305
+ #swagger.autoBody=false
306
+ #swagger.security = [{
307
+ "bearerAuth": []
308
+ }]
309
+ #swagger.parameters["session"] = {
310
+ schema: 'NERDWHATS_AMERICA'
311
+ }
312
+ #swagger.parameters["obj"] = {
313
+ in: 'body',
314
+ schema: {
315
+ $id: '<product_id>',
316
+ $index: '1',
317
+ }
318
+ }
319
+ */
174
320
  const { id, index } = req.body;
175
321
  if (!id || !index)
176
322
  return res.status(401).send({
@@ -190,6 +336,25 @@ async function removeProductImage(req, res) {
190
336
  }
191
337
 
192
338
  async function getCollections(req, res) {
339
+ /**
340
+ * #swagger.tags = ["Catalog & Bussiness"]
341
+ #swagger.autoBody=false
342
+ #swagger.security = [{
343
+ "bearerAuth": []
344
+ }]
345
+ #swagger.parameters["session"] = {
346
+ schema: 'NERDWHATS_AMERICA'
347
+ }
348
+ #swagger.parameters["phone"] = {
349
+ schema: '5521999999999'
350
+ }
351
+ #swagger.parameters["qnt"] = {
352
+ schema: '10'
353
+ }
354
+ #swagger.parameters["max"] = {
355
+ schema: '10'
356
+ }
357
+ */
193
358
  const { phone, qnt, max } = req.query;
194
359
  if (!phone)
195
360
  return res.status(401).send({
@@ -198,10 +363,10 @@ async function getCollections(req, res) {
198
363
 
199
364
  try {
200
365
  const result = await req.client.getCollections(
201
- phone,
202
- qnt,
203
- max);
204
-
366
+ phone,
367
+ qnt,
368
+ max
369
+ );
205
370
  res.status(201).json({ status: 'success', response: result });
206
371
  } catch (error) {
207
372
  res.status(500).json({
@@ -213,6 +378,23 @@ async function getCollections(req, res) {
213
378
  }
214
379
 
215
380
  async function createCollection(req, res) {
381
+ /**
382
+ * #swagger.tags = ["Catalog & Bussiness"]
383
+ #swagger.autoBody=false
384
+ #swagger.security = [{
385
+ "bearerAuth": []
386
+ }]
387
+ #swagger.parameters["session"] = {
388
+ schema: 'NERDWHATS_AMERICA'
389
+ }
390
+ #swagger.parameters["obj"] = {
391
+ in: 'body',
392
+ schema: {
393
+ $name: 'Collection name',
394
+ $products: ['<id_product1>', '<id_product2>'],
395
+ }
396
+ }
397
+ */
216
398
  const { name, products } = req.body;
217
399
  if (!name || !products)
218
400
  return res.status(401).send({
@@ -232,6 +414,25 @@ async function createCollection(req, res) {
232
414
  }
233
415
 
234
416
  async function editCollection(req, res) {
417
+ /**
418
+ * #swagger.tags = ["Catalog & Bussiness"]
419
+ #swagger.autoBody=false
420
+ #swagger.security = [{
421
+ "bearerAuth": []
422
+ }]
423
+ #swagger.parameters["session"] = {
424
+ schema: 'NERDWHATS_AMERICA'
425
+ }
426
+ #swagger.parameters["obj"] = {
427
+ in: 'body',
428
+ schema: {
429
+ $id: '<id_product>',
430
+ $options: {
431
+ name: 'New name for collection',
432
+ },
433
+ }
434
+ }
435
+ */
235
436
  const { id, options } = req.body;
236
437
  if (!id || !options)
237
438
  return res.status(401).send({
@@ -251,6 +452,22 @@ async function editCollection(req, res) {
251
452
  }
252
453
 
253
454
  async function deleteCollection(req, res) {
455
+ /**
456
+ * #swagger.tags = ["Catalog & Bussiness"]
457
+ #swagger.autoBody=false
458
+ #swagger.security = [{
459
+ "bearerAuth": []
460
+ }]
461
+ #swagger.parameters["session"] = {
462
+ schema: 'NERDWHATS_AMERICA'
463
+ }
464
+ #swagger.parameters["obj"] = {
465
+ in: 'body',
466
+ schema: {
467
+ $id: '<id_product>',
468
+ }
469
+ }
470
+ */
254
471
  const { id } = req.body;
255
472
  if (!id)
256
473
  return res.status(401).send({
@@ -270,6 +487,23 @@ async function deleteCollection(req, res) {
270
487
  }
271
488
 
272
489
  async function setProductVisibility(req, res) {
490
+ /**
491
+ * #swagger.tags = ["Catalog & Bussiness"]
492
+ #swagger.autoBody=false
493
+ #swagger.security = [{
494
+ "bearerAuth": []
495
+ }]
496
+ #swagger.parameters["session"] = {
497
+ schema: 'NERDWHATS_AMERICA'
498
+ }
499
+ #swagger.parameters["obj"] = {
500
+ in: 'body',
501
+ schema: {
502
+ $id: '<id_product>',
503
+ $value: false,
504
+ }
505
+ }
506
+ */
273
507
  const { id, value } = req.body;
274
508
  if (!id || !value)
275
509
  return res.status(401).send({
@@ -289,6 +523,22 @@ async function setProductVisibility(req, res) {
289
523
  }
290
524
 
291
525
  async function updateCartEnabled(req, res) {
526
+ /**
527
+ * #swagger.tags = ["Catalog & Bussiness"]
528
+ #swagger.autoBody=false
529
+ #swagger.security = [{
530
+ "bearerAuth": []
531
+ }]
532
+ #swagger.parameters["session"] = {
533
+ schema: 'NERDWHATS_AMERICA'
534
+ }
535
+ #swagger.parameters["obj"] = {
536
+ in: 'body',
537
+ schema: {
538
+ $enabled: true,
539
+ }
540
+ }
541
+ */
292
542
  const { enabled } = req.body;
293
543
  if (!enabled)
294
544
  return res.status(401).send({
@@ -308,6 +558,23 @@ async function updateCartEnabled(req, res) {
308
558
  }
309
559
 
310
560
  async function sendLinkCatalog(req, res) {
561
+ /**
562
+ * #swagger.tags = ["Messages"]
563
+ #swagger.autoBody=false
564
+ #swagger.security = [{
565
+ "bearerAuth": []
566
+ }]
567
+ #swagger.parameters["session"] = {
568
+ schema: 'NERDWHATS_AMERICA'
569
+ }
570
+ #swagger.parameters["obj"] = {
571
+ in: 'body',
572
+ schema: {
573
+ $phones: ['<array_phone_id'],
574
+ $message: 'Message',
575
+ }
576
+ }
577
+ */
311
578
  const { phones, message } = req.body;
312
579
  if (!phones)
313
580
  return res.status(401).send({
@@ -319,18 +586,18 @@ async function sendLinkCatalog(req, res) {
319
586
  const catalogLink = (0, _functions.createCatalogLink)(session);
320
587
  for (const phone of phones) {
321
588
  const result = await req.client.sendText(
322
- phone,
323
- `${message} ${catalogLink}`,
324
- {
325
- useTemplateButtons: true,
326
- buttons: [
589
+ phone,
590
+ `${message} ${catalogLink}`,
327
591
  {
328
- url: catalogLink,
329
- text: 'Abrir catálogo'
330
- }]
331
-
332
- });
333
-
592
+ useTemplateButtons: true,
593
+ buttons: [
594
+ {
595
+ url: catalogLink,
596
+ text: 'Abrir catálogo'
597
+ }]
598
+
599
+ }
600
+ );
334
601
  results.push({ phone, status: result.id });
335
602
  }
336
603
  return res.status(200).json({ status: 'success', response: results });
@@ -342,4 +609,4 @@ async function sendLinkCatalog(req, res) {
342
609
  });
343
610
  }
344
611
  }
345
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZnVuY3Rpb25zIiwicmVxdWlyZSIsImdldFByb2R1Y3RzIiwicmVxIiwicmVzIiwicGhvbmUiLCJxbnQiLCJxdWVyeSIsInN0YXR1cyIsInNlbmQiLCJtZXNzYWdlIiwicmVzdWx0IiwiY2xpZW50IiwianNvbiIsInJlc3BvbnNlIiwiZXJyb3IiLCJnZXRQcm9kdWN0QnlJZCIsImlkIiwiZWRpdFByb2R1Y3QiLCJvcHRpb25zIiwiYm9keSIsImRlbFByb2R1Y3RzIiwiY2hhbmdlUHJvZHVjdEltYWdlIiwiYmFzZTY0IiwiYWRkUHJvZHVjdCIsIm5hbWUiLCJpbWFnZSIsImRlc2NyaXB0aW9uIiwicHJpY2UiLCJ1cmwiLCJyZXRhaWxlcklkIiwiY3VycmVuY3kiLCJjcmVhdGVQcm9kdWN0IiwiY29uc29sZSIsImxvZyIsImFkZFByb2R1Y3RJbWFnZSIsInJlbW92ZVByb2R1Y3RJbWFnZSIsImluZGV4IiwiZ2V0Q29sbGVjdGlvbnMiLCJtYXgiLCJjcmVhdGVDb2xsZWN0aW9uIiwicHJvZHVjdHMiLCJlZGl0Q29sbGVjdGlvbiIsImRlbGV0ZUNvbGxlY3Rpb24iLCJzZXRQcm9kdWN0VmlzaWJpbGl0eSIsInZhbHVlIiwidXBkYXRlQ2FydEVuYWJsZWQiLCJlbmFibGVkIiwic2VuZExpbmtDYXRhbG9nIiwicGhvbmVzIiwicmVzdWx0cyIsInNlc3Npb24iLCJnZXRXaWQiLCJjYXRhbG9nTGluayIsImNyZWF0ZUNhdGFsb2dMaW5rIiwic2VuZFRleHQiLCJ1c2VUZW1wbGF0ZUJ1dHRvbnMiLCJidXR0b25zIiwidGV4dCIsInB1c2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9jYXRhbG9nQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjEgV1BQQ29ubmVjdCBUZWFtXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBjcmVhdGVDYXRhbG9nTGluayB9IGZyb20gJy4uL3V0aWwvZnVuY3Rpb25zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2R1Y3RzKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lLCBxbnQgfSA9IHJlcS5xdWVyeTtcbiAgaWYgKCFwaG9uZSlcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ1BsZWFzZSBzZW5kIHRoZSBjb250YWN0IG51bWJlciB5b3Ugd2lzaCB0byByZXR1cm4gdGhlIHByb2R1Y3RzLicsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LmdldFByb2R1Y3RzKFxuICAgICAgcGhvbmUgYXMgc3RyaW5nLFxuICAgICAgcW50IGFzIHVua25vd24gYXMgbnVtYmVyXG4gICAgKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgcHJvZHVjdHMnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9kdWN0QnlJZChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBwaG9uZSwgaWQgfSA9IHJlcS5xdWVyeTtcbiAgaWYgKCFwaG9uZSB8fCAhaWQpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdQbGVhc2Ugc2VuZCB0aGUgY29udGFjdCBudW1iZXIgYW5kIHByb2R1Y3RJZC4nLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5nZXRQcm9kdWN0QnlJZChcbiAgICAgIHBob25lIGFzIHN0cmluZyxcbiAgICAgIGlkIGFzIHN0cmluZ1xuICAgICk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNcbiAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgLmpzb24oeyBzdGF0dXM6ICdFcnJvcicsIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgcHJvZHVjdCcsIGVycm9yOiBlcnJvciB9KTtcbiAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRQcm9kdWN0KHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGlkLCBvcHRpb25zIH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZCB8fCAhb3B0aW9ucylcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ3Byb2R1Y3RJZCBvciBvcHRpb25zIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5lZGl0UHJvZHVjdChpZCwgb3B0aW9ucyk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZWRpdCBwcm9kdWN0LicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbFByb2R1Y3RzKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGlkIH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZClcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ3Byb2R1Y3RzIElkIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5kZWxQcm9kdWN0cyhpZCk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZGVsZXRlIHByb2R1Y3QuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhbmdlUHJvZHVjdEltYWdlKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGlkLCBiYXNlNjQgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWlkIHx8ICFiYXNlNjQpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwcm9kdWN0SWQgYW5kIGJhc2U2NCB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuY2hhbmdlUHJvZHVjdEltYWdlKGlkLCBiYXNlNjQpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGNoYW5nZSBwcm9kdWN0IGltYWdlLicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFByb2R1Y3QocmVxOiBhbnksIHJlczogYW55KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGltYWdlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHByaWNlLFxuICAgIHVybCxcbiAgICByZXRhaWxlcklkLFxuICAgIGN1cnJlbmN5ID0gJ0JSTCcsXG4gIH0gPSByZXEuYm9keTtcbiAgaWYgKCFuYW1lIHx8ICFpbWFnZSB8fCAhcHJpY2UpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICduYW1lLCBwcmljZSBhbmQgaW1hZ2Ugd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LmNyZWF0ZVByb2R1Y3QoXG4gICAgICBuYW1lLFxuICAgICAgaW1hZ2UsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHByaWNlLFxuICAgICAgZmFsc2UsXG4gICAgICB1cmwsXG4gICAgICByZXRhaWxlcklkLFxuICAgICAgY3VycmVuY3lcbiAgICApO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBhZGQgcHJvZHVjdC4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQcm9kdWN0SW1hZ2UocmVxOiBhbnksIHJlczogYW55KSB7XG4gIGNvbnN0IHsgaWQsIGJhc2U2NCB9ID0gcmVxLmJvZHk7XG4gIGlmICghaWQgfHwgIWJhc2U2NClcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ3Byb2R1Y3RJZCBhbmQgYmFzZTY0IHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5hZGRQcm9kdWN0SW1hZ2UoaWQsIGJhc2U2NCk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gYWRkIHByb2R1Y3QgaW1hZ2UuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUHJvZHVjdEltYWdlKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGlkLCBpbmRleCB9ID0gcmVxLmJvZHk7XG4gIGlmICghaWQgfHwgIWluZGV4KVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAncHJvZHVjdElkIGFuZCBpbmRleCBpbWFnZSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQucmVtb3ZlUHJvZHVjdEltYWdlKGlkLCBpbmRleCk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gcmVtb3ZlIHByb2R1Y3QgaW1hZ2UuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbnMocmVxOiBhbnksIHJlczogYW55KSB7XG4gIGNvbnN0IHsgcGhvbmUsIHFudCwgbWF4IH0gPSByZXEucXVlcnk7XG4gIGlmICghcGhvbmUpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwaG9uZSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0Q29sbGVjdGlvbnMoXG4gICAgICBwaG9uZSBhcyBzdHJpbmcsXG4gICAgICBxbnQgYXMgc3RyaW5nLFxuICAgICAgbWF4IGFzIHN0cmluZ1xuICAgICk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IGNvbGxlY3Rpb25zLicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24ocmVxOiBhbnksIHJlczogYW55KSB7XG4gIGNvbnN0IHsgbmFtZSwgcHJvZHVjdHMgfSA9IHJlcS5ib2R5O1xuICBpZiAoIW5hbWUgfHwgIXByb2R1Y3RzKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAnbmFtZSBvciBwcm9kdWN0cyB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuY3JlYXRlQ29sbGVjdGlvbihuYW1lLCBwcm9kdWN0cyk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gY3JlYXRlIGNvbGxlY3Rpb24uJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdENvbGxlY3Rpb24ocmVxOiBhbnksIHJlczogYW55KSB7XG4gIGNvbnN0IHsgaWQsIG9wdGlvbnMgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWlkIHx8ICFvcHRpb25zKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAnaWQgb3Igb3B0aW9ucyB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuZWRpdENvbGxlY3Rpb24oaWQsIG9wdGlvbnMpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGVkaXQgY29sbGVjdGlvbi4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVDb2xsZWN0aW9uKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGlkIH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZClcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ2lkIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5kZWxldGVDb2xsZWN0aW9uKGlkKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBkZWxldGUgY29sbGVjdGlvbi4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQcm9kdWN0VmlzaWJpbGl0eShyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgY29uc3QgeyBpZCwgdmFsdWUgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWlkIHx8ICF2YWx1ZSlcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ3Byb2R1Y3QgaWQgb3IgdmFsdWUgKGZhbHNlLCB0cnVlKSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuc2V0UHJvZHVjdFZpc2liaWxpdHkoaWQsIHZhbHVlKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBzZXQgcHJvZHVjdCB2aXNpYmlsaXR5LicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNhcnRFbmFibGVkKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IGVuYWJsZWQgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWVuYWJsZWQpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdlbmFibGVkIChmYWxzZSwgdHJ1ZSkgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LnVwZGF0ZUNhcnRFbmFibGVkKGVuYWJsZWQpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIHNldCBlbmFibGVkIGNhcnQuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZExpbmtDYXRhbG9nKHJlcTogYW55LCByZXM6IGFueSkge1xuICBjb25zdCB7IHBob25lcywgbWVzc2FnZSB9ID0gcmVxLmJvZHk7XG4gIGlmICghcGhvbmVzKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAncGhvbmVzIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuICBjb25zdCByZXN1bHRzID0gW107XG4gIHRyeSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0V2lkKCk7XG4gICAgY29uc3QgY2F0YWxvZ0xpbmsgPSBjcmVhdGVDYXRhbG9nTGluayhzZXNzaW9uKTtcbiAgICBmb3IgKGNvbnN0IHBob25lIG9mIHBob25lcykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5zZW5kVGV4dChcbiAgICAgICAgcGhvbmUsXG4gICAgICAgIGAke21lc3NhZ2V9ICR7Y2F0YWxvZ0xpbmt9YCxcbiAgICAgICAge1xuICAgICAgICAgIHVzZVRlbXBsYXRlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHVybDogY2F0YWxvZ0xpbmssXG4gICAgICAgICAgICAgIHRleHQ6ICdBYnJpciBjYXTDoWxvZ28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgKHJlc3VsdHMgYXMgYW55KS5wdXNoKHsgcGhvbmUsIHN0YXR1czogcmVzdWx0LmlkIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDApLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdHMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIHNldCBlbmFibGVkIGNhcnQuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFlQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUEsc0JBQXNELENBZnREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUdPLGVBQWVDLFdBQVdBLENBQUNDLEdBQVEsRUFBRUMsR0FBUSxFQUFFLENBQ3BELE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxHQUFHLENBQUMsQ0FBQyxHQUFHSCxHQUFHLENBQUNJLEtBQUssQ0FDaEMsSUFBSSxDQUFDRixLQUFLLEVBQ1IsT0FBT0QsR0FBRyxDQUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUNDLElBQUksQ0FBQyxFQUMxQkMsT0FBTyxFQUNMLGlFQUFpRSxDQUNyRSxDQUFDLENBQUMsQ0FFSixJQUFJLENBQ0YsTUFBTUMsTUFBTSxHQUFHLE1BQU1SLEdBQUcsQ0FBQ1MsTUFBTSxDQUFDVixXQUFXLENBQ3pDRyxLQUFLLEVBQ0xDLEdBQUcsQ0FDSjtJQUNERixHQUFHLENBQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLEVBQUVMLE1BQU0sRUFBRSxTQUFTLEVBQUVNLFFBQVEsRUFBRUgsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUMvRCxDQUFDLENBQUMsT0FBT0ksS0FBSyxFQUFFO0lBQ2RYLEdBQUcsQ0FBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDSyxJQUFJLENBQUM7TUFDbkJMLE1BQU0sRUFBRSxP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
612
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZnVuY3Rpb25zIiwicmVxdWlyZSIsImdldFByb2R1Y3RzIiwicmVxIiwicmVzIiwicGhvbmUiLCJxbnQiLCJxdWVyeSIsInN0YXR1cyIsInNlbmQiLCJtZXNzYWdlIiwicmVzdWx0IiwiY2xpZW50IiwianNvbiIsInJlc3BvbnNlIiwiZXJyb3IiLCJnZXRQcm9kdWN0QnlJZCIsImlkIiwiZWRpdFByb2R1Y3QiLCJvcHRpb25zIiwiYm9keSIsImRlbFByb2R1Y3RzIiwiY2hhbmdlUHJvZHVjdEltYWdlIiwiYmFzZTY0IiwiYWRkUHJvZHVjdCIsIm5hbWUiLCJpbWFnZSIsImRlc2NyaXB0aW9uIiwicHJpY2UiLCJ1cmwiLCJyZXRhaWxlcklkIiwiY3VycmVuY3kiLCJjcmVhdGVQcm9kdWN0IiwiY29uc29sZSIsImxvZyIsImFkZFByb2R1Y3RJbWFnZSIsInJlbW92ZVByb2R1Y3RJbWFnZSIsImluZGV4IiwiZ2V0Q29sbGVjdGlvbnMiLCJtYXgiLCJjcmVhdGVDb2xsZWN0aW9uIiwicHJvZHVjdHMiLCJlZGl0Q29sbGVjdGlvbiIsImRlbGV0ZUNvbGxlY3Rpb24iLCJzZXRQcm9kdWN0VmlzaWJpbGl0eSIsInZhbHVlIiwidXBkYXRlQ2FydEVuYWJsZWQiLCJlbmFibGVkIiwic2VuZExpbmtDYXRhbG9nIiwicGhvbmVzIiwicmVzdWx0cyIsInNlc3Npb24iLCJnZXRXaWQiLCJjYXRhbG9nTGluayIsImNyZWF0ZUNhdGFsb2dMaW5rIiwic2VuZFRleHQiLCJ1c2VUZW1wbGF0ZUJ1dHRvbnMiLCJidXR0b25zIiwidGV4dCIsInB1c2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJvbGxlci9jYXRhbG9nQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjEgV1BQQ29ubmVjdCBUZWFtXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuXG5pbXBvcnQgeyBjcmVhdGVDYXRhbG9nTGluayB9IGZyb20gJy4uL3V0aWwvZnVuY3Rpb25zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2R1Y3RzKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAvKipcbiAgICogI3N3YWdnZXIudGFncyA9IFtcIkNhdGFsb2cgJiBCdXNzaW5lc3NcIl1cbiAgICAgI3N3YWdnZXIuYXV0b0JvZHk9ZmFsc2VcbiAgICAgI3N3YWdnZXIuc2VjdXJpdHkgPSBbe1xuICAgICAgICAgICAgXCJiZWFyZXJBdXRoXCI6IFtdXG4gICAgIH1dXG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJzZXNzaW9uXCJdID0ge1xuICAgICAgc2NoZW1hOiAnTkVSRFdIQVRTX0FNRVJJQ0EnXG4gICAgIH1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcInBob25lXCJdID0ge1xuICAgICAgaW46ICdxdWVyeScsXG4gICAgICBzY2hlbWE6ICc1NTIxOTk5OTk5OTk5JyxcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wicW50XCJdID0ge1xuICAgICAgaW46ICdxdWVyeScsXG4gICAgICBzY2hlbWE6ICcxMCcsXG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgcGhvbmUsIHFudCB9ID0gcmVxLnF1ZXJ5O1xuICBpZiAoIXBob25lKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnUGxlYXNlIHNlbmQgdGhlIGNvbnRhY3QgbnVtYmVyIHlvdSB3aXNoIHRvIHJldHVybiB0aGUgcHJvZHVjdHMuJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQ/LmdldFByb2R1Y3RzKFxuICAgICAgcGhvbmUgYXMgc3RyaW5nLFxuICAgICAgcW50IGFzIHVua25vd24gYXMgbnVtYmVyXG4gICAgKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBnZXQgcHJvZHVjdHMnLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9kdWN0QnlJZChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJwaG9uZVwiXSA9IHtcbiAgICAgIGluOiAncXVlcnknLFxuICAgICAgc2NoZW1hOiAnNTUyMTk5OTk5OTk5OScsXG4gICAgIH1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcImlkXCJdID0ge1xuICAgICAgaW46ICdxdWVyeScsXG4gICAgICBzY2hlbWE6ICcxMCcsXG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgcGhvbmUsIGlkIH0gPSByZXEucXVlcnk7XG4gIGlmICghcGhvbmUgfHwgIWlkKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAnUGxlYXNlIHNlbmQgdGhlIGNvbnRhY3QgbnVtYmVyIGFuZCBwcm9kdWN0SWQuJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0UHJvZHVjdEJ5SWQoXG4gICAgICBwaG9uZSBhcyBzdHJpbmcsXG4gICAgICBpZCBhcyBzdHJpbmdcbiAgICApO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzXG4gICAgICAuc3RhdHVzKDUwMClcbiAgICAgIC5qc29uKHsgc3RhdHVzOiAnRXJyb3InLCBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IHByb2R1Y3QnLCBlcnJvcjogZXJyb3IgfSk7XG4gIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UHJvZHVjdChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxwcm9kdWN0X2lkPicsXG4gICAgICAgICRvcHRpb25zOiB7XG4gICAgICAgICAgJG5hbWU6ICdOZXcgbmFtZSBmb3IgcHJvZHVjdCcsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgfVxuICAgKi9cbiAgY29uc3QgeyBpZCwgb3B0aW9ucyB9ID0gcmVxLmJvZHk7XG4gIGlmICghaWQgfHwgIW9wdGlvbnMpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwcm9kdWN0SWQgb3Igb3B0aW9ucyB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuZWRpdFByb2R1Y3QoaWQsIG9wdGlvbnMpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGVkaXQgcHJvZHVjdC4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxQcm9kdWN0cyhyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxwcm9kdWN0X2lkPicsXG4gICAgICB9XG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgaWQgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWlkKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAncHJvZHVjdHMgSWQgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LmRlbFByb2R1Y3RzKGlkKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBkZWxldGUgcHJvZHVjdC4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGFuZ2VQcm9kdWN0SW1hZ2UocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gIC8qKlxuICAgKiAjc3dhZ2dlci50YWdzID0gW1wiQ2F0YWxvZyAmIEJ1c3NpbmVzc1wiXVxuICAgICAjc3dhZ2dlci5hdXRvQm9keT1mYWxzZVxuICAgICAjc3dhZ2dlci5zZWN1cml0eSA9IFt7XG4gICAgICAgICAgICBcImJlYXJlckF1dGhcIjogW11cbiAgICAgfV1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcInNlc3Npb25cIl0gPSB7XG4gICAgICBzY2hlbWE6ICdORVJEV0hBVFNfQU1FUklDQSdcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wib2JqXCJdID0ge1xuICAgICAgaW46ICdib2R5JyxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICAkaWQ6ICc8cHJvZHVjdF9pZD4nLFxuICAgICAgICAkYmFzZTY0OiAnPGJhc2U2NF9zdHJpbmc+JyxcbiAgICAgIH1cbiAgICAgfVxuICAgKi9cbiAgY29uc3QgeyBpZCwgYmFzZTY0IH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZCB8fCAhYmFzZTY0KVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAncHJvZHVjdElkIGFuZCBiYXNlNjQgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LmNoYW5nZVByb2R1Y3RJbWFnZShpZCwgYmFzZTY0KTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBjaGFuZ2UgcHJvZHVjdCBpbWFnZS4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQcm9kdWN0KHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAvKipcbiAgICogI3N3YWdnZXIudGFncyA9IFtcIkNhdGFsb2cgJiBCdXNzaW5lc3NcIl1cbiAgICAgI3N3YWdnZXIuYXV0b0JvZHk9ZmFsc2VcbiAgICAgI3N3YWdnZXIuc2VjdXJpdHkgPSBbe1xuICAgICAgICAgICAgXCJiZWFyZXJBdXRoXCI6IFtdXG4gICAgIH1dXG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJzZXNzaW9uXCJdID0ge1xuICAgICAgc2NoZW1hOiAnTkVSRFdIQVRTX0FNRVJJQ0EnXG4gICAgIH1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcIm9ialwiXSA9IHtcbiAgICAgIGluOiAnYm9keScsXG4gICAgICBzY2hlbWE6IHtcbiAgICAgICAgJG5hbWU6ICdQcm9kdWN0IG5hbWUnLFxuICAgICAgICAkaW1hZ2U6ICc8YmFzZTY0X3N0cmluZz4nLFxuICAgICAgICAkZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbiBmb3IgeW91ciBwcm9kdWN0JyxcbiAgICAgICAgJHByaWNlOiAnODg5MCcsXG4gICAgICAgICR1cmw6ICdodHRwOi8vbGlua19mb3JfeW91cl9wcm9kdWN0LmNvbScsXG4gICAgICAgICRyZXRhaWxlcklkOiAnU0tVMDAxJyxcbiAgICAgICAgJGN1cnJlbmN5OiAnQlJMJyxcbiAgICAgIH1cbiAgICAgfVxuICAgKi9cbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgaW1hZ2UsXG4gICAgZGVzY3JpcHRpb24sXG4gICAgcHJpY2UsXG4gICAgdXJsLFxuICAgIHJldGFpbGVySWQsXG4gICAgY3VycmVuY3kgPSAnQlJMJyxcbiAgfSA9IHJlcS5ib2R5O1xuICBpZiAoIW5hbWUgfHwgIWltYWdlIHx8ICFwcmljZSlcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ25hbWUsIHByaWNlIGFuZCBpbWFnZSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuY3JlYXRlUHJvZHVjdChcbiAgICAgIG5hbWUsXG4gICAgICBpbWFnZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcHJpY2UsXG4gICAgICBmYWxzZSxcbiAgICAgIHVybCxcbiAgICAgIHJldGFpbGVySWQsXG4gICAgICBjdXJyZW5jeVxuICAgICk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGFkZCBwcm9kdWN0LicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFByb2R1Y3RJbWFnZShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxwcm9kdWN0X2lkPicsXG4gICAgICAgICRiYXNlNjQ6ICc8YmFzZTY0X3N0cmluZz4nLFxuICAgICAgfVxuICAgICB9XG4gICAqL1xuICBjb25zdCB7IGlkLCBiYXNlNjQgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWlkIHx8ICFiYXNlNjQpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwcm9kdWN0SWQgYW5kIGJhc2U2NCB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuYWRkUHJvZHVjdEltYWdlKGlkLCBiYXNlNjQpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIGFkZCBwcm9kdWN0IGltYWdlLicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2R1Y3RJbWFnZShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxwcm9kdWN0X2lkPicsXG4gICAgICAgICRpbmRleDogJzEnLFxuICAgICAgfVxuICAgICB9XG4gICAqL1xuICBjb25zdCB7IGlkLCBpbmRleCB9ID0gcmVxLmJvZHk7XG4gIGlmICghaWQgfHwgIWluZGV4KVxuICAgIHJldHVybiByZXMuc3RhdHVzKDQwMSkuc2VuZCh7XG4gICAgICBtZXNzYWdlOiAncHJvZHVjdElkIGFuZCBpbmRleCBpbWFnZSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQucmVtb3ZlUHJvZHVjdEltYWdlKGlkLCBpbmRleCk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gcmVtb3ZlIHByb2R1Y3QgaW1hZ2UuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbnMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gIC8qKlxuICAgKiAjc3dhZ2dlci50YWdzID0gW1wiQ2F0YWxvZyAmIEJ1c3NpbmVzc1wiXVxuICAgICAjc3dhZ2dlci5hdXRvQm9keT1mYWxzZVxuICAgICAjc3dhZ2dlci5zZWN1cml0eSA9IFt7XG4gICAgICAgICAgICBcImJlYXJlckF1dGhcIjogW11cbiAgICAgfV1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcInNlc3Npb25cIl0gPSB7XG4gICAgICBzY2hlbWE6ICdORVJEV0hBVFNfQU1FUklDQSdcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wicGhvbmVcIl0gPSB7XG4gICAgICBzY2hlbWE6ICc1NTIxOTk5OTk5OTk5J1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJxbnRcIl0gPSB7XG4gICAgICBzY2hlbWE6ICcxMCdcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wibWF4XCJdID0ge1xuICAgICAgc2NoZW1hOiAnMTAnXG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgcGhvbmUsIHFudCwgbWF4IH0gPSByZXEucXVlcnk7XG4gIGlmICghcGhvbmUpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwaG9uZSB3YXMgbm90IGluZm9ybWVkJyxcbiAgICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jbGllbnQuZ2V0Q29sbGVjdGlvbnMoXG4gICAgICBwaG9uZSBhcyBzdHJpbmcsXG4gICAgICBxbnQgYXMgc3RyaW5nLFxuICAgICAgbWF4IGFzIHN0cmluZ1xuICAgICk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZ2V0IGNvbGxlY3Rpb25zLicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gIC8qKlxuICAgKiAjc3dhZ2dlci50YWdzID0gW1wiQ2F0YWxvZyAmIEJ1c3NpbmVzc1wiXVxuICAgICAjc3dhZ2dlci5hdXRvQm9keT1mYWxzZVxuICAgICAjc3dhZ2dlci5zZWN1cml0eSA9IFt7XG4gICAgICAgICAgICBcImJlYXJlckF1dGhcIjogW11cbiAgICAgfV1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcInNlc3Npb25cIl0gPSB7XG4gICAgICBzY2hlbWE6ICdORVJEV0hBVFNfQU1FUklDQSdcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wib2JqXCJdID0ge1xuICAgICAgaW46ICdib2R5JyxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICAkbmFtZTogJ0NvbGxlY3Rpb24gbmFtZScsXG4gICAgICAgICRwcm9kdWN0czogWyc8aWRfcHJvZHVjdDE+JywgJzxpZF9wcm9kdWN0Mj4nXSxcbiAgICAgIH1cbiAgICAgfVxuICAgKi9cbiAgY29uc3QgeyBuYW1lLCBwcm9kdWN0cyB9ID0gcmVxLmJvZHk7XG4gIGlmICghbmFtZSB8fCAhcHJvZHVjdHMpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICduYW1lIG9yIHByb2R1Y3RzIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5jcmVhdGVDb2xsZWN0aW9uKG5hbWUsIHByb2R1Y3RzKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBjcmVhdGUgY29sbGVjdGlvbi4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0Q29sbGVjdGlvbihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxpZF9wcm9kdWN0PicsXG4gICAgICAgICRvcHRpb25zOiB7XG4gICAgICAgICAgbmFtZTogJ05ldyBuYW1lIGZvciBjb2xsZWN0aW9uJyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgfVxuICAgKi9cbiAgY29uc3QgeyBpZCwgb3B0aW9ucyB9ID0gcmVxLmJvZHk7XG4gIGlmICghaWQgfHwgIW9wdGlvbnMpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdpZCBvciBvcHRpb25zIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5lZGl0Q29sbGVjdGlvbihpZCwgb3B0aW9ucyk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gZWRpdCBjb2xsZWN0aW9uLicsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNvbGxlY3Rpb24ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gIC8qKlxuICAgKiAjc3dhZ2dlci50YWdzID0gW1wiQ2F0YWxvZyAmIEJ1c3NpbmVzc1wiXVxuICAgICAjc3dhZ2dlci5hdXRvQm9keT1mYWxzZVxuICAgICAjc3dhZ2dlci5zZWN1cml0eSA9IFt7XG4gICAgICAgICAgICBcImJlYXJlckF1dGhcIjogW11cbiAgICAgfV1cbiAgICAgI3N3YWdnZXIucGFyYW1ldGVyc1tcInNlc3Npb25cIl0gPSB7XG4gICAgICBzY2hlbWE6ICdORVJEV0hBVFNfQU1FUklDQSdcbiAgICAgfVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wib2JqXCJdID0ge1xuICAgICAgaW46ICdib2R5JyxcbiAgICAgIHNjaGVtYToge1xuICAgICAgICAkaWQ6ICc8aWRfcHJvZHVjdD4nLFxuICAgICAgfVxuICAgICB9XG4gICAqL1xuICBjb25zdCB7IGlkIH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZClcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDEpLnNlbmQoe1xuICAgICAgbWVzc2FnZTogJ2lkIHdhcyBub3QgaW5mb3JtZWQnLFxuICAgIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxLmNsaWVudC5kZWxldGVDb2xsZWN0aW9uKGlkKTtcbiAgICByZXMuc3RhdHVzKDIwMSkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHN0YXR1czogJ0Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFcnJvciBvbiBkZWxldGUgY29sbGVjdGlvbi4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQcm9kdWN0VmlzaWJpbGl0eShyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRpZDogJzxpZF9wcm9kdWN0PicsXG4gICAgICAgICR2YWx1ZTogZmFsc2UsXG4gICAgICB9XG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgaWQsIHZhbHVlIH0gPSByZXEuYm9keTtcbiAgaWYgKCFpZCB8fCAhdmFsdWUpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwcm9kdWN0IGlkIG9yIHZhbHVlIChmYWxzZSwgdHJ1ZSkgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LnNldFByb2R1Y3RWaXNpYmlsaXR5KGlkLCB2YWx1ZSk7XG4gICAgcmVzLnN0YXR1cygyMDEpLmpzb24oeyBzdGF0dXM6ICdzdWNjZXNzJywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gc2V0IHByb2R1Y3QgdmlzaWJpbGl0eS4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDYXJ0RW5hYmxlZChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgLyoqXG4gICAqICNzd2FnZ2VyLnRhZ3MgPSBbXCJDYXRhbG9nICYgQnVzc2luZXNzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRlbmFibGVkOiB0cnVlLFxuICAgICAgfVxuICAgICB9XG4gICAqL1xuICBjb25zdCB7IGVuYWJsZWQgfSA9IHJlcS5ib2R5O1xuICBpZiAoIWVuYWJsZWQpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdlbmFibGVkIChmYWxzZSwgdHJ1ZSkgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LnVwZGF0ZUNhcnRFbmFibGVkKGVuYWJsZWQpO1xuICAgIHJlcy5zdGF0dXMoMjAxKS5qc29uKHsgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgc3RhdHVzOiAnRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIG9uIHNldCBlbmFibGVkIGNhcnQuJyxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZExpbmtDYXRhbG9nKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAvKipcbiAgICogI3N3YWdnZXIudGFncyA9IFtcIk1lc3NhZ2VzXCJdXG4gICAgICNzd2FnZ2VyLmF1dG9Cb2R5PWZhbHNlXG4gICAgICNzd2FnZ2VyLnNlY3VyaXR5ID0gW3tcbiAgICAgICAgICAgIFwiYmVhcmVyQXV0aFwiOiBbXVxuICAgICB9XVxuICAgICAjc3dhZ2dlci5wYXJhbWV0ZXJzW1wic2Vzc2lvblwiXSA9IHtcbiAgICAgIHNjaGVtYTogJ05FUkRXSEFUU19BTUVSSUNBJ1xuICAgICB9XG4gICAgICNzd2FnZ2VyLnBhcmFtZXRlcnNbXCJvYmpcIl0gPSB7XG4gICAgICBpbjogJ2JvZHknLFxuICAgICAgc2NoZW1hOiB7XG4gICAgICAgICRwaG9uZXM6IFsnPGFycmF5X3Bob25lX2lkJ10sXG4gICAgICAgICRtZXNzYWdlOiAnTWVzc2FnZScsXG4gICAgICB9XG4gICAgIH1cbiAgICovXG4gIGNvbnN0IHsgcGhvbmVzLCBtZXNzYWdlIH0gPSByZXEuYm9keTtcbiAgaWYgKCFwaG9uZXMpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNDAxKS5zZW5kKHtcbiAgICAgIG1lc3NhZ2U6ICdwaG9uZXMgd2FzIG5vdCBpbmZvcm1lZCcsXG4gICAgfSk7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcmVxLmNsaWVudC5nZXRXaWQoKTtcbiAgICBjb25zdCBjYXRhbG9nTGluayA9IGNyZWF0ZUNhdGFsb2dMaW5rKHNlc3Npb24pO1xuICAgIGZvciAoY29uc3QgcGhvbmUgb2YgcGhvbmVzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXEuY2xpZW50LnNlbmRUZXh0KFxuICAgICAgICBwaG9uZSxcbiAgICAgICAgYCR7bWVzc2FnZX0gJHtjYXRhbG9nTGlua31gLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlVGVtcGxhdGVCdXR0b25zOiB0cnVlLFxuICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXJsOiBjYXRhbG9nTGluayxcbiAgICAgICAgICAgICAgdGV4dDogJ0FicmlyIGNhdMOhbG9nbycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICAocmVzdWx0cyBhcyBhbnkpLnB1c2goeyBwaG9uZSwgc3RhdHVzOiByZXN1bHQuaWQgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuc3RhdHVzKDIwMCkuanNvbih7IHN0YXR1czogJ3N1Y2Nlc3MnLCByZXNwb25zZTogcmVzdWx0cyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICBzdGF0dXM6ICdFcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXJyb3Igb24gc2V0IGVuYWJsZWQgY2FydC4nLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLElBQUFBLFVBQUEsR0FBQUMsT0FBQSxzQkFBc0QsQ0FqQnREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUtPLGVBQWVDLFdBQVdBLENBQUNDLEdBQVksRUFBRUMsR0FBYSxFQUFFLENBQzdEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNFLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxHQUFHLENBQUMsQ0FBQyxHQUFHSCxHQUFHLENBQUNJLEtBQUssQ0FDaEMsSUFBSSxDQUFDRixLQUFLLEVBQ1IsT0FBT0QsR0FBRyxDQUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUNDLElBQUksQ0FBQyxFQUMxQkMsT0FB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