occam-verify-cli 0.0.1067 → 0.0.1069

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 (137) hide show
  1. package/bin/action/verify.js +3 -2
  2. package/lib/assertion/contained.js +2 -2
  3. package/lib/assertion/defined.js +2 -2
  4. package/lib/assertion/subproof.js +3 -3
  5. package/lib/assignment/judgement.js +3 -3
  6. package/lib/axiom.js +11 -6
  7. package/lib/combinator.js +9 -9
  8. package/lib/conclusion.js +13 -10
  9. package/lib/conjecture.js +11 -6
  10. package/lib/consequent.js +13 -10
  11. package/lib/constructor.js +9 -9
  12. package/lib/context/file.js +34 -126
  13. package/lib/context/local.js +16 -5
  14. package/lib/context/release.js +2 -3
  15. package/lib/declaration.js +96 -2
  16. package/lib/equivalence.js +2 -2
  17. package/lib/frame.js +179 -98
  18. package/lib/index.js +22 -6
  19. package/lib/judgement.js +84 -5
  20. package/lib/label.js +12 -8
  21. package/lib/lemma.js +12 -12
  22. package/lib/metaLemma.js +120 -8
  23. package/lib/metaType.js +24 -3
  24. package/lib/metatheorem.js +145 -9
  25. package/lib/metavariable.js +128 -43
  26. package/lib/mixins/statement/qualified/unify.js +6 -10
  27. package/lib/mixins/statement/unify.js +4 -19
  28. package/lib/mixins/statement/verify.js +13 -13
  29. package/lib/mixins/term/unify.js +2 -2
  30. package/lib/premise.js +21 -13
  31. package/lib/reference.js +17 -17
  32. package/lib/rule.js +28 -40
  33. package/lib/statement/unqualified.js +34 -9
  34. package/lib/statement.js +7 -5
  35. package/lib/substitution/frameForMetavariable.js +75 -70
  36. package/lib/substitution/statementForMetavariable.js +83 -42
  37. package/lib/substitution/termForVariable.js +65 -68
  38. package/lib/substitution.js +46 -43
  39. package/lib/substitutions.js +52 -40
  40. package/lib/supposition.js +15 -11
  41. package/lib/term.js +6 -11
  42. package/lib/theorem.js +11 -6
  43. package/lib/topLevelAssertion.js +24 -42
  44. package/lib/type.js +5 -12
  45. package/lib/unifier/intrinsicLevel.js +4 -4
  46. package/lib/unifier/metaLevel.js +11 -7
  47. package/lib/unifier/metavariable.js +6 -6
  48. package/lib/unifier/statementWithCombinator.js +16 -16
  49. package/lib/unifier/termWithConstructor.js +7 -7
  50. package/lib/utilities/brackets.js +10 -10
  51. package/lib/utilities/json.js +493 -0
  52. package/lib/utilities/node.js +26 -19
  53. package/lib/utilities/release.js +53 -0
  54. package/lib/utilities/releaseContext.js +4 -15
  55. package/lib/utilities/tokens.js +8 -1
  56. package/lib/variable.js +14 -15
  57. package/lib/verifier/topLevel.js +5 -5
  58. package/package.json +1 -1
  59. package/src/assertion/contained.js +1 -1
  60. package/src/assertion/defined.js +1 -1
  61. package/src/assertion/subproof.js +2 -3
  62. package/src/assignment/judgement.js +3 -4
  63. package/src/axiom.js +14 -6
  64. package/src/combinator.js +12 -13
  65. package/src/conclusion.js +16 -13
  66. package/src/conjecture.js +14 -6
  67. package/src/consequent.js +16 -13
  68. package/src/constructor.js +11 -13
  69. package/src/context/file.js +94 -202
  70. package/src/context/local.js +8 -6
  71. package/src/context/release.js +2 -3
  72. package/src/declaration.js +126 -45
  73. package/src/equivalence.js +2 -2
  74. package/src/frame.js +225 -141
  75. package/src/index.js +17 -1
  76. package/src/judgement.js +109 -3
  77. package/src/label.js +15 -10
  78. package/src/lemma.js +17 -10
  79. package/src/metaLemma.js +102 -1
  80. package/src/metaType.js +29 -3
  81. package/src/metatheorem.js +143 -2
  82. package/src/metavariable.js +189 -66
  83. package/src/mixins/statement/qualified/unify.js +7 -19
  84. package/src/mixins/statement/unify.js +3 -25
  85. package/src/mixins/statement/verify.js +15 -13
  86. package/src/mixins/term/unify.js +1 -1
  87. package/src/premise.js +31 -16
  88. package/src/reference.js +18 -18
  89. package/src/rule.js +40 -58
  90. package/src/statement/unqualified.js +41 -11
  91. package/src/statement.js +6 -3
  92. package/src/substitution/frameForMetavariable.js +85 -98
  93. package/src/substitution/statementForMetavariable.js +109 -45
  94. package/src/substitution/termForVariable.js +83 -94
  95. package/src/substitution.js +36 -34
  96. package/src/substitutions.js +53 -46
  97. package/src/supposition.js +22 -14
  98. package/src/term.js +5 -15
  99. package/src/theorem.js +14 -6
  100. package/src/topLevelAssertion.js +38 -64
  101. package/src/type.js +5 -20
  102. package/src/unifier/intrinsicLevel.js +4 -3
  103. package/src/unifier/metaLevel.js +19 -7
  104. package/src/unifier/metavariable.js +5 -5
  105. package/src/unifier/statementWithCombinator.js +19 -19
  106. package/src/unifier/termWithConstructor.js +7 -7
  107. package/src/utilities/brackets.js +5 -5
  108. package/src/utilities/json.js +551 -0
  109. package/src/utilities/node.js +28 -23
  110. package/src/{verify → utilities}/release.js +5 -1
  111. package/src/utilities/releaseContext.js +2 -2
  112. package/src/utilities/tokens.js +10 -0
  113. package/src/variable.js +18 -19
  114. package/src/verifier/topLevel.js +6 -4
  115. package/lib/argument.js +0 -106
  116. package/lib/metaTypes.js +0 -19
  117. package/lib/unify/metavariableWithFrame.js +0 -40
  118. package/lib/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -31
  119. package/lib/unify/statementWithSttaemetnGivenEquivalences.js +0 -45
  120. package/lib/verify/declaration.js +0 -83
  121. package/lib/verify/frame.js +0 -120
  122. package/lib/verify/judgement.js +0 -88
  123. package/lib/verify/metaLemma.js +0 -49
  124. package/lib/verify/metatheorem.js +0 -48
  125. package/lib/verify/metavariableGivenMetaType.js +0 -44
  126. package/lib/verify/release.js +0 -50
  127. package/src/argument.js +0 -79
  128. package/src/metaTypes.js +0 -11
  129. package/src/unify/metavariableWithFrame.js +0 -40
  130. package/src/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -27
  131. package/src/unify/statementWithSttaemetnGivenEquivalences.js +0 -51
  132. package/src/verify/declaration.js +0 -113
  133. package/src/verify/frame.js +0 -157
  134. package/src/verify/judgement.js +0 -127
  135. package/src/verify/metaLemma.js +0 -72
  136. package/src/verify/metatheorem.js +0 -67
  137. package/src/verify/metavariableGivenMetaType.js +0 -45
