occam-verify-cli 1.0.584 → 1.0.602

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 (105) hide show
  1. package/lib/context/ephemeral.js +74 -2
  2. package/lib/context/file/nominal.js +11 -9
  3. package/lib/context/liminal.js +161 -24
  4. package/lib/context/literal.js +8 -2
  5. package/lib/context/scoped.js +4 -28
  6. package/lib/context/synthetic.js +146 -0
  7. package/lib/context.js +184 -1
  8. package/lib/element/assertion/contained.js +21 -15
  9. package/lib/element/assertion/defined.js +45 -65
  10. package/lib/element/assertion/property.js +25 -19
  11. package/lib/element/assertion/satisfies.js +14 -8
  12. package/lib/element/assertion/subproof.js +12 -6
  13. package/lib/element/assertion.js +47 -1
  14. package/lib/element/assumption.js +12 -12
  15. package/lib/element/conclusion.js +2 -2
  16. package/lib/element/deduction.js +2 -2
  17. package/lib/element/frame.js +61 -29
  18. package/lib/element/judgement.js +7 -1
  19. package/lib/element/label.js +8 -8
  20. package/lib/element/metavariable.js +71 -59
  21. package/lib/element/procedureCall.js +3 -4
  22. package/lib/element/proof.js +43 -35
  23. package/lib/element/proofAssertion/premise.js +122 -97
  24. package/lib/element/proofAssertion/step.js +162 -115
  25. package/lib/element/proofAssertion/supposition.js +157 -118
  26. package/lib/element/proofAssertion.js +3 -3
  27. package/lib/element/reference.js +40 -7
  28. package/lib/element/rule.js +227 -95
  29. package/lib/element/signature.js +2 -1
  30. package/lib/element/statement.js +67 -34
  31. package/lib/element/substitution/frame.js +36 -16
  32. package/lib/element/substitution/reference.js +36 -16
  33. package/lib/element/substitution/statement.js +94 -55
  34. package/lib/element/substitution/term.js +36 -16
  35. package/lib/element/substitution.js +54 -17
  36. package/lib/element/substitutions.js +4 -276
  37. package/lib/element/term.js +60 -31
  38. package/lib/element/topLevelAssertion/axiom.js +13 -4
  39. package/lib/element/topLevelAssertion/conjecture.js +7 -2
  40. package/lib/element/topLevelAssertion/theorem.js +7 -2
  41. package/lib/element/topLevelAssertion.js +201 -134
  42. package/lib/element/topLevelMetaAssertion.js +310 -51
  43. package/lib/element/variable.js +15 -6
  44. package/lib/node/substitution/statement.js +33 -1
  45. package/lib/process/unify.js +6 -6
  46. package/lib/utilities/context.js +10 -25
  47. package/lib/utilities/element.js +34 -9
  48. package/lib/utilities/statement.js +1 -8
  49. package/lib/utilities/string.js +12 -1
  50. package/lib/utilities/substitutions.js +42 -16
  51. package/lib/utilities/unification.js +3 -1
  52. package/lib/utilities/validation.js +2 -2
  53. package/package.json +4 -4
  54. package/src/context/ephemeral.js +73 -1
  55. package/src/context/file/nominal.js +14 -11
  56. package/src/context/liminal.js +180 -25
  57. package/src/context/literal.js +3 -1
  58. package/src/context/scoped.js +3 -35
  59. package/src/context/synthetic.js +49 -0
  60. package/src/context.js +176 -0
  61. package/src/element/assertion/contained.js +28 -20
  62. package/src/element/assertion/defined.js +62 -34
  63. package/src/element/assertion/property.js +27 -19
  64. package/src/element/assertion/satisfies.js +15 -7
  65. package/src/element/assertion/subproof.js +13 -5
  66. package/src/element/assertion.js +35 -0
  67. package/src/element/assumption.js +5 -5
  68. package/src/element/conclusion.js +2 -4
  69. package/src/element/deduction.js +2 -4
  70. package/src/element/frame.js +71 -39
  71. package/src/element/judgement.js +2 -0
  72. package/src/element/label.js +4 -4
  73. package/src/element/metavariable.js +94 -75
  74. package/src/element/procedureCall.js +2 -2
  75. package/src/element/proof.js +6 -6
  76. package/src/element/proofAssertion/premise.js +101 -69
  77. package/src/element/proofAssertion/step.js +79 -39
  78. package/src/element/proofAssertion/supposition.js +141 -115
  79. package/src/element/proofAssertion.js +2 -2
  80. package/src/element/reference.js +52 -10
  81. package/src/element/rule.js +138 -76
  82. package/src/element/signature.js +2 -0
  83. package/src/element/statement.js +76 -45
  84. package/src/element/substitution/frame.js +44 -15
  85. package/src/element/substitution/reference.js +44 -15
  86. package/src/element/substitution/statement.js +124 -72
  87. package/src/element/substitution/term.js +43 -15
  88. package/src/element/substitution.js +55 -18
  89. package/src/element/substitutions.js +1 -258
  90. package/src/element/term.js +65 -34
  91. package/src/element/topLevelAssertion/axiom.js +1 -1
  92. package/src/element/topLevelAssertion/conjecture.js +1 -1
  93. package/src/element/topLevelAssertion/theorem.js +1 -1
  94. package/src/element/topLevelAssertion.js +128 -48
  95. package/src/element/topLevelMetaAssertion.js +86 -32
  96. package/src/element/variable.js +15 -5
  97. package/src/node/substitution/statement.js +33 -0
  98. package/src/process/unify.js +6 -8
  99. package/src/utilities/context.js +9 -8
  100. package/src/utilities/element.js +37 -10
  101. package/src/utilities/statement.js +0 -7
  102. package/src/utilities/string.js +14 -0
  103. package/src/utilities/substitutions.js +59 -17
  104. package/src/utilities/unification.js +4 -0
  105. package/src/utilities/validation.js +3 -1
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "default", {
11
11
  var _occamlanguages = require("occam-languages");
12
12
  var _proofAssertion = /*#__PURE__*/ _interop_require_default(require("../proofAssertion"));
13
13
  var _elements = require("../../elements");
14
+ var _unification = require("../../utilities/unification");
14
15
  var _context = require("../../utilities/context");
15
16
  var _statement = require("../../utilities/statement");
16
17
  function _assert_this_initialized(self) {
@@ -286,11 +287,91 @@ var _default = (0, _elements.define)((_Step = /*#__PURE__*/ function(ProofAssert
286
287
  return comparesToTermAndPropertyRelation;
287
288
  }
288
289
  },
290
+ {
291
+ key: "validate",
292
+ value: function validate(assignments, context) {
293
+ var validates = false;
294
+ var stepString = this.getString(); ///
295
+ context.trace("Validating the '".concat(stepString, "' step..."));
296
+ var statement = this.getStatement();
297
+ if (statement !== null) {
298
+ var referenceValidates = this.validateReference(context);
299
+ if (referenceValidates) {
300
+ var satisfiesAssertioValidates = this.validateSatisfiesAssertion(context);
301
+ if (satisfiesAssertioValidates) {
302
+ var statementValidates = this.validateStatement(assignments, context);
303
+ if (statementValidates) {
304
+ validates = true;
305
+ }
306
+ }
307
+ }
308
+ } else {
309
+ context.debug("Unable to validate the '".concat(stepString, "' step because it is nonsense."));
310
+ }
311
+ if (validates) {
312
+ context.debug("...validate the '".concat(stepString, "' step."));
313
+ }
314
+ return validates;
315
+ }
316
+ },
317
+ {
318
+ key: "validateReference",
319
+ value: function validateReference(context) {
320
+ var referenceValidates = true;
321
+ if (this.reference !== null) {
322
+ var stepString = this.getString(), referenceString = this.reference.getString();
323
+ context.trace("Validating the '".concat(stepString, "' step's '").concat(referenceString, "' reference... "));
324
+ referenceValidates = this.reference.validate(context);
325
+ if (referenceValidates) {
326
+ context.debug("...validated the '".concat(stepString, "' step's '").concat(referenceString, "' reference. "));
327
+ }
328
+ }
329
+ return referenceValidates;
330
+ }
331
+ },
332
+ {
333
+ key: "validateSatisfiesAssertion",
334
+ value: function validateSatisfiesAssertion(context) {
335
+ var satisfiesAssertionValidates = true; ///
336
+ if (this.satisfiesAssertion !== null) {
337
+ var stepString = this.getString(), satisfiesAssertion = this.satisfiesAssertion.getString();
338
+ context.trace("Validating the '".concat(stepString, "' step's '").concat(satisfiesAssertion, "' satisfies assertion... "));
339
+ var stated = true, assignments = null;
340
+ satisfiesAssertionValidates = this.satisfiesAssertion.validate(assignments, stated, context);
341
+ if (satisfiesAssertionValidates) {
342
+ context.debug("...validating the '".concat(stepString, "' step's '").concat(satisfiesAssertion, "' satisfies assertion. "));
343
+ }
344
+ }
345
+ return satisfiesAssertionValidates;
346
+ }
347
+ },
348
+ {
349
+ key: "unifyWithSatisfiesAssertion",
350
+ value: function unifyWithSatisfiesAssertion(satisfiesAssertion, context) {
351
+ var unifiesWithSatisfiesAssertion = false;
352
+ var stepString = this.getString(), satisfiesAssertionString = satisfiesAssertion.getString();
353
+ context.trace("Unifying the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion..."));
354
+ var reference = satisfiesAssertion.getReference(), axiom = context.findAxiomByReference(reference);
355
+ if (axiom !== null) {
356
+ var step = this, substitutions = [], stepUnifies = axiom.unifyStep(step, substitutions, context);
357
+ if (stepUnifies) {
358
+ var substitutionsCompare = satisfiesAssertion.compareSubstitutions(substitutions, context);
359
+ if (substitutionsCompare) {
360
+ unifiesWithSatisfiesAssertion = true;
361
+ }
362
+ }
363
+ }
364
+ if (unifiesWithSatisfiesAssertion) {
365
+ context.debug("...unified the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion."));
366
+ }
367
+ return unifiesWithSatisfiesAssertion;
368
+ }
369
+ },
289
370
  {
290
371
  key: "verify",
291
372
  value: function verify(assignments, context) {
292
373
  return _async_to_generator(function() {
293
- var _this, verifies, stepString, statement;
374
+ var _this, verifies, stepString;
294
375
  return _ts_generator(this, function(_state) {
295
376
  switch(_state.label){
296
377
  case 0:
@@ -304,165 +385,131 @@ var _default = (0, _elements.define)((_Step = /*#__PURE__*/ function(ProofAssert
304
385
  _state.sent();
305
386
  stepString = this.getString(); ///
306
387
  context.trace("Verifying the '".concat(stepString, "' step..."));
307
- statement = this.getStatement();
308
- if (statement !== null) {
388
+ return [
389
+ 4,
309
390
  (0, _context.asyncAttempt)(function(context) {
310
391
  return _async_to_generator(function() {
311
- var _this, referenceValidates, satisfiesAssertioValidates, statementValidates, reference, satisfiesAssertion, statementUnifies;
392
+ var validates, unifies;
312
393
  return _ts_generator(this, function(_state) {
313
394
  switch(_state.label){
314
395
  case 0:
315
- _this = this;
316
- referenceValidates = this.validateReference(context);
317
- if (!referenceValidates) return [
396
+ validates = this.validate(assignments, context);
397
+ if (!validates) return [
318
398
  3,
319
399
  2
320
400
  ];
321
- satisfiesAssertioValidates = this.validateSatisfiesAssertion(context);
322
- if (!satisfiesAssertioValidates) return [
323
- 3,
324
- 2
401
+ return [
402
+ 4,
403
+ this.unify(context)
325
404
  ];
326
- statementValidates = this.validateStatement(assignments, context);
327
- if (!statementValidates) return [
328
- 3,
405
+ case 1:
406
+ unifies = _state.sent();
407
+ if (unifies) {
408
+ this.setContext(context);
409
+ verifies = true;
410
+ }
411
+ _state.label = 2;
412
+ case 2:
413
+ return [
329
414
  2
330
415
  ];
331
- reference = this.getReference(), satisfiesAssertion = this.getSatisfiesAssertion();
416
+ }
417
+ });
418
+ }).call(_this);
419
+ }, context)
420
+ ];
421
+ case 2:
422
+ _state.sent();
423
+ if (verifies) {
424
+ context.debug("...verified the '".concat(stepString, "' step."));
425
+ }
426
+ return [
427
+ 2,
428
+ verifies
429
+ ];
430
+ }
431
+ });
432
+ }).call(this);
433
+ }
434
+ },
435
+ {
436
+ key: "unify",
437
+ value: function unify(context) {
438
+ return _async_to_generator(function() {
439
+ var unifies, stepString, statement, reference, satisfiesAssertion, statementUnifies;
440
+ return _ts_generator(this, function(_state) {
441
+ switch(_state.label){
442
+ case 0:
443
+ unifies = false;
444
+ stepString = this.getString(); ///
445
+ context.trace("Unifying the '".concat(stepString, "' step..."));
446
+ statement = this.getStatement(), reference = this.getReference(), satisfiesAssertion = this.getSatisfiesAssertion();
447
+ return [
448
+ 4,
449
+ (0, _context.asyncLiminally)(function(context) {
450
+ return _async_to_generator(function() {
451
+ var statementUnifies;
452
+ return _ts_generator(this, function(_state) {
453
+ switch(_state.label){
454
+ case 0:
332
455
  return [
333
456
  4,
334
- (0, _context.asyncLiminally)(function(context) {
457
+ asyncSome(_unification.unifyStatements, function(unifyStatement) {
335
458
  return _async_to_generator(function() {
336
- var _this, statementUnifies;
459
+ var statementUnifies;
337
460
  return _ts_generator(this, function(_state) {
338
461
  switch(_state.label){
339
462
  case 0:
340
- _this = this;
341
463
  return [
342
464
  4,
343
- asyncSome(function(unifyStatement) {
344
- return _async_to_generator(function() {
345
- var statementUnifies;
346
- return _ts_generator(this, function(_state) {
347
- switch(_state.label){
348
- case 0:
349
- return [
350
- 4,
351
- unifyStatement(statement, reference, satisfiesAssertion, context)
352
- ];
353
- case 1:
354
- statementUnifies = _state.sent();
355
- if (statementUnifies) {
356
- this.setContext(context);
357
- return [
358
- 2,
359
- true
360
- ];
361
- }
362
- return [
363
- 2
364
- ];
365
- }
366
- });
367
- }).call(_this);
368
- })
465
+ unifyStatement(statement, reference, satisfiesAssertion, context)
369
466
  ];
370
467
  case 1:
371
468
  statementUnifies = _state.sent();
469
+ if (statementUnifies) {
470
+ return [
471
+ 2,
472
+ true
473
+ ];
474
+ }
372
475
  return [
373
- 2,
374
- statementUnifies
476
+ 2
375
477
  ];
376
478
  }
377
479
  });
378
- }).call(_this);
379
- }, context)
480
+ })();
481
+ })
380
482
  ];
381
483
  case 1:
382
484
  statementUnifies = _state.sent();
383
- if (statementUnifies) {
384
- verifies = true;
385
- }
386
- _state.label = 2;
387
- case 2:
388
485
  return [
389
486
  2,
390
- verifies
487
+ statementUnifies
391
488
  ];
392
489
  }
393
490
  });
394
- }).call(_this);
395
- }, context);
396
- } else {
397
- context.debug("Unable to verify the '".concat(stepString, "' step because it is nonsense."));
491
+ })();
492
+ }, context)
493
+ ];
494
+ case 1:
495
+ statementUnifies = _state.sent();
496
+ if (statementUnifies) {
497
+ unifies = true;
398
498
  }
399
- if (verifies) {
400
- context.debug("...verified the '".concat(stepString, "' step."));
499
+ if (unifies) {
500
+ context.debug("...unified the '".concat(stepString, "' step."));
401
501
  }
402
502
  return [
403
503
  2,
404
- verifies
504
+ unifies
405
505
  ];
406
506
  }
407
507
  });
408
508
  }).call(this);
409
509
  }
410
- },
411
- {
412
- key: "validateReference",
413
- value: function validateReference(context) {
414
- var referenceValidates = true;
415
- if (this.reference !== null) {
416
- var stepString = this.getString(), referenceString = this.reference.getString();
417
- context.trace("Validating the '".concat(stepString, "' step's '").concat(referenceString, "' reference... "));
418
- referenceValidates = this.reference.validate(context);
419
- if (referenceValidates) {
420
- context.debug("...validated the '".concat(stepString, "' step's '").concat(referenceString, "' reference. "));
421
- }
422
- }
423
- return referenceValidates;
424
- }
425
- },
426
- {
427
- key: "validateSatisfiesAssertion",
428
- value: function validateSatisfiesAssertion(context) {
429
- var satisfiesAssertionValidates = true; ///
430
- if (this.satisfiesAssertion !== null) {
431
- var stepString = this.getString(), satisfiesAssertion = this.satisfiesAssertion.getString();
432
- context.trace("Validating the '".concat(stepString, "' step's '").concat(satisfiesAssertion, "' satisfies assertion... "));
433
- var stated = true, assignments = null;
434
- satisfiesAssertionValidates = this.satisfiesAssertion.validate(assignments, stated, context);
435
- if (satisfiesAssertionValidates) {
436
- context.debug("...validating the '".concat(stepString, "' step's '").concat(satisfiesAssertion, "' satisfies assertion. "));
437
- }
438
- }
439
- return satisfiesAssertionValidates;
440
- }
441
- },
442
- {
443
- key: "unifyWithSatisfiesAssertion",
444
- value: function unifyWithSatisfiesAssertion(satisfiesAssertion, context) {
445
- var unifiesWithSatisfiesAssertion = false;
446
- var stepString = this.getString(), satisfiesAssertionString = satisfiesAssertion.getString();
447
- context.trace("Unifying the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion..."));
448
- var reference = satisfiesAssertion.getReference(), axiom = context.findAxiomByReference(reference);
449
- if (axiom !== null) {
450
- var step = this, substitutions = [], stepUnifies = axiom.unifyStep(step, substitutions, context);
451
- if (stepUnifies) {
452
- var substitutionsCompare = satisfiesAssertion.compareSubstitutions(substitutions, context);
453
- if (substitutionsCompare) {
454
- unifiesWithSatisfiesAssertion = true;
455
- }
456
- }
457
- }
458
- if (unifiesWithSatisfiesAssertion) {
459
- context.debug("...unified the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion."));
460
- }
461
- return unifiesWithSatisfiesAssertion;
462
- }
463
510
  }
464
511
  ]);
