occam-verify-cli 0.0.922 → 0.0.924

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 (150) hide show
  1. package/lib/axiom.js +9 -9
  2. package/lib/conclusion.js +11 -41
  3. package/lib/conjecture.js +9 -9
  4. package/lib/constants.js +1 -13
  5. package/lib/context/file.js +3 -3
  6. package/lib/context/local.js +19 -59
  7. package/lib/declaration.js +15 -15
  8. package/lib/lemma.js +9 -9
  9. package/lib/metaLemma.js +7 -7
  10. package/lib/metatheorem.js +7 -7
  11. package/lib/metavariable.js +8 -1
  12. package/lib/mixins/nodesVerifier/metaLevel.js +6 -6
  13. package/lib/premise.js +14 -91
  14. package/lib/{step/proof.js → proofStep.js} +1 -1
  15. package/lib/rule.js +1 -45
  16. package/lib/ruleNames.js +1 -9
  17. package/lib/substitution/statementForMetavariable.js +9 -1
  18. package/lib/substitution.js +1 -8
  19. package/lib/supposition.js +55 -1
  20. package/lib/theorem.js +9 -9
  21. package/lib/topLevelAssertion.js +186 -0
  22. package/lib/utilities/customGrammar.js +2 -2
  23. package/lib/utilities/match.js +13 -50
  24. package/lib/utilities/node.js +2 -27
  25. package/lib/utilities/tokens.js +1 -8
  26. package/lib/utilities/verify.js +8 -24
  27. package/lib/verifier/nodes/intrinsicLevelAgainstMetaLevel.js +29 -29
  28. package/lib/verifier/nodes/metaLevel.js +13 -13
  29. package/lib/verify/axiom.js +4 -4
  30. package/lib/verify/conclusion.js +10 -11
  31. package/lib/verify/conjecture.js +4 -4
  32. package/lib/verify/containedAssertion.js +91 -0
  33. package/lib/verify/declaration.js +7 -7
  34. package/lib/verify/definedAssertion.js +115 -0
  35. package/lib/verify/derivation.js +7 -7
  36. package/lib/verify/frame.js +2 -2
  37. package/lib/verify/judgement.js +2 -2
  38. package/lib/verify/lemma.js +5 -5
  39. package/lib/verify/metaLemma.js +12 -12
  40. package/lib/verify/metastatement.js +48 -67
  41. package/lib/verify/metatheorem.js +12 -12
  42. package/lib/verify/metavariable.js +2 -2
  43. package/lib/verify/premise.js +11 -30
  44. package/lib/verify/proof.js +3 -3
  45. package/lib/verify/proofStep.js +8 -8
  46. package/lib/verify/rule.js +10 -10
  47. package/lib/verify/statement/qualified.js +38 -15
  48. package/lib/verify/statement/unqualified.js +38 -10
  49. package/lib/verify/statement.js +85 -92
  50. package/lib/verify/subDerivation.js +3 -3
  51. package/lib/verify/subproof.js +3 -3
  52. package/lib/verify/supposition.js +3 -3
  53. package/lib/verify/termAsConstructor.js +2 -2
  54. package/lib/verify/theorem.js +4 -4
  55. package/package.json +2 -2
  56. package/src/axiom.js +4 -4
  57. package/src/conclusion.js +13 -52
  58. package/src/conjecture.js +4 -4
  59. package/src/constants.js +0 -3
  60. package/src/context/file.js +2 -2
  61. package/src/context/local.js +21 -67
  62. package/src/declaration.js +19 -19
  63. package/src/lemma.js +4 -4
  64. package/src/metaLemma.js +4 -4
  65. package/src/metatheorem.js +4 -4
  66. package/src/metavariable.js +6 -0
  67. package/src/mixins/nodesVerifier/metaLevel.js +8 -8
  68. package/src/premise.js +20 -137
  69. package/src/rule.js +0 -67
  70. package/src/ruleNames.js +0 -2
  71. package/src/substitution/statementForMetavariable.js +14 -0
  72. package/src/substitution.js +0 -6
  73. package/src/supposition.js +46 -0
  74. package/src/theorem.js +4 -4
  75. package/src/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +36 -23
  76. package/src/utilities/customGrammar.js +1 -2
  77. package/src/utilities/match.js +13 -60
  78. package/src/utilities/node.js +3 -32
  79. package/src/utilities/tokens.js +0 -8
  80. package/src/utilities/verify.js +4 -20
  81. package/src/verifier/nodes/intrinsicLevelAgainstMetaLevel.js +36 -37
  82. package/src/verifier/nodes/metaLevel.js +17 -17
  83. package/src/verify/axiom.js +5 -4
  84. package/src/verify/conclusion.js +9 -13
  85. package/src/verify/conjecture.js +5 -4
  86. package/src/verify/{statementAsContainedAssertion.js → containedAssertion.js} +20 -36
  87. package/src/verify/declaration.js +8 -8
  88. package/src/verify/{statementAsDefinedAssertion.js → definedAssertion.js} +22 -37
  89. package/src/verify/derivation.js +6 -6
  90. package/src/verify/frame.js +1 -1
  91. package/src/verify/judgement.js +1 -1
  92. package/src/verify/lemma.js +8 -5
  93. package/src/verify/metaLemma.js +24 -24
  94. package/src/verify/metastatement.js +48 -76
  95. package/src/verify/metatheorem.js +23 -23
  96. package/src/verify/metavariable.js +1 -1
  97. package/src/verify/premise.js +14 -46
  98. package/src/verify/proof.js +2 -2
  99. package/src/verify/proofStep.js +4 -4
  100. package/src/verify/rule.js +11 -11
  101. package/src/verify/statement/qualified.js +56 -21
  102. package/src/verify/statement/unqualified.js +52 -10
  103. package/src/verify/statement.js +133 -39
  104. package/src/verify/subDerivation.js +2 -2
  105. package/src/verify/subproof.js +2 -2
  106. package/src/verify/supposition.js +1 -1
  107. package/src/verify/termAsConstructor.js +2 -2
  108. package/src/verify/theorem.js +7 -4
  109. package/lib/axiomLemmaTheoremConjecture.js +0 -174
  110. package/lib/metaConsequent.js +0 -108
  111. package/lib/metaLemmaMetatheorem.js +0 -191
  112. package/lib/metaSupposition.js +0 -160
  113. package/lib/node/metastatement/bracketed.js +0 -16
  114. package/lib/step/metaproof.js +0 -106
  115. package/lib/substitution/metastatementForMetavariable.js +0 -173
  116. package/lib/verify/metaConsequent.js +0 -50
  117. package/lib/verify/metaDerivation.js +0 -31
  118. package/lib/verify/metaSubDerivation.js +0 -25
  119. package/lib/verify/metaSubproof.js +0 -34
  120. package/lib/verify/metaSupposition.js +0 -61
  121. package/lib/verify/metaSuppositions.js +0 -28
  122. package/lib/verify/metaproof.js +0 -31
  123. package/lib/verify/metaproofStep.js +0 -98
  124. package/lib/verify/metastatement/qualified.js +0 -95
  125. package/lib/verify/metastatement/unqualified.js +0 -37
  126. package/lib/verify/metastatementAsContainedAssertion.js +0 -109
  127. package/lib/verify/metastatementAsDefinedAssertion.js +0 -132
  128. package/lib/verify/metavariableAgainstMetastatement.js +0 -44
  129. package/lib/verify/statementAsContainedAssertion.js +0 -109
  130. package/lib/verify/statementAsDefinedAssertion.js +0 -132
  131. package/src/metaConsequent.js +0 -83
  132. package/src/metaLemmaMetatheorem.js +0 -188
  133. package/src/metaSupposition.js +0 -127
  134. package/src/node/metastatement/bracketed.js +0 -9
  135. package/src/step/metaproof.js +0 -73
  136. package/src/substitution/metastatementForMetavariable.js +0 -90
  137. package/src/verify/metaConsequent.js +0 -61
  138. package/src/verify/metaDerivation.js +0 -23
  139. package/src/verify/metaSubDerivation.js +0 -22
  140. package/src/verify/metaSubproof.js +0 -32
  141. package/src/verify/metaSupposition.js +0 -78
  142. package/src/verify/metaSuppositions.js +0 -17
  143. package/src/verify/metaproof.js +0 -28
  144. package/src/verify/metaproofStep.js +0 -137
  145. package/src/verify/metastatement/qualified.js +0 -130
  146. package/src/verify/metastatement/unqualified.js +0 -34
  147. package/src/verify/metastatementAsContainedAssertion.js +0 -127
  148. package/src/verify/metastatementAsDefinedAssertion.js +0 -156
  149. package/src/verify/metavariableAgainstMetastatement.js +0 -42
  150. /package/src/{step/proof.js → proofStep.js} +0 -0