@@ -5,10 +5,19 @@ Object.defineProperty(exports, "__esModule", {
5
5
  Object.defineProperty(exports, "default", {
6
6
  enumerable: true,
7
7
  get: function() {
8
- return Metatheorem;
8
+ return _default;
9
9
  }
10
10
  });
11
- var _topLevelAssertion = /*#__PURE__*/ _interop_require_default(require("./topLevelAssertion"));
11
+ var _shim = /*#__PURE__*/ _interop_require_default(require("./shim"));
12
+ var _label = /*#__PURE__*/ _interop_require_default(require("./label"));
13
+ var _proof = /*#__PURE__*/ _interop_require_default(require("./proof"));
14
+ var _consequent = /*#__PURE__*/ _interop_require_default(require("./consequent"));
15
+ var _supposition = /*#__PURE__*/ _interop_require_default(require("./supposition"));
16
+ var _local = /*#__PURE__*/ _interop_require_default(require("./context/local"));
17
+ var _substitutions = /*#__PURE__*/ _interop_require_default(require("./substitutions"));
18
+ var _topLevelAssertion = /*#__PURE__*/ _interop_require_wildcard(require("./topLevelAssertion"));
19
+ var _query = require("./utilities/query");
20
+ var _json = require("./utilities/json");
12
21
  function _assert_this_initialized(self) {
13
22
  if (self === void 0) {
14
23
  throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
@@ -62,6 +71,47 @@ function _interop_require_default(obj) {
62
71
  default: obj
63
72
  };
64
73
  }
74
+ function _getRequireWildcardCache(nodeInterop) {
75
+ if (typeof WeakMap !== "function") return null;
76
+ var cacheBabelInterop = new WeakMap();
77
+ var cacheNodeInterop = new WeakMap();
78
+ return (_getRequireWildcardCache = function(nodeInterop) {
79
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
80
+ })(nodeInterop);
81
+ }
82
+ function _interop_require_wildcard(obj, nodeInterop) {
83
+ if (!nodeInterop && obj && obj.__esModule) {
84
+ return obj;
85
+ }
86
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
87
+ return {
88
+ default: obj
89
+ };
90
+ }
91
+ var cache = _getRequireWildcardCache(nodeInterop);
92
+ if (cache && cache.has(obj)) {
93
+ return cache.get(obj);
94
+ }
95
+ var newObj = {
96
+ __proto__: null
97
+ };
98
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
99
+ for(var key in obj){
100
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
101
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
102
+ if (desc && (desc.get || desc.set)) {
103
+ Object.defineProperty(newObj, key, desc);
104
+ } else {
105
+ newObj[key] = obj[key];
106
+ }
107
+ }
108
+ }
109
+ newObj.default = obj;
110
+ if (cache) {
111
+ cache.set(obj, newObj);
112
+ }
113
+ return newObj;
114
+ }
65
115
  function _possible_constructor_return(self, call) {
66
116
  if (call && (_type_of(call) === "object" || typeof call === "function")) {
67
117
  return call;
@@ -87,21 +137,107 @@ function _is_native_reflect_construct() {
87
137
  return !!result;
88
138
  })();
89
139
  }
140
+ var proofNodeQuery = (0, _query.nodeQuery)("/metatheorem/proof"), labelNodesQuery = (0, _query.nodesQuery)("/metatheorem/label"), consequentNodeQuery = (0, _query.nodeQuery)("/metatheorem/consequent"), suppositionNodesQuery = (0, _query.nodesQuery)("/metatheorem/supposition");
90
141
  var Metatheorem = /*#__PURE__*/ function(TopLevelAssertion) {
91
142
  _inherits(Metatheorem, TopLevelAssertion);
92
- function Metatheorem() {
143
+ function Metatheorem(fileContext, string, labels, suppositions, consequent, proof, substitutions) {
93
144
  _class_call_check(this, Metatheorem);
94
- return _call_super(this, Metatheorem, arguments);
145
+ var _this;
146
+ _this = _call_super(this, Metatheorem, [
147
+ fileContext,
148
+ string,
149
+ labels,
150
+ suppositions,
151
+ consequent,
152
+ proof
153
+ ]);
154
+ _this.substitutions = substitutions;
155
+ return _this;
95
156
  }
96
- _create_class(Metatheorem, null, [
157
+ _create_class(Metatheorem, [
97
158
  {
98
- key: "fromLabelsSuppositionsConsequentSubstitutionsAndFileContext",
99
- value: function fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext) {
100
- return _topLevelAssertion.default.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(Metatheorem, labels, suppositions, consequent, substitutions, fileContext);
159
+ key: "getSubstitutions",
160
+ value: function getSubstitutions() {
161
+ return this.substitutions;
162
+ }
163
+ },
164
+ {
165
+ key: "verify",
166
+ value: function verify() {
167
+ var _this = this;
168
+ var verified = false;
169
+ var metatheoremString = this.string; ///
170
+ this.fileContext.trace("Verifying the '".concat(metatheoremString, "' metatheorem..."));
171
+ var labelsVerifiedAtTopLevel = this.labels.every(function(label) {
172
+ var labelVVerifiedAtTopLevel = label.verifyAtTopLevel(_this.fileContext);
173
+ if (labelVVerifiedAtTopLevel) {
174
+ return true;
175
+ }
176
+ });
177
+ if (labelsVerifiedAtTopLevel) {
178
+ var localContext = _local.default.fromFileContext(this.fileContext), suppositionsVerified = this.suppositions.every(function(supposition) {
179
+ var suppositionVerified = supposition.verify(localContext);
180
+ if (suppositionVerified) {
181
+ return true;
182
+ }
183
+ });
184
+ if (suppositionsVerified) {
185
+ var consequentVerified = this.consequent.verify(localContext);
186
+ if (consequentVerified) {
187
+ var proofVerified = this.proof.verify(this.substitutions, this.consequent, localContext);
188
+ if (proofVerified) {
189
+ var metatheorem = this; ///
190
+ this.fileContext.addMetatheorem(metatheorem);
191
+ verified = true;
192
+ }
193
+ }
194
+ }
195
+ }
196
+ if (verified) {
197
+ this.fileContext.debug("...verified the '".concat(metatheoremString, "' metatheorem."));
198
+ }
199
+ return verified;
200
+ }
201
+ },
202
+ {
203
+ key: "toJSON",
204
+ value: function toJSON() {
205
+ var labelsJSON = (0, _json.labelsToLabelsJSON)(this.labels), consequentJSON = (0, _json.consequentToConsequentJSON)(this.consequent), suppositionsJSON = (0, _json.suppositionsToSuppositionsJSON)(this.suppositions), substitutionsJSON = (0, _json.substitutionsToSubstitutionsJSON)(this.substitutions), labels = labelsJSON, consequent = consequentJSON, suppositions = suppositionsJSON, substitutions = substitutionsJSON, json = {
206
+ labels: labels,
207
+ consequent: consequent,
208
+ suppositions: suppositions,
209
+ substitutions: substitutions
210
+ };
211
+ return json;
212
+ }
213
+ }
214
+ ], [
215
+ {
216
+ key: "fromJSON",
217
+ value: function fromJSON(json, fileContext) {
218
+ var labels = (0, _json.labelsFromJSON)(json, fileContext), consequent = (0, _json.consequentFromJSON)(json, fileContext), suppositions = (0, _json.suppositionsFromJSON)(json, fileContext), substitutions = (0, _json.substitutionsFromJSON)(json, fileContext), string = (0, _topLevelAssertion.stringFromLabels)(labels), proof = null, topLevelAssertion = new Metatheorem(fileContext, string, labels, suppositions, consequent, proof, substitutions);
219
+ return topLevelAssertion;
220
+ }
221
+ },
222
+ {
223
+ key: "fromMetatheoremNode",
224
+ value: function fromMetatheoremNode(metatheoremNode, fileContext) {
225
+ var proofNode = proofNodeQuery(metatheoremNode), labelNodes = labelNodesQuery(metatheoremNode), consequentNode = consequentNodeQuery(metatheoremNode), suppositionNodes = suppositionNodesQuery(metatheoremNode), labels = labelNodes.map(function(labelNode) {
226
+ var label = _label.default.fromLabelNode(labelNode, fileContext);
227
+ return label;
228
+ }), suppositions = suppositionNodes.map(function(suppositionNode) {
229
+ var supposition = _supposition.default.fromSuppositionNode(suppositionNode, fileContext);
230
+ return supposition;
231
+ }), consequent = _consequent.default.fromConsequentNode(consequentNode, fileContext), proof = _proof.default.fromProofNode(proofNode, fileContext), string = (0, _topLevelAssertion.stringFromLabels)(labels), substitutions = _substitutions.default.fromNothing(), metatheorem = new Metatheorem(fileContext, string, labels, suppositions, consequent, proof, substitutions);
232
+ return metatheorem;
101
233
  }
102
234
  }
103
235
  ]);
104
236
  return Metatheorem;
105
237
  }(_topLevelAssertion.default);
238
+ Object.assign(_shim.default, {
239
+ Metatheorem: Metatheorem
240
+ });
241
+ var _default = Metatheorem;
106
242
 
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhdGhlb3JlbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFRvcExldmVsQXNzZXJ0aW9uIGZyb20gXCIuL3RvcExldmVsQXNzZXJ0aW9uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGF0aGVvcmVtIGV4dGVuZHMgVG9wTGV2ZWxBc3NlcnRpb24ge1xuICBzdGF0aWMgZnJvbUxhYmVsc1N1cHBvc2l0aW9uc0NvbnNlcXVlbnRTdWJzdGl0dXRpb25zQW5kRmlsZUNvbnRleHQobGFiZWxzLCBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIHN1YnN0aXR1dGlvbnMsIGZpbGVDb250ZXh0KSB7IHJldHVybiBUb3BMZXZlbEFzc2VydGlvbi5mcm9tTGFiZWxzU3VwcG9zaXRpb25zQ29uc2VxdWVudFN1YnN0aXR1dGlvbnNBbmRGaWxlQ29udGV4dChNZXRhdGhlb3JlbSwgbGFiZWxzLCBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIHN1YnN0aXR1dGlvbnMsIGZpbGVDb250ZXh0KTsgfVxufVxuIl0sIm5hbWVzIjpbIk1ldGF0aGVvcmVtIiwiZnJvbUxhYmVsc1N1cHBvc2l0aW9uc0NvbnNlcXVlbnRTdWJzdGl0dXRpb25zQW5kRmlsZUNvbnRleHQiLCJsYWJlbHMiLCJzdXBwb3NpdGlvbnMiLCJjb25zZXF1ZW50Iiwic3Vic3RpdHV0aW9ucyIsImZpbGVDb250ZXh0IiwiVG9wTGV2ZWxBc3NlcnRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBSXFCQTs7O3dFQUZTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWYsSUFBQSxBQUFNQSw0QkFBTjtjQUFNQTthQUFBQTtnQ0FBQUE7aUNBQUFBOztrQkFBQUE7O1lBQ1pDLEtBQUFBO21CQUFQLFNBQU9BLDREQUE0REMsTUFBTSxFQUFFQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxXQUFXO2dCQUFJLE9BQU9DLDBCQUFpQixDQUFDTiwyREFBMkQsQ0FEcE1ELGFBQ2tORSxRQUFRQyxjQUFjQyxZQUFZQyxlQUFlQztZQUFjOzs7V0FEalJOO0VBQW9CTywwQkFBaUIifQ==
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhdGhlb3JlbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHNoaW0gZnJvbSBcIi4vc2hpbVwiO1xuaW1wb3J0IExhYmVsIGZyb20gXCIuL2xhYmVsXCI7XG5pbXBvcnQgUHJvb2YgZnJvbSBcIi4vcHJvb2ZcIjtcbmltcG9ydCBDb25zZXF1ZW50IGZyb20gXCIuL2NvbnNlcXVlbnRcIjtcbmltcG9ydCBTdXBwb3NpdGlvbiBmcm9tIFwiLi9zdXBwb3NpdGlvblwiO1xuaW1wb3J0IExvY2FsQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0L2xvY2FsXCI7XG5pbXBvcnQgU3Vic3RpdHV0aW9ucyBmcm9tIFwiLi9zdWJzdGl0dXRpb25zXCI7XG5pbXBvcnQgVG9wTGV2ZWxBc3NlcnRpb24gZnJvbSBcIi4vdG9wTGV2ZWxBc3NlcnRpb25cIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5LCBub2Rlc1F1ZXJ5IH0gZnJvbSBcIi4vdXRpbGl0aWVzL3F1ZXJ5XCI7XG5pbXBvcnQgeyBzdHJpbmdGcm9tTGFiZWxzIH0gZnJvbSBcIi4vdG9wTGV2ZWxBc3NlcnRpb25cIjtcbmltcG9ydCB7IGxhYmVsc0Zyb21KU09OLFxuICAgICAgICAgbGFiZWxzVG9MYWJlbHNKU09OLFxuICAgICAgICAgY29uc2VxdWVudEZyb21KU09OLFxuICAgICAgICAgc3VwcG9zaXRpb25zRnJvbUpTT04sXG4gICAgICAgICBzdWJzdGl0dXRpb25zRnJvbUpTT04sXG4gICAgICAgICBjb25zZXF1ZW50VG9Db25zZXF1ZW50SlNPTixcbiAgICAgICAgIHN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTixcbiAgICAgICAgIHN1YnN0aXR1dGlvbnNUb1N1YnN0aXR1dGlvbnNKU09OIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2pzb25cIjtcblxuY29uc3QgcHJvb2ZOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXRoZW9yZW0vcHJvb2ZcIiksXG4gICAgICBsYWJlbE5vZGVzUXVlcnkgPSBub2Rlc1F1ZXJ5KFwiL21ldGF0aGVvcmVtL2xhYmVsXCIpLFxuICAgICAgY29uc2VxdWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9tZXRhdGhlb3JlbS9jb25zZXF1ZW50XCIpLFxuICAgICAgc3VwcG9zaXRpb25Ob2Rlc1F1ZXJ5ID0gbm9kZXNRdWVyeShcIi9tZXRhdGhlb3JlbS9zdXBwb3NpdGlvblwiKTtcblxuY2xhc3MgTWV0YXRoZW9yZW0gZXh0ZW5kcyBUb3BMZXZlbEFzc2VydGlvbiB7XG4gIGNvbnN0cnVjdG9yKGZpbGVDb250ZXh0LCBzdHJpbmcsIGxhYmVscywgc3VwcG9zaXRpb25zLCBjb25zZXF1ZW50LCBwcm9vZiwgc3Vic3RpdHV0aW9ucykge1xuICAgIHN1cGVyKGZpbGVDb250ZXh0LCBzdHJpbmcsIGxhYmVscywgc3VwcG9zaXRpb25zLCBjb25zZXF1ZW50LCBwcm9vZik7XG5cbiAgICB0aGlzLnN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zO1xuICB9XG5cbiAgZ2V0U3Vic3RpdHV0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25zO1xuICB9XG5cbiAgdmVyaWZ5KCkge1xuICAgIGxldCB2ZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbWV0YXRoZW9yZW1TdHJpbmcgPSB0aGlzLnN0cmluZzsgIC8vL1xuXG4gICAgdGhpcy5maWxlQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHttZXRhdGhlb3JlbVN0cmluZ30nIG1ldGF0aGVvcmVtLi4uYCk7XG5cbiAgICBjb25zdCBsYWJlbHNWZXJpZmllZEF0VG9wTGV2ZWwgPSB0aGlzLmxhYmVscy5ldmVyeSgobGFiZWwpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsVlZlcmlmaWVkQXRUb3BMZXZlbCA9IGxhYmVsLnZlcmlmeUF0VG9wTGV2ZWwodGhpcy5maWxlQ29udGV4dCk7XG5cbiAgICAgIGlmIChsYWJlbFZWZXJpZmllZEF0VG9wTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobGFiZWxzVmVyaWZpZWRBdFRvcExldmVsKSB7XG4gICAgICBjb25zdCBsb2NhbENvbnRleHQgPSBMb2NhbENvbnRleHQuZnJvbUZpbGVDb250ZXh0KHRoaXMuZmlsZUNvbnRleHQpLFxuICAgICAgICAgICAgc3VwcG9zaXRpb25zVmVyaWZpZWQgPSB0aGlzLnN1cHBvc2l0aW9ucy5ldmVyeSgoc3VwcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3VwcG9zaXRpb25WZXJpZmllZCA9IHN1cHBvc2l0aW9uLnZlcmlmeShsb2NhbENvbnRleHQpO1xuXG4gICAgICAgICAgICAgIGlmIChzdXBwb3NpdGlvblZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICBpZiAoc3VwcG9zaXRpb25zVmVyaWZpZWQpIHtcbiAgICAgICAgY29uc3QgY29uc2VxdWVudFZlcmlmaWVkID0gdGhpcy5jb25zZXF1ZW50LnZlcmlmeShsb2NhbENvbnRleHQpO1xuXG4gICAgICAgIGlmIChjb25zZXF1ZW50VmVyaWZpZWQpIHtcbiAgICAgICAgICBjb25zdCBwcm9vZlZlcmlmaWVkID0gdGhpcy5wcm9vZi52ZXJpZnkodGhpcy5zdWJzdGl0dXRpb25zLCB0aGlzLmNvbnNlcXVlbnQsIGxvY2FsQ29udGV4dCk7XG5cbiAgICAgICAgICBpZiAocHJvb2ZWZXJpZmllZCkge1xuICAgICAgICAgICAgY29uc3QgbWV0YXRoZW9yZW0gPSB0aGlzOyAgLy8vXG5cbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbnRleHQuYWRkTWV0YXRoZW9yZW0obWV0YXRoZW9yZW0pO1xuXG4gICAgICAgICAgICB2ZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZlcmlmaWVkKSB7XG4gICAgICB0aGlzLmZpbGVDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7bWV0YXRoZW9yZW1TdHJpbmd9JyBtZXRhdGhlb3JlbS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZWQ7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgbGFiZWxzSlNPTiA9IGxhYmVsc1RvTGFiZWxzSlNPTih0aGlzLmxhYmVscyksXG4gICAgICAgICAgY29uc2VxdWVudEpTT04gPSBjb25zZXF1ZW50VG9Db25zZXF1ZW50SlNPTih0aGlzLmNvbnNlcXVlbnQpLFxuICAgICAgICAgIHN1cHBvc2l0aW9uc0pTT04gPSBzdXBwb3NpdGlvbnNUb1N1cHBvc2l0aW9uc0pTT04odGhpcy5zdXBwb3NpdGlvbnMpLFxuICAgICAgICAgIHN1YnN0aXR1dGlvbnNKU09OID0gc3Vic3RpdHV0aW9uc1RvU3Vic3RpdHV0aW9uc0pTT04odGhpcy5zdWJzdGl0dXRpb25zKSxcbiAgICAgICAgICBsYWJlbHMgPSBsYWJlbHNKU09OLCAgLy8vXG4gICAgICAgICAgY29uc2VxdWVudCA9IGNvbnNlcXVlbnRKU09OLCAgLy8vXG4gICAgICAgICAgc3VwcG9zaXRpb25zID0gc3VwcG9zaXRpb25zSlNPTiwgIC8vL1xuICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zSlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICBjb25zZXF1ZW50LFxuICAgICAgICAgICAgc3VwcG9zaXRpb25zLFxuICAgICAgICAgICAgc3Vic3RpdHV0aW9uc1xuICAgICAgICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCkge1xuICAgIGNvbnN0IGxhYmVscyA9IGxhYmVsc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KSxcbiAgICAgICAgICBjb25zZXF1ZW50ID0gY29uc2VxdWVudEZyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCksXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCksXG4gICAgICAgICAgc3RyaW5nID0gc3RyaW5nRnJvbUxhYmVscyhsYWJlbHMpLFxuICAgICAgICAgIHByb29mID0gbnVsbCxcbiAgICAgICAgICB0b3BMZXZlbEFzc2VydGlvbiA9IG5ldyBNZXRhdGhlb3JlbShmaWxlQ29udGV4dCwgc3RyaW5nLCBsYWJlbHMsIHN1cHBvc2l0aW9ucywgY29uc2VxdWVudCwgcHJvb2YsIHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIHRvcExldmVsQXNzZXJ0aW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21NZXRhdGhlb3JlbU5vZGUobWV0YXRoZW9yZW1Ob2RlLCBmaWxlQ29udGV4dCkge1xuICAgIGNvbnN0IHByb29mTm9kZSA9IHByb29mTm9kZVF1ZXJ5KG1ldGF0aGVvcmVtTm9kZSksXG4gICAgICAgICAgbGFiZWxOb2RlcyA9IGxhYmVsTm9kZXNRdWVyeShtZXRhdGhlb3JlbU5vZGUpLFxuICAgICAgICAgIGNvbnNlcXVlbnROb2RlID0gY29uc2VxdWVudE5vZGVRdWVyeShtZXRhdGhlb3JlbU5vZGUpLFxuICAgICAgICAgIHN1cHBvc2l0aW9uTm9kZXMgPSBzdXBwb3NpdGlvbk5vZGVzUXVlcnkobWV0YXRoZW9yZW1Ob2RlKSxcbiAgICAgICAgICBsYWJlbHMgPSBsYWJlbE5vZGVzLm1hcCgobGFiZWxOb2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IExhYmVsLmZyb21MYWJlbE5vZGUobGFiZWxOb2RlLCBmaWxlQ29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbk5vZGVzLm1hcCgoc3VwcG9zaXRpb25Ob2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdXBwb3NpdGlvbiA9IFN1cHBvc2l0aW9uLmZyb21TdXBwb3NpdGlvbk5vZGUoc3VwcG9zaXRpb25Ob2RlLCBmaWxlQ29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdXBwb3NpdGlvbjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb25zZXF1ZW50ID0gQ29uc2VxdWVudC5mcm9tQ29uc2VxdWVudE5vZGUoY29uc2VxdWVudE5vZGUsIGZpbGVDb250ZXh0KSxcbiAgICAgICAgICBwcm9vZiA9IFByb29mLmZyb21Qcm9vZk5vZGUocHJvb2ZOb2RlLCBmaWxlQ29udGV4dCksXG4gICAgICAgICAgc3RyaW5nID0gc3RyaW5nRnJvbUxhYmVscyhsYWJlbHMpLFxuICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBTdWJzdGl0dXRpb25zLmZyb21Ob3RoaW5nKCksXG4gICAgICAgICAgbWV0YXRoZW9yZW0gPSBuZXcgTWV0YXRoZW9yZW0oZmlsZUNvbnRleHQsIHN0cmluZywgbGFiZWxzLCBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIHByb29mLCBzdWJzdGl0dXRpb25zKTtcblxuICAgIHJldHVybiBtZXRhdGhlb3JlbTtcbiAgfVxufVxuXG5PYmplY3QuYXNzaWduKHNoaW0sIHtcbiAgTWV0YXRoZW9yZW1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBNZXRhdGhlb3JlbTtcbiJdLCJuYW1lcyI6WyJwcm9vZk5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsImxhYmVsTm9kZXNRdWVyeSIsIm5vZGVzUXVlcnkiLCJjb25zZXF1ZW50Tm9kZVF1ZXJ5Iiwic3VwcG9zaXRpb25Ob2Rlc1F1ZXJ5IiwiTWV0YXRoZW9yZW0iLCJmaWxlQ29udGV4dCIsInN0cmluZyIsImxhYmVscyIsInN1cHBvc2l0aW9ucyIsImNvbnNlcXVlbnQiLCJwcm9vZiIsInN1YnN0aXR1dGlvbnMiLCJnZXRTdWJzdGl0dXRpb25zIiwidmVyaWZ5IiwidmVyaWZpZWQiLCJtZXRhdGhlb3JlbVN0cmluZyIsInRyYWNlIiwibGFiZWxzVmVyaWZpZWRBdFRvcExldmVsIiwiZXZlcnkiLCJsYWJlbCIsImxhYmVsVlZlcmlmaWVkQXRUb3BMZXZlbCIsInZlcmlmeUF0VG9wTGV2ZWwiLCJsb2NhbENvbnRleHQiLCJMb2NhbENvbnRleHQiLCJmcm9tRmlsZUNvbnRleHQiLCJzdXBwb3NpdGlvbnNWZXJpZmllZCIsInN1cHBvc2l0aW9uIiwic3VwcG9zaXRpb25WZXJpZmllZCIsImNvbnNlcXVlbnRWZXJpZmllZCIsInByb29mVmVyaWZpZWQiLCJtZXRhdGhlb3JlbSIsImFkZE1ldGF0aGVvcmVtIiwiZGVidWciLCJ0b0pTT04iLCJsYWJlbHNKU09OIiwibGFiZWxzVG9MYWJlbHNKU09OIiwiY29uc2VxdWVudEpTT04iLCJjb25zZXF1ZW50VG9Db25zZXF1ZW50SlNPTiIsInN1cHBvc2l0aW9uc0pTT04iLCJzdXBwb3NpdGlvbnNUb1N1cHBvc2l0aW9uc0pTT04iLCJzdWJzdGl0dXRpb25zSlNPTiIsInN1YnN0aXR1dGlvbnNUb1N1YnN0aXR1dGlvbnNKU09OIiwianNvbiIsImZyb21KU09OIiwibGFiZWxzRnJvbUpTT04iLCJjb25zZXF1ZW50RnJvbUpTT04iLCJzdXBwb3NpdGlvbnNGcm9tSlNPTiIsInN1YnN0aXR1dGlvbnNGcm9tSlNPTiIsInN0cmluZ0Zyb21MYWJlbHMiLCJ0b3BMZXZlbEFzc2VydGlvbiIsImZyb21NZXRhdGhlb3JlbU5vZGUiLCJtZXRhdGhlb3JlbU5vZGUiLCJwcm9vZk5vZGUiLCJsYWJlbE5vZGVzIiwiY29uc2VxdWVudE5vZGUiLCJzdXBwb3NpdGlvbk5vZGVzIiwibWFwIiwibGFiZWxOb2RlIiwiTGFiZWwiLCJmcm9tTGFiZWxOb2RlIiwic3VwcG9zaXRpb25Ob2RlIiwiU3VwcG9zaXRpb24iLCJmcm9tU3VwcG9zaXRpb25Ob2RlIiwiQ29uc2VxdWVudCIsImZyb21Db25zZXF1ZW50Tm9kZSIsIlByb29mIiwiZnJvbVByb29mTm9kZSIsIlN1YnN0aXR1dGlvbnMiLCJmcm9tTm90aGluZyIsIlRvcExldmVsQXNzZXJ0aW9uIiwiT2JqZWN0IiwiYXNzaWduIiwic2hpbSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBbUpBOzs7ZUFBQTs7OzJEQWpKaUI7NERBQ0M7NERBQ0E7aUVBQ0s7a0VBQ0M7NERBQ0M7b0VBQ0M7eUVBQ0k7cUJBRVE7b0JBU1c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVqRCxJQUFNQSxpQkFBaUJDLElBQUFBLGdCQUFTLEVBQUMsdUJBQzNCQyxrQkFBa0JDLElBQUFBLGlCQUFVLEVBQUMsdUJBQzdCQyxzQkFBc0JILElBQUFBLGdCQUFTLEVBQUMsNEJBQ2hDSSx3QkFBd0JGLElBQUFBLGlCQUFVLEVBQUM7QUFFekMsSUFBQSxBQUFNRyw0QkFBTjtjQUFNQTthQUFBQSxZQUNRQyxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUFFQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsS0FBSyxFQUFFQyxhQUFhO2dDQURuRlA7O2dCQUVGLGtCQUZFQTtZQUVJQztZQUFhQztZQUFRQztZQUFRQztZQUFjQztZQUFZQzs7UUFFN0QsTUFBS0MsYUFBYSxHQUFHQTs7O2tCQUpuQlA7O1lBT0pRLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0QsYUFBYTtZQUMzQjs7O1lBRUFFLEtBQUFBO21CQUFBQSxTQUFBQTs7Z0JBQ0UsSUFBSUMsV0FBVztnQkFFZixJQUFNQyxvQkFBb0IsSUFBSSxDQUFDVCxNQUFNLEVBQUcsR0FBRztnQkFFM0MsSUFBSSxDQUFDRCxXQUFXLENBQUNXLEtBQUssQ0FBQyxBQUFDLGtCQUFtQyxPQUFsQkQsbUJBQWtCO2dCQUUzRCxJ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
@@ -9,13 +9,14 @@ Object.defineProperty(exports, "default", {
9
9
  }
10
10
  });
11
11
  var _shim = /*#__PURE__*/ _interop_require_default(require("./shim"));
12
- var _argument = /*#__PURE__*/ _interop_require_default(require("./argument"));
13
12
  var _local = /*#__PURE__*/ _interop_require_default(require("./context/local"));
14
13
  var _metavariable = /*#__PURE__*/ _interop_require_default(require("./unifier/metavariable"));
14
+ var _frameForMetavariable = /*#__PURE__*/ _interop_require_default(require("./substitution/frameForMetavariable"));
15
15
  var _statementForMetavariable = /*#__PURE__*/ _interop_require_default(require("./substitution/statementForMetavariable"));
16
16
  var _query = require("./utilities/query");
17
- var _name = require("./utilities/name");
18
17
  var _node = require("./utilities/node");
18
+ var _json = require("./utilities/json");
19
+ var _name = require("./utilities/name");
19
20
  function _class_call_check(instance, Constructor) {
20
21
  if (!(instance instanceof Constructor)) {
21
22
  throw new TypeError("Cannot call a class as a function");
@@ -40,7 +41,7 @@ function _interop_require_default(obj) {
40
41
  default: obj
41
42
  };
42
43
  }
43
- var argumentNodeQuery = (0, _query.nodeQuery)("/metavariable/argument"), metaTypeNodeQuery = (0, _query.nodeQuery)("/metavariableDeclaration/metaType"), metavariableNodeQuery = (0, _query.nodeQuery)("/metavariableDeclaration/metavariable"), statementMetavariableNodeQuery = (0, _query.nodeQuery)("/statement/metavariable!");
44
+ var termNodeQuery = (0, _query.nodeQuery)("/metavariable/argument/term"), typeNodeQuery = (0, _query.nodeQuery)("/metavariable/argument/type"), metaTypeNodeQuery = (0, _query.nodeQuery)("/metavariableDeclaration/metaType"), metavariableNodeQuery = (0, _query.nodeQuery)("/metavariableDeclaration/metavariable"), frameMetavariableNodeQuery = (0, _query.nodeQuery)("/frame/metavariable!"), statementMetavariableNodeQuery = (0, _query.nodeQuery)("/statement/metavariable!");
44
45
  var Metavariable = /*#__PURE__*/ function() {
45
46
  function Metavariable(fileContext, string, node, name, metaType) {
46
47
  _class_call_check(this, Metavariable);
@@ -88,6 +89,13 @@ var Metavariable = /*#__PURE__*/ function() {
88
89
  return metaTypeName;
89
90
  }
90
91
  },
92
+ {
93
+ key: "matchMetaType",
94
+ value: function matchMetaType(metaType) {
95
+ var metaTypeMatches = this.metaType === metaType;
96
+ return metaTypeMatches;
97
+ }
98
+ },
91
99
  {
92
100
  key: "matchMetavariableName",
93
101
  value: function matchMetavariableName(metavariableName) {
@@ -102,6 +110,80 @@ var Metavariable = /*#__PURE__*/ function() {
102
110
  return metavariableNodeMatches;
103
111
  }
104
112
  },
113
+ {
114
+ key: "unifyFrame",
115
+ value: function unifyFrame(frame, substitutions, localContext) {
116
+ var frameUnified = false;
117
+ var frameNode = frame.getNode(), frameString = frame.getString(), metavariableString = this.string; ///
118
+ localContext.trace("Unifying the '".concat(frameString, "' frame with the '").concat(metavariableString, "' metavariable..."));
119
+ var metavariableName = this.name, simpleSubstitutionPresent = substitutions.isSimpleSubstitutionPresentByMetavariableName(metavariableName);
120
+ if (simpleSubstitutionPresent) {
121
+ var simpleSubstitution = substitutions.findSimpleSubstitutionByMetavariableName(metavariableName), substitution = simpleSubstitution, frameNodeMatches = substitution.matchFrameNode(frameNode);
122
+ if (frameNodeMatches) {
123
+ frameUnified = true;
124
+ }
125
+ } else {
126
+ var metavariableNode = this.node, metavariable = metavariableFromMetavariableNode(metavariableNode, localContext), frameMetavariable = frameMetavariableFromStatementNode(frameNode, localContext);
127
+ if (metavariable === frameMetavariable) {
128
+ frameUnified = true;
129
+ } else {
130
+ var metavariable1 = this, frameForMetavariableSubstitution = _frameForMetavariable.default.fromFrameAndMetavariable(frame, metavariable1, localContext), substitution1 = frameForMetavariableSubstitution; ///
131
+ substitutions.addSubstitution(substitution1, localContext);
132
+ frameUnified = true;
133
+ }
134
+ }
135
+ if (frameUnified) {
136
+ localContext.debug("...unified the '".concat(frameString, "' frame with the '").concat(metavariableString, "' metavariable."));
137
+ }
138
+ return frameUnified;
139
+ }
140
+ },
141
+ {
142
+ key: "unifyStatement",
143
+ value: function unifyStatement(statement, substitution, substitutions, localContext) {
144
+ var statementUnified = false;
145
+ var statementString = statement.getString(), metavariableString = this.string, substitutionString = substitution !== null ? substitution.getString() : null;
146
+ substitutionString !== null ? localContext.trace("Unifying the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable given the ").concat(substitutionString, " substitution...")) : localContext.trace("Unifying the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable..."));
147
+ var statementNode = statement.getNode(), metavariableNode = this.node, metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), substitutionNode = substitution !== null ? substitution.getSubstitutionNode() : null, substitutionPresent = substitutions.isSubstitutionPresentByMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode);
148
+ if (substitutionPresent) {
149
+ var _$substitution = substitutions.findSubstitutionByMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode), statementNodeMatches = _$substitution.matchStatementNode(statementNode);
150
+ if (statementNodeMatches) {
151
+ statementUnified = true;
152
+ }
153
+ } else {
154
+ var metavariableNode1 = this.node, metavariable = metavariableFromMetavariableNode(metavariableNode1, localContext), statementMetavariable = statementMetavariableFromStatementNode(statementNode, localContext);
155
+ if (metavariable === statementMetavariable) {
156
+ statementUnified = true;
157
+ } else {
158
+ var metavariable1 = this, statementForMetavariableSubstitution = _statementForMetavariable.default.fromStatementMetavariableAndSubstitution(statement, metavariable1, substitution, localContext);
159
+ substitution = statementForMetavariableSubstitution; ///
160
+ substitutions.addSubstitution(substitution, localContext);
161
+ statementUnified = true;
162
+ }
163
+ }
164
+ if (statementUnified) {
165
+ substitutionString !== null ? localContext.debug("...unified the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable given the ").concat(substitutionString, " substitution.")) : localContext.debug("...unified the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable."));
166
+ }
167
+ return statementUnified;
168
+ }
169
+ },
170
+ {
171
+ key: "unifySubstitution",
172
+ value: function unifySubstitution(substitution, localContext) {
173
+ var substitutionUnified = false;
174
+ var metavariableString = this.string, substitutionString = substitution.getString();
175
+ localContext.trace("Unifying the '".concat(substitutionString, "' substitution with the '").concat(metavariableString, "' metavariable..."));
176
+ var metavariableName = this.name, judgement = localContext.findJudgementByMetavariableName(metavariableName);
177
+ if (judgement !== null) {
178
+ var declaration = judgement.getDeclaration();
179
+ substitutionUnified = declaration.unifySubstitution(substitution, localContext);
180
+ }
181
+ if (substitutionUnified) {
182
+ localContext.debug("...unified the '".concat(substitutionString, "' substitution with the '").concat(metavariableString, "' metavariable."));
183
+ }
184
+ return substitutionUnified;
185
+ }
186
+ },
105
187
  {
106
188
  key: "verify",
107
189
  value: function verify(localContext) {
@@ -129,12 +211,20 @@ var Metavariable = /*#__PURE__*/ function() {
129
211
  if (metavariablePresent) {
130
212
  fileContext.debug("The metavariable '".concat(metavariableString, "' is already present."));
131
213
  } else {
132
- var argumentNode = argumentNodeQuery(metavariableNode), argument = _argument.default.fromArgumentNode(argumentNode, fileContext);
133
- if (argument === null) {
134
- verifiedAtTopLevel = true;
214
+ var termNode = termNodeQuery(this.node);
215
+ if (termNode !== null) {
216
+ var termString = this.fileContext.nodeAsString(termNode);
217
+ this.fileContext.debug("The '".concat(termString, "' term was found when a type should have been present."));
135
218
  } else {
136
- var argumentVerified = argument.verify(fileContext);
137
- if (argumentVerified) {
219
+ var typeNode = typeNodeQuery(this.node);
220
+ if (typeNode !== null) {
221
+ var typeName = (0, _name.typeNameFromTypeNode)(typeNode), typePresent = this.fileContext.isTypePresentByTypeName(typeName);
222
+ if (typePresent) {
223
+ verifiedAtTopLevel = true;
224
+ } else {
225
+ this.fileContext.debug("The '".concat(typeName, "' type is not present."));
226
+ }
227
+ } else {
138
228
  verifiedAtTopLevel = true;
139
229
  }
140
230
  }
@@ -146,36 +236,26 @@ var Metavariable = /*#__PURE__*/ function() {
146
236
  }
147
237
  },
148
238
  {
149
- key: "unifyStatement",
150
- value: function unifyStatement(statement, substitution, substitutions, localContext) {
151
- var statementUnified = false;
152
- var statementString = statement.getString(), metavariableString = this.string, substitutionString = substitution !== null ? substitution.getString() : null;
153
- substitutionString !== null ? localContext.trace("Unifying the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable given the ").concat(substitutionString, " substitution...")) : localContext.trace("Unifying the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable..."));
154
- var statementNode = statement.getNode(), metavariableNode = this.node, substitutionNode = substitution !== null ? substitution.getSubstitutionNode() : null, substitutionPresent = substitutions.isSubstitutionPresentByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
155
- if (substitutionPresent) {
156
- var _$substitution = substitutions.findSubstitutionByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode), statementNodeMatches = _$substitution.matchStatementNode(statementNode);
157
- if (statementNodeMatches) {
158
- statementUnified = true;
159
- }
160
- } else {
161
- var metavariable = this, statementMetavariable = statementMetavariableFromStatementNode(statementNode, localContext);
162
- if (metavariable === statementMetavariable) {
163
- statementUnified = true;
164
- } else {
165
- var statementForMetavariableSubstitution = _statementForMetavariable.default.fromStatementMetavariableAndSubstitution(statement, metavariable, substitution, localContext);
166
- substitution = statementForMetavariableSubstitution; ///
167
- substitutions.addSubstitution(substitution, localContext);
168
- statementUnified = true;
169
- }
239
+ key: "verifyGivenMetaType",
240
+ value: function verifyGivenMetaType(metaType, localContext) {
241
+ var verifiedGivenMetaType = false;
242
+ var metavariableString = this.string, metaTypeString = metaType.getString();
243
+ localContext.trace("Verifying the '".concat(metavariableString, "' metavariable given the '").concat(metaTypeString, "' meta-type..."));
244
+ var name = this.getName(), metavariableName = name, metavariable = localContext.findMetavariableByMetavariableName(metavariableName);
245
+ if (metavariable !== null) {
246
+ var metaTypeMatches = metavariable.matchMetaType(metaType);
247
+ verifiedGivenMetaType = metaTypeMatches; ///
170
248
  }
171
- substitutionString !== null ? localContext.debug("...unified the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable given the ").concat(substitutionString, " substitution.")) : localContext.debug("...unified the '".concat(statementString, "' statement with the '").concat(metavariableString, "' metavariable."));
172
- return statementUnified;
249
+ if (verifiedGivenMetaType) {
250
+ localContext.debug("...verified the '".concat(metavariableString, "' metavariable given the '").concat(metaTypeString, "' meta-type."));
251
+ }
252
+ return verifiedGivenMetaType;
173
253
  }
174
254
  },
175
255
  {
176
256
  key: "toJSON",
177
257
  value: function toJSON() {
178
- var metaTypeJSON = this.metaType !== null ? this.metaType.toJSON() : null, string = this.string, metaType = metaTypeJSON, json = {
258
+ var metaTypeJSON = (0, _json.metaTypeToMetaTypeJSON)(this.metaType), metaType = metaTypeJSON, string = this.string, json = {
179
259
  string: string,
180
260
  metaType: metaType
181
261
  };
@@ -186,17 +266,17 @@ var Metavariable = /*#__PURE__*/ function() {
186
266
  {
187
267
  key: "fromJSON",
188
268
  value: function fromJSON(json, fileContext) {
189
- var string = json.string, lexer = fileContext.getLexer(), parser = fileContext.getParser(), metavariableString = string, metavariableNode = (0, _node.metavariableNodeFromMetavariableString)(metavariableString, lexer, parser), metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), node = metavariableNode, name = metavariableName, metaType = metaTypeFromJSON(json, fileContext), metavariable = new Metavariable(fileContext, string, node, name, metaType);
269
+ var string = json.string, lexer = fileContext.getLexer(), parser = fileContext.getParser(), metavariableString = string, metavariableNode = (0, _node.metavariableNodeFromMetavariableString)(metavariableString, lexer, parser), metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), node = metavariableNode, name = metavariableName, metaType = (0, _json.metaTypeFromJSON)(json, fileContext), metavariable = new Metavariable(fileContext, string, node, name, metaType);
190
270
  return metavariable;
191
271
  }
192
272
  },
193
273
  {
194
274
  key: "fromMetavariableNode",
195
- value: function fromMetavariableNode(metavariableNode, fileContext) {
275
+ value: function fromMetavariableNode(metavariableNode, localContext) {
196
276
  var metavariable = null;
197
277
  if (metavariableNode !== null) {
198
- var metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), node = metavariableNode, name = metavariableName, string = fileContext.nodeAsString(node), metaType = null;
199
- metavariable = new Metavariable(fileContext, string, node, name, metaType);
278
+ var metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), node = metavariableNode, name = metavariableName, string = localContext.nodeAsString(node), metaType = null;
279
+ metavariable = new Metavariable(localContext, string, node, name, metaType);
200
280
  }
201
281
  return metavariable;
202
282
  }
@@ -215,13 +295,18 @@ Object.assign(_shim.default, {
215
295
  Metavariable: Metavariable
216
296
  });
217
297
  var _default = Metavariable;
218
- function metaTypeFromJSON(json, fileContext) {
219
- var metaType = json.metaType;
220
- if (metaType !== null) {
221
- var name = metaType.name, metaTypeName = name; ///
222
- metaType = fileContext.findMetaTypeByMetaTypeName(metaTypeName);
298
+ function metavariableFromMetavariableNode(metavariableNode, localContext) {
299
+ var metavariableName = (0, _name.metavariableNameFromMetavariableNode)(metavariableNode), metavariable = localContext.findMetavariableByMetavariableName(metavariableName);
300
+ return metavariable;
301
+ }
302
+ function frameMetavariableFromStatementNode(frameNode, localContext) {
303
+ var frameMetavariable = null;
304
+ var frameMetavariableNode = frameMetavariableNodeQuery(frameNode);
305
+ if (frameMetavariableNode !== null) {
306
+ var frameMetavariableName = (0, _name.metavariableNameFromMetavariableNode)(frameMetavariableNode);
307
+ frameMetavariable = localContext.findMetavariableByMetavariableName(frameMetavariableName);
223
308
  }
224
- return metaType;
309
+ return frameMetavariable;
225
310
  }
226
311
  function statementMetavariableFromStatementNode(statementNode, localContext) {
227
312
  var statementMetavariable = null;
@@ -233,4 +318,4 @@ function statementMetavariableFromStatementNode(statementNode, localContext) {
233
318
  return statementMetavariable;
234
319
  }
235
320
 
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhdmFyaWFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBzaGltIGZyb20gXCIuL3NoaW1cIjtcbmltcG9ydCBBcmd1bWVudCBmcm9tIFwiLi9hcmd1bWVudFwiO1xuaW1wb3J0IExvY2FsQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0L2xvY2FsXCI7XG5pbXBvcnQgbWV0YXZhcmlhYmxlVW5pZmllciBmcm9tIFwiLi91bmlmaWVyL21ldGF2YXJpYWJsZVwiO1xuaW1wb3J0IFN0YXRlbWVudEZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbiBmcm9tIFwiLi9zdWJzdGl0dXRpb24vc3RhdGVtZW50Rm9yTWV0YXZhcmlhYmxlXCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlIH0gZnJvbSBcIi4vdXRpbGl0aWVzL25hbWVcIjtcbmltcG9ydCB7IG1ldGF2YXJpYWJsZU5vZGVGcm9tTWV0YXZhcmlhYmxlU3RyaW5nIH0gZnJvbSBcIi4vdXRpbGl0aWVzL25vZGVcIjtcblxuY29uc3QgYXJndW1lbnROb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlL2FyZ3VtZW50XCIpLFxuICAgICAgbWV0YVR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlRGVjbGFyYXRpb24vbWV0YVR5cGVcIiksXG4gICAgICBtZXRhdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlRGVjbGFyYXRpb24vbWV0YXZhcmlhYmxlXCIpLFxuICAgICAgc3RhdGVtZW50TWV0YXZhcmlhYmxlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3N0YXRlbWVudC9tZXRhdmFyaWFibGUhXCIpO1xuXG5jbGFzcyBNZXRhdmFyaWFibGUge1xuICBjb25zdHJ1Y3RvcihmaWxlQ29udGV4dCwgc3RyaW5nLCBub2RlLCBuYW1lLCBtZXRhVHlwZSkge1xuICAgIHRoaXMuZmlsZUNvbnRleHQgPSBmaWxlQ29udGV4dDtcbiAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0RmlsZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRleHQ7XG4gIH1cblxuICBnZXRTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICB9XG5cbiAgZ2V0Tm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlO1xuICB9XG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0TWV0YVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YVR5cGU7XG4gIH1cblxuICBnZXRNZXRhVHlwZU5hbWUoKSB7XG4gICAgY29uc3QgbWV0YVR5cGVOYW1lID0gdGhpcy5tZXRhVHlwZS5nZXROYW1lKCk7XG5cbiAgICByZXR1cm4gbWV0YVR5cGVOYW1lO1xuICB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOYW1lTWF0Y2hlcyA9ICh0aGlzLm5hbWUgPT09IG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZU5hbWVNYXRjaGVzO1xuICB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHRoaXMubm9kZS5tYXRjaChtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcztcbiAgfVxuXG4gIHZlcmlmeShsb2NhbENvbnRleHQpIHtcbiAgICBsZXQgdmVyaWZpZWQ7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVOYW1lID0gdGhpcy5uYW1lLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IGxvY2FsQ29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVCID0gdGhpcyxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVBID0gbWV0YXZhcmlhYmxlQS5nZXROb2RlKCksIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZUIgPSBtZXRhdmFyaWFibGVCLmdldE5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZVVuaWZpZWQgPSBtZXRhdmFyaWFibGVVbmlmaWVyLnVuaWZ5KG1ldGF2YXJpYWJsZU5vZGVBLCBtZXRhdmFyaWFibGVOb2RlQiwgbG9jYWxDb250ZXh0KTtcblxuICAgICAgdmVyaWZpZWQgPSBtZXRhdmFyaWFibGVVbmlmaWVkOyAvLy9cblxuICAgIH1cblxuICAgIGlmICh2ZXJpZmllZCkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZmllZDtcbiAgfVxuXG4gIHZlcmlmeUF0VG9wTGV2ZWwoZmlsZUNvbnRleHQpIHtcbiAgICBsZXQgdmVyaWZpZWRBdFRvcExldmVsID0gZmFsc2U7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBmaWxlQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgYXQgdG9wIGxldmVsLi4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5ub2RlLCAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSBmaWxlQ29udGV4dC5pc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlUHJlc2VudCkge1xuICAgICAgZmlsZUNvbnRleHQuZGVidWcoYFRoZSBtZXRhdmFyaWFibGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcmd1bWVudE5vZGUgPSBhcmd1bWVudE5vZGVRdWVyeShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICAgIGFyZ3VtZW50ID0gQXJndW1lbnQuZnJvbUFyZ3VtZW50Tm9kZShhcmd1bWVudE5vZGUsIGZpbGVDb250ZXh0KTtcblxuICAgICAgaWYgKGFyZ3VtZW50ID09PSBudWxsKSB7XG4gICAgICAgIHZlcmlmaWVkQXRUb3BMZXZlbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhcmd1bWVudFZlcmlmaWVkID0gYXJndW1lbnQudmVyaWZ5KGZpbGVDb250ZXh0KTtcblxuICAgICAgICBpZiAoYXJndW1lbnRWZXJpZmllZCkge1xuICAgICAgICAgIHZlcmlmaWVkQXRUb3BMZXZlbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZWRBdFRvcExldmVsKSB7XG4gICAgICBmaWxlQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBhdCB0b3AgbGV2ZWwuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVkQXRUb3BMZXZlbDtcbiAgfVxuXG4gIHVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgc3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50VW5pZmllZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuc3RyaW5nLCAvLy9cbiAgICAgICAgICBzdWJzdGl0dXRpb25TdHJpbmcgPSAoc3Vic3RpdHV0aW9uICE9PSBudWxsKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLmdldFN0cmluZygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7XG5cbiAgICAoc3Vic3RpdHV0aW9uU3RyaW5nICE9PSBudWxsKSA/XG4gICAgICBsb2NhbENvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGdpdmVuIHRoZSAke3N1YnN0aXR1dGlvblN0cmluZ30gc3Vic3RpdHV0aW9uLi4uYCkgOlxuICAgICAgICBsb2NhbENvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50LmdldE5vZGUoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5ub2RlLCAvLy9cbiAgICAgICAgICBzdWJzdGl0dXRpb25Ob2RlID0gKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbi5nZXRTdWJzdGl0dXRpb25Ob2RlKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzdWJzdGl0dXRpb25QcmVzZW50ID0gc3Vic3RpdHV0aW9ucy5pc1N1YnN0aXR1dGlvblByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgaWYgKHN1YnN0aXR1dGlvblByZXNlbnQpIHtcbiAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnMuZmluZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUobWV0YXZhcmlhYmxlTm9kZSwgc3Vic3RpdHV0aW9uTm9kZSksXG4gICAgICAgICAgICBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN1YnN0aXR1dGlvbi5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcywgLy8vXG4gICAgICAgICAgICBzdGF0ZW1lbnRNZXRhdmFyaWFibGUgPSBzdGF0ZW1lbnRNZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlLCBsb2NhbENvbnRleHQpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlID09PSBzdGF0ZW1lbnRNZXRhdmFyaWFibGUpIHtcbiAgICAgICAgc3RhdGVtZW50VW5pZmllZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24gPSBTdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24uZnJvbVN0YXRlbWVudE1ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbihzdGF0ZW1lbnQsIG1ldGF2YXJpYWJsZSwgc3Vic3RpdHV0aW9uLCBsb2NhbENvbnRleHQpO1xuXG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN0YXRlbWVudEZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgICAgIHN1YnN0aXR1dGlvbnMuYWRkU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbiwgbG9jYWxDb250ZXh0KTtcblxuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAoc3Vic3RpdHV0aW9uU3RyaW5nICE9PSBudWxsKSA/XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgZ2l2ZW4gdGhlICR7c3Vic3RpdHV0aW9uU3RyaW5nfSBzdWJzdGl0dXRpb24uYCkgOlxuICAgICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50VW5pZmllZDtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBtZXRhVHlwZUpTT04gPSAodGhpcy5tZXRhVHlwZSAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YVR5cGUudG9KU09OKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLnN0cmluZyxcbiAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlSlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICBtZXRhVHlwZVxuICAgICAgICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCkge1xuICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgIGxleGVyICA9IGZpbGVDb250ZXh0LmdldExleGVyKCksXG4gICAgICAgICAgcGFyc2VyID0gZmlsZUNvbnRleHQuZ2V0UGFyc2VyKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gc3RyaW5nLCAgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVGcm9tTWV0YXZhcmlhYmxlU3RyaW5nKG1ldGF2YXJpYWJsZVN0cmluZywgbGV4ZXIsIHBhcnNlciksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBub2RlID0gbWV0YXZhcmlhYmxlTm9kZSwgIC8vL1xuICAgICAgICAgIG5hbWUgPSBtZXRhdmFyaWFibGVOYW1lLCAgLy8vXG4gICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUZyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBuZXcgTWV0YXZhcmlhYmxlKGZpbGVDb250ZXh0LCBzdHJpbmcsIG5vZGUsIG5hbWUsIG1ldGFUeXBlKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBzdGF0aWMgZnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgZmlsZUNvbnRleHQpIHtcbiAgICBsZXQgbWV0YXZhcmlhYmxlID0gbnVsbDtcblxuICAgIGlmIChtZXRhdmFyaWFibGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICAgIG5hbWUgPSBtZXRhdmFyaWFibGVOYW1lLCAgLy8vXG4gICAgICAgICAgICBzdHJpbmcgPSBmaWxlQ29udGV4dC5ub2RlQXNTdHJpbmcobm9kZSksXG4gICAgICAgICAgICBtZXRhVHlwZSA9IG51bGw7XG5cbiAgICAgIG1ldGF2YXJpYWJsZSA9IG5ldyBNZXRhdmFyaWFibGUoZmlsZUNvbnRleHQsIHN0cmluZywgbm9kZSwgbmFtZSwgbWV0YVR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBzdGF0aWMgZnJvbU1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZShtZXRhdmFyaWFibGVEZWNsYXJhdGlvbk5vZGUsIGZpbGVDb250ZXh0KSB7XG4gICAgY29uc3QgeyBNZXRhVHlwZSB9ID0gc2hpbSxcbiAgICAgICAgICBtZXRhVHlwZU5vZGUgPSBtZXRhVHlwZU5vZGVRdWVyeShtZXRhdmFyaWFibGVEZWNsYXJhdGlvbk5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkobWV0YXZhcmlhYmxlRGVjbGFyYXRpb25Ob2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIGxvY2FsQ29udGV4dCA9IExvY2FsQ29udGV4dC5mcm9tRmlsZUNvbnRleHQoZmlsZUNvbnRleHQpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IGZpbGVDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBzdHJpbmcgPSBtZXRhdmFyaWFibGVTdHJpbmcsICAvLy9cbiAgICAgICAgICBub2RlID0gbWV0YXZhcmlhYmxlTm9kZSwgIC8vL1xuICAgICAgICAgIG5hbWUgPSBtZXRhdmFyaWFibGVOYW1lLCAgLy8vXG4gICAgICAgICAgbWV0YVR5cGUgPSBNZXRhVHlwZS5mcm9tTWV0YVR5cGVOb2RlKG1ldGFUeXBlTm9kZSwgbG9jYWxDb250ZXh0KSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBuZXcgTWV0YXZhcmlhYmxlKGZpbGVDb250ZXh0LCBzdHJpbmcsIG5vZGUsIG5hbWUsIG1ldGFUeXBlKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cbn1cblxuT2JqZWN0LmFzc2lnbihzaGltLCB7XG4gIE1ldGF2YXJpYWJsZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IE1ldGF2YXJpYWJsZTtcblxuZnVuY3Rpb24gbWV0YVR5cGVGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCkge1xuICBsZXQgeyBtZXRhVHlwZSB9ID0ganNvbjtcblxuICBpZiAobWV0YVR5cGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IG1ldGFUeXBlLFxuICAgICAgICAgIG1ldGFUeXBlTmFtZSA9IG5hbWU7ICAvLy9cblxuICAgIG1ldGFUeXBlID0gZmlsZUNvbnRleHQuZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBtZXRhVHlwZTtcbn1cblxuZnVuY3Rpb24gc3RhdGVtZW50TWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRNZXRhdmFyaWFibGUgPSBudWxsO1xuXG4gIGNvbnN0IHN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGUgPSBzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKHN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKHN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgc3RhdGVtZW50TWV0YXZhcmlhYmxlID0gbG9jYWxDb250ZXh0LmZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUoc3RhdGVtZW50TWV0YXZhcmlhYmxlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50TWV0YXZhcmlhYmxlO1xufVxuIl0sIm5hbWVzIjpbImFyZ3VtZW50Tm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwibWV0YVR5cGVOb2RlUXVlcnkiLCJtZXRhdmFyaWFibGVOb2RlUXVlcnkiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlUXVlcnkiLCJNZXRhdmFyaWFibGUiLCJmaWxlQ29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJuYW1lIiwibWV0YVR5cGUiLCJnZXRGaWxlQ29udGV4dCIsImdldFN0cmluZyIsImdldE5vZGUiLCJnZXROYW1lIiwiZ2V0TWV0YVR5cGUiLCJnZXRNZXRhVHlwZU5hbWUiLCJtZXRhVHlwZU5hbWUiLCJtYXRjaE1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVOYW1lIiwibWV0YXZhcmlhYmxlTmFtZU1hdGNoZXMiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMiLCJtYXRjaCIsInZlcmlmeSIsImxvY2FsQ29udGV4dCIsInZlcmlmaWVkIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwidHJhY2UiLCJtZXRhdmFyaWFibGUiLCJmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lIiwibWV0YXZhcmlhYmxlQSIsIm1ldGF2YXJpYWJsZUIiLCJtZXRhdmFyaWFibGVOb2RlQSIsIm1ldGF2YXJpYWJsZU5vZGVCIiwibWV0YXZhcmlhYmxlVW5pZmllZCIsIm1ldGF2YXJpYWJsZVVuaWZpZXIiLCJ1bmlmeSIsImRlYnVnIiwidmVyaWZ5QXRUb3BMZXZlbCIsInZlcmlmaWVkQXRUb3BMZXZlbCIsIm1ldGF2YXJpYWJsZU5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZVByZXNlbnQiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJhcmd1bWVudE5vZGUiLCJhcmd1bWVudCIsIkFyZ3VtZW50IiwiZnJvbUFyZ3VtZW50Tm9kZSIsImFyZ3VtZW50VmVyaWZpZWQiLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbnMiLCJzdGF0ZW1lbnRVbmlmaWVkIiwic3RhdGVtZW50U3RyaW5nIiwic3Vic3RpdHV0aW9uU3RyaW5nIiwic3RhdGVtZW50Tm9kZSIsInN1YnN0aXR1dGlvbk5vZGUiLCJnZXRTdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uUHJlc2VudCIsImlzU3Vic3RpdHV0aW9uUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUiLCJmaW5kU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50TWV0YXZhcmlhYmxlIiwic3RhdGVtZW50TWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24iLCJTdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24iLCJmcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwiYWRkU3Vic3RpdHV0aW9uIiwidG9KU09OIiwibWV0YVR5cGVKU09OIiwianNvbiIsImZyb21KU09OIiwibGV4ZXIiLCJnZXRMZXhlciIsInBhcnNlciIsImdldFBhcnNlciIsIm1ldGF2YXJpYWJsZU5vZGVGcm9tTWV0YXZhcmlhYmxlU3RyaW5nIiwibWV0YVR5cGVGcm9tSlNPTiIsImZyb21NZXRhdmFyaWFibGVOb2RlIiwibm9kZUFzU3RyaW5nIiwiZnJvbU1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZSIsIm1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZSIsIk1ldGFUeXBlIiwic2hpbSIsIm1ldGFUeXBlTm9kZSIsIkxvY2FsQ29udGV4dCIsImZyb21GaWxlQ29udGV4dCIsImZyb21NZXRhVHlwZU5vZGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSIsInN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGUiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVOYW1lIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFvUEE7OztlQUFBOzs7MkRBbFBpQjsrREFDSTs0REFDSTttRUFDTzsrRUFDaUI7cUJBRXZCO29CQUMyQjtvQkFDRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV2RCxJQUFNQSxvQkFBb0JDLElBQUFBLGdCQUFTLEVBQUMsMkJBQzlCQyxvQkFBb0JELElBQUFBLGdCQUFTLEVBQUMsc0NBQzlCRSx3QkFBd0JGLElBQUFBLGdCQUFTLEVBQUMsMENBQ2xDRyxpQ0FBaUNILElBQUFBLGdCQUFTLEVBQUM7QUFFakQsSUFBQSxBQUFNSSw2QkFBTjthQUFNQSxhQUNRQyxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEVBQUVD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
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhdmFyaWFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBzaGltIGZyb20gXCIuL3NoaW1cIjtcbmltcG9ydCBMb2NhbENvbnRleHQgZnJvbSBcIi4vY29udGV4dC9sb2NhbFwiO1xuaW1wb3J0IG1ldGF2YXJpYWJsZVVuaWZpZXIgZnJvbSBcIi4vdW5pZmllci9tZXRhdmFyaWFibGVcIjtcbmltcG9ydCBGcmFtZUZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbiBmcm9tIFwiLi9zdWJzdGl0dXRpb24vZnJhbWVGb3JNZXRhdmFyaWFibGVcIjtcbmltcG9ydCBTdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24gZnJvbSBcIi4vc3Vic3RpdHV0aW9uL3N0YXRlbWVudEZvck1ldGF2YXJpYWJsZVwiO1xuXG5pbXBvcnQgeyBub2RlUXVlcnkgfSBmcm9tIFwiLi91dGlsaXRpZXMvcXVlcnlcIjtcbmltcG9ydCB7IG1ldGF2YXJpYWJsZU5vZGVGcm9tTWV0YXZhcmlhYmxlU3RyaW5nIH0gZnJvbSBcIi4vdXRpbGl0aWVzL25vZGVcIjtcbmltcG9ydCB7IG1ldGFUeXBlRnJvbUpTT04sIG1ldGFUeXBlVG9NZXRhVHlwZUpTT04gfSBmcm9tIFwiLi91dGlsaXRpZXMvanNvblwiO1xuaW1wb3J0IHsgdHlwZU5hbWVGcm9tVHlwZU5vZGUsIG1ldGF2YXJpYWJsZU5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZSB9IGZyb20gXCIuL3V0aWxpdGllcy9uYW1lXCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlL2FyZ3VtZW50L3Rlcm1cIiksXG4gICAgICB0eXBlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL21ldGF2YXJpYWJsZS9hcmd1bWVudC90eXBlXCIpLFxuICAgICAgbWV0YVR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlRGVjbGFyYXRpb24vbWV0YVR5cGVcIiksXG4gICAgICBtZXRhdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YXZhcmlhYmxlRGVjbGFyYXRpb24vbWV0YXZhcmlhYmxlXCIpLFxuICAgICAgZnJhbWVNZXRhdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvZnJhbWUvbWV0YXZhcmlhYmxlIVwiKSxcbiAgICAgIHN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvbWV0YXZhcmlhYmxlIVwiKTtcblxuY2xhc3MgTWV0YXZhcmlhYmxlIHtcbiAgY29uc3RydWN0b3IoZmlsZUNvbnRleHQsIHN0cmluZywgbm9kZSwgbmFtZSwgbWV0YVR5cGUpIHtcbiAgICB0aGlzLmZpbGVDb250ZXh0ID0gZmlsZUNvbnRleHQ7XG4gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubWV0YVR5cGUgPSBtZXRhVHlwZTtcbiAgfVxuXG4gIGdldEZpbGVDb250ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZXh0O1xuICB9XG5cbiAgZ2V0U3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmluZztcbiAgfVxuXG4gIGdldE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIGdldE1ldGFUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0TWV0YVR5cGVOYW1lKCkge1xuICAgIGNvbnN0IG1ldGFUeXBlTmFtZSA9IHRoaXMubWV0YVR5cGUuZ2V0TmFtZSgpO1xuXG4gICAgcmV0dXJuIG1ldGFUeXBlTmFtZTtcbiAgfVxuXG4gIG1hdGNoTWV0YVR5cGUobWV0YVR5cGUpIHtcbiAgICBjb25zdCBtZXRhVHlwZU1hdGNoZXMgPSAodGhpcy5tZXRhVHlwZSA9PT0gbWV0YVR5cGUpO1xuXG4gICAgcmV0dXJuIG1ldGFUeXBlTWF0Y2hlcztcbiAgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZU1hdGNoZXMgPSAodGhpcy5uYW1lID09PSBtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOYW1lTWF0Y2hlcztcbiAgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSB0aGlzLm5vZGUubWF0Y2gobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXM7XG4gIH1cblxuICB1bmlmeUZyYW1lKGZyYW1lLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpIHtcbiAgICBsZXQgZnJhbWVVbmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBmcmFtZU5vZGUgPSBmcmFtZS5nZXROb2RlKCksXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMubmFtZSwgLy8vXG4gICAgICAgICAgc2ltcGxlU3Vic3RpdHV0aW9uUHJlc2VudCA9IHN1YnN0aXR1dGlvbnMuaXNTaW1wbGVTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgaWYgKHNpbXBsZVN1YnN0aXR1dGlvblByZXNlbnQpIHtcbiAgICAgIGNvbnN0IHNpbXBsZVN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnMuZmluZFNpbXBsZVN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IHNpbXBsZVN1YnN0aXR1dGlvbiwgIC8vL1xuICAgICAgICAgICAgZnJhbWVOb2RlTWF0Y2hlcyA9IHN1YnN0aXR1dGlvbi5tYXRjaEZyYW1lTm9kZShmcmFtZU5vZGUpO1xuXG4gICAgICBpZiAoZnJhbWVOb2RlTWF0Y2hlcykge1xuICAgICAgICBmcmFtZVVuaWZpZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5ub2RlLCAgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGVGcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlLCBsb2NhbENvbnRleHQpLFxuICAgICAgICAgICAgZnJhbWVNZXRhdmFyaWFibGUgID0gZnJhbWVNZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZShmcmFtZU5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGUgPT09IGZyYW1lTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgIGZyYW1lVW5pZmllZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgICAgIGZyYW1lRm9yTWV0YXZhcmlhYmxlU3Vic3RpdHV0aW9uID0gRnJhbWVGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb24uZnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlKGZyYW1lLCBtZXRhdmFyaWFibGUsIGxvY2FsQ29udGV4dCksXG4gICAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IGZyYW1lRm9yTWV0YXZhcmlhYmxlU3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgICAgc3Vic3RpdHV0aW9ucy5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCBsb2NhbENvbnRleHQpO1xuXG4gICAgICAgIGZyYW1lVW5pZmllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lVW5pZmllZCkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWVVbmlmaWVkO1xuICB9XG5cbiAgdW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBzdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbnMsIGxvY2FsQ29udGV4dCkge1xuICAgIGxldCBzdGF0ZW1lbnRVbmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5zdHJpbmcsIC8vL1xuICAgICAgICAgIHN1YnN0aXR1dGlvblN0cmluZyA9IChzdWJzdGl0dXRpb24gIT09IG51bGwpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcblxuICAgIChzdWJzdGl0dXRpb25TdHJpbmcgIT09IG51bGwpID9cbiAgICAgIGxvY2FsQ29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgZ2l2ZW4gdGhlICR7c3Vic3RpdHV0aW9uU3RyaW5nfSBzdWJzdGl0dXRpb24uLi5gKSA6XG4gICAgICAgIGxvY2FsQ29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLm5vZGUsIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uTm9kZSA9IChzdWJzdGl0dXRpb24gIT09IG51bGwpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uLmdldFN1YnN0aXR1dGlvbk5vZGUoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzdWJzdGl0dXRpb25QcmVzZW50ID0gc3Vic3RpdHV0aW9ucy5pc1N1YnN0aXR1dGlvblByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5hbWUsIHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgaWYgKHN1YnN0aXR1dGlvblByZXNlbnQpIHtcbiAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbnMuZmluZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTmFtZUFuZFN1YnN0aXR1dGlvbk5vZGUobWV0YXZhcmlhYmxlTmFtZSwgc3Vic3RpdHV0aW9uTm9kZSksXG4gICAgICAgICAgICBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN1YnN0aXR1dGlvbi5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMubm9kZSwgIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgbG9jYWxDb250ZXh0KSxcbiAgICAgICAgICAgIHN0YXRlbWVudE1ldGF2YXJpYWJsZSA9IHN0YXRlbWVudE1ldGF2YXJpYWJsZUZyb21TdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGUgPT09IHN0YXRlbWVudE1ldGF2YXJpYWJsZSkge1xuICAgICAgICBzdGF0ZW1lbnRVbmlmaWVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMsICAvLy9cbiAgICAgICAgICAgICAgc3RhdGVtZW50Rm9yTWV0YXZhcmlhYmxlU3Vic3RpdHV0aW9uID0gU3RhdGVtZW50Rm9yTWV0YXZhcmlhYmxlU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgbG9jYWxDb250ZXh0KTtcblxuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRGb3JNZXRhdmFyaWFibGVTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgICBzdWJzdGl0dXRpb25zLmFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIGxvY2FsQ29udGV4dCk7XG5cbiAgICAgICAgc3RhdGVtZW50VW5pZmllZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZWQpIHtcbiAgICAgIChzdWJzdGl0dXRpb25TdHJpbmcgIT09IG51bGwpID9cbiAgICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGdpdmVuIHRoZSAke3N1YnN0aXR1dGlvblN0cmluZ30gc3Vic3RpdHV0aW9uLmApIDpcbiAgICAgICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZWQ7XG4gIH1cblxuICB1bmlmeVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIGxvY2FsQ29udGV4dCkge1xuICAgIGxldCBzdWJzdGl0dXRpb25VbmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLnN0cmluZywgIC8vL1xuICAgICAgICAgIHN1YnN0aXR1dGlvblN0cmluZyA9IHN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5hbWUgPSB0aGlzLm5hbWUsIC8vL1xuICAgICAgICAgIGp1ZGdlbWVudCA9IGxvY2FsQ29udGV4dC5maW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgaWYgKGp1ZGdlbWVudCAhPT0gbnVsbCl7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGp1ZGdlbWVudC5nZXREZWNsYXJhdGlvbigpO1xuXG4gICAgICBzdWJzdGl0dXRpb25VbmlmaWVkID0gZGVjbGFyYXRpb24udW5pZnlTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCBsb2NhbENvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChzdWJzdGl0dXRpb25VbmlmaWVkKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvblVuaWZpZWQ7XG4gIH1cblxuICB2ZXJpZnkobG9jYWxDb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVkO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5zdHJpbmc7IC8vL1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMubmFtZSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBsb2NhbENvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZUEgPSBtZXRhdmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlQiA9IHRoaXMsXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlQSA9IG1ldGF2YXJpYWJsZUEuZ2V0Tm9kZSgpLCAvLy9cbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVCID0gbWV0YXZhcmlhYmxlQi5nZXROb2RlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVVbmlmaWVkID0gbWV0YXZhcmlhYmxlVW5pZmllci51bmlmeShtZXRhdmFyaWFibGVOb2RlQSwgbWV0YXZhcmlhYmxlTm9kZUIsIGxvY2FsQ29udGV4dCk7XG5cbiAgICAgIHZlcmlmaWVkID0gbWV0YXZhcmlhYmxlVW5pZmllZDsgLy8vXG4gICAgfVxuXG4gICAgaWYgKHZlcmlmaWVkKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVkO1xuICB9XG5cbiAgdmVyaWZ5QXRUb3BMZXZlbChmaWxlQ29udGV4dCkge1xuICAgIGxldCB2ZXJpZmllZEF0VG9wTGV2ZWwgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuc3RyaW5nOyAvLy9cblxuICAgIGZpbGVDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBhdCB0b3AgbGV2ZWwuLi5gKTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLm5vZGUsIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlUHJlc2VudCA9IGZpbGVDb250ZXh0LmlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGlmIChtZXRhdmFyaWFibGVQcmVzZW50KSB7XG4gICAgICBmaWxlQ29udGV4dC5kZWJ1ZyhgVGhlIG1ldGF2YXJpYWJsZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBpcyBhbHJlYWR5IHByZXNlbnQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlcm1Ob2RlID0gdGVybU5vZGVRdWVyeSh0aGlzLm5vZGUpO1xuXG4gICAgICBpZiAodGVybU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGVybVN0cmluZyA9IHRoaXMuZmlsZUNvbnRleHQubm9kZUFzU3RyaW5nKHRlcm1Ob2RlKTtcblxuICAgICAgICB0aGlzLmZpbGVDb250ZXh0LmRlYnVnKGBUaGUgJyR7dGVybVN0cmluZ30nIHRlcm0gd2FzIGZvdW5kIHdoZW4gYSB0eXBlIHNob3VsZCBoYXZlIGJlZW4gcHJlc2VudC5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHR5cGVOb2RlID0gdHlwZU5vZGVRdWVyeSh0aGlzLm5vZGUpO1xuXG4gICAgICAgIGlmICh0eXBlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gdHlwZU5hbWVGcm9tVHlwZU5vZGUodHlwZU5vZGUpLFxuICAgICAgICAgICAgICAgIHR5cGVQcmVzZW50ID0gdGhpcy5maWxlQ29udGV4dC5pc1R5cGVQcmVzZW50QnlUeXBlTmFtZSh0eXBlTmFtZSk7XG5cbiAgICAgICAgICBpZiAodHlwZVByZXNlbnQpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkQXRUb3BMZXZlbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbnRleHQuZGVidWcoYFRoZSAnJHt0eXBlTmFtZX0nIHR5cGUgaXMgbm90IHByZXNlbnQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZlcmlmaWVkQXRUb3BMZXZlbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZWRBdFRvcExldmVsKSB7XG4gICAgICBmaWxlQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBhdCB0b3AgbGV2ZWwuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVkQXRUb3BMZXZlbDtcbiAgfVxuXG4gIHZlcmlmeUdpdmVuTWV0YVR5cGUobWV0YVR5cGUsIGxvY2FsQ29udGV4dCkge1xuICAgIGxldCB2ZXJpZmllZEdpdmVuTWV0YVR5cGUgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuc3RyaW5nLCAgLy8vXG4gICAgICAgICAgbWV0YVR5cGVTdHJpbmcgPSBtZXRhVHlwZS5nZXRTdHJpbmcoKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgZ2l2ZW4gdGhlICcke21ldGFUeXBlU3RyaW5nfScgbWV0YS10eXBlLi4uYCk7XG5cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG5hbWUsICAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBsb2NhbENvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGFUeXBlTWF0Y2hlcyA9IG1ldGF2YXJpYWJsZS5tYXRjaE1ldGFUeXBlKG1ldGFUeXBlKTtcblxuICAgICAgdmVyaWZpZWRHaXZlbk1ldGFUeXBlID0gbWV0YVR5cGVNYXRjaGVzOyAgLy8vXG4gICAgfVxuXG4gICAgaWYgKHZlcmlmaWVkR2l2ZW5NZXRhVHlwZSkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGdpdmVuIHRoZSAnJHttZXRhVHlwZVN0cmluZ30nIG1ldGEtdHlwZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZWRHaXZlbk1ldGFUeXBlO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IG1ldGFUeXBlSlNPTiA9IG1ldGFUeXBlVG9NZXRhVHlwZUpTT04odGhpcy5tZXRhVHlwZSksXG4gICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUpTT04sICAvLy9cbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLnN0cmluZyxcbiAgICAgICAgICBqc29uID0ge1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgbWV0YVR5cGVcbiAgICAgICAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpIHtcbiAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICBsZXhlciAgPSBmaWxlQ29udGV4dC5nZXRMZXhlcigpLFxuICAgICAgICAgIHBhcnNlciA9IGZpbGVDb250ZXh0LmdldFBhcnNlcigpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHN0cmluZywgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlRnJvbU1ldGF2YXJpYWJsZVN0cmluZyhtZXRhdmFyaWFibGVTdHJpbmcsIGxleGVyLCBwYXJzZXIpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICBuYW1lID0gbWV0YXZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgIG1ldGFUeXBlID0gbWV0YVR5cGVGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbmV3IE1ldGF2YXJpYWJsZShmaWxlQ29udGV4dCwgc3RyaW5nLCBub2RlLCBuYW1lLCBtZXRhVHlwZSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgc3RhdGljIGZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGxvY2FsQ29udGV4dCkge1xuICAgIGxldCBtZXRhdmFyaWFibGUgPSBudWxsO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgICBub2RlID0gbWV0YXZhcmlhYmxlTm9kZSwgIC8vL1xuICAgICAgICAgICAgbmFtZSA9IG1ldGF2YXJpYWJsZU5hbWUsICAvLy9cbiAgICAgICAgICAgIHN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcobm9kZSksXG4gICAgICAgICAgICBtZXRhVHlwZSA9IG51bGw7XG5cbiAgICAgIG1ldGF2YXJpYWJsZSA9IG5ldyBNZXRhdmFyaWFibGUobG9jYWxDb250ZXh0LCBzdHJpbmcsIG5vZGUsIG5hbWUsIG1ldGFUeXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgc3RhdGljIGZyb21NZXRhdmFyaWFibGVEZWNsYXJhdGlvbk5vZGUobWV0YXZhcmlhYmxlRGVjbGFyYXRpb25Ob2RlLCBmaWxlQ29udGV4dCkge1xuICAgIGNvbnN0IHsgTWV0YVR5cGUgfSA9IHNoaW0sXG4gICAgICAgICAgbWV0YVR5cGVOb2RlID0gbWV0YVR5cGVOb2RlUXVlcnkobWV0YXZhcmlhYmxlRGVjbGFyYXRpb25Ob2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlTm9kZVF1ZXJ5KG1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBsb2NhbENvbnRleHQgPSBMb2NhbENvbnRleHQuZnJvbUZpbGVDb250ZXh0KGZpbGVDb250ZXh0KSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSBmaWxlQ29udGV4dC5ub2RlQXNTdHJpbmcobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgc3RyaW5nID0gbWV0YXZhcmlhYmxlU3RyaW5nLCAgLy8vXG4gICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICBuYW1lID0gbWV0YXZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgIG1ldGFUeXBlID0gTWV0YVR5cGUuZnJvbU1ldGFUeXBlTm9kZShtZXRhVHlwZU5vZGUsIGxvY2FsQ29udGV4dCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbmV3IE1ldGF2YXJpYWJsZShmaWxlQ29udGV4dCwgc3RyaW5nLCBub2RlLCBuYW1lLCBtZXRhVHlwZSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oc2hpbSwge1xuICBNZXRhdmFyaWFibGVcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBNZXRhdmFyaWFibGU7XG5cbmZ1bmN0aW9uIG1ldGF2YXJpYWJsZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGxvY2FsQ29udGV4dCkge1xuICBjb25zdCBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICBtZXRhdmFyaWFibGUgPSBsb2NhbENvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICByZXR1cm4gbWV0YXZhcmlhYmxlO1xufVxuXG5mdW5jdGlvbiBmcmFtZU1ldGF2YXJpYWJsZUZyb21TdGF0ZW1lbnROb2RlKGZyYW1lTm9kZSwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBmcmFtZU1ldGF2YXJpYWJsZSA9IG51bGw7XG5cbiAgY29uc3QgZnJhbWVNZXRhdmFyaWFibGVOb2RlID0gZnJhbWVNZXRhdmFyaWFibGVOb2RlUXVlcnkoZnJhbWVOb2RlKTtcblxuICBpZiAoZnJhbWVNZXRhdmFyaWFibGVOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnJhbWVNZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKGZyYW1lTWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICBmcmFtZU1ldGF2YXJpYWJsZSA9IGxvY2FsQ29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKGZyYW1lTWV0YXZhcmlhYmxlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZnJhbWVNZXRhdmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIHN0YXRlbWVudE1ldGF2YXJpYWJsZUZyb21TdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50TWV0YXZhcmlhYmxlID0gbnVsbDtcblxuICBjb25zdCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlID0gc3RhdGVtZW50TWV0YXZhcmlhYmxlTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gIGlmIChzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50TWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZShzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlKTtcblxuICAgIHN0YXRlbWVudE1ldGF2YXJpYWJsZSA9IGxvY2FsQ29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKHN0YXRlbWVudE1ldGF2YXJpYWJsZU5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudE1ldGF2YXJpYWJsZTtcbn1cbiJdLCJuYW1lcyI6WyJ0ZXJtTm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwidHlwZU5vZGVRdWVyeSIsIm1ldGFUeXBlTm9kZVF1ZXJ5IiwibWV0YXZhcmlhYmxlTm9kZVF1ZXJ5IiwiZnJhbWVNZXRhdmFyaWFibGVOb2RlUXVlcnkiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlUXVlcnkiLCJNZXRhdmFyaWFibGUiLCJmaWxlQ29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJuYW1lIiwibWV0YVR5cGUiLCJnZXRGaWxlQ29udGV4dCIsImdldFN0cmluZyIsImdldE5vZGUiLCJnZXROYW1lIiwiZ2V0TWV0YVR5cGUiLCJnZXRNZXRhVHlwZU5hbWUiLCJtZXRhVHlwZU5hbWUiLCJtYXRjaE1ldGFUeXBlIiwibWV0YVR5cGVNYXRjaGVzIiwibWF0Y2hNZXRhdmFyaWFibGVOYW1lIiwibWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5hbWVNYXRjaGVzIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2giLCJ1bmlmeUZyYW1lIiwiZnJhbWUiLCJzdWJzdGl0dXRpb25zIiwibG9jYWxDb250ZXh0IiwiZnJhbWVVbmlmaWVkIiwiZnJhbWVOb2RlIiwiZnJhbWVTdHJpbmciLCJtZXRhdmFyaWFibGVTdHJpbmciLCJ0cmFjZSIsInNpbXBsZVN1YnN0aXR1dGlvblByZXNlbnQiLCJpc1NpbXBsZVN1YnN0aXR1dGlvblByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJzaW1wbGVTdWJzdGl0dXRpb24iLCJmaW5kU2ltcGxlU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOYW1lIiwic3Vic3RpdHV0aW9uIiwiZnJhbWVOb2RlTWF0Y2hlcyIsIm1hdGNoRnJhbWVOb2RlIiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJmcmFtZU1ldGF2YXJpYWJsZSIsImZyYW1lTWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUiLCJmcmFtZUZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbiIsIkZyYW1lRm9yTWV0YXZhcmlhYmxlU3Vic3RpdHV0aW9uIiwiZnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlIiwiYWRkU3Vic3RpdHV0aW9uIiwiZGVidWciLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudFVuaWZpZWQiLCJzdGF0ZW1lbnRTdHJpbmciLCJzdWJzdGl0dXRpb25TdHJpbmciLCJzdGF0ZW1lbnROb2RlIiwibWV0YXZhcmlhYmxlTmFtZUZyb21NZXRhdmFyaWFibGVOb2RlIiwic3Vic3RpdHV0aW9uTm9kZSIsImdldFN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25QcmVzZW50IiwiaXNTdWJzdGl0dXRpb25QcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lQW5kU3Vic3RpdHV0aW9uTm9kZSIsImZpbmRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5hbWVBbmRTdWJzdGl0dXRpb25Ob2RlIiwic3RhdGVtZW50Tm9kZU1hdGNoZXMiLCJtYXRjaFN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGUiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudEZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbiIsIlN0YXRlbWVudEZvck1ldGF2YXJpYWJsZVN1YnN0aXR1dGlvbiIsImZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24iLCJ1bmlmeVN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvblVuaWZpZWQiLCJqdWRnZW1lbnQiLCJmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGVOYW1lIiwiZGVjbGFyYXRpb24iLCJnZXREZWNsYXJhdGlvbiIsInZlcmlmeSIsInZlcmlmaWVkIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZUEiLCJtZXRhdmFyaWFibGVCIiwibWV0YXZhcmlhYmxlTm9kZUEiLCJtZXRhdmFyaWFibGVOb2RlQiIsIm1ldGF2YXJpYWJsZVVuaWZpZWQiLCJtZXRhdmFyaWFibGVVbmlmaWVyIiwidW5pZnkiLCJ2ZXJpZnlBdFRvcExldmVsIiwidmVyaWZpZWRBdFRvcExldmVsIiwibWV0YXZhcmlhYmxlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZSIsInRlcm1Ob2RlIiwidGVybVN0cmluZyIsIm5vZGVBc1N0cmluZyIsInR5cGVOb2RlIiwidHlwZU5hbWUiLCJ0eXBlTmFtZUZyb21UeXBlTm9kZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ2ZXJpZnlHaXZlbk1ldGFUeXBlIiwidmVyaWZpZWRHaXZlbk1ldGFUeXBlIiwibWV0YVR5cGVTdHJpbmciLCJ0b0pTT04iLCJtZXRhVHlwZUpTT04iLCJtZXRhVHlwZVRvTWV0YVR5cGVKU09OIiwianNvbiIsImZyb21KU09OIiwibGV4ZXIiLCJnZXRMZXhlciIsInBhcnNlciIsImdldFBhcnNlciIsIm1ldGF2YXJpYWJsZU5vZGVGcm9tTWV0YXZhcmlhYmxlU3RyaW5nIiwibWV0YVR5cGVGcm9tSlNPTiIsImZyb21NZXRhdmFyaWFibGVOb2RlIiwiZnJvbU1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZSIsIm1ldGF2YXJpYWJsZURlY2xhcmF0aW9uTm9kZSIsIk1ldGFUeXBlIiwic2hpbSIsIm1ldGFUeXBlTm9kZSIsIkxvY2FsQ29udGV4dCIsImZyb21GaWxlQ29udGV4dCIsImZyb21NZXRhVHlwZU5vZGUiLCJPYmplY3QiLCJhc3NpZ24iLCJmcmFtZU1ldGF2YXJpYWJsZU5vZGUiLCJmcmFtZU1ldGF2YXJpYWJsZU5hbWUiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlIiwic3RhdGVtZW50TWV0YXZhcmlhYmxlTmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBdVdBOzs7ZUFBQTs7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