occam-verify-cli 1.0.852 → 1.0.857
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/lib/context/file/nominal.js +18 -3
- package/lib/context/liminal.js +101 -102
- package/lib/context/mnemic.js +511 -0
- package/lib/context.js +23 -11
- package/lib/element/assertion/contained.js +8 -8
- package/lib/element/assertion/defined.js +6 -6
- package/lib/element/assertion/satisfies.js +4 -4
- package/lib/element/assertion/type.js +5 -4
- package/lib/element/assumption/metaLevel.js +7 -7
- package/lib/element/assumption.js +23 -15
- package/lib/element/combinator.js +4 -4
- package/lib/element/conclusion.js +4 -4
- package/lib/element/constructor.js +4 -4
- package/lib/element/declaration/combinator.js +4 -4
- package/lib/element/declaration/complexType.js +3 -3
- package/lib/element/declaration/constructor.js +6 -4
- package/lib/element/declaration/metavariable.js +7 -7
- package/lib/element/declaration/variable.js +6 -4
- package/lib/element/deduction.js +4 -4
- package/lib/element/frame.js +60 -48
- package/lib/element/judgement.js +16 -29
- package/lib/element/label.js +4 -4
- package/lib/element/metavariable.js +59 -58
- package/lib/element/proofAssertion/premise.js +4 -4
- package/lib/element/reference.js +20 -20
- package/lib/element/rule.js +4 -4
- package/lib/element/substitution/frame.js +9 -8
- package/lib/element/substitution/reference.js +7 -7
- package/lib/element/substitution/statement.js +12 -11
- package/lib/element/substitution/term.js +9 -8
- package/lib/element/topLevelAssertion.js +4 -4
- package/lib/element/topLevelMetaAssertion.js +2 -2
- package/lib/element/variable.js +8 -8
- package/lib/utilities/context.js +6 -6
- package/lib/utilities/element.js +3 -3
- package/lib/utilities/json.js +16 -16
- package/lib/utilities/string.js +7 -29
- package/lib/utilities/substitutions.js +6 -6
- package/package.json +1 -1
- package/src/context/file/nominal.js +24 -2
- package/src/context/liminal.js +116 -117
- package/src/context/{ephemeral.js → mnemic.js} +38 -40
- package/src/context.js +32 -12
- package/src/element/assertion/contained.js +7 -7
- package/src/element/assertion/defined.js +5 -5
- package/src/element/assertion/satisfies.js +3 -4
- package/src/element/assertion/type.js +5 -4
- package/src/element/assumption/metaLevel.js +6 -8
- package/src/element/assumption.js +28 -17
- package/src/element/combinator.js +3 -4
- package/src/element/conclusion.js +3 -4
- package/src/element/constructor.js +3 -4
- package/src/element/declaration/combinator.js +3 -4
- package/src/element/declaration/complexType.js +2 -2
- package/src/element/declaration/constructor.js +7 -4
- package/src/element/declaration/metavariable.js +6 -8
- package/src/element/declaration/variable.js +7 -4
- package/src/element/deduction.js +3 -4
- package/src/element/frame.js +81 -64
- package/src/element/judgement.js +21 -43
- package/src/element/label.js +3 -4
- package/src/element/metavariable.js +66 -73
- package/src/element/proofAssertion/premise.js +3 -4
- package/src/element/reference.js +21 -25
- package/src/element/rule.js +3 -3
- package/src/element/substitution/frame.js +7 -7
- package/src/element/substitution/reference.js +4 -6
- package/src/element/substitution/statement.js +9 -10
- package/src/element/substitution/term.js +7 -7
- package/src/element/topLevelAssertion.js +3 -3
- package/src/element/topLevelMetaAssertion.js +2 -2
- package/src/element/variable.js +7 -8
- package/src/utilities/context.js +9 -9
- package/src/utilities/element.js +3 -3
- package/src/utilities/json.js +9 -9
- package/src/utilities/string.js +11 -40
- package/src/utilities/substitutions.js +3 -3
- package/lib/context/ephemeral.js +0 -513
|
@@ -0,0 +1,511 @@
|
|
|
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 MnemicContext;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _necessary = require("necessary");
|
|
12
|
+
const _context = /*#__PURE__*/ _interop_require_default(require("../context"));
|
|
13
|
+
const _synoptic = require("../utilities/synoptic");
|
|
14
|
+
const _json = require("../utilities/json");
|
|
15
|
+
function _interop_require_default(obj) {
|
|
16
|
+
return obj && obj.__esModule ? obj : {
|
|
17
|
+
default: obj
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const { push } = _necessary.arrayUtilities;
|
|
21
|
+
class MnemicContext extends _context.default {
|
|
22
|
+
constructor(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions){
|
|
23
|
+
super(context);
|
|
24
|
+
this.terms = terms;
|
|
25
|
+
this.frames = frames;
|
|
26
|
+
this.equalities = equalities;
|
|
27
|
+
this.judgements = judgements;
|
|
28
|
+
this.assertions = assertions;
|
|
29
|
+
this.statements = statements;
|
|
30
|
+
this.references = references;
|
|
31
|
+
this.assumptions = assumptions;
|
|
32
|
+
this.metavariables = metavariables;
|
|
33
|
+
this.substitutions = substitutions;
|
|
34
|
+
}
|
|
35
|
+
getTerms(terms = []) {
|
|
36
|
+
const context = this.getContext();
|
|
37
|
+
push(terms, this.terms);
|
|
38
|
+
context.getTerms(terms);
|
|
39
|
+
(0, _synoptic.compressTerms)(context);
|
|
40
|
+
return terms;
|
|
41
|
+
}
|
|
42
|
+
getFrames(frames = []) {
|
|
43
|
+
const context = this.getContext();
|
|
44
|
+
push(frames, this.frames);
|
|
45
|
+
context.getFrames(frames);
|
|
46
|
+
(0, _synoptic.compressFrames)(context);
|
|
47
|
+
return frames;
|
|
48
|
+
}
|
|
49
|
+
getEqualities(equalities = []) {
|
|
50
|
+
const context = this.getContext();
|
|
51
|
+
push(equalities, this.equalities);
|
|
52
|
+
context.getEqualities(equalities);
|
|
53
|
+
(0, _synoptic.compressEqualities)(context);
|
|
54
|
+
return equalities;
|
|
55
|
+
}
|
|
56
|
+
getJudgements(judgements = []) {
|
|
57
|
+
const context = this.getContext();
|
|
58
|
+
push(judgements, this.judgements);
|
|
59
|
+
context.getJudgements(judgements);
|
|
60
|
+
(0, _synoptic.compressJudgements)(context);
|
|
61
|
+
return judgements;
|
|
62
|
+
}
|
|
63
|
+
getStatements(statements = []) {
|
|
64
|
+
const context = this.getContext();
|
|
65
|
+
push(statements, this.statements);
|
|
66
|
+
context.getStatements(statements);
|
|
67
|
+
(0, _synoptic.compressStatements)(context);
|
|
68
|
+
return statements;
|
|
69
|
+
}
|
|
70
|
+
getAssertions(assertions = []) {
|
|
71
|
+
const context = this.getContext();
|
|
72
|
+
push(assertions, this.assertions);
|
|
73
|
+
context.getAssertions(assertions);
|
|
74
|
+
(0, _synoptic.compressAssertions)(context);
|
|
75
|
+
return assertions;
|
|
76
|
+
}
|
|
77
|
+
getReferences(references = []) {
|
|
78
|
+
const context = this.getContext();
|
|
79
|
+
push(references, this.references);
|
|
80
|
+
context.getReferences(references);
|
|
81
|
+
(0, _synoptic.compressReferences)(context);
|
|
82
|
+
return references;
|
|
83
|
+
}
|
|
84
|
+
getAssumptions(assumptions = []) {
|
|
85
|
+
const context = this.getContext();
|
|
86
|
+
push(assumptions, this.assumptions);
|
|
87
|
+
context.getAssumptions(assumptions);
|
|
88
|
+
(0, _synoptic.compressAssumptions)(context);
|
|
89
|
+
return assumptions;
|
|
90
|
+
}
|
|
91
|
+
getMetavariables(metavariables = []) {
|
|
92
|
+
const context = this.getContext();
|
|
93
|
+
push(metavariables, this.metavariables);
|
|
94
|
+
context.getMetavariables(metavariables);
|
|
95
|
+
(0, _synoptic.compressMetavariables)(context);
|
|
96
|
+
return metavariables;
|
|
97
|
+
}
|
|
98
|
+
getSubstitutions(substitutions = []) {
|
|
99
|
+
const context = this.getContext();
|
|
100
|
+
push(substitutions, this.substitutions);
|
|
101
|
+
context.getSubstitutions(substitutions);
|
|
102
|
+
(0, _synoptic.compressSubstitutions)(context);
|
|
103
|
+
return substitutions;
|
|
104
|
+
}
|
|
105
|
+
addTerm(term) {
|
|
106
|
+
const context = this, termA = term, termString = term.getString();
|
|
107
|
+
context.trace(`Adding the '${termString}' term to the mnemic context...`);
|
|
108
|
+
const terms = this.getTerms(), termB = terms.find((term)=>{
|
|
109
|
+
const termB = term, termAComparesToTermB = termA.compareTerm(termB);
|
|
110
|
+
if (termAComparesToTermB) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}) || null;
|
|
114
|
+
if (termB !== null) {
|
|
115
|
+
context.trace(`The '${termString}' term has already been added to the mnemic context.`);
|
|
116
|
+
} else {
|
|
117
|
+
this.terms.push(term);
|
|
118
|
+
}
|
|
119
|
+
context.debug(`...added the '${termString}' term to the mnemic context.`);
|
|
120
|
+
}
|
|
121
|
+
addFrame(frame) {
|
|
122
|
+
const context = this, frameA = frame, frameString = frame.getString();
|
|
123
|
+
context.trace(`Adding the '${frameString}' frame to the mnemic context...`);
|
|
124
|
+
const frames = this.getFrames(), frameB = frames.find((frame)=>{
|
|
125
|
+
const frameB = frame, frameAEqualToFrameB = frameA.isEqualTo(frameB);
|
|
126
|
+
if (frameAEqualToFrameB) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}) || null;
|
|
130
|
+
if (frameB !== null) {
|
|
131
|
+
context.trace(`The '${frameString}' frame has already been added to the mnemic context.`);
|
|
132
|
+
} else {
|
|
133
|
+
this.frames.push(frame);
|
|
134
|
+
}
|
|
135
|
+
context.debug(`...added the '${frameString}' frame to the mnemic context.`);
|
|
136
|
+
}
|
|
137
|
+
addEquality(equality) {
|
|
138
|
+
const context = this, equalityA = equality, equalityString = equality.getString();
|
|
139
|
+
context.trace(`Adding the '${equalityString}' equality to the mnemic context...`);
|
|
140
|
+
const equalities = this.getEqualities(), equalityB = equalities.find((equality)=>{
|
|
141
|
+
const equalityB = equality, equalityAEqualToEqualityB = equalityA.isEqualTo(equalityB);
|
|
142
|
+
if (equalityAEqualToEqualityB) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}) || null;
|
|
146
|
+
if (equalityB !== null) {
|
|
147
|
+
context.trace(`The '${equalityString}' equality has already been added to the mnemic context.`);
|
|
148
|
+
} else {
|
|
149
|
+
this.equalities.push(equality);
|
|
150
|
+
}
|
|
151
|
+
context.debug(`...added the '${equalityString}' equality to the mnemic context.`);
|
|
152
|
+
}
|
|
153
|
+
addJudgement(judgement) {
|
|
154
|
+
const context = this, judgementA = judgement, judgementString = judgement.getString();
|
|
155
|
+
context.trace(`Adding the '${judgementString}' judgement to the mnemic context...`);
|
|
156
|
+
const judgements = this.getJudgements(), judgementB = judgements.find((judgement)=>{
|
|
157
|
+
const judgementB = judgement, judgementAEqualToEqualityB = judgementA.isEqualTo(judgementB);
|
|
158
|
+
if (judgementAEqualToEqualityB) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
}) || null;
|
|
162
|
+
if (judgementB !== null) {
|
|
163
|
+
context.trace(`The '${judgementString}' judgement has already been added to the mnemic context.`);
|
|
164
|
+
} else {
|
|
165
|
+
this.judgements.push(judgement);
|
|
166
|
+
}
|
|
167
|
+
context.debug(`...added the '${judgementString}' judgement to the mnemic context.`);
|
|
168
|
+
}
|
|
169
|
+
addStatement(statement) {
|
|
170
|
+
const context = this, statementA = statement, statementString = statement.getString();
|
|
171
|
+
context.trace(`Adding the '${statementString}' statement to the mnemic context...`);
|
|
172
|
+
const statements = this.getStatements(), statementB = statements.find((statement)=>{
|
|
173
|
+
const statementB = statement, statementAEqualToStatementB = statementA.isEqualTo(statementB);
|
|
174
|
+
if (statementAEqualToStatementB) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}) || null;
|
|
178
|
+
if (statementB !== null) {
|
|
179
|
+
context.trace(`The '${statementString}' statement has already been added to the mnemic context.`);
|
|
180
|
+
} else {
|
|
181
|
+
this.statements.push(statement);
|
|
182
|
+
}
|
|
183
|
+
context.debug(`...added the '${statementString}' statement to the mnemic context.`);
|
|
184
|
+
}
|
|
185
|
+
addAssertion(assertion) {
|
|
186
|
+
const context = this, assertionA = assertion, assertionString = assertion.getString();
|
|
187
|
+
context.trace(`Adding the '${assertionString}' assertion to the mnemic context...`);
|
|
188
|
+
const assertions = this.getAssumptions(), assertionB = assertions.find((assertion)=>{
|
|
189
|
+
const assertionB = assertion, assertionAEqualToAssertionB = assertionA.isEqualTo(assertionB);
|
|
190
|
+
if (assertionAEqualToAssertionB) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
}) || null;
|
|
194
|
+
if (assertionB !== null) {
|
|
195
|
+
context.trace(`The '${assertionString}' assertion has already been added to the mnemic context.`);
|
|
196
|
+
} else {
|
|
197
|
+
this.assertions.push(assertion);
|
|
198
|
+
}
|
|
199
|
+
context.debug(`...added the '${assertionString}' assertion to the mnemic context.`);
|
|
200
|
+
}
|
|
201
|
+
addReference(reference) {
|
|
202
|
+
const context = this, referenceA = reference, referenceString = reference.getString();
|
|
203
|
+
context.trace(`Adding the '${referenceString}' reference to the mnemic context...`);
|
|
204
|
+
const references = this.getReferences(), referenceB = references.find((reference)=>{
|
|
205
|
+
const referenceB = reference, referenceAEqualToReferenceB = referenceA.isEqualTo(referenceB);
|
|
206
|
+
if (referenceAEqualToReferenceB) {
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
}) || null;
|
|
210
|
+
if (referenceB !== null) {
|
|
211
|
+
context.trace(`The '${referenceString}' reference has already been added to the mnemic context.`);
|
|
212
|
+
} else {
|
|
213
|
+
this.references.push(reference);
|
|
214
|
+
}
|
|
215
|
+
context.debug(`...added the '${referenceString}' reference to the mnemic context.`);
|
|
216
|
+
}
|
|
217
|
+
addAssumption(assumption) {
|
|
218
|
+
const context = this, assumptionA = assumption, assumptionString = assumption.getString();
|
|
219
|
+
context.trace(`Adding the '${assumptionString}' assumption to the mnemic context...`);
|
|
220
|
+
const assumptions = this.getAssumptions(), assumptionB = assumptions.find((assumption)=>{
|
|
221
|
+
const assumptionB = assumption, assumptionAEqualToAssumptionB = assumptionA.isEqualTo(assumptionB);
|
|
222
|
+
if (assumptionAEqualToAssumptionB) {
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
}) || null;
|
|
226
|
+
if (assumptionB !== null) {
|
|
227
|
+
context.trace(`The '${assumptionString}' assumption has already been added to the mnemic context.`);
|
|
228
|
+
} else {
|
|
229
|
+
this.assumptions.push(assumption);
|
|
230
|
+
}
|
|
231
|
+
context.debug(`...added the '${assumptionString}' assumption to the mnemic context.`);
|
|
232
|
+
}
|
|
233
|
+
addMetavariable(metavariable) {
|
|
234
|
+
const context = this, metavariableA = metavariable, metavariableString = metavariable.getString();
|
|
235
|
+
context.trace(`Adding the '${metavariableString}' metavariable to the mnemic context...`);
|
|
236
|
+
const metavariables = this.getMetavariables(), metavariableB = metavariables.find((metavariable)=>{
|
|
237
|
+
const metavariableB = metavariable, metavariableAEqualToSubstitutionB = metavariableA.isEqualTo(metavariableB);
|
|
238
|
+
if (metavariableAEqualToSubstitutionB) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}) || null;
|
|
242
|
+
if (metavariableB !== null) {
|
|
243
|
+
context.trace(`The '${metavariableString}' metavariable has already been added to the mnemic context.`);
|
|
244
|
+
} else {
|
|
245
|
+
this.metavariables.push(metavariable);
|
|
246
|
+
}
|
|
247
|
+
context.debug(`...added the '${metavariableString}' metavariable to the mnemic context.`);
|
|
248
|
+
}
|
|
249
|
+
addSubstitution(substitution) {
|
|
250
|
+
const context = this, substitutionA = substitution, substitutionString = substitution.getString();
|
|
251
|
+
context.trace(`Adding the '${substitutionString}' substitution to the mnemic context...`);
|
|
252
|
+
const substitutions = this.getSubstitutions(), substitutionB = substitutions.find((substitution)=>{
|
|
253
|
+
const substitutionB = substitution, substitutionAEqualToSubstitutionB = substitutionA.isEqualTo(substitutionB);
|
|
254
|
+
if (substitutionAEqualToSubstitutionB) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
}) || null;
|
|
258
|
+
if (substitutionB !== null) {
|
|
259
|
+
context.trace(`The '${substitutionString}' substitution has already been added to the mnemic context.`);
|
|
260
|
+
} else {
|
|
261
|
+
this.substitutions.push(substitution);
|
|
262
|
+
}
|
|
263
|
+
context.debug(`...added the '${substitutionString}' substitution to the mnemic context.`);
|
|
264
|
+
}
|
|
265
|
+
addTerms(terms) {
|
|
266
|
+
terms.forEach((term)=>{
|
|
267
|
+
this.addTerm(term);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
addFrames(frames) {
|
|
271
|
+
frames.forEach((frame)=>{
|
|
272
|
+
this.addFrame(frame);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
addEqualities(equalities) {
|
|
276
|
+
equalities.forEach((equality)=>{
|
|
277
|
+
this.addEquality(equality);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
addJudgements(judgements) {
|
|
281
|
+
judgements.forEach((judgement)=>{
|
|
282
|
+
this.addJudgement(judgement);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
addAssertions(assertions) {
|
|
286
|
+
assertions.forEach((assertion)=>{
|
|
287
|
+
this.addAssertion(assertion);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
addStatements(statements) {
|
|
291
|
+
statements.forEach((statement)=>{
|
|
292
|
+
this.addStatement(statement);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
addReferences(references) {
|
|
296
|
+
references.forEach((reference)=>{
|
|
297
|
+
this.addReference(reference);
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
addAssumptions(assumptions) {
|
|
301
|
+
assumptions.forEach((assumption)=>{
|
|
302
|
+
this.addAssumption(assumption);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
addMetavariables(metavariables) {
|
|
306
|
+
metavariables.forEach((metavariable)=>{
|
|
307
|
+
this.addMetavariable(metavariable);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
addSubstitutions(substitutions) {
|
|
311
|
+
///
|
|
312
|
+
}
|
|
313
|
+
findVariableByVariableNode(variableNode) {
|
|
314
|
+
const variableIdentifier = variableNode.getVariableIdentifier(), declaredVariable = this.findDeclaredVariableByVariableIdentifier(variableIdentifier), variable = declaredVariable; ///
|
|
315
|
+
return variable;
|
|
316
|
+
}
|
|
317
|
+
findTermByTermNode(termNode) {
|
|
318
|
+
const terms = this.getTerms(), term = terms.find((term)=>{
|
|
319
|
+
const termNodeMatches = term.matchTermNode(termNode);
|
|
320
|
+
if (termNodeMatches) {
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
}) || null;
|
|
324
|
+
return term;
|
|
325
|
+
}
|
|
326
|
+
findFrameByFrameNode(frameNode) {
|
|
327
|
+
const frames = this.getFrames(), frame = frames.find((frame)=>{
|
|
328
|
+
const frameNodeMatches = frame.matchFrameNode(frameNode);
|
|
329
|
+
if (frameNodeMatches) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}) || null;
|
|
333
|
+
return frame;
|
|
334
|
+
}
|
|
335
|
+
findEqualityByEqualityNode(equalityNode) {
|
|
336
|
+
const equalities = this.getEqualities(), equality = equalities.find((equality)=>{
|
|
337
|
+
const equalityNodeMatches = equality.matchEqualityNode(equalityNode);
|
|
338
|
+
if (equalityNodeMatches) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
}) || null;
|
|
342
|
+
return equality;
|
|
343
|
+
}
|
|
344
|
+
findJudgementByJudgementNode(judgementNode) {
|
|
345
|
+
const judgements = this.getJudgements(), judgement = judgements.find((judgement)=>{
|
|
346
|
+
const judgementNodeMatches = judgement.matchJudgementNode(judgementNode);
|
|
347
|
+
if (judgementNodeMatches) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
}) || null;
|
|
351
|
+
return judgement;
|
|
352
|
+
}
|
|
353
|
+
findStatementByStatementNode(statementNode) {
|
|
354
|
+
const statements = this.getStatements(), statement = statements.find((statement)=>{
|
|
355
|
+
const statementNodeMatches = statement.matchStatementNode(statementNode);
|
|
356
|
+
if (statementNodeMatches) {
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
}) || null;
|
|
360
|
+
return statement;
|
|
361
|
+
}
|
|
362
|
+
findReferenceByReferenceNode(referenceNode) {
|
|
363
|
+
const references = this.getReferences(), reference = references.find((reference)=>{
|
|
364
|
+
const referenceMatcheReferenceNode = reference.matchReferenceNode(referenceNode);
|
|
365
|
+
if (referenceMatcheReferenceNode) {
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
}) || null;
|
|
369
|
+
return reference;
|
|
370
|
+
}
|
|
371
|
+
findAssertionByAssertionNode(assertionNode) {
|
|
372
|
+
const assertions = this.getAssertions(), assertion = assertions.find((assertion)=>{
|
|
373
|
+
const assertionNodeMatches = assertion.matchAssertionNode(assertionNode);
|
|
374
|
+
if (assertionNodeMatches) {
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
}) || null;
|
|
378
|
+
return assertion;
|
|
379
|
+
}
|
|
380
|
+
findAssumptionByAssumptionNode(assumptionNode) {
|
|
381
|
+
const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
|
|
382
|
+
const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
|
|
383
|
+
if (assumptionNodeMatches) {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
}) || null;
|
|
387
|
+
return assumption;
|
|
388
|
+
}
|
|
389
|
+
findReferenceByMetavariableNode(metavariableNode) {
|
|
390
|
+
const references = this.getReferences(), reference = references.find((reference)=>{
|
|
391
|
+
const referenceMatcheMetavariableNode = reference.matchMetavariableNode(metavariableNode);
|
|
392
|
+
if (referenceMatcheMetavariableNode) {
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
}) || null;
|
|
396
|
+
return reference;
|
|
397
|
+
}
|
|
398
|
+
findMetavariableByMetavariableNode(metavariableNode) {
|
|
399
|
+
const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
|
|
400
|
+
const metavariableNodeMatches = metavariable.matchMetavariableNode(metavariableNode);
|
|
401
|
+
if (metavariableNodeMatches) {
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
}) || null;
|
|
405
|
+
return metavariable;
|
|
406
|
+
}
|
|
407
|
+
findSubstitutionBySubstitutionNode(substitutionNode) {
|
|
408
|
+
const substitutions = this.getSubstitutions(), substitution = substitutions.find((substitution)=>{
|
|
409
|
+
const substitutionNodeMatches = substitution.matchSubstitutionNode(substitutionNode);
|
|
410
|
+
if (substitutionNodeMatches) {
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
}) || null;
|
|
414
|
+
return substitution;
|
|
415
|
+
}
|
|
416
|
+
isTermPresentByTermNode(termNode) {
|
|
417
|
+
const term = this.findTermByTermNode(termNode), termPresent = term !== null;
|
|
418
|
+
return termPresent;
|
|
419
|
+
}
|
|
420
|
+
isFramePresentByFrameNode(frameNode) {
|
|
421
|
+
const frame = this.findFrameByFrameNode(frameNode), framePresent = frame !== null;
|
|
422
|
+
return framePresent;
|
|
423
|
+
}
|
|
424
|
+
isEqualityPresentByEqualityNode(equalityNode) {
|
|
425
|
+
const equality = this.findEqualityByEqualityNode(equalityNode), equalityPresent = equality !== null;
|
|
426
|
+
return equalityPresent;
|
|
427
|
+
}
|
|
428
|
+
isJudgementPresentByJudgementNode(judgementNode) {
|
|
429
|
+
const judgement = this.findJudgementByJudgementNode(judgementNode), judgementPresent = judgement !== null;
|
|
430
|
+
return judgementPresent;
|
|
431
|
+
}
|
|
432
|
+
isStatementPresentByStatementNode(statementNode) {
|
|
433
|
+
const statement = this.findStatementByStatementNode(statementNode), statementPresent = statement !== null;
|
|
434
|
+
return statementPresent;
|
|
435
|
+
}
|
|
436
|
+
isAssertionPresentByAssertionNode(assertionNode) {
|
|
437
|
+
const assertion = this.findAssertionByAssertionNode(assertionNode), assertionPresent = assertion !== null;
|
|
438
|
+
return assertionPresent;
|
|
439
|
+
}
|
|
440
|
+
isAssumptionPresentByAssumptionNode(assumptionNode) {
|
|
441
|
+
const assumption = this.findAssumptionByAssumptionNode(assumptionNode), assumptionPresent = assumption !== null;
|
|
442
|
+
return assumptionPresent;
|
|
443
|
+
}
|
|
444
|
+
isReferencePresentByMetavariableNode(metavariableNode) {
|
|
445
|
+
const reference = this.findReferenceByMetavariableNode(metavariableNode), referencePresent = reference !== null;
|
|
446
|
+
return referencePresent;
|
|
447
|
+
}
|
|
448
|
+
isMetavariablePresentByMetavariableNode(metavariablenNode) {
|
|
449
|
+
const metavariablen = this.findMetavariableByMetavariableNode(metavariablenNode), metavariablenPresent = metavariablen !== null;
|
|
450
|
+
return metavariablenPresent;
|
|
451
|
+
}
|
|
452
|
+
isSubstitutionPresentBySubstitutionNode(substitutionNode) {
|
|
453
|
+
const substitution = this.findSubstitutionBySubstitutionNode(substitutionNode), substitutionPresent = substitution !== null;
|
|
454
|
+
return substitutionPresent;
|
|
455
|
+
}
|
|
456
|
+
commit(element) {
|
|
457
|
+
const context = this; ///
|
|
458
|
+
element.setContext(context);
|
|
459
|
+
}
|
|
460
|
+
initialise(json) {
|
|
461
|
+
const context = this; ///
|
|
462
|
+
this.terms = (0, _json.termsFromJSON)(json, context);
|
|
463
|
+
this.metavariables = (0, _json.metavariablesFromJSON)(json, context);
|
|
464
|
+
this.statements = (0, _json.statementsFromJSON)(json, context);
|
|
465
|
+
this.references = (0, _json.referencesFromJSON)(json, context);
|
|
466
|
+
this.equalities = (0, _json.equalitiesFromJSON)(json, context);
|
|
467
|
+
this.assumptions = (0, _json.assumptionsFromJSON)(json, context);
|
|
468
|
+
this.frames = (0, _json.framesFromJSON)(json, context);
|
|
469
|
+
this.judgements = (0, _json.judgementsFromJSON)(json, context);
|
|
470
|
+
this.assertions = (0, _json.assertionsFromJSON)(json, context);
|
|
471
|
+
this.substitutions = (0, _json.substitutionsFromJSON)(json, context);
|
|
472
|
+
}
|
|
473
|
+
toJSON() {
|
|
474
|
+
let terms = this.getTerms(), frames = this.getFrames(), judgements = this.getJudgements(), equalities = this.getEqualities(), statements = this.getStatements(), assertions = this.getAssertions(), references = this.getReferences(), assumptions = this.getAssumptions(), metavariables = this.getMetavariables(), substitutions = this.getSubstitutions();
|
|
475
|
+
const termsJSON = (0, _json.termsToTermsJSON)(terms), framesJSON = (0, _json.framesToFramesJSON)(frames), judgementsJSON = (0, _json.judgementsToJudgementsJSON)(judgements), equalitiesJSON = (0, _json.equalitiesToEqualitiesJSON)(equalities), statementsJSON = (0, _json.statementsToStatementsJSON)(statements), assertionsJSON = (0, _json.assertionsToAssertionsJSON)(assertions), referencesJSON = (0, _json.referencesToReferencesJSON)(references), assumptionsJSON = (0, _json.assumptionsToAssumptionsJSON)(assumptions), metavariablesJSON = (0, _json.metavariablesToMetavariablesJSON)(metavariables), substitutionsJSON = (0, _json.substitutionsToSubstitutionsJSON)(substitutions);
|
|
476
|
+
terms = termsJSON; ///
|
|
477
|
+
frames = framesJSON; ///
|
|
478
|
+
judgements = judgementsJSON; ///
|
|
479
|
+
equalities = equalitiesJSON; ///
|
|
480
|
+
statements = statementsJSON; ///
|
|
481
|
+
assertions = assertionsJSON; ///
|
|
482
|
+
references = referencesJSON; ///
|
|
483
|
+
assumptions = assumptionsJSON; ///
|
|
484
|
+
metavariables = metavariablesJSON; //
|
|
485
|
+
substitutions = substitutionsJSON; ///
|
|
486
|
+
const json = {
|
|
487
|
+
terms,
|
|
488
|
+
frames,
|
|
489
|
+
judgements,
|
|
490
|
+
equalities,
|
|
491
|
+
statements,
|
|
492
|
+
assertions,
|
|
493
|
+
references,
|
|
494
|
+
assumptions,
|
|
495
|
+
metavariables,
|
|
496
|
+
substitutions
|
|
497
|
+
};
|
|
498
|
+
return json;
|
|
499
|
+
}
|
|
500
|
+
static fromJSON(json, context) {
|
|
501
|
+
const terms = null, frames = null, equalities = null, judgements = null, statements = null, assertions = null, references = null, assumptions = null, metavariables = null, substitutions = null, mnemicContext = new MnemicContext(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions);
|
|
502
|
+
mnemicContext.initialise(json);
|
|
503
|
+
return mnemicContext;
|
|
504
|
+
}
|
|
505
|
+
static fromNothing(context) {
|
|
506
|
+
const terms = [], frames = [], equalities = [], judgements = [], statements = [], assertions = [], references = [], assumptions = [], metavariables = [], substitutions = [], mnemicContext = new MnemicContext(context, terms, frames, equalities, judgements, assertions, statements, references, assumptions, metavariables, substitutions);
|
|
507
|
+
return mnemicContext;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L21uZW1pYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmltcG9ydCB7IGNvbXByZXNzVGVybXMsXG4gICAgICAgICBjb21wcmVzc0ZyYW1lcyxcbiAgICAgICAgIGNvbXByZXNzRXF1YWxpdGllcyxcbiAgICAgICAgIGNvbXByZXNzSnVkZ2VtZW50cyxcbiAgICAgICAgIGNvbXByZXNzQXNzZXJ0aW9ucyxcbiAgICAgICAgIGNvbXByZXNzU3RhdGVtZW50cyxcbiAgICAgICAgIGNvbXByZXNzUmVmZXJlbmNlcyxcbiAgICAgICAgIGNvbXByZXNzQXNzdW1wdGlvbnMsXG4gICAgICAgICBjb21wcmVzc01ldGF2YXJpYWJsZXMsXG4gICAgICAgICBjb21wcmVzc1N1YnN0aXR1dGlvbnMsfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N5bm9wdGljXCI7XG5pbXBvcnQgeyB0ZXJtc0Zyb21KU09OLFxuICAgICAgICAgZnJhbWVzRnJvbUpTT04sXG4gICAgICAgICB0ZXJtc1RvVGVybXNKU09OLFxuICAgICAgICAgZnJhbWVzVG9GcmFtZXNKU09OLFxuICAgICAgICAganVkZ2VtZW50c0Zyb21KU09OLFxuICAgICAgICAgZXF1YWxpdGllc0Zyb21KU09OLFxuICAgICAgICAgc3RhdGVtZW50c0Zyb21KU09OLFxuICAgICAgICAgYXNzZXJ0aW9uc0Zyb21KU09OLFxuICAgICAgICAgcmVmZXJlbmNlc0Zyb21KU09OLFxuICAgICAgICAgYXNzdW1wdGlvbnNGcm9tSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIHN1YnN0aXR1dGlvbnNGcm9tSlNPTixcbiAgICAgICAgIGp1ZGdlbWVudHNUb0p1ZGdlbWVudHNKU09OLFxuICAgICAgICAgZXF1YWxpdGllc1RvRXF1YWxpdGllc0pTT04sXG4gICAgICAgICBzdGF0ZW1lbnRzVG9TdGF0ZW1lbnRzSlNPTixcbiAgICAgICAgIGFzc2VydGlvbnNUb0Fzc2VydGlvbnNKU09OLFxuICAgICAgICAgcmVmZXJlbmNlc1RvUmVmZXJlbmNlc0pTT04sXG4gICAgICAgICBhc3N1bXB0aW9uc1RvQXNzdW1wdGlvbnNKU09OLFxuICAgICAgICAgbWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04sXG4gICAgICAgICBzdWJzdGl0dXRpb25zVG9TdWJzdGl0dXRpb25zSlNPTiB9IGZyb20gXCIuLi91dGlsaXRpZXMvanNvblwiO1xuXG5jb25zdCB7IHB1c2ggfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNbmVtaWNDb250ZXh0IGV4dGVuZHMgQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHRlcm1zLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGp1ZGdlbWVudHMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHJlZmVyZW5jZXMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBzdWJzdGl0dXRpb25zKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5mcmFtZXMgPSBmcmFtZXM7XG4gICAgdGhpcy5lcXVhbGl0aWVzID0gZXF1YWxpdGllcztcbiAgICB0aGlzLmp1ZGdlbWVudHMgPSBqdWRnZW1lbnRzO1xuICAgIHRoaXMuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnM7XG4gICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9ucztcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzO1xuICAgIHRoaXMuc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBnZXRUZXJtcyh0ZXJtcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaCh0ZXJtcywgdGhpcy50ZXJtcyk7XG5cbiAgICBjb250ZXh0LmdldFRlcm1zKHRlcm1zKTtcblxuICAgIGNvbXByZXNzVGVybXMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gdGVybXM7XG4gIH1cblxuICBnZXRGcmFtZXMoZnJhbWVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGZyYW1lcywgdGhpcy5mcmFtZXMpO1xuXG4gICAgY29udGV4dC5nZXRGcmFtZXMoZnJhbWVzKTtcblxuICAgIGNvbXByZXNzRnJhbWVzKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZyYW1lcztcbiAgfVxuXG4gIGdldEVxdWFsaXRpZXMoZXF1YWxpdGllcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChlcXVhbGl0aWVzLCB0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5nZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpO1xuXG4gICAgY29tcHJlc3NFcXVhbGl0aWVzKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXRpZXM7XG4gIH1cblxuICBnZXRKdWRnZW1lbnRzKGp1ZGdlbWVudHMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goanVkZ2VtZW50cywgdGhpcy5qdWRnZW1lbnRzKTtcblxuICAgIGNvbnRleHQuZ2V0SnVkZ2VtZW50cyhqdWRnZW1lbnRzKTtcblxuICAgIGNvbXByZXNzSnVkZ2VtZW50cyhjb250ZXh0KTtcblxuICAgIHJldHVybiBqdWRnZW1lbnRzO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHN0YXRlbWVudHMsIHRoaXMuc3RhdGVtZW50cyk7XG5cbiAgICBjb250ZXh0LmdldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7XG5cbiAgICBjb21wcmVzc1N0YXRlbWVudHMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdldEFzc2VydGlvbnMoYXNzZXJ0aW9ucyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChhc3NlcnRpb25zLCB0aGlzLmFzc2VydGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3NlcnRpb25zKGFzc2VydGlvbnMpO1xuXG4gICAgY29tcHJlc3NBc3NlcnRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRSZWZlcmVuY2VzKHJlZmVyZW5jZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gocmVmZXJlbmNlcywgdGhpcy5yZWZlcmVuY2VzKTtcblxuICAgIGNvbnRleHQuZ2V0UmVmZXJlbmNlcyhyZWZlcmVuY2VzKTtcblxuICAgIGNvbXByZXNzUmVmZXJlbmNlcyhjb250ZXh0KTtcblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG5cbiAgZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIHRoaXMuYXNzdW1wdGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucyk7XG5cbiAgICBjb21wcmVzc0Fzc3VtcHRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIHRoaXMubWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb21wcmVzc01ldGF2YXJpYWJsZXMoY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldFN1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChzdWJzdGl0dXRpb25zLCB0aGlzLnN1YnN0aXR1dGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgY29tcHJlc3NTdWJzdGl0dXRpb25zKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBhZGRUZXJtKHRlcm0pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgdGVybUEgPSB0ZXJtLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIG1uZW1pYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgICB0ZXJtQiA9IHRlcm1zLmZpbmQoKHRlcm0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1CID0gdGVybSwgLy8vXG4gICAgICAgICAgICAgICAgICB0ZXJtQUNvbXBhcmVzVG9UZXJtQiA9IHRlcm1BLmNvbXBhcmVUZXJtKHRlcm1CKTtcbiAgICAgIFxuICAgICAgICAgICAgaWYgKHRlcm1BQ29tcGFyZXNUb1Rlcm1CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAodGVybUIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXJtcy5wdXNoKHRlcm0pO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRGcmFtZShmcmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZUEgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZnJhbWVTdHJpbmd9JyBmcmFtZSB0byB0aGUgbW5lbWljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGZyYW1lcyA9IHRoaXMuZ2V0RnJhbWVzKCksXG4gICAgICAgICAgZnJhbWVCID0gZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGZyYW1lQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnJhbWVzLnB1c2goZnJhbWUpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWFsaXR5QSA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICBlcXVhbGl0eVN0cmluZyA9IGVxdWFsaXR5LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IHRvIHRoZSBtbmVtaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZXF1YWxpdGllcyA9IHRoaXMuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgIGVxdWFsaXR5QiA9IGVxdWFsaXRpZXMuZmluZCgoZXF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsaXR5QiA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICAgICAgICAgIGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAoZXF1YWxpdHlCICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcXVhbGl0aWVzLnB1c2goZXF1YWxpdHkpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEp1ZGdlbWVudChqdWRnZW1lbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAganVkZ2VtZW50QSA9IGp1ZGdlbWVudCwgLy8vXG4gICAgICAgICAganVkZ2VtZW50U3RyaW5nID0ganVkZ2VtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgdG8gdGhlIG1uZW1pYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50QiA9IGp1ZGdlbWVudHMuZmluZCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRCID0ganVkZ2VtZW50LCAvLy9cbiAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudEFFcXVhbFRvRXF1YWxpdHlCID0ganVkZ2VtZW50QS5pc0VxdWFsVG8oanVkZ2VtZW50Qik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRBRXF1YWxUb0VxdWFsaXR5Qikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKGp1ZGdlbWVudEIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuanVkZ2VtZW50cy5wdXNoKGp1ZGdlbWVudCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHRvIHRoZSBtbmVtaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IHRoaXMuZ2V0U3RhdGVtZW50cygpLFxuICAgICAgICAgIHN0YXRlbWVudEIgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50QiA9IHN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIgPSBzdGF0ZW1lbnRBLmlzRXF1YWxUbyhzdGF0ZW1lbnRCKTtcbiAgICAgIFxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50Qikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgaWYgKHN0YXRlbWVudEIgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgbW5lbWljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRBc3NlcnRpb24oYXNzZXJ0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc2VydGlvbkEgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgIGFzc2VydGlvblN0cmluZyA9IGFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIHRvIHRoZSBtbmVtaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICBhc3NlcnRpb25CID0gYXNzZXJ0aW9ucy5maW5kKChhc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2VydGlvbkIgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CID0gYXNzZXJ0aW9uQS5pc0VxdWFsVG8oYXNzZXJ0aW9uQik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChhc3NlcnRpb25CICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG1uZW1pYyBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydGlvbnMucHVzaChhc3NlcnRpb24pO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIG1uZW1pYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VBID0gcmVmZXJlbmNlLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB0byB0aGUgbW5lbWljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2VCID0gcmVmZXJlbmNlcy5maW5kKChyZWZlcmVuY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZUIgPSByZWZlcmVuY2UsIC8vL1xuICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlQUVxdWFsVG9SZWZlcmVuY2VCID0gcmVmZXJlbmNlQS5pc0VxdWFsVG8ocmVmZXJlbmNlQik7XG4gICAgICBcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VBRXF1YWxUb1JlZmVyZW5jZUIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChyZWZlcmVuY2VCICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG1uZW1pYyBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UgdG8gdGhlIG1uZW1pYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc3VtcHRpb25BID0gYXNzdW1wdGlvbiwgLy8vXG4gICAgICAgICAgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBtbmVtaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmdldEFzc3VtcHRpb25zKCksXG4gICAgICAgICAgYXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uQiA9IGFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgICAgICAgYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9uQS5pc0VxdWFsVG8oYXNzdW1wdGlvbkIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIGlmIChhc3N1bXB0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG1uZW1pYyBjb250ZXh0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc3VtcHRpb25zLnB1c2goYXNzdW1wdGlvbik7XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbWV0YXZhcmlhYmxlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlIG1uZW1pYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVCID0gbWV0YXZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgICAgIG1ldGF2YXJpYWJsZUFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IG1ldGF2YXJpYWJsZUEuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZUIpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlQUVxdWFsVG9TdWJzdGl0dXRpb25CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhdmFyaWFibGVzLnB1c2gobWV0YXZhcmlhYmxlKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgc3Vic3RpdHV0aW9uQSA9IHN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgc3Vic3RpdHV0aW9uU3RyaW5nID0gc3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtzdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24gdG8gdGhlIG1uZW1pYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gdGhpcy5nZXRTdWJzdGl0dXRpb25zKCksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbnMuZmluZCgoc3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25CID0gc3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbkEuaXNFcXVhbFRvKHN1YnN0aXR1dGlvbkIpO1xuXG4gICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uQUVxdWFsVG9TdWJzdGl0dXRpb25CKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uQiAhPT0gbnVsbCkge1xuICAgICAgY29udGV4dC50cmFjZShgVGhlICcke3N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7c3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uIHRvIHRoZSBtbmVtaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkRnJhbWVzKGZyYW1lcykge1xuICAgIGZyYW1lcy5mb3JFYWNoKChmcmFtZSkgPT4ge1xuICAgICAgdGhpcy5hZGRGcmFtZShmcmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpIHtcbiAgICBlcXVhbGl0aWVzLmZvckVhY2goKGVxdWFsaXR5KSA9PiB7XG4gICAgICB0aGlzLmFkZEVxdWFsaXR5KGVxdWFsaXR5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEp1ZGdlbWVudHMoanVkZ2VtZW50cykge1xuICAgIGp1ZGdlbWVudHMuZm9yRWFjaCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICB0aGlzLmFkZEp1ZGdlbWVudChqdWRnZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9ucyhhc3NlcnRpb25zKSB7XG4gICAgYXNzZXJ0aW9ucy5mb3JFYWNoKChhc3NlcnRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgdGhpcy5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJlZmVyZW5jZXMocmVmZXJlbmNlcykge1xuICAgIHJlZmVyZW5jZXMuZm9yRWFjaCgocmVmZXJlbmNlKSA9PiB7XG4gICAgICB0aGlzLmFkZFJlZmVyZW5jZShyZWZlcmVuY2UpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMpIHtcbiAgICBhc3N1bXB0aW9ucy5mb3JFYWNoKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICB0aGlzLmFkZEFzc3VtcHRpb24oYXNzdW1wdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGVzKG1ldGF2YXJpYWJsZXMpIHtcbiAgICBtZXRhdmFyaWFibGVzLmZvckVhY2goKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgdGhpcy5hZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucykge1xuICAgIC8vL1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZU5vZGUodmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgdmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGVOb2RlLmdldFZhcmlhYmxlSWRlbnRpZmllcigpLFxuICAgICAgICAgIGRlY2xhcmVkVmFyaWFibGUgPSB0aGlzLmZpbmREZWNsYXJlZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IGRlY2xhcmVkVmFyaWFibGU7ICAvLy9cblxuICAgIHJldHVybiB2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm1zID0gdGhpcy5nZXRUZXJtcygpLFxuICAgICAgICAgIHRlcm0gPSB0ZXJtcy5maW5kKCh0ZXJtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoVGVybU5vZGUodGVybU5vZGUpO1xuICAgICAgXG4gICAgICAgICAgICBpZiAodGVybU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lcyA9IHRoaXMuZ2V0RnJhbWVzKCksXG4gICAgICAgICAgZnJhbWUgPSBmcmFtZXMuZmluZCgoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lTm9kZU1hdGNoZXMgPSBmcmFtZS5tYXRjaEZyYW1lTm9kZShmcmFtZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZnJhbWVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSB7XG4gICAgY29uc3QgZXF1YWxpdGllcyA9IHRoaXMuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgIGVxdWFsaXR5ID0gZXF1YWxpdGllcy5maW5kKChlcXVhbGl0eSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxpdHlOb2RlTWF0Y2hlcyA9IGVxdWFsaXR5Lm1hdGNoRXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChlcXVhbGl0eU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZXF1YWxpdHk7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE5vZGVNYXRjaGVzID0ganVkZ2VtZW50Lm1hdGNoSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKTtcblxuICAgICAgICAgICAgaWYgKGp1ZGdlbWVudE5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IHRoaXMuZ2V0U3RhdGVtZW50cygpLFxuICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudHMuZmluZCgoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlUmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVSZWZlcmVuY2VOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICAgIGFzc3VtcHRpb24gPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uTm9kZU1hdGNoZXMgPSBhc3N1bXB0aW9uLm1hdGNoQXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbjtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG1ldGF2YXJpYWJsZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSkge1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zLmZpbmQoKHN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMgPSBzdWJzdGl0dXRpb24ubWF0Y2hTdWJzdGl0dXRpb25Ob2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cblxuICBpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLmZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSksXG4gICAgICAgICAgdGVybVByZXNlbnQgPSAodGVybSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdGVybVByZXNlbnQ7XG4gIH1cblxuICBpc0ZyYW1lUHJlc2VudEJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpLFxuICAgICAgICAgIGZyYW1lUHJlc2VudCA9IChmcmFtZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZnJhbWVQcmVzZW50O1xuICB9XG5cbiAgaXNFcXVhbGl0eVByZXNlbnRCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0eSA9IHRoaXMuZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSxcbiAgICAgICAgICBlcXVhbGl0eVByZXNlbnQgPSAoZXF1YWxpdHkgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5UHJlc2VudDtcbiAgfVxuXG4gIGlzSnVkZ2VtZW50UHJlc2VudEJ5SnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKSB7XG4gICAgY29uc3QganVkZ2VtZW50ID0gdGhpcy5maW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpLFxuICAgICAgICAgIGp1ZGdlbWVudFByZXNlbnQgPSAoanVkZ2VtZW50ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBqdWRnZW1lbnRQcmVzZW50O1xuICB9XG5cbiAgaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgc3RhdGVtZW50UHJlc2VudCA9IChzdGF0ZW1lbnQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFByZXNlbnQ7XG4gIH1cblxuICBpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSxcbiAgICAgICAgICBhc3NlcnRpb25QcmVzZW50ID0gKGFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbiA9IHRoaXMuZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSxcbiAgICAgICAgICBhc3N1bXB0aW9uUHJlc2VudCA9IChhc3N1bXB0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzUmVmZXJlbmNlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gdGhpcy5maW5kUmVmZXJlbmNlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIHJlZmVyZW5jZVByZXNlbnQgPSAocmVmZXJlbmNlICE9PSBudWxsKTtcblxuICAgIHJldHVybiByZWZlcmVuY2VQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZW5Ob2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlbiA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVuTm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlblByZXNlbnQgPSAobWV0YXZhcmlhYmxlbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlblByZXNlbnQ7XG4gIH1cblxuICBpc1N1YnN0aXR1dGlvblByZXNlbnRCeVN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSkge1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25QcmVzZW50ID0gKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGNvbW1pdChlbGVtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgZWxlbWVudC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgaW5pdGlhbGlzZShqc29uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXM7IC8vL1xuXG4gICAgdGhpcy50ZXJtcyA9IHRlcm1zRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG4gICAgdGhpcy5yZWZlcmVuY2VzID0gcmVmZXJlbmNlc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuXG4gICAgdGhpcy5lcXVhbGl0aWVzID0gZXF1YWxpdGllc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuXG4gICAgdGhpcy5mcmFtZXMgPSBmcmFtZXNGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcblxuICAgIHRoaXMuanVkZ2VtZW50cyA9IGp1ZGdlbWVudHNGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcbiAgICB0aGlzLmFzc2VydGlvbnMgPSBhc3NlcnRpb25zRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG4gICAgdGhpcy5zdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGxldCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgZnJhbWVzID0gdGhpcy5nZXRGcmFtZXMoKSxcbiAgICAgICAganVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpLFxuICAgICAgICBlcXVhbGl0aWVzID0gdGhpcy5nZXRFcXVhbGl0aWVzKCksXG4gICAgICAgIHN0YXRlbWVudHMgPSB0aGlzLmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICByZWZlcmVuY2VzID0gdGhpcy5nZXRSZWZlcmVuY2VzKCksXG4gICAgICAgIGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgIHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoKTtcblxuICAgIGNvbnN0IHRlcm1zSlNPTiA9IHRlcm1zVG9UZXJtc0pTT04odGVybXMpLFxuICAgICAgICAgIGZyYW1lc0pTT04gPSBmcmFtZXNUb0ZyYW1lc0pTT04oZnJhbWVzKSxcbiAgICAgICAgICBqdWRnZW1lbnRzSlNPTiA9IGp1ZGdlbWVudHNUb0p1ZGdlbWVudHNKU09OKGp1ZGdlbWVudHMpLFxuICAgICAgICAgIGVxdWFsaXRpZXNKU09OID0gZXF1YWxpdGllc1RvRXF1YWxpdGllc0pTT04oZXF1YWxpdGllcyksXG4gICAgICAgICAgc3RhdGVtZW50c0pTT04gPSBzdGF0ZW1lbnRzVG9TdGF0ZW1lbnRzSlNPTihzdGF0ZW1lbnRzKSxcbiAgICAgICAgICBhc3NlcnRpb25zSlNPTiA9IGFzc2VydGlvbnNUb0Fzc2VydGlvbnNKU09OKGFzc2VydGlvbnMpLFxuICAgICAgICAgIHJlZmVyZW5jZXNKU09OID0gcmVmZXJlbmNlc1RvUmVmZXJlbmNlc0pTT04ocmVmZXJlbmNlcyksXG4gICAgICAgICAgYXNzdW1wdGlvbnNKU09OID0gYXNzdW1wdGlvbnNUb0Fzc3VtcHRpb25zSlNPTihhc3N1bXB0aW9ucyksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlc0pTT04gPSBtZXRhdmFyaWFibGVzVG9NZXRhdmFyaWFibGVzSlNPTihtZXRhdmFyaWFibGVzKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25zSlNPTiA9IHN1YnN0aXR1dGlvbnNUb1N1YnN0aXR1dGlvbnNKU09OKHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgdGVybXMgPSB0ZXJtc0pTT047IC8vL1xuICAgIGZyYW1lcyA9IGZyYW1lc0pTT047IC8vL1xuICAgIGp1ZGdlbWVudHMgPSBqdWRnZW1lbnRzSlNPTjsgLy8vXG4gICAgZXF1YWxpdGllcyA9IGVxdWFsaXRpZXNKU09OOyAvLy9cbiAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50c0pTT047IC8vL1xuICAgIGFzc2VydGlvbnMgPSBhc3NlcnRpb25zSlNPTjsgLy8vXG4gICAgcmVmZXJlbmNlcyA9IHJlZmVyZW5jZXNKU09OOyAvLy9cbiAgICBhc3N1bXB0aW9ucyA9IGFzc3VtcHRpb25zSlNPTjsgLy8vXG4gICAgbWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNKU09OOyAgLy9cbiAgICBzdWJzdGl0dXRpb25zID0gc3Vic3RpdHV0aW9uc0pTT047IC8vL1xuXG4gICAgY29uc3QganNvbiA9IHtcbiAgICAgIHRlcm1zLFxuICAgICAgZnJhbWVzLFxuICAgICAganVkZ2VtZW50cyxcbiAgICAgIGVxdWFsaXRpZXMsXG4gICAgICBzdGF0ZW1lbnRzLFxuICAgICAgYXNzZXJ0aW9ucyxcbiAgICAgIHJlZmVyZW5jZXMsXG4gICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIG1ldGF2YXJpYWJsZXMsXG4gICAgICBzdWJzdGl0dXRpb25zXG4gICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IG51bGwsXG4gICAgICAgICAgZnJhbWVzID0gbnVsbCxcbiAgICAgICAgICBlcXVhbGl0aWVzID0gbnVsbCxcbiAgICAgICAgICBqdWRnZW1lbnRzID0gbnVsbCxcbiAgICAgICAgICBzdGF0ZW1lbnRzID0gbnVsbCxcbiAgICAgICAgICBhc3NlcnRpb25zID0gbnVsbCxcbiAgICAgICAgICByZWZlcmVuY2VzID0gbnVsbCxcbiAgICAgICAgICBhc3N1bXB0aW9ucyA9IG51bGwsXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG51bGwsXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IG51bGwsXG4gICAgICAgICAgbW5lbWljQ29udGV4dCA9IG5ldyBNbmVtaWNDb250ZXh0KGNvbnRleHQsIHRlcm1zLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGp1ZGdlbWVudHMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHJlZmVyZW5jZXMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBzdWJzdGl0dXRpb25zKTtcblxuICAgIG1uZW1pY0NvbnRleHQuaW5pdGlhbGlzZShqc29uKTtcblxuICAgIHJldHVybiBtbmVtaWNDb250ZXh0O1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdLFxuICAgICAgICAgIGZyYW1lcyA9IFtdLFxuICAgICAgICAgIGVxdWFsaXRpZXMgPSBbXSxcbiAgICAgICAgICBqdWRnZW1lbnRzID0gW10sXG4gICAgICAgICAgc3RhdGVtZW50cyA9IFtdLFxuICAgICAgICAgIGFzc2VydGlvbnMgPSBbXSxcbiAgICAgICAgICByZWZlcmVuY2VzID0gW10sXG4gICAgICAgICAgYXNzdW1wdGlvbnMgPSBbXSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzID0gW10sXG4gICAgICAgICAgc3Vic3RpdHV0aW9ucyA9IFtdLFxuICAgICAgICAgIG1uZW1pY0NvbnRleHQgPSBuZXcgTW5lbWljQ29udGV4dChjb250ZXh0LCB0ZXJtcywgZnJhbWVzLCBlcXVhbGl0aWVzLCBqdWRnZW1lbnRzLCBhc3NlcnRpb25zLCBzdGF0ZW1lbnRzLCByZWZlcmVuY2VzLCBhc3N1bXB0aW9ucywgbWV0YXZhcmlhYmxlcywgc3Vic3RpdHV0aW9ucyk7XG5cbiAgICByZXR1cm4gbW5lbWljQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIk1uZW1pY0NvbnRleHQiLCJwdXNoIiwiYXJyYXlVdGlsaXRpZXMiLCJDb250ZXh0IiwiY29udGV4dCIsInRlcm1zIiwiZnJhbWVzIiwiZXF1YWxpdGllcyIsImp1ZGdlbWVudHMiLCJhc3NlcnRpb25zIiwic3RhdGVtZW50cyIsInJlZmVyZW5jZXMiLCJhc3N1bXB0aW9ucyIsIm1ldGF2YXJpYWJsZXMiLCJzdWJzdGl0dXRpb25zIiwiZ2V0VGVybXMiLCJnZXRDb250ZXh0IiwiY29tcHJlc3NUZXJtcyIsImdldEZyYW1lcyIsImNvbXByZXNzRnJhbWVzIiwiZ2V0RXF1YWxpdGllcyIsImNvbXByZXNzRXF1YWxpdGllcyIsImdldEp1ZGdlbWVudHMiLCJjb21wcmVzc0p1ZGdlbWVudHMiLCJnZXRTdGF0ZW1lbnRzIiwiY29tcHJlc3NTdGF0ZW1lbnRzIiwiZ2V0QXNzZXJ0aW9ucyIsImNvbXByZXNzQXNzZXJ0aW9ucyIsImdldFJlZmVyZW5jZXMiLCJjb21wcmVzc1JlZmVyZW5jZXMiLCJnZXRBc3N1bXB0aW9ucyIsImNvbXByZXNzQXNzdW1wdGlvbnMiLCJnZXRNZXRhdmFyaWFibGVzIiwiY29tcHJlc3NNZXRhdmFyaWFibGVzIiwiZ2V0U3Vic3RpdHV0aW9ucyIsImNvbXByZXNzU3Vic3RpdHV0aW9ucyIsImFkZFRlcm0iLCJ0ZXJtIiwidGVybUEiLCJ0ZXJtU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ0ZXJtQiIsImZpbmQiLCJ0ZXJtQUNvbXBhcmVzVG9UZXJtQiIsImNvbXBhcmVUZXJtIiwiZGVidWciLCJhZGRGcmFtZSIsImZyYW1lIiwiZnJhbWVBIiwiZnJhbWVTdHJpbmciLCJmcmFtZUIiLCJmcmFtZUFFcXVhbFRvRnJhbWVCIiwiaXNFcXVhbFRvIiwiYWRkRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5QSIsImVxdWFsaXR5U3RyaW5nIiwiZXF1YWxpdHlCIiwiZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5QiIsImFkZEp1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudEEiLCJqdWRnZW1lbnRTdHJpbmciLCJqdWRnZW1lbnRCIiwianVkZ2VtZW50QUVxdWFsVG9FcXVhbGl0eUIiLCJhZGRTdGF0ZW1lbnQiLCJzdGF0ZW1lbnQiLCJzdGF0ZW1lbnRBIiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50QiIsInN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50QiIsImFkZEFzc2VydGlvbiIsImFzc2VydGlvbiIsImFzc2VydGlvbkEiLCJhc3NlcnRpb25TdHJpbmciLCJhc3NlcnRpb25CIiwiYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CIiwiYWRkUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlQSIsInJlZmVyZW5jZVN0cmluZyIsInJlZmVyZW5jZUIiLCJyZWZlcmVuY2VBRXF1YWxUb1JlZmVyZW5jZUIiLCJhZGRBc3N1bXB0aW9uIiwiYXNzdW1wdGlvbiIsImFzc3VtcHRpb25BIiwiYXNzdW1wdGlvblN0cmluZyIsImFzc3VtcHRpb25CIiwiYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVBIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwibWV0YXZhcmlhYmxlQiIsIm1ldGF2YXJpYWJsZUFFcXVhbFRvU3Vic3RpdHV0aW9uQiIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbkEiLCJzdWJzdGl0dXRpb25TdHJpbmciLCJzdWJzdGl0dXRpb25CIiwic3Vic3RpdHV0aW9uQUVxdWFsVG9TdWJzdGl0dXRpb25CIiwiYWRkVGVybXMiLCJmb3JFYWNoIiwiYWRkRnJhbWVzIiwiYWRkRXF1YWxpdGllcyIsImFkZEp1ZGdlbWVudHMiLCJhZGRBc3NlcnRpb25zIiwiYWRkU3RhdGVtZW50cyIsImFkZFJlZmVyZW5jZXMiLCJhZGRBc3N1bXB0aW9ucyIsImFkZE1ldGF2YXJpYWJsZXMiLCJhZGRTdWJzdGl0dXRpb25zIiwiZmluZFZhcmlhYmxlQnlWYXJpYWJsZU5vZGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJnZXRWYXJpYWJsZUlkZW50aWZpZXIiLCJkZWNsYXJlZFZhcmlhYmxlIiwiZmluZERlY2xhcmVkVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllciIsInZhcmlhYmxlIiwiZmluZFRlcm1CeVRlcm1Ob2RlIiwidGVybU5vZGUiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaFRlcm1Ob2RlIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJmcmFtZU5vZGUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZU1hdGNoZXMiLCJtYXRjaEVxdWFsaXR5Tm9kZSIsImZpbmRKdWRnZW1lbnRCeUp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnROb2RlIiwianVkZ2VtZW50Tm9kZU1hdGNoZXMiLCJtYXRjaEp1ZGdlbWVudE5vZGUiLCJmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hTdGF0ZW1lbnROb2RlIiwiZmluZFJlZmVyZW5jZUJ5UmVmZXJlbmNlTm9kZSIsInJlZmVyZW5jZU5vZGUiLCJyZWZlcmVuY2VNYXRjaGVSZWZlcmVuY2VOb2RlIiwibWF0Y2hSZWZlcmVuY2VOb2RlIiwiZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlTWF0Y2hlcyIsIm1hdGNoQXNzZXJ0aW9uTm9kZSIsImZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZSIsImFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3N1bXB0aW9uTm9kZSIsImZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwicmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaFN1YnN0aXR1dGlvbk5vZGUiLCJpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSIsInRlcm1QcmVzZW50IiwiaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZSIsImZyYW1lUHJlc2VudCIsImlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUiLCJlcXVhbGl0eVByZXNlbnQiLCJpc0p1ZGdlbWVudFByZXNlbnRCeUp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnRQcmVzZW50IiwiaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50UHJlc2VudCIsImlzQXNzZXJ0aW9uUHJlc2VudEJ5QXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvblByZXNlbnQiLCJpc0Fzc3VtcHRpb25QcmVzZW50QnlBc3N1bXB0aW9uTm9kZSIsImFzc3VtcHRpb25QcmVzZW50IiwiaXNSZWZlcmVuY2VQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlIiwicmVmZXJlbmNlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZW5Ob2RlIiwibWV0YXZhcmlhYmxlbiIsIm1ldGF2YXJpYWJsZW5QcmVzZW50IiwiaXNTdWJzdGl0dXRpb25QcmVzZW50QnlTdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uUHJlc2VudCIsImNvbW1pdCIsImVsZW1lbnQiLCJzZXRDb250ZXh0IiwiaW5pdGlhbGlzZSIsImpzb24iLCJ0ZXJtc0Zyb21KU09OIiwibWV0YXZhcmlhYmxlc0Zyb21KU09OIiwic3RhdGVtZW50c0Zyb21KU09OIiwicmVmZXJlbmNlc0Zyb21KU09OIiwiZXF1YWxpdGllc0Zyb21KU09OIiwiYXNzdW1wdGlvbnNGcm9tSlNPTiIsImZyYW1lc0Zyb21KU09OIiwianVkZ2VtZW50c0Zyb21KU09OIiwiYXNzZXJ0aW9uc0Zyb21KU09OIiwic3Vic3RpdHV0aW9uc0Zyb21KU09OIiwidG9KU09OIiwidGVybXNKU09OIiwidGVybXNUb1Rlcm1zSlNPTiIsImZyYW1lc0pTT04iLCJmcmFtZXNUb0ZyYW1lc0pTT04iLCJqdWRnZW1lbnRzSlNPTiIsImp1ZGdlbWVudHNUb0p1ZGdlbWVudHNKU09OIiwiZXF1YWxpdGllc0pTT04iLCJlcXVhbGl0aWVzVG9FcXVhbGl0aWVzSlNPTiIsInN0YXRlbWVudHNKU09OIiwic3RhdGVtZW50c1RvU3RhdGVtZW50c0pTT04iLCJhc3NlcnRpb25zSlNPTiIsImFzc2VydGlvbnNUb0Fzc2VydGlvbnNKU09OIiwicmVmZXJlbmNlc0pTT04iLCJyZWZlcmVuY2VzVG9SZWZlcmVuY2VzSlNPTiIsImFzc3VtcHRpb25zSlNPTiIsImFzc3VtcHRpb25zVG9Bc3N1bXB0aW9uc0pTT04iLCJtZXRhdmFyaWFibGVzSlNPTiIsIm1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OIiwic3Vic3RpdHV0aW9uc0pTT04iLCJzdWJzdGl0dXRpb25zVG9TdWJzdGl0dXRpb25zSlNPTiIsImZyb21KU09OIiwibW5lbWljQ29udGV4dCIsImZyb21Ob3RoaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkF1Q0E7OztlQUFxQkE7OzsyQkFyQ1U7Z0VBRVg7MEJBV2tCO3NCQW9CVzs7Ozs7O0FBRWpELE1BQU0sRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRWhCLE1BQU1G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
|