@@ -7,28 +7,70 @@ import { nodeQuery } from "../../utilities/query";
7
7
  const statementNodeQuery = nodeQuery("/unqualifiedStatement/statement!");
8
8
 
9
9
  export default function verifyUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext) {
10
- let unqualifiedStatementVerified = false;
10
+ let unqualifiedStatementVerified;
11
11
 
12
- const statementNode = statementNodeQuery(unqualifiedStatementNode),
13
- unqualifiedStatementString = localContext.nodeAsString(unqualifiedStatementNode);
12
+ const unqualifiedStatementString = localContext.nodeAsString(unqualifiedStatementNode);
14
13
 
15
14
  localContext.trace(`Verifying the '${unqualifiedStatementString}' unqualified statement...`, unqualifiedStatementNode);
16
15
 
16
+ const verifyUnqualifiedStatementFunctions = [
17
+ verifyDerivedUnqualifiedStatement,
18
+ verifyStatedUnqualifiedStatement
19
+ ];
20
+
21
+ unqualifiedStatementVerified = verifyUnqualifiedStatementFunctions.some((verifyUnqualifiedStatementFunction) => {
22
+ const unqualifiedStatementVerified = verifyUnqualifiedStatementFunction(unqualifiedStatementNode, assignments, derived, localContext);
23
+
24
+ if (unqualifiedStatementVerified) {
25
+ return true;
26
+ }
27
+ });
28
+
29
+ if (unqualifiedStatementVerified) {
30
+ localContext.debug(`...verified the '${unqualifiedStatementString}' unqualified statement.`, unqualifiedStatementNode);
31
+ }
32
+
33
+ return unqualifiedStatementVerified;
34
+ }
35
+
36
+ function verifyDerivedUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext) {
37
+ let derivedUnqualifiedStatementVerified = false;
38
+
17
39
  if (derived) {
40
+ const statementNode = statementNodeQuery(unqualifiedStatementNode),
41
+ unqualifiedStatementString = localContext.nodeAsString(unqualifiedStatementNode);
42
+
43
+ localContext.trace(`Verifying the '${unqualifiedStatementString}' derived unqualified statement...`, unqualifiedStatementNode);
44
+
18
45
  const matchesStatementNode = localContext.matchStatementNode(statementNode);
19
46
 
20
- unqualifiedStatementVerified = matchesStatementNode; ///
47
+ derivedUnqualifiedStatementVerified = matchesStatementNode; ///
48
+
49
+ if (derivedUnqualifiedStatementVerified) {
50
+ localContext.debug(`...verified the '${unqualifiedStatementString}' derived unqualified statement.`, unqualifiedStatementNode);
51
+ }
21
52
  }
22
53
 
23
- if (!unqualifiedStatementVerified) {
54
+ return derivedUnqualifiedStatementVerified;
55
+ }
56
+
57
+ function verifyStatedUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext) {
58
+ let statedUnqualifiedStatementVerified = false;
59
+
60
+ if (!derived) {
61
+ const statementNode = statementNodeQuery(unqualifiedStatementNode),
62
+ unqualifiedStatementString = localContext.nodeAsString(unqualifiedStatementNode);
63
+
64
+ localContext.trace(`Verifying the '${unqualifiedStatementString}' stated unqualified statement...`, unqualifiedStatementNode);
65
+
24
66
  const statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
25
67
 
26
- unqualifiedStatementVerified = statementVerified; ///
27
- }
68
+ statedUnqualifiedStatementVerified = statementVerified; ///
28
69
 
29
- if (unqualifiedStatementVerified) {
30
- localContext.debug(`...verified the '${unqualifiedStatementString}' unqualified statement.`, unqualifiedStatementNode);
70
+ if (statedUnqualifiedStatementVerified) {
71
+ localContext.debug(`...verified the '${unqualifiedStatementString}' stated unqualified statement.`, unqualifiedStatementNode);
72
+ }
31
73
  }
32
74
 
33
- return unqualifiedStatementVerified;
75
+ return statedUnqualifiedStatementVerified;
34
76
  }