465
512
  return Step;
466
513
  }(_proofAssertion.default), _define_property(_Step, "name", "Step"), _Step));
467
514
 
468
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3Byb29mQXNzZXJ0aW9uL3N0ZXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFzeW5jaHJvbm91c1V0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IFByb29mQXNzZXJ0aW9uIGZyb20gXCIuLi9wcm9vZkFzc2VydGlvblwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGFzeW5jQXR0ZW1wdCwgYXN5bmNMaW1pbmFsbHkgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc3RhdGVtZW50XCI7XG5cbmNvbnN0IHsgYXN5bmNTb21lIH0gPSBhc3luY2hyb25vdXNVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBTdGVwIGV4dGVuZHMgUHJvb2ZBc3NlcnRpb24ge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLnNhdGlzZmllc0Fzc2VydGlvbiA9IHNhdGlzZmllc0Fzc2VydGlvbjtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7XG4gIH1cblxuICBnZXRTYXRpc2ZpZXNBc3NlcnRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uO1xuICB9XG5cbiAgaXNTYXRpc2ZpZWQoKSB7XG4gICAgY29uc3Qgc2F0aXNmaWVkID0gKHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBzYXRpc2ZpZWQ7XG4gIH1cblxuICBpc1F1YWxpZmllZCgpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSAodGhpcy5yZWZlcmVuY2UgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHF1YWxpZmllZDtcbiAgfVxuXG4gIGlzU3RhdGVkKCkge1xuICAgIGNvbnN0IHF1YWxpZmllZCA9IHRoaXMuaXNRdWFsaWZpZWQoKSxcbiAgICAgICAgICBzdGF0ZWQgPSBxdWFsaWZpZWQ7IC8vL1xuXG4gICAgcmV0dXJuIHN0YXRlZDtcbiAgfVxuXG4gIGNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbih0ZXJtLCBwcm9wZXJ0eVJlbGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbi5jb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24odGVybSwgcHJvcGVydHlSZWxhdGlvbiwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeShhc3NpZ25tZW50cywgY29udGV4dCkge1xuICAgIGxldCB2ZXJpZmllcyA9IGZhbHNlO1xuXG4gICAgYXdhaXQgdGhpcy5icmVhayhjb250ZXh0KTtcblxuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuZ2V0U3RhdGVtZW50KCk7XG5cbiAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICBhc3luY0F0dGVtcHQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVJlZmVyZW5jZShjb250ZXh0KTtcblxuICAgICAgICBpZiAocmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3Qgc2F0aXNmaWVzQXNzZXJ0aW9WYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlU2F0aXNmaWVzQXNzZXJ0aW9uKGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKHNhdGlzZmllc0Fzc2VydGlvVmFsaWRhdGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnRWYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlU3RhdGVtZW50KGFzc2lnbm1lbnRzLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudFZhbGlkYXRlcykge1xuICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2UgPSB0aGlzLmdldFJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgICAgICAgICBzYXRpc2ZpZXNBc3NlcnRpb24gPSB0aGlzLmdldFNhdGlzZmllc0Fzc2VydGlvbigpLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRVbmlmaWVzID0gYXdhaXQgYXN5bmNMaW1pbmFsbHkoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnRVbmlmaWVzID0gYXdhaXQgYXN5bmNTb21lKGFzeW5jICh1bmlmeVN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50VW5pZmllcyA9IGF3YWl0IHVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvbnRleHQoY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50VW5pZmllcztcbiAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgICB2ZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmVyaWZpZXM7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgVW5hYmxlIHRvIHZlcmlmeSB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgYmVjYXVzZSBpdCBpcyBub25zZW5zZS5gKTtcbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZXM7XG4gIH1cblxuICB2YWxpZGF0ZVJlZmVyZW5jZShjb250ZXh0KSB7XG4gICAgbGV0IHJlZmVyZW5jZVZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5yZWZlcmVuY2UgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSB0aGlzLnJlZmVyZW5jZS5nZXRTdHJpbmcoKTtcblxuICAgICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAncyAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UuLi4gYCk7XG5cbiAgICAgIHJlZmVyZW5jZVZhbGlkYXRlcyA9IHRoaXMucmVmZXJlbmNlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAncyAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UuIGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWZlcmVuY2VWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVNhdGlzZmllc0Fzc2VydGlvbihjb250ZXh0KSB7XG4gICAgbGV0IHNhdGlzZmllc0Fzc2VydGlvblZhbGlkYXRlcyA9IHRydWU7ICAvLy9cblxuICAgIGlmICh0aGlzLnNhdGlzZmllc0Fzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvLy9cbiAgICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvbiA9IHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcCdzICcke3NhdGlzZmllc0Fzc2VydGlvbn0nIHNhdGlzZmllcyBhc3NlcnRpb24uLi4gYCk7XG5cbiAgICAgIGNvbnN0IHN0YXRlZCA9IHRydWUsXG4gICAgICAgICAgICBhc3NpZ25tZW50cyA9IG51bGw7XG5cbiAgICAgIHNhdGlzZmllc0Fzc2VydGlvblZhbGlkYXRlcyA9IHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uLnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRpbmcgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwJ3MgJyR7c2F0aXNmaWVzQXNzZXJ0aW9ufScgc2F0aXNmaWVzIGFzc2VydGlvbi4gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhdGlzZmllc0Fzc2VydGlvblZhbGlkYXRlcztcbiAgfVxuXG4gIHVuaWZ5V2l0aFNhdGlzZmllc0Fzc2VydGlvbihzYXRpc2ZpZXNBc3NlcnRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgdW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24gPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAvLy9cbiAgICAgICAgICBzYXRpc2ZpZXNBc3NlcnRpb25TdHJpbmcgPSBzYXRpc2ZpZXNBc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgd2l0aCB0aGUgJyR7c2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nfScgc2F0aXNmaWVzIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgcmVmZXJlbmNlID0gc2F0aXNmaWVzQXNzZXJ0aW9uLmdldFJlZmVyZW5jZSgpLFxuICAgICAgICAgIGF4aW9tID0gY29udGV4dC5maW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgaWYgKGF4aW9tICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGVwID0gdGhpcywgIC8vL1xuICAgICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IFtdLFxuICAgICAgICAgICAgc3RlcFVuaWZpZXMgPSBheGlvbS51bmlmeVN0ZXAoc3RlcCwgc3Vic3RpdHV0aW9ucywgY29udGV4dCk7XG5cbiAgICAgIGlmIChzdGVwVW5pZmllcykge1xuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zQ29tcGFyZSA9IHNhdGlzZmllc0Fzc2VydGlvbi5jb21wYXJlU3Vic3RpdHV0aW9ucyhzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoc3Vic3RpdHV0aW9uc0NvbXBhcmUpIHtcbiAgICAgICAgICB1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwIHdpdGggdGhlICcke3NhdGlzZmllc0Fzc2VydGlvblN0cmluZ30nIHNhdGlzZmllcyBhc3NlcnRpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIlN0ZXBcIjtcbn0pO1xuIl0sIm5hbWVzIjpbImFzeW5jU29tZSIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImRlZmluZSIsIlN0ZXAiLCJjb250ZXh0Iiwic3RyaW5nIiwibm9kZSIsInN0YXRlbWVudCIsInJlZmVyZW5jZSIsInNhdGlzZmllc0Fzc2VydGlvbiIsImdldFJlZmVyZW5jZSIsImdldFNhdGlzZmllc0Fzc2VydGlvbiIsImlzU2F0aXNmaWVkIiwic2F0aXNmaWVkIiwiaXNRdWFsaWZpZWQiLCJxdWFsaWZpZWQiLCJpc1N0YXRlZCIsInN0YXRlZCIsImNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsInRlcm0iLCJwcm9wZXJ0eVJlbGF0aW9uIiwiY29tcGFyZXNUb1Rlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uIiwiZ2V0U3RhdGVtZW50IiwicHJvcGVydHlBc3NlcnRpb24iLCJwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJ2ZXJpZnkiLCJhc3NpZ25tZW50cyIsInZlcmlmaWVzIiwic3RlcFN0cmluZyIsImJyZWFrIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJhc3luY0F0dGVtcHQiLCJyZWZlcmVuY2VWYWxpZGF0ZXMiLCJzYXRpc2ZpZXNBc3NlcnRpb1ZhbGlkYXRlcyIsInN0YXRlbWVudFZhbGlkYXRlcyIsInN0YXRlbWVudFVuaWZpZXMiLCJ2YWxpZGF0ZVJlZmVyZW5jZSIsInZhbGlkYXRlU2F0aXNmaWVzQXNzZXJ0aW9uIiwidmFsaWRhdGVTdGF0ZW1lbnQiLCJhc3luY0xpbWluYWxseSIsInVuaWZ5U3RhdGVtZW50Iiwic2V0Q29udGV4dCIsImRlYnVnIiwicmVmZXJlbmNlU3RyaW5nIiwidmFsaWRhdGUiLCJzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXMiLCJ1bmlmeVdpdGhTYXRpc2ZpZXNBc3NlcnRpb24iLCJ1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInNhdGlzZmllc0Fzc2VydGlvblN0cmluZyIsImF4aW9tIiwiZmluZEF4aW9tQnlSZWZlcmVuY2UiLCJzdGVwIiwic3Vic3RpdHV0aW9ucyIsInN0ZXBVbmlmaWVzIiwidW5pZnlTdGVwIiwic3Vic3RpdHV0aW9uc0NvbXBhcmUiLCJjb21wYXJlU3Vic3RpdHV0aW9ucyIsIlByb29mQXNzZXJ0aW9uIiwibmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBWUE7OztlQUFBOzs7OEJBVnNDO3FFQUVYO3dCQUVKO3VCQUNzQjt5QkFDRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3Byb29mQXNzZXJ0aW9uL3N0ZXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFzeW5jaHJvbm91c1V0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IFByb29mQXNzZXJ0aW9uIGZyb20gXCIuLi9wcm9vZkFzc2VydGlvblwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IHVuaWZ5U3RhdGVtZW50cyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvdW5pZmljYXRpb25cIjtcbmltcG9ydCB7IGFzeW5jQXR0ZW1wdCwgYXN5bmNMaW1pbmFsbHkgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc3RhdGVtZW50XCI7XG5cbmNvbnN0IHsgYXN5bmNTb21lIH0gPSBhc3luY2hyb25vdXNVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBTdGVwIGV4dGVuZHMgUHJvb2ZBc3NlcnRpb24ge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLnNhdGlzZmllc0Fzc2VydGlvbiA9IHNhdGlzZmllc0Fzc2VydGlvbjtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7XG4gIH1cblxuICBnZXRTYXRpc2ZpZXNBc3NlcnRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uO1xuICB9XG5cbiAgaXNTYXRpc2ZpZWQoKSB7XG4gICAgY29uc3Qgc2F0aXNmaWVkID0gKHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBzYXRpc2ZpZWQ7XG4gIH1cblxuICBpc1F1YWxpZmllZCgpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSAodGhpcy5yZWZlcmVuY2UgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHF1YWxpZmllZDtcbiAgfVxuXG4gIGlzU3RhdGVkKCkge1xuICAgIGNvbnN0IHF1YWxpZmllZCA9IHRoaXMuaXNRdWFsaWZpZWQoKSxcbiAgICAgICAgICBzdGF0ZWQgPSBxdWFsaWZpZWQ7IC8vL1xuXG4gICAgcmV0dXJuIHN0YXRlZDtcbiAgfVxuXG4gIGNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbih0ZXJtLCBwcm9wZXJ0eVJlbGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbi5jb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24odGVybSwgcHJvcGVydHlSZWxhdGlvbiwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbjtcbiAgfVxuXG4gIHZhbGlkYXRlKGFzc2lnbm1lbnRzLCBjb250ZXh0KSB7XG4gICAgbGV0IHZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuZ2V0U3RhdGVtZW50KCk7XG5cbiAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlUmVmZXJlbmNlKGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IHNhdGlzZmllc0Fzc2VydGlvVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVNhdGlzZmllc0Fzc2VydGlvbihjb250ZXh0KTtcblxuICAgICAgICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9WYWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZW1lbnRWYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlU3RhdGVtZW50KGFzc2lnbm1lbnRzLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYFVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgYmVjYXVzZSBpdCBpcyBub25zZW5zZS5gKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZSB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlUmVmZXJlbmNlKGNvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlVmFsaWRhdGVzID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnJlZmVyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksICAvLy9cbiAgICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHRoaXMucmVmZXJlbmNlLmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcCdzICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZS4uLiBgKTtcblxuICAgICAgcmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy5yZWZlcmVuY2UudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcCdzICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZS4gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlU2F0aXNmaWVzQXNzZXJ0aW9uKGNvbnRleHQpIHtcbiAgICBsZXQgc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzID0gdHJ1ZTsgIC8vL1xuXG4gICAgaWYgKHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGVwU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgICAgc2F0aXNmaWVzQXNzZXJ0aW9uID0gdGhpcy5zYXRpc2ZpZXNBc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwJ3MgJyR7c2F0aXNmaWVzQXNzZXJ0aW9ufScgc2F0aXNmaWVzIGFzc2VydGlvbi4uLiBgKTtcblxuICAgICAgY29uc3Qgc3RhdGVkID0gdHJ1ZSxcbiAgICAgICAgICAgIGFzc2lnbm1lbnRzID0gbnVsbDtcblxuICAgICAgc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzID0gdGhpcy5zYXRpc2ZpZXNBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICAgIGlmIChzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAncyAnJHtzYXRpc2ZpZXNBc3NlcnRpb259JyBzYXRpc2ZpZXMgYXNzZXJ0aW9uLiBgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzO1xuICB9XG5cbiAgdW5pZnlXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uKHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICAgIGxldCB1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbiA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksIC8vL1xuICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvblN0cmluZyA9IHNhdGlzZmllc0Fzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcCB3aXRoIHRoZSAnJHtzYXRpc2ZpZXNBc3NlcnRpb25TdHJpbmd9JyBzYXRpc2ZpZXMgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCByZWZlcmVuY2UgPSBzYXRpc2ZpZXNBc3NlcnRpb24uZ2V0UmVmZXJlbmNlKCksXG4gICAgICAgICAgYXhpb20gPSBjb250ZXh0LmZpbmRBeGlvbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICBpZiAoYXhpb20gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgICBzdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgICBzdGVwVW5pZmllcyA9IGF4aW9tLnVuaWZ5U3RlcChzdGVwLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHN0ZXBVbmlmaWVzKSB7XG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbnNDb21wYXJlID0gc2F0aXNmaWVzQXNzZXJ0aW9uLmNvbXBhcmVTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChzdWJzdGl0dXRpb25zQ29tcGFyZSkge1xuICAgICAgICAgIHVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgd2l0aCB0aGUgJyR7c2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nfScgc2F0aXNmaWVzIGFzc2VydGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb247XG4gIH1cblxuICBhc3luYyB2ZXJpZnkoYXNzaWdubWVudHMsIGNvbnRleHQpIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIGF3YWl0IHRoaXMuYnJlYWsoY29udGV4dCk7XG5cbiAgICBjb25zdCBzdGVwU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwLi4uYCk7XG5cbiAgICBhd2FpdCBhc3luY0F0dGVtcHQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlcyA9IHRoaXMudmFsaWRhdGUoYXNzaWdubWVudHMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IHVuaWZpZXMgPSBhd2FpdCB0aGlzLnVuaWZ5KGNvbnRleHQpO1xuXG4gICAgICAgIGlmICh1bmlmaWVzKSB7XG4gICAgICAgICAgdGhpcy5zZXRDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgICAgICAgdmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZXM7XG4gIH1cblxuICBhc3luYyB1bmlmeShjb250ZXh0KSB7XG4gICAgbGV0IHVuaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXBTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSB0aGlzLmdldFJlZmVyZW5jZSgpLFxuICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvbiA9IHRoaXMuZ2V0U2F0aXNmaWVzQXNzZXJ0aW9uKCksXG4gICAgICAgICAgc3RhdGVtZW50VW5pZmllcyA9IGF3YWl0IGFzeW5jTGltaW5hbGx5KGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnRVbmlmaWVzID0gYXdhaXQgYXN5bmNTb21lKHVuaWZ5U3RhdGVtZW50cywgYXN5bmMgKHVuaWZ5U3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudFVuaWZpZXMgPSBhd2FpdCB1bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIHJlZmVyZW5jZSwgc2F0aXNmaWVzQXNzZXJ0aW9uLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXM7XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgdW5pZmllcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwLmApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlmaWVzO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIlN0ZXBcIjtcbn0pO1xuIl0sIm5hbWVzIjpbImFzeW5jU29tZSIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImRlZmluZSIsIlN0ZXAiLCJjb250ZXh0Iiwic3RyaW5nIiwibm9kZSIsInN0YXRlbWVudCIsInJlZmVyZW5jZSIsInNhdGlzZmllc0Fzc2VydGlvbiIsImdldFJlZmVyZW5jZSIsImdldFNhdGlzZmllc0Fzc2VydGlvbiIsImlzU2F0aXNmaWVkIiwic2F0aXNmaWVkIiwiaXNRdWFsaWZpZWQiLCJxdWFsaWZpZWQiLCJpc1N0YXRlZCIsInN0YXRlZCIsImNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbiIsInRlcm0iLCJwcm9wZXJ0eVJlbGF0aW9uIiwiY29tcGFyZXNUb1Rlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uIiwiZ2V0U3RhdGVtZW50IiwicHJvcGVydHlBc3NlcnRpb24iLCJwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJ2YWxpZGF0ZSIsImFzc2lnbm1lbnRzIiwidmFsaWRhdGVzIiwic3RlcFN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwicmVmZXJlbmNlVmFsaWRhdGVzIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJzYXRpc2ZpZXNBc3NlcnRpb1ZhbGlkYXRlcyIsInZhbGlkYXRlU2F0aXNmaWVzQXNzZXJ0aW9uIiwic3RhdGVtZW50VmFsaWRhdGVzIiwidmFsaWRhdGVTdGF0ZW1lbnQiLCJkZWJ1ZyIsInJlZmVyZW5jZVN0cmluZyIsInNhdGlzZmllc0Fzc2VydGlvblZhbGlkYXRlcyIsInVuaWZ5V2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uIiwic2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nIiwiYXhpb20iLCJmaW5kQXhpb21CeVJlZmVyZW5jZSIsInN0ZXAiLCJzdWJzdGl0dXRpb25zIiwic3RlcFVuaWZpZXMiLCJ1bmlmeVN0ZXAiLCJzdWJzdGl0dXRpb25zQ29tcGFyZSIsImNvbXBhcmVTdWJzdGl0dXRpb25zIiwidmVyaWZ5IiwidmVyaWZpZXMiLCJicmVhayIsImFzeW5jQXR0ZW1wdCIsInVuaWZpZXMiLCJ1bmlmeSIsInNldENvbnRleHQiLCJzdGF0ZW1lbnRVbmlmaWVzIiwiYXN5bmNMaW1pbmFsbHkiLCJ1bmlmeVN0YXRlbWVudHMiLCJ1bmlmeVN0YXRlbWVudCIsIlByb29mQXNzZXJ0aW9uIiwibmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBYUE7OztlQUFBOzs7OEJBWHNDO3FFQUVYO3dCQUVKOzJCQUNTO3VCQUNhO3lCQUNFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFL0MsSUFB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