occam-verify-cli 0.0.453 → 0.0.455
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.
- package/bin/utilities/fileSystem.js +15 -2
- package/lib/assertion.js +8 -1
- package/lib/context/file.js +42 -6
- package/lib/context/proof.js +25 -4
- package/lib/context/release/directory.js +16 -5
- package/lib/context/release/file.js +25 -11
- package/lib/kinds.js +5 -1
- package/lib/theorem.js +146 -0
- package/lib/variable.js +8 -1
- package/lib/verify/declaration/topLevel.js +7 -3
- package/lib/verify/derivation.js +112 -0
- package/lib/verify/equality.js +3 -16
- package/lib/verify/metaDerivation.js +47 -39
- package/lib/verify/proof.js +83 -0
- package/lib/verify/statement/unqualified.js +65 -4
- package/lib/verify/statement.js +2 -2
- package/lib/verify/term.js +12 -12
- package/lib/verify/termAsConstructor.js +2 -2
- package/lib/verify/theorem.js +57 -0
- package/package.json +3 -3
- package/src/assertion.js +8 -1
- package/src/context/file.js +45 -5
- package/src/context/proof.js +8 -4
- package/src/context/release/directory.js +17 -4
- package/src/context/release/file.js +29 -12
- package/src/kinds.js +1 -0
- package/src/theorem.js +130 -0
- package/src/variable.js +6 -0
- package/src/verify/assertion/type.js +25 -12
- package/src/verify/declaration/topLevel.js +7 -0
- package/src/verify/derivation.js +156 -0
- package/src/verify/equality.js +3 -22
- package/src/verify/metaDerivation.js +57 -45
- package/src/verify/proof.js +123 -0
- package/src/verify/statement/unqualified.js +69 -2
- package/src/verify/statement.js +2 -1
- package/src/verify/term.js +16 -17
- package/src/verify/termAsConstructor.js +1 -2
- package/src/verify/theorem.js +77 -0
- package/lib/verify/assertion/type.js +0 -104
package/src/verify/term.js
CHANGED
|
@@ -9,17 +9,24 @@ const termNodeQuery = nodeQuery("/argument/term!"),
|
|
|
9
9
|
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
10
10
|
variableNodeQuery = nodeQuery("/term/variable!");
|
|
11
11
|
|
|
12
|
-
export default function verifyTerm(termNode, types,
|
|
12
|
+
export default function verifyTerm(termNode, types, context) {
|
|
13
13
|
let termVerified = false;
|
|
14
14
|
|
|
15
15
|
context.begin(termNode);
|
|
16
16
|
|
|
17
|
-
const
|
|
17
|
+
const variables = [],
|
|
18
|
+
termVerifiedAsVariable = verifyTermAsVariable(termNode, variables, context);
|
|
18
19
|
|
|
19
20
|
if (termVerifiedAsVariable) {
|
|
21
|
+
const firstVariable = first(variables),
|
|
22
|
+
variable = firstVariable, ///
|
|
23
|
+
type = variable.getType();
|
|
24
|
+
|
|
25
|
+
types.push(type);
|
|
26
|
+
|
|
20
27
|
termVerified = true;
|
|
21
28
|
} else {
|
|
22
|
-
const termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types,
|
|
29
|
+
const termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, context);
|
|
23
30
|
|
|
24
31
|
if (termVerifiedAgainstConstructors) {
|
|
25
32
|
termVerified = true;
|
|
@@ -33,7 +40,7 @@ export default function verifyTerm(termNode, types, values, context) {
|
|
|
33
40
|
return termVerified;
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
export function verifyTermAsVariable(termNode,
|
|
43
|
+
export function verifyTermAsVariable(termNode, variables, context) {
|
|
37
44
|
let termVerifiedAsVariable = false;
|
|
38
45
|
|
|
39
46
|
context.begin(termNode);
|
|
@@ -47,13 +54,9 @@ export function verifyTermAsVariable(termNode, types, values, context) {
|
|
|
47
54
|
if (!variablePresent) {
|
|
48
55
|
context.error(`The ${variableName} variable is not present.`)
|
|
49
56
|
} else {
|
|
50
|
-
const variable = context.findVariableByVariableName(variableName)
|
|
51
|
-
type = variable.getType(),
|
|
52
|
-
value = variable.getValue();
|
|
57
|
+
const variable = context.findVariableByVariableName(variableName);
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
values.push(value);
|
|
59
|
+
variables.push(variable);
|
|
57
60
|
|
|
58
61
|
termVerifiedAsVariable = true;
|
|
59
62
|
}
|
|
@@ -66,7 +69,7 @@ export function verifyTermAsVariable(termNode, types, values, context) {
|
|
|
66
69
|
return termVerifiedAsVariable;
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
export function verifyTermAgainstConstructors(termNode, types,
|
|
72
|
+
export function verifyTermAgainstConstructors(termNode, types, context) {
|
|
70
73
|
let termVerifiedAgainstConstructors = false;
|
|
71
74
|
|
|
72
75
|
context.begin(termNode);
|
|
@@ -81,13 +84,10 @@ export function verifyTermAgainstConstructors(termNode, types, values, context)
|
|
|
81
84
|
}) || null;
|
|
82
85
|
|
|
83
86
|
if (constructor !== null) {
|
|
84
|
-
const type = constructor.getType()
|
|
85
|
-
value = termNode; ///
|
|
87
|
+
const type = constructor.getType();
|
|
86
88
|
|
|
87
89
|
types.push(type);
|
|
88
90
|
|
|
89
|
-
values.push(value);
|
|
90
|
-
|
|
91
91
|
termVerifiedAgainstConstructors = true;
|
|
92
92
|
}
|
|
93
93
|
|
|
@@ -211,8 +211,7 @@ function verifyArgumentNode(argumentNode, constructorArgumentNode, context) {
|
|
|
211
211
|
context.error(`The ${argumentString} argument should be a term, not a type`);
|
|
212
212
|
} else {
|
|
213
213
|
const types = [],
|
|
214
|
-
|
|
215
|
-
termVerified = verifyTerm(termNode, types, values, context);
|
|
214
|
+
termVerified = verifyTerm(termNode, types, context);
|
|
216
215
|
|
|
217
216
|
if (termVerified) {
|
|
218
217
|
const firstType = first(types),
|
|
@@ -138,9 +138,8 @@ function verifyNonTerminalNode(nonTerminalNode, fileContext) {
|
|
|
138
138
|
case TERM_RULE_NAME: {
|
|
139
139
|
const termNode = nonTerminalNode, ///
|
|
140
140
|
types = [],
|
|
141
|
-
values = [],
|
|
142
141
|
context = fileContext, ///
|
|
143
|
-
termVerified = verifyTerm(termNode, types,
|
|
142
|
+
termVerified = verifyTerm(termNode, types, context);
|
|
144
143
|
|
|
145
144
|
if (termVerified) {
|
|
146
145
|
const firstType = first(types),
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Theorem from "../theorem";
|
|
4
|
+
import verifyLabels from "../verify/labels";
|
|
5
|
+
import ProofContext from "../context/proof";
|
|
6
|
+
import verifyUnqualifiedStatement from "../verify/statement/unqualified";
|
|
7
|
+
import verifyIndicativeConditional from "../verify/indicativeConditional";
|
|
8
|
+
|
|
9
|
+
import { front, last } from "../utilities/array";
|
|
10
|
+
import { nodesAsString } from "../utilities/string";
|
|
11
|
+
import { nodeQuery, nodesQuery } from "../utilities/query";
|
|
12
|
+
|
|
13
|
+
const labelNodesQuery = nodesQuery("/theorem/label"),
|
|
14
|
+
statementNodeQuery = nodeQuery("/unqualifiedStatement/statement!"),
|
|
15
|
+
statementNodesQuery = nodesQuery("/indicativeConditional/unqualifiedStatement/statement!"),
|
|
16
|
+
unqualifiedStatementNodeQuery = nodeQuery("/theorem/unqualifiedStatement!"),
|
|
17
|
+
indicativeConditionalNodeQuery = nodeQuery("/theorem/indicativeConditional!");
|
|
18
|
+
|
|
19
|
+
export default function verifyTheorem(theoremNode, fileContext) {
|
|
20
|
+
let theoremVerified = false;
|
|
21
|
+
|
|
22
|
+
fileContext.begin(theoremNode);
|
|
23
|
+
|
|
24
|
+
const labelNodes = labelNodesQuery(theoremNode),
|
|
25
|
+
labelsString = nodesAsString(labelNodes),
|
|
26
|
+
proofContext = ProofContext.fromFileContext(fileContext);
|
|
27
|
+
|
|
28
|
+
fileContext.debug(`Verifying the '${labelsString}' theorem...`);
|
|
29
|
+
|
|
30
|
+
const labels = [],
|
|
31
|
+
labelsVerified = verifyLabels(labelNodes, labels, fileContext);
|
|
32
|
+
|
|
33
|
+
if (labelsVerified) {
|
|
34
|
+
const unqualifiedStatementNode = unqualifiedStatementNodeQuery(theoremNode),
|
|
35
|
+
indicativeConditionalNode = indicativeConditionalNodeQuery(theoremNode);
|
|
36
|
+
|
|
37
|
+
if (unqualifiedStatementNode !== null) {
|
|
38
|
+
const unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
|
|
39
|
+
|
|
40
|
+
if (unqualifiedStatementVerified) {
|
|
41
|
+
const statementNode = statementNodeQuery(unqualifiedStatementNode),
|
|
42
|
+
theorem = Theorem.fromLabelsAndStatementNode(labels, statementNode);
|
|
43
|
+
|
|
44
|
+
fileContext.addTheorem(theorem);
|
|
45
|
+
|
|
46
|
+
theoremVerified = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (indicativeConditionalNode !== null) {
|
|
51
|
+
const indicativeConditionalVerified = verifyIndicativeConditional(indicativeConditionalNode, proofContext);
|
|
52
|
+
|
|
53
|
+
if (indicativeConditionalVerified !== null) {
|
|
54
|
+
const statementNodes = statementNodesQuery(indicativeConditionalNode),
|
|
55
|
+
lastStatementNode = last(statementNodes),
|
|
56
|
+
frontStatementNodes = front(statementNodes),
|
|
57
|
+
consequentStatementNode = lastStatementNode, ///
|
|
58
|
+
suppositionStatementNodes = frontStatementNodes, ///
|
|
59
|
+
theorem = Theorem.fromLabelsSuppositionStatementNodesAndConsequentStatementNode(labels, suppositionStatementNodes, consequentStatementNode);
|
|
60
|
+
|
|
61
|
+
fileContext.addTheorem(theorem);
|
|
62
|
+
|
|
63
|
+
theoremVerified = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (theoremVerified) {
|
|
69
|
+
fileContext.info(`Verified the '${labelsString}' theorem.`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
theoremVerified ?
|
|
73
|
+
fileContext.complete(theoremNode) :
|
|
74
|
+
fileContext.halt(theoremNode);
|
|
75
|
+
|
|
76
|
+
return theoremVerified;
|
|
77
|
+
}
|
|
@@ -1,104 +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 verifyTypeAssertion;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _variable = /*#__PURE__*/ _interopRequireDefault(require("../../variable"));
|
|
12
|
-
var _term = /*#__PURE__*/ _interopRequireWildcard(require("../../verify/term"));
|
|
13
|
-
var _array = require("../../utilities/array");
|
|
14
|
-
var _string = require("../../utilities/string");
|
|
15
|
-
var _query = require("../../utilities/query");
|
|
16
|
-
function _interopRequireDefault(obj) {
|
|
17
|
-
return obj && obj.__esModule ? obj : {
|
|
18
|
-
default: obj
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
22
|
-
if (typeof WeakMap !== "function") return null;
|
|
23
|
-
var cacheBabelInterop = new WeakMap();
|
|
24
|
-
var cacheNodeInterop = new WeakMap();
|
|
25
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
26
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
27
|
-
})(nodeInterop);
|
|
28
|
-
}
|
|
29
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
30
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
31
|
-
return obj;
|
|
32
|
-
}
|
|
33
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
34
|
-
return {
|
|
35
|
-
default: obj
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
39
|
-
if (cache && cache.has(obj)) {
|
|
40
|
-
return cache.get(obj);
|
|
41
|
-
}
|
|
42
|
-
var newObj = {};
|
|
43
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
44
|
-
for(var key in obj){
|
|
45
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
46
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
47
|
-
if (desc && (desc.get || desc.set)) {
|
|
48
|
-
Object.defineProperty(newObj, key, desc);
|
|
49
|
-
} else {
|
|
50
|
-
newObj[key] = obj[key];
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
newObj.default = obj;
|
|
55
|
-
if (cache) {
|
|
56
|
-
cache.set(obj, newObj);
|
|
57
|
-
}
|
|
58
|
-
return newObj;
|
|
59
|
-
}
|
|
60
|
-
var termNodeQuery = (0, _query.nodeQuery)("/typeAssertion/term"), typeNodeQuery = (0, _query.nodeQuery)("/typeAssertion/type");
|
|
61
|
-
function verifyTypeAssertion(typeAssertionNode, proofContext) {
|
|
62
|
-
var typeAssertionVerified = false;
|
|
63
|
-
proofContext.begin(typeAssertionNode);
|
|
64
|
-
var typeNode = typeNodeQuery(typeAssertionNode), typeName = (0, _query.typeNameFromTypeNode)(typeNode), typePresent = proofContext.isTypePresentByTypeName(typeName);
|
|
65
|
-
if (!typePresent) {
|
|
66
|
-
proofContext.error("The ".concat(typeName, " type is not present."));
|
|
67
|
-
} else {
|
|
68
|
-
var derived = proofContext.isDerived();
|
|
69
|
-
if (derived) {
|
|
70
|
-
debugger;
|
|
71
|
-
} else {
|
|
72
|
-
var types = [], values = [], context = proofContext, termNode = termNodeQuery(typeAssertionNode), termString = (0, _string.nodeAsString)(termNode), termVerifiedAsVariable = (0, _term.verifyTermAsVariable)(termNode, types, values, context);
|
|
73
|
-
if (termVerifiedAsVariable) {
|
|
74
|
-
var firstValue = (0, _array.first)(values), variableName = termString, value = firstValue; ///
|
|
75
|
-
if (value !== undefined) {
|
|
76
|
-
proofContext.error("The value of the ".concat(variableName, " variable is not undefined."));
|
|
77
|
-
} else {
|
|
78
|
-
var type = proofContext.findTypeByTypeName(typeName), firstType = (0, _array.first)(types), variableType = firstType, typeEqualToOrSubTypeOfVariableType = type.isEqualToOrSubTypeOf(variableType);
|
|
79
|
-
if (!typeEqualToOrSubTypeOfVariableType) {
|
|
80
|
-
proofContext.error("The asserted type of the ".concat(variableName, " variable is not equal to or a sub-type of its declared type."));
|
|
81
|
-
} else {
|
|
82
|
-
var name = variableName, variable = _variable.default.fromTypeAndName(type, name);
|
|
83
|
-
proofContext.addVariable(variable);
|
|
84
|
-
typeAssertionVerified = true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
} else {
|
|
88
|
-
var termVerifiedAgainstConstructors = (0, _term.verifyTermAgainstConstructors)(termNode, types, values, context);
|
|
89
|
-
if (termVerifiedAgainstConstructors) {
|
|
90
|
-
var type1 = proofContext.findTypeByTypeName(typeName), firstType1 = (0, _array.first)(types), termType = firstType1, typeEqualToOrSubTypeOfTermType = type1.isEqualToOrSubTypeOf(termType);
|
|
91
|
-
if (!typeEqualToOrSubTypeOfTermType) {
|
|
92
|
-
proofContext.error("The asserted type of the '".concat(termString, "' term is not equal to or a sub-type of its declared type."));
|
|
93
|
-
} else {
|
|
94
|
-
typeAssertionVerified = true;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
typeAssertionVerified ? proofContext.complete(typeAssertionNode) : proofContext.halt(typeAssertionNode);
|
|
101
|
-
return typeAssertionVerified;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJpZnkvYXNzZXJ0aW9uL3R5cGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBWYXJpYWJsZSBmcm9tIFwiLi4vLi4vdmFyaWFibGVcIjtcbmltcG9ydCB2ZXJpZnlUZXJtIGZyb20gXCIuLi8uLi92ZXJpZnkvdGVybVwiO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYXJyYXlcIjtcbmltcG9ydCB7IG5vZGVBc1N0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc3RyaW5nXCI7XG5pbXBvcnQgeyBub2RlUXVlcnksIHR5cGVOYW1lRnJvbVR5cGVOb2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgdmVyaWZ5VGVybUFzVmFyaWFibGUsIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzIH0gZnJvbSBcIi4uLy4uL3ZlcmlmeS90ZXJtXCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdHlwZUFzc2VydGlvbi90ZXJtXCIpLFxuICAgICAgdHlwZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi90eXBlQXNzZXJ0aW9uL3R5cGVcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVR5cGVBc3NlcnRpb24odHlwZUFzc2VydGlvbk5vZGUsIHByb29mQ29udGV4dCkge1xuICBsZXQgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gZmFsc2U7XG5cbiAgcHJvb2ZDb250ZXh0LmJlZ2luKHR5cGVBc3NlcnRpb25Ob2RlKTtcblxuICBjb25zdCB0eXBlTm9kZSA9IHR5cGVOb2RlUXVlcnkodHlwZUFzc2VydGlvbk5vZGUpLFxuICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVR5cGVOb2RlKHR5cGVOb2RlKSxcbiAgICAgICAgdHlwZVByZXNlbnQgPSBwcm9vZkNvbnRleHQuaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gIGlmICghdHlwZVByZXNlbnQpIHtcbiAgICBwcm9vZkNvbnRleHQuZXJyb3IoYFRoZSAke3R5cGVOYW1lfSB0eXBlIGlzIG5vdCBwcmVzZW50LmApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlcml2ZWQgPSBwcm9vZkNvbnRleHQuaXNEZXJpdmVkKCk7XG5cbiAgICBpZiAoZGVyaXZlZCkge1xuICAgICAgZGVidWdnZXJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZXMgPSBbXSxcbiAgICAgICAgICAgIHZhbHVlcyA9IFtdLFxuICAgICAgICAgICAgY29udGV4dCA9IHByb29mQ29udGV4dCwgLy8vXG4gICAgICAgICAgICB0ZXJtTm9kZSA9IHRlcm1Ob2RlUXVlcnkodHlwZUFzc2VydGlvbk5vZGUpLFxuICAgICAgICAgICAgdGVybVN0cmluZyA9IG5vZGVBc1N0cmluZyh0ZXJtTm9kZSksXG4gICAgICAgICAgICB0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlID0gdmVyaWZ5VGVybUFzVmFyaWFibGUodGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAodGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gZmlyc3QodmFsdWVzKSxcbiAgICAgICAgICAgICAgdmFyaWFibGVOYW1lID0gdGVybVN0cmluZywgLy8vXG4gICAgICAgICAgICAgIHZhbHVlID0gZmlyc3RWYWx1ZTsgLy8vXG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9vZkNvbnRleHQuZXJyb3IoYFRoZSB2YWx1ZSBvZiB0aGUgJHt2YXJpYWJsZU5hbWV9IHZhcmlhYmxlIGlzIG5vdCB1bmRlZmluZWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHByb29mQ29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpLFxuICAgICAgICAgICAgICAgIGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBmaXJzdFR5cGUsIC8vL1xuICAgICAgICAgICAgICAgIHR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZWYXJpYWJsZVR5cGUgPSB0eXBlLmlzRXF1YWxUb09yU3ViVHlwZU9mKHZhcmlhYmxlVHlwZSk7XG5cbiAgICAgICAgICBpZiAoIXR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZWYXJpYWJsZVR5cGUpIHtcbiAgICAgICAgICAgIHByb29mQ29udGV4dC5lcnJvcihgVGhlIGFzc2VydGVkIHR5cGUgb2YgdGhlICR7dmFyaWFibGVOYW1lfSB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gb3IgYSBzdWItdHlwZSBvZiBpdHMgZGVjbGFyZWQgdHlwZS5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tVHlwZUFuZE5hbWUodHlwZSwgbmFtZSk7XG5cbiAgICAgICAgICAgIHByb29mQ29udGV4dC5hZGRWYXJpYWJsZSh2YXJpYWJsZSk7XG5cbiAgICAgICAgICAgIHR5cGVBc3NlcnRpb25WZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzID0gdmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnModGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICh0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHByb29mQ29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpLFxuICAgICAgICAgICAgICAgIGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgICB0ZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICAgICAgdHlwZUVxdWFsVG9PclN1YlR5cGVPZlRlcm1UeXBlID0gdHlwZS5pc0VxdWFsVG9PclN1YlR5cGVPZih0ZXJtVHlwZSk7XG5cbiAgICAgICAgICBpZiAoIXR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUZXJtVHlwZSkge1xuICAgICAgICAgICAgcHJvb2ZDb250ZXh0LmVycm9yKGBUaGUgYXNzZXJ0ZWQgdHlwZSBvZiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gaXMgbm90IGVxdWFsIHRvIG9yIGEgc3ViLXR5cGUgb2YgaXRzIGRlY2xhcmVkIHR5cGUuYCk7XG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQgP1xuICAgIHByb29mQ29udGV4dC5jb21wbGV0ZSh0eXBlQXNzZXJ0aW9uTm9kZSkgOlxuICAgICAgcHJvb2ZDb250ZXh0LmhhbHQodHlwZUFzc2VydGlvbk5vZGUpO1xuXG4gIHJldHVybiB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQ7XG59XG4iXSwibmFtZXMiOlsidmVyaWZ5VHlwZUFzc2VydGlvbiIsInRlcm1Ob2RlUXVlcnkiLCJub2RlUXVlcnkiLCJ0eXBlTm9kZVF1ZXJ5IiwidHlwZUFzc2VydGlvbk5vZGUiLCJwcm9vZkNvbnRleHQiLCJ0eXBlQXNzZXJ0aW9uVmVyaWZpZWQiLCJiZWdpbiIsInR5cGVOb2RlIiwidHlwZU5hbWUiLCJ0eXBlTmFtZUZyb21UeXBlTm9kZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJlcnJvciIsImRlcml2ZWQiLCJpc0Rlcml2ZWQiLCJ0eXBlcyIsInZhbHVlcyIsImNvbnRleHQiLCJ0ZXJtTm9kZSIsInRlcm1TdHJpbmciLCJub2RlQXNTdHJpbmciLCJ0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFzVmFyaWFibGUiLCJmaXJzdFZhbHVlIiwiZmlyc3QiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsInR5cGUiLCJmaW5kVHlwZUJ5VHlwZU5hbWUiLCJmaXJzdFR5cGUiLCJ2YXJpYWJsZVR5cGUiLCJ0eXBlRXF1YWxUb09yU3ViVHlwZU9mVmFyaWFibGVUeXBlIiwiaXNFcXVhbFRvT3JTdWJUeXBlT2YiLCJuYW1lIiwidmFyaWFibGUiLCJWYXJpYWJsZSIsImZyb21UeXBlQW5kTmFtZSIsImFkZFZhcmlhYmxlIiwidGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyIsInZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzIiwidGVybVR5cGUiLCJ0eXBlRXF1YWxUb09yU3ViVHlwZU9mVGVybVR5cGUiLCJjb21wbGV0ZSIsImhhbHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWFBOzs7ZUFBd0JBOzs7NkRBWEg7MERBQ0U7cUJBRUQ7c0JBQ087cUJBQ21COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHaEQsSUFBTUMsZ0JBQWdCQyxJQUFBQSxnQkFBUyxFQUFDLHdCQUMxQkMsZ0JBQWdCRCxJQUFBQSxnQkFBUyxFQUFDO0FBRWpCLFNBQVNGLG9CQUFvQkksaUJBQWlCLEVBQUVDLFlBQVksRUFBRTtJQUMzRSxJQUFJQyx3QkFBd0IsS0FBSztJQUVqQ0QsYUFBYUUsS0FBSyxDQUFDSDtJQUVuQixJQUFNSSxXQUFXTCxjQUFjQyxvQkFDekJLLFdBQVdDLElBQUFBLDJCQUFvQixFQUFDRixXQUNoQ0csY0FBY04sYUFBYU8sdUJBQXVCLENBQUNIO0lBRXpELElBQUksQ0FBQ0UsYUFBYTtRQUNoQk4sYUFBYVEsS0FBSyxDQUFDLEFBQUMsT0FBZSxPQUFUSixVQUFTO0lBQ3JDLE9BQU87UUFDTCxJQUFNSyxVQUFVVCxhQUFhVSxTQUFTO1FBRXRDLElBQUlELFNBQVM7WUFDWCxRQUFRO1FBQ1YsT0FBTztZQUNMLElBQU1FLFFBQVEsRUFBRSxFQUNWQyxTQUFTLEVBQUUsRUFDWEMsVUFBVWIsY0FDVmMsV0FBV2xCLGNBQWNHLG9CQUN6QmdCLGFBQWFDLElBQUFBLG9CQUFZLEVBQUNGLFdBQzFCRyx5QkFBeUJDLElBQUFBLDBCQUFvQixFQUFDSixVQUFVSCxPQUFPQyxRQUFRQztZQUU3RSxJQUFJSSx3QkFBd0I7Z0JBQzFCLElBQU1FLGFBQWFDLElBQUFBLFlBQUssRUFBQ1IsU0FDbkJTLGVBQWVOLFlBQ2ZPLFFBQVFILFlBQVksR0FBRztnQkFFN0IsSUFBSUcsVUFBVUMsV0FBVztvQkFDdkJ2QixhQUFhUSxLQUFLLENBQUMsQUFBQyxvQkFBZ0MsT0FBYmEsY0FBYTtnQkFDdEQsT0FBTztvQkFDTCxJQUFNRyxPQUFPeEIsYUFBYXlCLGtCQUFrQixDQUFDckIsV0FDdkNzQixZQUFZTixJQUFBQSxZQUFLLEVBQUNULFFBQ2xCZ0IsZUFBZUQsV0FDZkUscUNBQXFDSixLQUFLSyxvQkFBb0IsQ0FBQ0Y7b0JBRXJFLElBQUksQ0FBQ0Msb0NBQW9DO3dCQUN2QzVCLGFBQWFRLEtBQUssQ0FBQyxBQUFDLDRCQUF3QyxPQUFiYSxjQUFhO29CQUM5RCxPQUFPO3dCQUNMLElBQU1TLE9BQU9ULGNBQ1BVLFdBQVdDLGlCQUFRLENBQUNDLGVBQWUsQ0FBQ1QsTUFBTU07d0JBRWhEOUIsYUFBYWtDLFdBQVcsQ0FBQ0g7d0JBRXpCOUIsd0JBQXdCLElBQUk7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBTWtDLGtDQUFrQ0MsSUFBQUEsbUNBQTZCLEVBQUN0QixVQUFVSCxPQUFPQyxRQUFRQztnQkFFL0YsSUFBSXNCLGlDQUFpQztvQkFDbkMsSUFBTVgsUUFBT3hCLGFBQWF5QixrQkFBa0IsQ0FBQ3JCLFdBQ3ZDc0IsYUFBWU4sSUFBQUEsWUFBSyxFQUFDVCxRQUNsQjBCLFdBQVdYLFlBQ1hZLGlDQUFpQ2QsTUFBS0ssb0JBQW9CLENBQUNRO29CQUVqRSxJQUFJLENBQUNDLGdDQUFnQzt3QkFDbkN0QyxhQUFhUSxLQUFLLENBQUMsQUFBQyw2QkFBdUMsT0FBWE8sWUFBVztvQkFDN0QsT0FBTzt3QkFFTGQsd0JBQXdCLElBQUk7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEQSx3QkFDRUQsYUFBYXVDLFFBQVEsQ0FBQ3hDLHFCQUNwQkMsYUFBYXdDLElBQUksQ0FBQ3pDLGtCQUFrQjtJQUV4QyxPQUFPRTtBQUNUIn0=
|