@@ -1,18 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  import verifyEquality from "../verify/equality";
4
- import bracketedCombinator from "../ocmbinator/bracketed";
4
+ import verifyJudgement from "../verify/judgement";
5
5
  import verifyTypeAssertion from "../verify/typeAssertion";
6
- import verifyStatementAsDefinedAssertion from "../verify/statementAsDefinedAssertion";
7
- import verifyStatementAsContainedAssertion from "../verify/statementAsContainedAssertion";
6
+ import verifyDefinedAssertion from "./definedAssertion";
7
+ import verifyContainedAssertion from "./containedAssertion";
8
8
  import statementAgainstCombinatorNodesVerifier from "../verifier/nodes/statementAgainstCombinator";
9
9
 
10
10
  import { nodeQuery } from "../utilities/query";
11
- import { isStatementDefinedAssertion } from "../verify/statementAsDefinedAssertion";
12
- import { isStatementContainedAssertion } from "../verify/statementAsContainedAssertion";
11
+ import { STATEMENT_META_TYPE_NAME } from "../metaTypeNames";
13
12
 
14
13
  const equalityNodeQuery = nodeQuery("/statement/equality!"),
15
- typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
14
+ judgementNodeQuery = nodeQuery("/statement/judgement!"),
15
+ metavariableNodeQuery = nodeQuery("/statement/metavariable!"),
16
+ typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
17
+ definedAssertionNodeQuery = nodeQuery("/statement/definedAssertion!"),
18
+ containedAssertionNodeQuery = nodeQuery("/statement/containedAssertion!");
16
19
 
