occam-verify-cli 1.0.437 → 1.0.438

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.
@@ -0,0 +1,198 @@
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 _default;
9
+ }
10
+ });
11
+ var _elements = /*#__PURE__*/ _interop_require_default(require("../../elements"));
12
+ var _statement = require("../../utilities/statement");
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ function validateAsMetavariableAndSubstitution(statement, assignments, stated, context) {
19
+ var validatesAsMetavariableAndSubstitution = false;
20
+ var metavariable = (0, _statement.metavariableFromStatement)(statement, context);
21
+ if (metavariable !== null) {
22
+ var statementString = statement.getString();
23
+ context.trace("Validating the '".concat(statementString, "' statement as a metavariable and substitution..."));
24
+ var metavariableValidates = metavariable.validate(context);
25
+ if (metavariableValidates) {
26
+ var TermSubstitution = _elements.default.TermSubstitution, FrameSubstitution = _elements.default.FrameSubstitution, frameSubstitution = FrameSubstitution.fromStatement(statement, context), termSubstitution = TermSubstitution.fromStatement(statement, context), substitution = termSubstitution || frameSubstitution;
27
+ if (substitution !== null) {
28
+ var substitutionValidates = substitution.validate(context);
29
+ if (substitutionValidates) {
30
+ validatesAsMetavariableAndSubstitution = true;
31
+ }
32
+ } else {
33
+ validatesAsMetavariableAndSubstitution = true;
34
+ }
35
+ }
36
+ if (validatesAsMetavariableAndSubstitution) {
37
+ context.debug("...validated the '".concat(statementString, "' statement as a metavariable and substitution."));
38
+ }
39
+ }
40
+ return validatesAsMetavariableAndSubstitution;
41
+ }
42
+ function unifyWithBracketedCombinatorStatement(statement, assignments, stated, context) {
43
+ stated = true; ///
44
+ assignments = null; ///
45
+ var BracketedCombinatorStatement = _elements.default.BracketedCombinatorStatement, bracketedCombinatorStatement = BracketedCombinatorStatement.fromNothing(), unifiesWithBracketedCombinatorStatement = bracketedCombinatorStatement.unifyStatement(statement, assignments, stated, context);
46
+ return unifiesWithBracketedCombinatorStatement;
47
+ }
48
+ function unifyWithCombinators(statement, assignments, stated, context) {
49
+ stated = true; ///
50
+ assignments = null; ///
51
+ var combinators = context.getCombinators(), unifiesWithCombinators = combinators.some(function(combinator) {
52
+ var unifiesWithCombinator = combinator.unifyStatement(statement, assignments, stated, context);
53
+ if (unifiesWithCombinator) {
54
+ return true;
55
+ }
56
+ });
57
+ return unifiesWithCombinators;
58
+ }
59
+ function validateAsEquality(statement, assignments, stated, context) {
60
+ var validatesAsEquality = false;
61
+ var equality = (0, _statement.equalityFromStatement)(statement, context);
62
+ if (equality !== null) {
63
+ var statementString = statement.getString();
64
+ context.trace("Validating the '".concat(statementString, "' statement as an equality..."));
65
+ var equalityValidates = equality.validate(assignments, stated, context);
66
+ validatesAsEquality = equalityValidates; ///
67
+ if (validatesAsEquality) {
68
+ context.debug("...validated the '".concat(statementString, "' statement as an equality."));
69
+ }
70
+ }
71
+ return validatesAsEquality;
72
+ }
73
+ function validateAsJudgement(statement, assignments, stated, context) {
74
+ var validatesAsJudgement = false;
75
+ var judgement = (0, _statement.judgementFromStatement)(statement, context);
76
+ if (judgement !== null) {
77
+ var statementString = statement.getString();
78
+ context.trace("Validating the '".concat(statementString, "' statement as a judgement..."));
79
+ var judgementValidates = judgement.validate(assignments, stated, context);
80
+ validatesAsJudgement = judgementValidates; ///
81
+ if (validatesAsJudgement) {
82
+ context.debug("...validated the '".concat(statementString, "' statement as a judgement."));
83
+ }
84
+ }
85
+ return validatesAsJudgement;
86
+ }
87
+ function validateAsTypeAssertion(statement, assignments, stated, context) {
88
+ var validatesAsTypeAssertion = false;
89
+ var typeAssertion = (0, _statement.typeAssertionFromStatement)(statement, context);
90
+ if (typeAssertion !== null) {
91
+ var statementString = statement.getString();
92
+ context.trace("Validating the '".concat(statementString, "' statement as a type assertion..."));
93
+ var typeAssertionValidates = typeAssertion.validate(assignments, stated, context);
94
+ validatesAsTypeAssertion = typeAssertionValidates; ///
95
+ if (validatesAsTypeAssertion) {
96
+ var assertion = typeAssertion; ///
97
+ context.addAssertion(assertion);
98
+ context.debug("...validated the '".concat(statementString, "' statement as a type assertion."));
99
+ }
100
+ }
101
+ return validatesAsTypeAssertion;
102
+ }
103
+ function validateAsDefinedAssertion(statement, assignments, stated, context) {
104
+ var validatesAsDefinedAssertion = false;
105
+ var definedAssertion = (0, _statement.definedAssertionFromStatement)(statement, context);
106
+ if (definedAssertion !== null) {
107
+ var statementString = statement.getString();
108
+ context.trace("Validating the '".concat(statementString, "' statement as a defined assertion..."));
109
+ var definedAssertionValidates = definedAssertion.validate(assignments, stated, context);
110
+ validatesAsDefinedAssertion = definedAssertionValidates; ///
111
+ if (validatesAsDefinedAssertion) {
112
+ var assertion = definedAssertion; ///
113
+ context.addAssertion(assertion);
114
+ context.debug("...validated the '".concat(statementString, "' statement as a defined assertion."));
115
+ }
116
+ }
117
+ return validatesAsDefinedAssertion;
118
+ }
119
+ function validateAsPropertyAssertion(statement, assignments, stated, context) {
120
+ var validatesAsPropertyAssertion = false;
121
+ var propertyAssertion = (0, _statement.propertyAssertionFromStatement)(statement, context);
122
+ if (propertyAssertion !== null) {
123
+ var statementString = statement.getString();
124
+ context.trace("Validating the '".concat(statementString, "' statement as a property assertion..."));
125
+ var propertyAssertionValidates = propertyAssertion.validate(assignments, stated, context);
126
+ validatesAsPropertyAssertion = propertyAssertionValidates; ///
127
+ if (validatesAsPropertyAssertion) {
128
+ var assertion = propertyAssertion; ///
129
+ context.addAssertion(assertion);
130
+ context.debug("...validated the '".concat(statementString, "' statement as a property assertion."));
131
+ }
132
+ }
133
+ return validatesAsPropertyAssertion;
134
+ }
135
+ function validateAsSubproofAssertion(statement, assignments, stated, context) {
136
+ var validatesAsSubproofAssertion = false;
137
+ var subproofAssertion = (0, _statement.subproofAssertionFromStatement)(statement, context);
138
+ if (subproofAssertion !== null) {
139
+ var statementString = statement.getString();
140
+ context.trace("Validating the '".concat(statementString, "' statement as a subproof assertion..."));
141
+ var subproofAssertionValidates = subproofAssertion.validate(assignments, stated, context);
142
+ validatesAsSubproofAssertion = subproofAssertionValidates; ///
143
+ if (validatesAsSubproofAssertion) {
144
+ var assertion = subproofAssertion; ///
145
+ context.addAssertion(assertion);
146
+ context.debug("...validated the '".concat(statementString, "' statement as a subproof assertion."));
147
+ }
148
+ }
149
+ return validatesAsSubproofAssertion;
150
+ }
151
+ function validateAsContainedAssertion(statement, assignments, stated, context) {
152
+ var validatesAsContainedAssertion = false;
153
+ var containedAssertion = (0, _statement.containedAssertionFromStatement)(statement, context);
154
+ if (containedAssertion !== null) {
155
+ var statementString = statement.getString();
156
+ context.trace("Validating the '".concat(statementString, "' statement as a contained assertion..."));
157
+ var containedAssertionValidates = containedAssertion.validate(assignments, stated, context);
158
+ validatesAsContainedAssertion = containedAssertionValidates; ///
159
+ if (validatesAsContainedAssertion) {
160
+ var assertion = containedAssertion; ///
161
+ context.addAssertion(assertion);
162
+ context.debug("...validated the '".concat(statementString, "' statement as a contained assertion."));
163
+ }
164
+ }
165
+ return validatesAsContainedAssertion;
166
+ }
167
+ function validateAsSatisfiesAssertion(statement, assignments, stated, context) {
168
+ var validatesAsSatisfiesAssertion = false;
169
+ var satisfiesAssertion = (0, _statement.satisfiesAssertionFromStatement)(statement, context);
170
+ if (satisfiesAssertion !== null) {
171
+ var statementString = statement.getString();
172
+ context.trace("Validating the '".concat(statementString, "' statement as a satisfies assertion..."));
173
+ var satisfiesAssertionValidates = satisfiesAssertion.validate(assignments, stated, context);
174
+ validatesAsSatisfiesAssertion = satisfiesAssertionValidates; ///
175
+ if (validatesAsSatisfiesAssertion) {
176
+ var assertion = satisfiesAssertion; ///
177
+ context.addAssertion(assertion);
178
+ context.debug("...validated the '".concat(statementString, "' statement as a satisfies assertion."));
179
+ }
180
+ }
181
+ return validatesAsSatisfiesAssertion;
182
+ }
183
+ var validateMixins = [
184
+ validateAsMetavariableAndSubstitution,
185
+ unifyWithBracketedCombinatorStatement,
186
+ unifyWithCombinators,
187
+ validateAsEquality,
188
+ validateAsJudgement,
189
+ validateAsTypeAssertion,
190
+ validateAsDefinedAssertion,
191
+ validateAsPropertyAssertion,
192
+ validateAsSubproofAssertion,
193
+ validateAsContainedAssertion,
194
+ validateAsSatisfiesAssertion
195
+ ];
196
+ var _default = validateMixins;
197
+
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9taXhpbnMvc3RhdGVtZW50L3ZhbGlkYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGVxdWFsaXR5RnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGp1ZGdlbWVudEZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50LFxuICAgICAgICAgdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBkZWZpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGNvbnRhaW5lZEFzc2VydGlvbkZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBzYXRpc2ZpZXNBc3NlcnRpb25Gcm9tU3RhdGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9zdGF0ZW1lbnRcIjtcblxuZnVuY3Rpb24gdmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUgYW5kIHN1YnN0aXR1dGlvbi4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlVmFsaWRhdGVzID0gbWV0YXZhcmlhYmxlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZVZhbGlkYXRlcykge1xuICAgICAgY29uc3QgeyBUZXJtU3Vic3RpdHV0aW9uLCBGcmFtZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvbiA9IEZyYW1lU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSxcbiAgICAgICAgICAgIHRlcm1TdWJzdGl0dXRpb24gPSBUZXJtU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSxcbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9ICh0ZXJtU3Vic3RpdHV0aW9uIHx8IGZyYW1lU3Vic3RpdHV0aW9uKTtcblxuICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25WYWxpZGF0ZXMgPSBzdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN1YnN0aXR1dGlvblZhbGlkYXRlcykge1xuICAgICAgICAgIHZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVzQXNNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXNBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUgYW5kIHN1YnN0aXR1dGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb247XG59XG5cbmZ1bmN0aW9uIHVuaWZ5V2l0aEJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQoc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIHN0YXRlZCA9IHRydWU7ICAvLy9cblxuICBhc3NpZ25tZW50cyA9IG51bGw7IC8vL1xuXG4gIGNvbnN0IHsgQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCB9ID0gZWxlbWVudHMsXG4gICAgICAgIGJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQgPSBCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50LmZyb21Ob3RoaW5nKCksXG4gICAgICAgIHVuaWZpZXNXaXRoQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCA9IGJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICByZXR1cm4gdW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50O1xufVxuXG5mdW5jdGlvbiB1bmlmeVdpdGhDb21iaW5hdG9ycyhzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgc3RhdGVkID0gdHJ1ZTsgIC8vL1xuXG4gIGFzc2lnbm1lbnRzID0gbnVsbDsgLy8vXG5cbiAgY29uc3QgY29tYmluYXRvcnMgPSBjb250ZXh0LmdldENvbWJpbmF0b3JzKCksXG4gICAgICAgIHVuaWZpZXNXaXRoQ29tYmluYXRvcnMgPSBjb21iaW5hdG9ycy5zb21lKChjb21iaW5hdG9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5pZmllc1dpdGhDb21iaW5hdG9yID0gY29tYmluYXRvci51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKHVuaWZpZXNXaXRoQ29tYmluYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICByZXR1cm4gdW5pZmllc1dpdGhDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0VxdWFsaXR5KHN0YXRlbWVudCwgYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzQXNFcXVhbGl0eSA9IGZhbHNlO1xuXG4gIGNvbnN0IGVxdWFsaXR5ID0gZXF1YWxpdHlGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGVxdWFsaXR5ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCk7XG5cbiAgICBjb25zdCBlcXVhbGl0eVZhbGlkYXRlcyA9IGVxdWFsaXR5LnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgdmFsaWRhdGVzQXNFcXVhbGl0eSA9IGVxdWFsaXR5VmFsaWRhdGVzOyAvLy9cblxuICAgIGlmICh2YWxpZGF0ZXNBc0VxdWFsaXR5KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhbiBlcXVhbGl0eS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNFcXVhbGl0eTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0p1ZGdlbWVudChzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzSnVkZ2VtZW50ID0gZmFsc2U7XG5cbiAgY29uc3QganVkZ2VtZW50ID0ganVkZ2VtZW50RnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChqdWRnZW1lbnQgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuLi5gKTtcblxuICAgIGNvbnN0IGp1ZGdlbWVudFZhbGlkYXRlcyA9IGp1ZGdlbWVudC52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzSnVkZ2VtZW50ID0ganVkZ2VtZW50VmFsaWRhdGVzOyAgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNKdWRnZW1lbnQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEganVkZ2VtZW50LmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNBc0p1ZGdlbWVudDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1R5cGVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB0eXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAodHlwZUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uVmFsaWRhdGVzID0gdHlwZUFzc2VydGlvbi52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbikge1xuICAgICAgY29uc3QgYXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbjsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNBc1R5cGVBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNEZWZpbmVkQXNzZXJ0aW9uKHN0YXRlbWVudCwgYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzQXNEZWZpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgZGVmaW5lZEFzc2VydGlvbiA9IGRlZmluZWRBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGRlZmluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBkZWZpbmVkIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgZGVmaW5lZEFzc2VydGlvblZhbGlkYXRlcyA9IGRlZmluZWRBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc0RlZmluZWRBc3NlcnRpb24gPSBkZWZpbmVkQXNzZXJ0aW9uVmFsaWRhdGVzOyAvLy9cblxuICAgIGlmICh2YWxpZGF0ZXNBc0RlZmluZWRBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGRlZmluZWRBc3NlcnRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBkZWZpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNEZWZpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgcHJvcGVydHlBc3NlcnRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAocHJvcGVydHlBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uLi5gKTtcblxuICAgIGNvbnN0IHByb3BlcnR5QXNzZXJ0aW9uVmFsaWRhdGVzID0gcHJvcGVydHlBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gcHJvcGVydHlBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uOyAvLy9cblxuICAgICAgY29udGV4dC5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzdWJwcm9vZkFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHN1YnByb29mIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc3VicHJvb2ZBc3NlcnRpb25WYWxpZGF0ZXMgPSBzdWJwcm9vZkFzc2VydGlvbi52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSBzdWJwcm9vZkFzc2VydGlvblZhbGlkYXRlczsgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbikge1xuICAgICAgY29uc3QgYXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb247IC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHN1YnByb29mIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzQ29udGFpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGFpbmVkQXNzZXJ0aW9uID0gY29udGFpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChjb250YWluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBjb250YWluZWQgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25WYWxpZGF0ZXMgPSBjb250YWluZWRBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc0NvbnRhaW5lZEFzc2VydGlvbiA9IGNvbnRhaW5lZEFzc2VydGlvblZhbGlkYXRlczsgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNDb250YWluZWRBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGNvbnRhaW5lZEFzc2VydGlvbjsgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgY29udGFpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNDb250YWluZWRBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1NhdGlzZmllc0Fzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHNhdGlzZmllc0Fzc2VydGlvbiA9IHNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc2F0aXNmaWVzIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzID0gc2F0aXNmaWVzQXNzZXJ0aW9uLnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgdmFsaWRhdGVzQXNTYXRpc2ZpZXNBc3NlcnRpb24gPSBzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzU2F0aXNmaWVzQXNzZXJ0aW9uKSB7XG4gICAgICBjb25zdCBhc3NlcnRpb24gPSBzYXRpc2ZpZXNBc3NlcnRpb247IC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHNhdGlzZmllcyBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc0FzU2F0aXNmaWVzQXNzZXJ0aW9uO1xufVxuXG5jb25zdCB2YWxpZGF0ZU1peGlucyA9IFtcbiAgdmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbixcbiAgdW5pZnlXaXRoQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCxcbiAgdW5pZnlXaXRoQ29tYmluYXRvcnMsXG4gIHZhbGlkYXRlQXNFcXVhbGl0eSxcbiAgdmFsaWRhdGVBc0p1ZGdlbWVudCxcbiAgdmFsaWRhdGVBc1R5cGVBc3NlcnRpb24sXG4gIHZhbGlkYXRlQXNEZWZpbmVkQXNzZXJ0aW9uLFxuICB2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24sXG4gIHZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbixcbiAgdmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbixcbiAgdmFsaWRhdGVBc1NhdGlzZmllc0Fzc2VydGlvblxuXTtcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGVNaXhpbnM7XG4iXSwibmFtZXMiOlsidmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbiIsInN0YXRlbWVudCIsImFzc2lnbm1lbnRzIiwic3RhdGVkIiwiY29udGV4dCIsInZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwibWV0YXZhcmlhYmxlVmFsaWRhdGVzIiwidmFsaWRhdGUiLCJUZXJtU3Vic3RpdHV0aW9uIiwiZWxlbWVudHMiLCJGcmFtZVN1YnN0aXR1dGlvbiIsImZyYW1lU3Vic3RpdHV0aW9uIiwiZnJvbVN0YXRlbWVudCIsInRlcm1TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb25WYWxpZGF0ZXMiLCJkZWJ1ZyIsInVuaWZ5V2l0aEJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQiLCJCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50IiwiYnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCIsImZyb21Ob3RoaW5nIiwidW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50IiwidW5pZnlTdGF0ZW1lbnQiLCJ1bmlmeVdpdGhDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZ2V0Q29tYmluYXRvcnMiLCJ1bmlmaWVzV2l0aENvbWJpbmF0b3JzIiwic29tZSIsImNvbWJpbmF0b3IiLCJ1bmlmaWVzV2l0aENvbWJpbmF0b3IiLCJ2YWxpZGF0ZUFzRXF1YWxpdHkiLCJ2YWxpZGF0ZXNBc0VxdWFsaXR5IiwiZXF1YWxpdHkiLCJlcXVhbGl0eUZyb21TdGF0ZW1lbnQiLCJlcXVhbGl0eVZhbGlkYXRlcyIsInZhbGlkYXRlQXNKdWRnZW1lbnQiLCJ2YWxpZGF0ZXNBc0p1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudEZyb21TdGF0ZW1lbnQiLCJqdWRnZW1lbnRWYWxpZGF0ZXMiLCJ2YWxpZGF0ZUFzVHlwZUFzc2VydGlvbiIsInZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbiIsInR5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInR5cGVBc3NlcnRpb25WYWxpZGF0ZXMiLCJhc3NlcnRpb24iLCJhZGRBc3NlcnRpb24iLCJ2YWxpZGF0ZUFzRGVmaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlc0FzRGVmaW5lZEFzc2VydGlvbiIsImRlZmluZWRBc3NlcnRpb24iLCJkZWZpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsImRlZmluZWRBc3NlcnRpb25WYWxpZGF0ZXMiLCJ2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24iLCJ2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uIiwicHJvcGVydHlBc3NlcnRpb24iLCJwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJwcm9wZXJ0eUFzc2VydGlvblZhbGlkYXRlcyIsInZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbiIsInZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24iLCJzdWJwcm9vZkFzc2VydGlvbiIsInN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInN1YnByb29mQXNzZXJ0aW9uVmFsaWRhdGVzIiwidmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlc0FzQ29udGFpbmVkQXNzZXJ0aW9uIiwiY29udGFpbmVkQXNzZXJ0aW9uIiwiY29udGFpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsImNvbnRhaW5lZEFzc2VydGlvblZhbGlkYXRlcyIsInZhbGlkYXRlQXNTYXRpc2ZpZXNBc3NlcnRpb24iLCJ2YWxpZGF0ZXNBc1NhdGlzZmllc0Fzc2VydGlvbiIsInNhdGlzZmllc0Fzc2VydGlvbiIsInNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXMiLCJ2YWxpZGF0ZU1peGlucyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBc1NBOzs7ZUFBQTs7OytEQXBTcUI7eUJBVTJCOzs7Ozs7QUFFaEQsU0FBU0Esc0NBQXNDQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxPQUFPO0lBQ3BGLElBQUlDLHlDQUF5QztJQUU3QyxJQUFNQyxlQUFlQyxJQUFBQSxvQ0FBeUIsRUFBQ04sV0FBV0c7SUFFMUQsSUFBSUUsaUJBQWlC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