17
20
  function verifyStatement(statementNode, assignments, derived, localContext) {
18
21
  let statementVerified;
@@ -22,7 +25,9 @@ function verifyStatement(statementNode, assignments, derived, localContext) {
22
25
  localContext.trace(`Verifying the '${statementString}' statement...`, statementNode);
23
26
 
24
27
  const verifyStatementFunctions = [
28
+ verifyStatementAsMetavariable,
25
29
  verifyStatementAsEquality,
30
+ verifyStatementAsJudgement,
26
31
  verifyStatementAsTypeAssertion,
27
32
  verifyStatementAsDefinedAssertion,
28
33
  verifyStatementAsContainedAssertion,
@@ -77,15 +82,14 @@ export default verifyStatement;
77
82
  export function verifyStatementAsEquality(statementNode, assignments, derived, localContext) {
78
83
  let statementVerifiedAsEquality = false;
79
84
 
80
- const statementEquality = isStatementEquality(statementNode);
85
+ const equalityNode = equalityNodeQuery(statementNode);
81
86
 
82
- if (statementEquality) {
87
+ if (equalityNode !== null) {
83
88
  const statementString = localContext.nodeAsString(statementNode);
84
89
 
85
90
  localContext.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
86
91
 
87
- const equalityNode = equalityNodeQuery(statementNode),
88
- equalityVerified = verifyEquality(equalityNode, assignments, derived, localContext, () => {
92
+ const equalityVerified = verifyEquality(equalityNode, assignments, derived, localContext, () => {
89
93
  const verifiedAhead = true;
90
94
 
91
95
  return verifiedAhead;
@@ -104,15 +108,14 @@ export function verifyStatementAsEquality(statementNode, assignments, derived, l
104
108
  export function verifyStatementAsTypeAssertion(statementNode, assignments, derived, localContext) {
105
109
  let statementVerifiedAsTypeAssertion = false;
106
110
 
107
- const statementTypeAssertion = isStatementTypeAssertion(statementNode);
111
+ const typeAssertionNode = typeAssertionNodeQuery(statementNode);
108
112
 
109
- if (statementTypeAssertion) {
113
+ if (typeAssertionNode !== null) {
110
114
  const statementString = localContext.nodeAsString(statementNode);
111
115
 
112
116
  localContext.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
113
117
 
114
- const typeAssertionNode = typeAssertionNodeQuery(statementNode),
115
- typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, localContext, () => {
118
+ const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, localContext, () => {
116
119
  const verifiedAhead = true;
117
120
 
118
121
  return verifiedAhead;
@@ -128,21 +131,126 @@ export function verifyStatementAsTypeAssertion(statementNode, assignments, deriv
128
131
  return statementVerifiedAsTypeAssertion;
129
132
  }
130
133
 
134
+ function verifyStatementAsJudgement(statementNode, assignments, derived, localContext) {
135
+ let statementVerifiedAsJudgement = false;
136
+
137
+ const judgementNode = judgementNodeQuery(statementNode);
138
+
139
+ if (judgementNode !== null) {
140
+ const statementString = localContext.nodeAsString(statementNode);
141
+
142
+ localContext.trace(`Verifying the '${statementString}' statement as a judgement...`, statementNode);
143
+
144
+ const judgementVerified = verifyJudgement(judgementNode, assignments, derived, localContext);
145
+
146
+ statementVerifiedAsJudgement = judgementVerified; ///
147
+
148
+ if (statementVerifiedAsJudgement) {
149
+ localContext.debug(`...verified the '${statementString}' statement as a judgement.`, statementNode);
150
+ }
151
+ }
152
+
153
+ return statementVerifiedAsJudgement;
154
+ }
155
+
156
+ function verifyStatementAsMetavariable(statementNode, assignments, derived, localContext) {
157
+ let statementVerifiedAsMetavariable = false;
158
+
159
+ const metavariableNode = metavariableNodeQuery(statementNode);
160
+
161
+ if (metavariableNode !== null) {
162
+ const statementString = localContext.nodeAsString(statementNode);
163
+
164
+ localContext.trace(`Verifying the '${statementString}' statement as a metavariable...`, statementNode);
165
+
166
+ const metavariable = localContext.findMetavariableByMetavariableNode(metavariableNode);
167
+
168
+ if (metavariable !== null) {
169
+ const metaTypeName = metavariable.getMetaTypeName();
170
+
171
+ if (metaTypeName === STATEMENT_META_TYPE_NAME) {
172
+ statementVerifiedAsMetavariable = true;
173
+ }
174
+ }
175
+
176
+ if (statementVerifiedAsMetavariable) {
177
+ localContext.debug(`...verified the '${statementString}' statement as a metavariable.`, statementNode);
178
+ }
179
+ }
180
+
181
+ return statementVerifiedAsMetavariable;
182
+ }
183
+
184
+ function verifyStatementAsDefinedAssertion(statementNode, assignments, derived, localContext) {
185
+ let statementVerifiedAsDefinedAssertion = false;
186
+
187
+ const definedAssertionNode = definedAssertionNodeQuery(statementNode);
188
+
189
+ if (definedAssertionNode !== null) {
190
+ const statementString = localContext.nodeAsString(statementNode);
191
+
192
+ localContext.trace(`Verifying the '${statementString}' statement as a defined assertion...`, statementNode);
193
+
194
+ const definedAssertionVerified = verifyDefinedAssertion(definedAssertionNode, assignments, derived, localContext, () => {
195
+ const verifiedAhead = true;
196
+
197
+ return verifiedAhead;
198
+ });
199
+
200
+ statementVerifiedAsDefinedAssertion = definedAssertionVerified; ///
201
+
202
+ if (statementVerifiedAsDefinedAssertion) {
203
+ localContext.debug(`...verified the '${statementString}' statement as a defined assertion.`, statementNode);
204
+ }
205
+ }
206
+
207
+ return statementVerifiedAsDefinedAssertion;
208
+ }
209
+
210
+ function verifyStatementAsContainedAssertion(statementNode, assignments, derived, localContext) {
211
+ let statementVerifiedAsContainedAssertion = false;
212
+
213
+ const containedAssertionNode = containedAssertionNodeQuery(statementNode);
214
+
215
+ if (containedAssertionNode !== null) {
216
+ const statementString = localContext.nodeAsString(statementNode);
217
+
218
+ localContext.trace(`Verifying the '${statementString}' statement as a defined assertion...`, statementNode);
219
+
220
+ const containedAssertionVerified = verifyContainedAssertion(containedAssertionNode, assignments, derived, localContext, () => {
221
+ const verifiedAhead = true;
222
+
223
+ return verifiedAhead;
224
+ });
225
+
226
+ statementVerifiedAsContainedAssertion = containedAssertionVerified; ///
227
+
228
+ if (statementVerifiedAsContainedAssertion) {
229
+ localContext.debug(`...verified the '${statementString}' statement as a defined assertion.`, statementNode);
230
+ }
231
+ }
232
+
233
+ return statementVerifiedAsContainedAssertion;
234
+ }
235
+
131
236
  function verifyStatementAgainstCombinators(statementNode, assignments, derived, localContext) {
132
237
  let statementVerifiedAgainstCombinators = false;
133
238
 
134
- const statementEquality = isStatementEquality(statementNode),
135
- statementTypeAssertion = isStatementTypeAssertion(statementNode),
136
- statementDefinedAssertion = isStatementDefinedAssertion(statementNode),
137
- statementContainedAssertion = isStatementContainedAssertion(statementNode);
239
+ const equalityNode = equalityNodeQuery(statementNode),
240
+ judgementNode = judgementNodeQuery(statementNode),
241
+ metavariableNode = metavariableNodeQuery(statementNode),
242
+ typeAssertionNode = typeAssertionNodeQuery(statementNode),
243
+ definedAssertionNode = definedAssertionNodeQuery(statementNode),
244
+ containedAssertionNode = containedAssertionNodeQuery(statementNode);
138
245
 
139
- if (!statementEquality && !statementTypeAssertion && !statementDefinedAssertion && !statementContainedAssertion) {
140
- let combinators = localContext.getCombinators();
246
+ if ( (equalityNode === null) &&
247
+ (judgementNode === null) &&
248
+ (metavariableNode === null) &&
249
+ (typeAssertionNode === null) &&
250
+ (definedAssertionNode === null) &&
251
+ (containedAssertionNode === null) ) {
141
252
 
142
- combinators = [ ///
143
- bracketedCombinator,
144
- ...combinators
145
- ];
253
+ const combinators = localContext.getCombinators();
146
254
 
147
255
  statementVerifiedAgainstCombinators = combinators.some((combinator) => {
148
256
  const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, localContext);
@@ -180,18 +288,4 @@ function verifyStatementAgainstCombinator(statementNode, combinator, localContex
180
288
  }
181
289
 
182
290
  return statementVerifiedAgainstCombinator;
183
- }
184
-
185
- function isStatementEquality(statementNode) {
186
- const equalityNode = equalityNodeQuery(statementNode),
187
- statementEquality = (equalityNode !== null);
188
-
189
- return statementEquality;
190
- }
191
-
192
- function isStatementTypeAssertion(statementNode) {
193
- const typeAssertionNode = typeAssertionNodeQuery(statementNode),
194
- statementTypeAssertion = (typeAssertionNode !== null);
195
-
196
- return statementTypeAssertion;
197
- }
291
+ }
@@ -4,14 +4,14 @@ import { nodesQuery } from "../utilities/query";
4
4
 
5
5
  const proofStepNodesQuery = nodesQuery("/subDerivation/proofStep|lastProofStep");
6
6
 
7
- export default function verifySubDerivation(subDerivationNode, localContext) {
7
+ export default function verifySubDerivation(subDerivationNode, substitutions, localContext) {
8
8
  let subDerivationVerified;
9
9
 
10
10
  const proofStepNodes = proofStepNodesQuery(subDerivationNode);
11
11
 
12
12
  subDerivationVerified = proofStepNodes.every((proofStepNode) => {
13
13
  const { verifyProofStep } = verifySubDerivation,
14
- proofStepVerified = verifyProofStep(proofStepNode, localContext);
14
+ proofStepVerified = verifyProofStep(proofStepNode, substitutions, localContext);
15
15
 
16
16
  if (proofStepVerified) {
17
17
  return true;
@@ -9,7 +9,7 @@ import { nodeQuery, nodesQuery } from "../utilities/query";
9
9
  const suppositionNodesQuery = nodesQuery("/subproof/supposition"),
10
10
  subDerivationNodeQuery = nodeQuery("/subproof/subDerivation");
11
11
 
12
- export default function verifySubproof(subproofNode, localContext) {
12
+ export default function verifySubproof(subproofNode, substitutions, localContext) {
13
13
  let subproofVerified = false;
14
14
 
15
15
  localContext = LocalContext.fromLocalContext(localContext); ///
@@ -20,7 +20,7 @@ export default function verifySubproof(subproofNode, localContext) {
20
20
 
21
21
  if (suppositionsVerified) {
22
22
  const subDerivationNode = subDerivationNodeQuery(subproofNode),
23
- subDerivationVerified = verifySubDerivation(subDerivationNode, localContext);
23
+ subDerivationVerified = verifySubDerivation(subDerivationNode, substitutions, localContext);
24
24
 
25
25
  if (subDerivationVerified) {
26
26
  subproofVerified = true;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import ProofStep from "../step/proof";
3
+ import ProofStep from "../proofStep";
4
4
  import Supposition from "../supposition";
5
5
  import verifyUnqualifiedStatement from "../verify/statement/unqualified";
6
6
 
@@ -11,9 +11,9 @@ export default function verifyTermAsConstructor(termNode, typeNode, fileContext)
11
11
 
12
12
  fileContext.debug(`Verifying the '${termString}' term as a constructor...`, termNode);
13
13
 
14
- const nonTerminalNode = termNode, ///
14
+ const localContext = LocalContext.fromFileContext(fileContext),
15
+ nonTerminalNode = termNode, ///
15
16
  childNodes = nonTerminalNode.getChildNodes(),
16
- localContext = LocalContext.fromFileContext(fileContext),
17
17
  childNodesVerified = termAsConstructorNodeVerifier.verifyChildNodes(childNodes, localContext, () => {
18
18
  const verifiedAhead = true;
19
19
 
@@ -27,9 +27,9 @@ export default function verifyTheorem(theoremNode, fileContext) {
27
27
  labelsVerified = verifyLabels(labelNodes, labels, fileContext);
28
28
 
29
29
  if (labelsVerified) {
30
- const suppositionNodes = suppositionsNodeQuery(theoremNode),
30
+ const localContext = LocalContext.fromFileContext(fileContext),
31
31
  suppositions = [],
32
- localContext = LocalContext.fromFileContext(fileContext),
32
+ suppositionNodes = suppositionsNodeQuery(theoremNode),
33
33
  suppositionsVerified = verifySuppositions(suppositionNodes, suppositions, localContext);
34
34
 
35
35
  if (suppositionsVerified) {
@@ -41,10 +41,13 @@ export default function verifyTheorem(theoremNode, fileContext) {
41
41
  const proofNode = proofNodeQuery(theoremNode),
42
42
  firstConsequent = first(consequents),
43
43
  consequent = firstConsequent, ///
44
- proofVerified = verifyProof(proofNode, consequent, localContext);
44
+ statementNode = consequent.getStatementNode(),
45
+ substitutions = [],
46
+ proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
45
47
 
46
48
  if (proofVerified) {
47
- const theorem = Theorem.fromLabelsSuppositionsConsequentAndLocalContext(labels, suppositions, consequent, localContext);
49
+ const substitutions = [],
50
+ theorem = Theorem.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext);
48
51
 
49
52
  fileContext.addTheorem(theorem);
50
53
 
@@ -1,174 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return AxiomLemmaTheoremConjecture;
9
- }
10
- });
11
- var _label = /*#__PURE__*/ _interop_require_default(require("./label"));
12
- var _consequent = /*#__PURE__*/ _interop_require_default(require("./consequent"));
13
- var _supposition = /*#__PURE__*/ _interop_require_default(require("./supposition"));
14
- var _local = /*#__PURE__*/ _interop_require_default(require("./context/local"));
15
- var _array = require("./utilities/array");
16
- function _class_call_check(instance, Constructor) {
17
- if (!(instance instanceof Constructor)) {
18
- throw new TypeError("Cannot call a class as a function");
19
- }
20
- }
21
- function _defineProperties(target, props) {
22
- for(var i = 0; i < props.length; i++){
23
- var descriptor = props[i];
24
- descriptor.enumerable = descriptor.enumerable || false;
25
- descriptor.configurable = true;
26
- if ("value" in descriptor) descriptor.writable = true;
27
- Object.defineProperty(target, descriptor.key, descriptor);
28
- }
29
- }
30
- function _create_class(Constructor, protoProps, staticProps) {
31
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
32
- if (staticProps) _defineProperties(Constructor, staticProps);
33
- return Constructor;
34
- }
35
- function _interop_require_default(obj) {
36
- return obj && obj.__esModule ? obj : {
37
- default: obj
38
- };
39
- }
40
- var AxiomLemmaTheoremConjecture = /*#__PURE__*/ function() {
41
- function AxiomLemmaTheoremConjecture(labels, suppositions, consequent, localContext) {
42
- _class_call_check(this, AxiomLemmaTheoremConjecture);
43
- this.labels = labels;
44
- this.suppositions = suppositions;
45
- this.consequent = consequent;
46
- this.localContext = localContext;
47
- }
48
- _create_class(AxiomLemmaTheoremConjecture, [
49
- {
50
- key: "getLabels",
51
- value: function getLabels() {
52
- return this.labels;
53
- }
54
- },
55
- {
56
- key: "getSuppositions",
57
- value: function getSuppositions() {
58
- return this.suppositions;
59
- }
60
- },
61
- {
62
- key: "getConsequent",
63
- value: function getConsequent() {
64
- return this.consequent;
65
- }
66
- },
67
- {
68
- key: "getLocalContext",
69
- value: function getLocalContext() {
70
- return this.localContext;
71
- }
72
- },
73
- {
74
- key: "matchStatement",
75
- value: function matchStatement(statementNode, localContext) {
76
- var statementNatches = false;
77
- var proofSteps = localContext.getProofSteps(), substitutions = [], suppositionsMatch = matchSuppositions(this.suppositions, proofSteps, substitutions, this.localContext, localContext);
78
- if (suppositionsMatch) {
79
- var consequentMatches = matchConsequent(this.consequent, statementNode, substitutions, this.localContext, localContext);
80
- statementNatches = consequentMatches; ///
81
- }
82
- return statementNatches;
83
- }
84
- },
85
- {
86
- key: "matchMetavariableNode",
87
- value: function matchMetavariableNode(metavariableNode) {
88
- var matchesMetavariableNode = this.labels.some(function(label) {
89
- var labelMatchesMetavariableNode = label.matchMetavariableNode(metavariableNode);
90
- if (labelMatchesMetavariableNode) {
91
- return true;
92
- }
93
- });
94
- return matchesMetavariableNode;
95
- }
96
- },
97
- {
98
- key: "toJSON",
99
- value: function toJSON(tokens) {
100
- var labelsJSON = this.labels.map(function(label) {
101
- var labelJSON = label.toJSON(tokens);
102
- return labelJSON;
103
- }), suppositionsJSON = this.suppositions.map(function(supposition) {
104
- var suppositionJSON = supposition.toJSON(tokens);
105
- return suppositionJSON;
106
- }), consequentJSON = this.consequent.toJSON(tokens), localContextJSON = this.localContext.toJSON(tokens), labels = labelsJSON, suppositions = suppositionsJSON, consequent = consequentJSON, localContext = localContextJSON, json = {
107
- labels: labels,
108
- suppositions: suppositions,
109
- consequent: consequent,
110
- localContext: localContext
111
- };
112
- return json;
113
- }
114
- }
115
- ], [
116
- {
117
- key: "fromJSONAndFileContext",
118
- value: function fromJSONAndFileContext(Class, json, fileContext) {
119
- var labels = json.labels;
120
- var labelsJSON = labels; ///
121
- labels = labelsJSON.map(function(labelJSON) {
122
- var _$json = labelJSON, label = _label.default.fromJSONAndFileContext(_$json, fileContext);
123
- return label;
124
- });
125
- var suppositions = json.suppositions, consequent = json.consequent, localContext = json.localContext;
126
- var suppositionsJSON = suppositions; ///
127
- suppositions = suppositionsJSON.map(function(suppositionJSON) {
128
- var _$json = suppositionJSON, supposition = _supposition.default.fromJSONAndFileContext(_$json, fileContext);
129
- return supposition;
130
- });
131
- var consequentJSON = consequent; ///
132
- json = consequentJSON; ///
133
- consequent = _consequent.default.fromJSONAndFileContext(json, fileContext);
134
- var localContextJSON = localContext; ///
135
- json = localContextJSON; ///
136
- localContext = _local.default.fromJSONAndFileContext(json, fileContext);
137
- return new Class(labels, suppositions, consequent, localContext); ///
138
- }
139
- },
140
- {
141
- key: "fromLabelsSuppositionsConsequentAndLocalContext",
142
- value: function fromLabelsSuppositionsConsequentAndLocalContext(Class, labels, suppositions, consequent, localContext) {
143
- return new Class(labels, suppositions, consequent, localContext);
144
- }
145
- }
146
- ]);
147
- return AxiomLemmaTheoremConjecture;
148
- }();
149
- function matchSuppositions(suppositions, proofSteps, substitutions, localContext, statementLocalContext) {
150
- suppositions = (0, _array.reverse)(suppositions); ///
151
- proofSteps = (0, _array.reverse)(proofSteps); ///
152
- var suppositionsMatch = (0, _array.correlate)(suppositions, proofSteps, function(supposition, proofStep) {
153
- var suppositionMatches = matchSupposition(supposition, proofStep, substitutions, localContext, statementLocalContext);
154
- if (suppositionMatches) {
155
- return true;
156
- }
157
- });
158
- return suppositionsMatch;
159
- }
160
- function matchSupposition(supposition, proofStep, substitutions, localContext, statementLocalContext) {
161
- var suppositionMatches = false;
162
- var statementNode = proofStep.getStatementNode();
163
- if (statementNode !== null) {
164
- var suppositionMatchesStatementNode = supposition.matchStatementNode(statementNode, substitutions, localContext, statementLocalContext);
165
- suppositionMatches = suppositionMatchesStatementNode; ///
166
- }
167
- return suppositionMatches;
168
- }
169
- function matchConsequent(consequent, statementNode, substitutions, localContext, statementLocalContext) {
170
- var consequentMatchesStatementNode = consequent.matchStatementNode(statementNode, substitutions, localContext, statementLocalContext), consequentMatches = consequentMatchesStatementNode; ///
171
- return consequentMatches;
172
- }
173
-
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9heGlvbUxlbW1hVGhlb3JlbUNvbmplY3R1cmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBMYWJlbCBmcm9tIFwiLi9sYWJlbFwiO1xuaW1wb3J0IENvbnNlcXVlbnQgZnJvbSBcIi4vY29uc2VxdWVudFwiO1xuaW1wb3J0IFN1cHBvc2l0aW9uIGZyb20gXCIuL3N1cHBvc2l0aW9uXCI7XG5pbXBvcnQgTG9jYWxDb250ZXh0IGZyb20gXCIuL2NvbnRleHQvbG9jYWxcIjtcblxuaW1wb3J0IHsgcmV2ZXJzZSwgY29ycmVsYXRlIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2FycmF5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF4aW9tTGVtbWFUaGVvcmVtQ29uamVjdHVyZSB7XG4gIGNvbnN0cnVjdG9yKGxhYmVscywgc3VwcG9zaXRpb25zLCBjb25zZXF1ZW50LCBsb2NhbENvbnRleHQpIHtcbiAgICB0aGlzLmxhYmVscyA9IGxhYmVscztcbiAgICB0aGlzLnN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9ucztcbiAgICB0aGlzLmNvbnNlcXVlbnQgPSBjb25zZXF1ZW50O1xuICAgIHRoaXMubG9jYWxDb250ZXh0ID0gbG9jYWxDb250ZXh0O1xuICB9XG5cbiAgZ2V0TGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmxhYmVscztcbiAgfVxuXG4gIGdldFN1cHBvc2l0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3NpdGlvbnM7XG4gIH1cblxuICBnZXRDb25zZXF1ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnNlcXVlbnQ7XG4gIH1cblxuICBnZXRMb2NhbENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxDb250ZXh0O1xuICB9XG5cbiAgbWF0Y2hTdGF0ZW1lbnQoc3RhdGVtZW50Tm9kZSwgbG9jYWxDb250ZXh0KSB7XG4gICAgbGV0IHN0YXRlbWVudE5hdGNoZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHByb29mU3RlcHMgPSBsb2NhbENvbnRleHQuZ2V0UHJvb2ZTdGVwcygpLFxuICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBbXSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnNNYXRjaCA9IG1hdGNoU3VwcG9zaXRpb25zKHRoaXMuc3VwcG9zaXRpb25zLCBwcm9vZlN0ZXBzLCBzdWJzdGl0dXRpb25zLCB0aGlzLmxvY2FsQ29udGV4dCwgbG9jYWxDb250ZXh0KTtcblxuICAgIGlmIChzdXBwb3NpdGlvbnNNYXRjaCkge1xuICAgICAgY29uc3QgY29uc2VxdWVudE1hdGNoZXMgPSBtYXRjaENvbnNlcXVlbnQodGhpcy5jb25zZXF1ZW50LCBzdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCB0aGlzLmxvY2FsQ29udGV4dCwgbG9jYWxDb250ZXh0KTtcblxuICAgICAgc3RhdGVtZW50TmF0Y2hlcyA9IGNvbnNlcXVlbnRNYXRjaGVzOyAgLy8vXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudE5hdGNoZXM7XG4gIH1cblxuICBtYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IG1hdGNoZXNNZXRhdmFyaWFibGVOb2RlID0gdGhpcy5sYWJlbHMuc29tZSgobGFiZWwpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsTWF0Y2hlc01ldGF2YXJpYWJsZU5vZGUgPSBsYWJlbC5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmIChsYWJlbE1hdGNoZXNNZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoZXNNZXRhdmFyaWFibGVOb2RlO1xuICB9XG5cbiAgdG9KU09OKHRva2Vucykge1xuICAgIGNvbnN0IGxhYmVsc0pTT04gPSB0aGlzLmxhYmVscy5tYXAoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEpTT04gPSBsYWJlbC50b0pTT04odG9rZW5zKTtcblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsSlNPTjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdXBwb3NpdGlvbnNKU09OID0gdGhpcy5zdXBwb3NpdGlvbnMubWFwKChzdXBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3VwcG9zaXRpb25KU09OID0gc3VwcG9zaXRpb24udG9KU09OKHRva2Vucyk7XG5cbiAgICAgICAgICAgIHJldHVybiBzdXBwb3NpdGlvbkpTT047XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY29uc2VxdWVudEpTT04gPSB0aGlzLmNvbnNlcXVlbnQudG9KU09OKHRva2VucyksXG4gICAgICAgICAgbG9jYWxDb250ZXh0SlNPTiA9IHRoaXMubG9jYWxDb250ZXh0LnRvSlNPTih0b2tlbnMpLFxuICAgICAgICAgIGxhYmVscyA9IGxhYmVsc0pTT04sICAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNKU09OLCAgLy8vXG4gICAgICAgICAgY29uc2VxdWVudCA9IGNvbnNlcXVlbnRKU09OLCAgLy8vXG4gICAgICAgICAgbG9jYWxDb250ZXh0ID0gbG9jYWxDb250ZXh0SlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBsYWJlbHMsXG4gICAgICAgICAgICBzdXBwb3NpdGlvbnMsXG4gICAgICAgICAgICBjb25zZXF1ZW50LFxuICAgICAgICAgICAgbG9jYWxDb250ZXh0XG4gICAgICAgICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OQW5kRmlsZUNvbnRleHQoQ2xhc3MsIGpzb24sIGZpbGVDb250ZXh0KSB7XG4gICAgbGV0IHsgbGFiZWxzIH0gPSBqc29uO1xuXG4gICAgY29uc3QgbGFiZWxzSlNPTiA9IGxhYmVsczsgIC8vL1xuXG4gICAgbGFiZWxzID0gbGFiZWxzSlNPTi5tYXAoKGxhYmVsSlNPTikgPT4ge1xuICAgICAgY29uc3QganNvbiA9IGxhYmVsSlNPTiwgLy8vXG4gICAgICAgICAgICBsYWJlbCA9IExhYmVsLmZyb21KU09OQW5kRmlsZUNvbnRleHQoanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gbGFiZWw7XG4gICAgfSk7XG5cbiAgICBsZXQgeyBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIGxvY2FsQ29udGV4dCB9ID0ganNvbjtcblxuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0pTT04gPSBzdXBwb3NpdGlvbnM7ICAvLy9cblxuICAgIHN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9uc0pTT04ubWFwKChzdXBwb3NpdGlvbkpTT04pID0+IHtcbiAgICAgIGNvbnN0IGpzb24gPSBzdXBwb3NpdGlvbkpTT04sIC8vL1xuICAgICAgICAgICAgc3VwcG9zaXRpb24gPSBTdXBwb3NpdGlvbi5mcm9tSlNPTkFuZEZpbGVDb250ZXh0KGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgICAgcmV0dXJuIHN1cHBvc2l0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29uc2VxdWVudEpTT04gPSBjb25zZXF1ZW50OyAgLy8vXG5cbiAgICBqc29uID0gY29uc2VxdWVudEpTT047ICAvLy9cblxuICAgIGNvbnNlcXVlbnQgPSBDb25zZXF1ZW50LmZyb21KU09OQW5kRmlsZUNvbnRleHQoanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgY29uc3QgbG9jYWxDb250ZXh0SlNPTiA9IGxvY2FsQ29udGV4dDsgIC8vL1xuXG4gICAganNvbiA9IGxvY2FsQ29udGV4dEpTT047ICAvLy9cblxuICAgIGxvY2FsQ29udGV4dCA9IExvY2FsQ29udGV4dC5mcm9tSlNPTkFuZEZpbGVDb250ZXh0KGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHJldHVybiBuZXcgQ2xhc3MobGFiZWxzLCBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIGxvY2FsQ29udGV4dCk7ICAvLy9cbiAgfVxuXG4gIHN0YXRpYyBmcm9tTGFiZWxzU3VwcG9zaXRpb25zQ29uc2VxdWVudEFuZExvY2FsQ29udGV4dChDbGFzcywgbGFiZWxzLCBzdXBwb3NpdGlvbnMsIGNvbnNlcXVlbnQsIGxvY2FsQ29udGV4dCkgeyByZXR1cm4gbmV3IENsYXNzKGxhYmVscywgc3VwcG9zaXRpb25zLCBjb25zZXF1ZW50LCBsb2NhbENvbnRleHQpOyB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoU3VwcG9zaXRpb25zKHN1cHBvc2l0aW9ucywgcHJvb2ZTdGVwcywgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0LCBzdGF0ZW1lbnRMb2NhbENvbnRleHQpIHtcbiAgc3VwcG9zaXRpb25zID0gcmV2ZXJzZShzdXBwb3NpdGlvbnMpOyAvLy9cblxuICBwcm9vZlN0ZXBzID0gcmV2ZXJzZShwcm9vZlN0ZXBzKTsgLy8vXG5cbiAgY29uc3Qgc3VwcG9zaXRpb25zTWF0Y2ggPSBjb3JyZWxhdGUoc3VwcG9zaXRpb25zLCBwcm9vZlN0ZXBzLCAoc3VwcG9zaXRpb24sIHByb29mU3RlcCkgPT4ge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uTWF0Y2hlcyA9IG1hdGNoU3VwcG9zaXRpb24oc3VwcG9zaXRpb24sIHByb29mU3RlcCwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0LCBzdGF0ZW1lbnRMb2NhbENvbnRleHQpO1xuXG4gICAgaWYgKHN1cHBvc2l0aW9uTWF0Y2hlcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gc3VwcG9zaXRpb25zTWF0Y2g7XG59XG5cbmZ1bmN0aW9uIG1hdGNoU3VwcG9zaXRpb24oc3VwcG9zaXRpb24sIHByb29mU3RlcCwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0LCBzdGF0ZW1lbnRMb2NhbENvbnRleHQpIHtcbiAgbGV0IHN1cHBvc2l0aW9uTWF0Y2hlcyA9IGZhbHNlO1xuXG4gIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBwcm9vZlN0ZXAuZ2V0U3RhdGVtZW50Tm9kZSgpO1xuXG4gIGlmIChzdGF0ZW1lbnROb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb25NYXRjaGVzU3RhdGVtZW50Tm9kZSA9IHN1cHBvc2l0aW9uLm1hdGNoU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQsIHN0YXRlbWVudExvY2FsQ29udGV4dCk7XG5cbiAgICBzdXBwb3NpdGlvbk1hdGNoZXMgPSBzdXBwb3NpdGlvbk1hdGNoZXNTdGF0ZW1lbnROb2RlOyAgLy8vXG4gIH1cblxuICByZXR1cm4gc3VwcG9zaXRpb25NYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBtYXRjaENvbnNlcXVlbnQoY29uc2VxdWVudCwgc3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0LCBzdGF0ZW1lbnRMb2NhbENvbnRleHQpIHtcbiAgY29uc3QgY29uc2VxdWVudE1hdGNoZXNTdGF0ZW1lbnROb2RlID0gY29uc2VxdWVudC5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0LCBzdGF0ZW1lbnRMb2NhbENvbnRleHQpLFxuICAgICAgICBjb25zZXF1ZW50TWF0Y2hlcyA9IGNvbnNlcXVlbnRNYXRjaGVzU3RhdGVtZW50Tm9kZTsgLy8vXG5cbiAgcmV0dXJuIGNvbnNlcXVlbnRNYXRjaGVzO1xufVxuIl0sIm5hbWVzIjpbIkF4aW9tTGVtbWFUaGVvcmVtQ29uamVjdHVyZSIsImxhYmVscyIsInN1cHBvc2l0aW9ucyIsImNvbnNlcXVlbnQiLCJsb2NhbENvbnRleHQiLCJnZXRMYWJlbHMiLCJnZXRTdXBwb3NpdGlvbnMiLCJnZXRDb25zZXF1ZW50IiwiZ2V0TG9jYWxDb250ZXh0IiwibWF0Y2hTdGF0ZW1lbnQiLCJzdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50TmF0Y2hlcyIsInByb29mU3RlcHMiLCJnZXRQcm9vZlN0ZXBzIiwic3Vic3RpdHV0aW9ucyIsInN1cHBvc2l0aW9uc01hdGNoIiwibWF0Y2hTdXBwb3NpdGlvbnMiLCJjb25zZXF1ZW50TWF0Y2hlcyIsIm1hdGNoQ29uc2VxdWVudCIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJtYXRjaGVzTWV0YXZhcmlhYmxlTm9kZSIsInNvbWUiLCJsYWJlbCIsImxhYmVsTWF0Y2hlc01ldGF2YXJpYWJsZU5vZGUiLCJ0b0pTT04iLCJ0b2tlbnMiLCJsYWJlbHNKU09OIiwibWFwIiwibGFiZWxKU09OIiwic3VwcG9zaXRpb25zSlNPTiIsInN1cHBvc2l0aW9uIiwic3VwcG9zaXRpb25KU09OIiwiY29uc2VxdWVudEpTT04iLCJsb2NhbENvbnRleHRKU09OIiwianNvbiIsImZyb21KU09OQW5kRmlsZUNvbnRleHQiLCJDbGFzcyIsImZpbGVDb250ZXh0IiwiTGFiZWwiLCJTdXBwb3NpdGlvbiIsIkNvbnNlcXVlbnQiLCJMb2NhbENvbnRleHQiLCJmcm9tTGFiZWxzU3VwcG9zaXRpb25zQ29uc2VxdWVudEFuZExvY2FsQ29udGV4dCIsInN0YXRlbWVudExvY2FsQ29udGV4dCIsInJldmVyc2UiLCJjb3JyZWxhdGUiLCJwcm9vZlN0ZXAiLCJzdXBwb3NpdGlvbk1hdGNoZXMiLCJtYXRjaFN1cHBvc2l0aW9uIiwiZ2V0U3RhdGVtZW50Tm9kZSIsInN1cHBvc2l0aW9uTWF0Y2hlc1N0YXRlbWVudE5vZGUiLCJtYXRjaFN0YXRlbWVudE5vZGUiLCJjb25zZXF1ZW50TWF0Y2hlc1N0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBU3FCQTs7OzREQVBIO2lFQUNLO2tFQUNDOzREQUNDO3FCQUVVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXBCLElBQUEsQUFBTUEsNENBQUQsQUFBTDthQUFNQSw0QkFDUEMsTUFBTSxFQUFFQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsWUFBWTtnQ0FEdkNKO1FBRWpCLElBQUksQ0FBQ0MsTUFBTSxHQUFHQTtRQUNkLElBQUks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