occam-furtle 2.0.342 → 3.0.2
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/example.js +5905 -1786
- package/lib/context/block.js +81 -41
- package/lib/context/file/furtle.js +260 -0
- package/lib/context/file/nominal.js +956 -0
- package/lib/context/file.js +146 -271
- package/lib/context.js +210 -0
- package/lib/element/assignment/array.js +116 -14
- package/lib/element/assignment/object.js +116 -14
- package/lib/element/assignment/variable.js +121 -14
- package/lib/element/assignments/variable.js +120 -13
- package/lib/element/declaration/procedure.js +120 -12
- package/lib/element/error.js +118 -13
- package/lib/element/every.js +116 -13
- package/lib/element/expression.js +127 -20
- package/lib/element/label.js +119 -12
- package/lib/element/nodeQuery.js +116 -14
- package/lib/element/nodesQuery.js +116 -14
- package/lib/element/parameter/named.js +117 -15
- package/lib/element/parameter.js +116 -14
- package/lib/element/parameters/named.js +116 -14
- package/lib/element/parameters.js +115 -13
- package/lib/element/primitive.js +115 -13
- package/lib/element/procedure/anonymous.js +118 -16
- package/lib/element/procedure.js +118 -16
- package/lib/element/procedureCall.js +116 -14
- package/lib/element/reduce.js +116 -14
- package/lib/element/reference.js +119 -12
- package/lib/element/returnBlock.js +116 -14
- package/lib/element/some.js +115 -13
- package/lib/element/statement/return.js +120 -13
- package/lib/element/step.js +121 -14
- package/lib/element/term/bracketed.js +120 -13
- package/lib/element/term/comparison.js +117 -15
- package/lib/element/term/logical.js +118 -16
- package/lib/element/term/negated.js +116 -14
- package/lib/element/term.js +127 -18
- package/lib/element/terms.js +125 -14
- package/lib/element/ternary.js +117 -15
- package/lib/element/variable.js +127 -19
- package/lib/element.js +1 -8
- package/lib/index.js +5 -5
- package/lib/log.js +13 -12
- package/lib/metaTypeNames.js +26 -0
- package/lib/metaTypes.js +66 -0
- package/lib/nodeProperties.js +17 -21
- package/lib/nodeProperty.js +4 -7
- package/lib/utilities/context.js +8 -37
- package/lib/utilities/customGrammar.js +49 -0
- package/lib/utilities/element.js +91 -37
- package/lib/utilities/lineIndex.js +26 -0
- package/lib/utilities/node.js +1 -8
- package/lib/utilities/primitive.js +14 -5
- package/lib/utilities/string.js +30 -19
- package/lib/utilities/term.js +14 -5
- package/lib/utilities/terms.js +7 -3
- package/package.json +2 -2
- package/src/context/block.js +20 -32
- package/src/context/file/furtle.js +141 -0
- package/src/context/file/nominal.js +946 -0
- package/src/context/file.js +32 -209
- package/src/context.js +74 -0
- package/src/element/assignment/array.js +6 -8
- package/src/element/assignment/object.js +6 -8
- package/src/element/assignment/variable.js +7 -8
- package/src/element/assignments/variable.js +7 -8
- package/src/element/declaration/procedure.js +6 -6
- package/src/element/error.js +4 -6
- package/src/element/every.js +5 -6
- package/src/element/expression.js +6 -7
- package/src/element/label.js +6 -7
- package/src/element/nodeQuery.js +6 -8
- package/src/element/nodesQuery.js +6 -8
- package/src/element/parameter/named.js +7 -8
- package/src/element/parameter.js +6 -8
- package/src/element/parameters/named.js +8 -9
- package/src/element/parameters.js +6 -8
- package/src/element/primitive.js +5 -7
- package/src/element/procedure/anonymous.js +7 -9
- package/src/element/procedure.js +6 -8
- package/src/element/procedureCall.js +6 -8
- package/src/element/reduce.js +5 -7
- package/src/element/reference.js +6 -7
- package/src/element/returnBlock.js +5 -7
- package/src/element/some.js +5 -7
- package/src/element/statement/return.js +7 -8
- package/src/element/step.js +6 -7
- package/src/element/term/bracketed.js +7 -8
- package/src/element/term/comparison.js +6 -8
- package/src/element/term/logical.js +6 -8
- package/src/element/term/negated.js +6 -8
- package/src/element/term.js +12 -9
- package/src/element/terms.js +16 -9
- package/src/element/ternary.js +6 -8
- package/src/element/variable.js +24 -14
- package/src/element.js +0 -8
- package/src/index.js +1 -1
- package/src/log.js +11 -11
- package/src/metaTypeNames.js +5 -0
- package/src/metaTypes.js +71 -0
- package/src/nodeProperties.js +23 -32
- package/src/nodeProperty.js +5 -10
- package/src/utilities/context.js +7 -45
- package/src/utilities/customGrammar.js +40 -0
- package/src/utilities/element.js +158 -64
- package/src/utilities/lineIndex.js +21 -0
- package/src/utilities/node.js +0 -5
- package/src/utilities/primitive.js +22 -5
- package/src/utilities/string.js +33 -19
- package/src/utilities/term.js +22 -5
- package/src/utilities/terms.js +12 -4
- package/test/context/release.js +477 -46
- package/test/helpers/furtle.js +1 -1
- package/test/helpers/nominal.js +2 -3
- package/test/main.js +1 -1
- package/test/context/file.js +0 -127
- package/test/helpers/constants.js +0 -17
|
@@ -0,0 +1,956 @@
|
|
|
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 NominalFileContext;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _necessary = require("necessary");
|
|
12
|
+
var _file = /*#__PURE__*/ _interop_require_default(require("../../context/file"));
|
|
13
|
+
var _verify = require("../process/verify");
|
|
14
|
+
var _context = require("../../utilities/context");
|
|
15
|
+
var _types = require("../types");
|
|
16
|
+
var _json = require("../utilities/json");
|
|
17
|
+
function _array_like_to_array(arr, len) {
|
|
18
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
19
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
20
|
+
return arr2;
|
|
21
|
+
}
|
|
22
|
+
function _array_without_holes(arr) {
|
|
23
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
24
|
+
}
|
|
25
|
+
function _assert_this_initialized(self) {
|
|
26
|
+
if (self === void 0) {
|
|
27
|
+
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
28
|
+
}
|
|
29
|
+
return self;
|
|
30
|
+
}
|
|
31
|
+
function _call_super(_this, derived, args) {
|
|
32
|
+
derived = _get_prototype_of(derived);
|
|
33
|
+
return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
|
|
34
|
+
}
|
|
35
|
+
function _class_call_check(instance, Constructor) {
|
|
36
|
+
if (!(instance instanceof Constructor)) {
|
|
37
|
+
throw new TypeError("Cannot call a class as a function");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function _defineProperties(target, props) {
|
|
41
|
+
for(var i = 0; i < props.length; i++){
|
|
42
|
+
var descriptor = props[i];
|
|
43
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
44
|
+
descriptor.configurable = true;
|
|
45
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
46
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
50
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
51
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
52
|
+
return Constructor;
|
|
53
|
+
}
|
|
54
|
+
function _get_prototype_of(o) {
|
|
55
|
+
_get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
|
|
56
|
+
return o.__proto__ || Object.getPrototypeOf(o);
|
|
57
|
+
};
|
|
58
|
+
return _get_prototype_of(o);
|
|
59
|
+
}
|
|
60
|
+
function _inherits(subClass, superClass) {
|
|
61
|
+
if (typeof superClass !== "function" && superClass !== null) {
|
|
62
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
63
|
+
}
|
|
64
|
+
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
65
|
+
constructor: {
|
|
66
|
+
value: subClass,
|
|
67
|
+
writable: true,
|
|
68
|
+
configurable: true
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
if (superClass) _set_prototype_of(subClass, superClass);
|
|
72
|
+
}
|
|
73
|
+
function _interop_require_default(obj) {
|
|
74
|
+
return obj && obj.__esModule ? obj : {
|
|
75
|
+
default: obj
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function _iterable_to_array(iter) {
|
|
79
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
80
|
+
}
|
|
81
|
+
function _non_iterable_spread() {
|
|
82
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
83
|
+
}
|
|
84
|
+
function _possible_constructor_return(self, call) {
|
|
85
|
+
if (call && (_type_of(call) === "object" || typeof call === "function")) {
|
|
86
|
+
return call;
|
|
87
|
+
}
|
|
88
|
+
return _assert_this_initialized(self);
|
|
89
|
+
}
|
|
90
|
+
function _set_prototype_of(o, p) {
|
|
91
|
+
_set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
|
|
92
|
+
o.__proto__ = p;
|
|
93
|
+
return o;
|
|
94
|
+
};
|
|
95
|
+
return _set_prototype_of(o, p);
|
|
96
|
+
}
|
|
97
|
+
function _to_consumable_array(arr) {
|
|
98
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
99
|
+
}
|
|
100
|
+
function _type_of(obj) {
|
|
101
|
+
"@swc/helpers - typeof";
|
|
102
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
103
|
+
}
|
|
104
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
105
|
+
if (!o) return;
|
|
106
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
107
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
108
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
109
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
110
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
111
|
+
}
|
|
112
|
+
function _is_native_reflect_construct() {
|
|
113
|
+
try {
|
|
114
|
+
var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
|
|
115
|
+
} catch (_) {}
|
|
116
|
+
return (_is_native_reflect_construct = function() {
|
|
117
|
+
return !!result;
|
|
118
|
+
})();
|
|
119
|
+
}
|
|
120
|
+
var push = _necessary.arrayUtilities.push, filter = _necessary.arrayUtilities.filter;
|
|
121
|
+
var NominalFileContext = /*#__PURE__*/ function(FileContext) {
|
|
122
|
+
_inherits(NominalFileContext, FileContext);
|
|
123
|
+
function NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables) {
|
|
124
|
+
_class_call_check(this, NominalFileContext);
|
|
125
|
+
var _this;
|
|
126
|
+
_this = _call_super(this, NominalFileContext, [
|
|
127
|
+
context,
|
|
128
|
+
filePath,
|
|
129
|
+
node,
|
|
130
|
+
tokens
|
|
131
|
+
]);
|
|
132
|
+
_this.context = context;
|
|
133
|
+
_this.filePath = filePath;
|
|
134
|
+
_this.tokens = tokens;
|
|
135
|
+
_this.node = node;
|
|
136
|
+
_this.types = types;
|
|
137
|
+
_this.rules = rules;
|
|
138
|
+
_this.axioms = axioms;
|
|
139
|
+
_this.lemmas = lemmas;
|
|
140
|
+
_this.theorems = theorems;
|
|
141
|
+
_this.variables = variables;
|
|
142
|
+
_this.metaLemmas = metaLemmas;
|
|
143
|
+
_this.conjectures = conjectures;
|
|
144
|
+
_this.combinators = combinators;
|
|
145
|
+
_this.typePrefixes = typePrefixes;
|
|
146
|
+
_this.constructors = constructors;
|
|
147
|
+
_this.metatheorems = metatheorems;
|
|
148
|
+
_this.metavariables = metavariables;
|
|
149
|
+
return _possible_constructor_return(_this, (0, _context.chainContext)(_this));
|
|
150
|
+
}
|
|
151
|
+
_create_class(NominalFileContext, [
|
|
152
|
+
{
|
|
153
|
+
key: "getContext",
|
|
154
|
+
value: function getContext() {
|
|
155
|
+
return this.context;
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
key: "getFilePath",
|
|
160
|
+
value: function getFilePath() {
|
|
161
|
+
return this.filePath;
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
key: "getLineIndex",
|
|
166
|
+
value: function getLineIndex() {
|
|
167
|
+
return this.lineIndex;
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
key: "getTokens",
|
|
172
|
+
value: function getTokens() {
|
|
173
|
+
return this.tokens;
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
key: "getNode",
|
|
178
|
+
value: function getNode() {
|
|
179
|
+
return this.node;
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
key: "getJudgements",
|
|
184
|
+
value: function getJudgements() {
|
|
185
|
+
var judgements = [];
|
|
186
|
+
return judgements;
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
key: "getEquivalences",
|
|
191
|
+
value: function getEquivalences() {
|
|
192
|
+
debugger;
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
key: "getSubproofOrProofAssertions",
|
|
197
|
+
value: function getSubproofOrProofAssertions() {
|
|
198
|
+
var subproofOrProofAssertions = [];
|
|
199
|
+
return subproofOrProofAssertions;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
key: "getLabels",
|
|
204
|
+
value: function getLabels() {
|
|
205
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
206
|
+
var labels = [];
|
|
207
|
+
if (includeRelease) {
|
|
208
|
+
var releaseContextLabels = this.context.getLabels();
|
|
209
|
+
push(labels, releaseContextLabels);
|
|
210
|
+
} else {
|
|
211
|
+
this.rules.forEach(function(rule) {
|
|
212
|
+
var ruleLabels = rule.getLabels();
|
|
213
|
+
push(labels, ruleLabels);
|
|
214
|
+
});
|
|
215
|
+
this.axioms.forEach(function(axiom) {
|
|
216
|
+
var axiomLabels = axiom.getLabels();
|
|
217
|
+
push(labels, axiomLabels);
|
|
218
|
+
});
|
|
219
|
+
this.lemmas.forEach(function(lemma) {
|
|
220
|
+
var lemmaLabels = lemma.getLabels();
|
|
221
|
+
push(labels, lemmaLabels);
|
|
222
|
+
});
|
|
223
|
+
this.theorems.forEach(function(theorem) {
|
|
224
|
+
var theoremLabels = theorem.getLabels();
|
|
225
|
+
push(labels, theoremLabels);
|
|
226
|
+
});
|
|
227
|
+
this.conjectures.forEach(function(conjecture) {
|
|
228
|
+
var conjectureLabels = conjecture.getLabels();
|
|
229
|
+
push(labels, conjectureLabels);
|
|
230
|
+
});
|
|
231
|
+
this.metatheorems.forEach(function(metatheorem) {
|
|
232
|
+
var metatheoremLabel = metatheorem.getLabel();
|
|
233
|
+
labels.push(metatheoremLabel);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return labels;
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
key: "getTypes",
|
|
241
|
+
value: function getTypes() {
|
|
242
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true, includeDependencies = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
|
243
|
+
var types = includeRelease ? this.context.getTypes(includeDependencies) : this.types;
|
|
244
|
+
return types;
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
key: "getRules",
|
|
249
|
+
value: function getRules() {
|
|
250
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
251
|
+
var rules = includeRelease ? this.context.getRules() : this.rules;
|
|
252
|
+
return rules;
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
key: "getAxioms",
|
|
257
|
+
value: function getAxioms() {
|
|
258
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
259
|
+
var axioms = includeRelease ? this.context.getAxioms() : this.axioms;
|
|
260
|
+
return axioms;
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
key: "getLemmas",
|
|
265
|
+
value: function getLemmas() {
|
|
266
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
267
|
+
var lemmas = includeRelease ? this.context.getLemmas() : this.lemmas;
|
|
268
|
+
return lemmas;
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
key: "getTheorems",
|
|
273
|
+
value: function getTheorems() {
|
|
274
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
275
|
+
var theorems = includeRelease ? this.context.getTheorems() : this.theorems;
|
|
276
|
+
return theorems;
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
key: "getVariables",
|
|
281
|
+
value: function getVariables() {
|
|
282
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
283
|
+
return this.variables;
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
key: "getProcedures",
|
|
288
|
+
value: function getProcedures() {
|
|
289
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
290
|
+
var procedures = includeRelease ? this.context.getProcedures() : null; ///
|
|
291
|
+
return procedures;
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
key: "getMetaLemmas",
|
|
296
|
+
value: function getMetaLemmas() {
|
|
297
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
298
|
+
var metaLemmas = includeRelease ? this.context.getMetaLemmas() : this.metaLemmas;
|
|
299
|
+
return metaLemmas;
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
key: "getConjectures",
|
|
304
|
+
value: function getConjectures() {
|
|
305
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
306
|
+
var conjectures = includeRelease ? this.context.getConjectures() : this.conjectures;
|
|
307
|
+
return conjectures;
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
key: "getCombinators",
|
|
312
|
+
value: function getCombinators() {
|
|
313
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
314
|
+
var combinators = includeRelease ? this.context.getCombinators() : this.combinators;
|
|
315
|
+
return combinators;
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
key: "getTypePrefixes",
|
|
320
|
+
value: function getTypePrefixes() {
|
|
321
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
322
|
+
var typePrefixes = includeRelease ? this.context.getTypePrefixes() : this.typePrefixes;
|
|
323
|
+
return typePrefixes;
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
key: "getConstructors",
|
|
328
|
+
value: function getConstructors() {
|
|
329
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
330
|
+
var constructors = includeRelease ? this.context.getConstructors() : this.constructors;
|
|
331
|
+
return constructors;
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
key: "getMetatheorems",
|
|
336
|
+
value: function getMetatheorems() {
|
|
337
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
338
|
+
var metatheorems = includeRelease ? this.context.getMetatheorems() : this.metatheorems;
|
|
339
|
+
return metatheorems;
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
key: "getMetavariables",
|
|
344
|
+
value: function getMetavariables() {
|
|
345
|
+
var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
346
|
+
return this.metavariables;
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
key: "addType",
|
|
351
|
+
value: function addType(type) {
|
|
352
|
+
this.types.push(type);
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
key: "addRule",
|
|
357
|
+
value: function addRule(rule) {
|
|
358
|
+
this.rules.push(rule);
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
key: "addAxiom",
|
|
363
|
+
value: function addAxiom(axiom) {
|
|
364
|
+
this.axioms.push(axiom);
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
key: "addLemma",
|
|
369
|
+
value: function addLemma(lemma) {
|
|
370
|
+
this.lemmas.push(lemma);
|
|
371
|
+
}
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
key: "addTheorem",
|
|
375
|
+
value: function addTheorem(theorem) {
|
|
376
|
+
this.theorems.push(theorem);
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
key: "addVariable",
|
|
381
|
+
value: function addVariable(variable) {
|
|
382
|
+
this.variables.push(variable);
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
key: "addMetaLemma",
|
|
387
|
+
value: function addMetaLemma(metaLemma) {
|
|
388
|
+
this.metaLemmas.push(metaLemma);
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
key: "addConjecture",
|
|
393
|
+
value: function addConjecture(conjecture) {
|
|
394
|
+
this.conjectures.push(conjecture);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
key: "addCombinator",
|
|
399
|
+
value: function addCombinator(combinator) {
|
|
400
|
+
this.combinators.push(combinator);
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
key: "addTypePrefix",
|
|
405
|
+
value: function addTypePrefix(typePrefix) {
|
|
406
|
+
this.typePrefixes.push(typePrefix);
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
key: "addConstructor",
|
|
411
|
+
value: function addConstructor(constructor) {
|
|
412
|
+
this.constructors.push(constructor);
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
key: "addMetatheorem",
|
|
417
|
+
value: function addMetatheorem(metatheorem) {
|
|
418
|
+
this.metatheorems.push(metatheorem);
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
key: "addMetavariable",
|
|
423
|
+
value: function addMetavariable(metavariable) {
|
|
424
|
+
this.metavariables.push(metavariable);
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
key: "findLabelByReference",
|
|
429
|
+
value: function findLabelByReference(reference, context) {
|
|
430
|
+
var labels = this.getLabels(), label = labels.find(function(label) {
|
|
431
|
+
var metavariableUnifies = label.unifyReference(reference, context);
|
|
432
|
+
if (metavariableUnifies) {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
}) || null;
|
|
436
|
+
return label;
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
key: "findMetaLemmaByReference",
|
|
441
|
+
value: function findMetaLemmaByReference(reference) {
|
|
442
|
+
var metaLemmas = this.getMetaLemmas(), metaLemma = metaLemmas.find(function(metaLemma) {
|
|
443
|
+
var metaLemmaComparesToReference = metaLemma.compareReference(reference);
|
|
444
|
+
if (metaLemmaComparesToReference) {
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
}) || null;
|
|
448
|
+
return metaLemma;
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
key: "findMetatheoremByReference",
|
|
453
|
+
value: function findMetatheoremByReference(reference) {
|
|
454
|
+
var metatheorems = this.getMetatheorems(), metatheorem = metatheorems.find(function(metatheorem) {
|
|
455
|
+
var metatheoremComparesToReference = metatheorem.compareReference(reference);
|
|
456
|
+
if (metatheoremComparesToReference) {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
}) || null;
|
|
460
|
+
return metatheorem;
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
key: "findRuleByReference",
|
|
465
|
+
value: function findRuleByReference(reference) {
|
|
466
|
+
var rules = this.getRules(), metavariableName = reference.getMetavariableName(), rule = rules.find(function(rule) {
|
|
467
|
+
var ruleComparesToMetavariableName = rule.compareMetavariableName(metavariableName);
|
|
468
|
+
if (ruleComparesToMetavariableName) {
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
}) || null;
|
|
472
|
+
return rule;
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
key: "findAxiomByReference",
|
|
477
|
+
value: function findAxiomByReference(reference) {
|
|
478
|
+
var axioms = this.getAxioms(), metavariableName = reference.getMetavariableName(), axiom = axioms.find(function(axiom) {
|
|
479
|
+
var axiomComparesToMetavariableName = axiom.compareMetavariableName(metavariableName);
|
|
480
|
+
if (axiomComparesToMetavariableName) {
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
}) || null;
|
|
484
|
+
return axiom;
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
key: "findLemmaByReference",
|
|
489
|
+
value: function findLemmaByReference(reference) {
|
|
490
|
+
var lemmas = this.getLemmas(), metavariableName = reference.getMetavariableName(), lemma = lemmas.find(function(lemma) {
|
|
491
|
+
var lemmaComparesToMetavariableName = lemma.compareMetavariableName(metavariableName);
|
|
492
|
+
if (lemmaComparesToMetavariableName) {
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
}) || null;
|
|
496
|
+
return lemma;
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
key: "findTheoremByReference",
|
|
501
|
+
value: function findTheoremByReference(reference) {
|
|
502
|
+
var theorems = this.getTheorems(), metavariableName = reference.getMetavariableName(), theorem = theorems.find(function(theorem) {
|
|
503
|
+
var theoremComparesToMetavariableName = theorem.compareMetavariableName(metavariableName);
|
|
504
|
+
if (theoremComparesToMetavariableName) {
|
|
505
|
+
return true;
|
|
506
|
+
}
|
|
507
|
+
}) || null;
|
|
508
|
+
return theorem;
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
key: "findProcedureByName",
|
|
513
|
+
value: function findProcedureByName(name) {
|
|
514
|
+
var procedures = this.getProcedures(), procedure = procedures.find(function(procedure) {
|
|
515
|
+
var nameMatches = procedure.matchName(name);
|
|
516
|
+
if (nameMatches) {
|
|
517
|
+
return true;
|
|
518
|
+
}
|
|
519
|
+
}) || null;
|
|
520
|
+
return procedure;
|
|
521
|
+
}
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
key: "findConjectureByReference",
|
|
525
|
+
value: function findConjectureByReference(reference) {
|
|
526
|
+
var conjectures = this.getConjectures(), metavariableName = reference.getMetavariableName(), conjecture = conjectures.find(function(conjecture) {
|
|
527
|
+
var conjectureComparesToMetavariableName = conjecture.compareMetavariableName(metavariableName);
|
|
528
|
+
if (conjectureComparesToMetavariableName) {
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
}) || null;
|
|
532
|
+
return conjecture;
|
|
533
|
+
}
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
key: "findMetaLemmasByReference",
|
|
537
|
+
value: function findMetaLemmasByReference(reference) {
|
|
538
|
+
var _this = this;
|
|
539
|
+
var metaLemmas = this.getMetaLemmas();
|
|
540
|
+
filter(metaLemmas, function(metaLemma) {
|
|
541
|
+
var context = _this, topLevelMetaAssertion = metaLemma, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
|
|
542
|
+
if (topLevelMetaAssertionUnifies) {
|
|
543
|
+
return true;
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
return metaLemmas;
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
key: "findMetatheoremsByReference",
|
|
551
|
+
value: function findMetatheoremsByReference(reference) {
|
|
552
|
+
var _this = this;
|
|
553
|
+
var metatheorems = this.getMetatheorems();
|
|
554
|
+
filter(metatheorems, function(metatheorem) {
|
|
555
|
+
var context = _this, topLevelMetaAssertion = metatheorem, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
|
|
556
|
+
if (topLevelMetaAssertionUnifies) {
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
return metatheorems;
|
|
561
|
+
}
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
key: "findTopLevelMetaAssertionByReference",
|
|
565
|
+
value: function findTopLevelMetaAssertionByReference(reference) {
|
|
566
|
+
var metaLemma = this.findMetaLemmaByReference(reference), metatheorem = this.findMetatheoremByReference(reference), topLevelMetaAssertion = metaLemma || metatheorem; ///
|
|
567
|
+
return topLevelMetaAssertion;
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
key: "findTopLevelMetaAssertionsByReference",
|
|
572
|
+
value: function findTopLevelMetaAssertionsByReference(reference) {
|
|
573
|
+
var metaLemmas = this.findMetaLemmasByReference(reference), metatheorems = this.findMetatheoremsByReference(reference), topLevelMetaAssertions = _to_consumable_array(metaLemmas).concat(_to_consumable_array(metatheorems));
|
|
574
|
+
return topLevelMetaAssertions;
|
|
575
|
+
}
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
key: "findTopLevelAssertionByReference",
|
|
579
|
+
value: function findTopLevelAssertionByReference(reference) {
|
|
580
|
+
var axiom = this.findAxiomByReference(reference), lemma = this.findLemmaByReference(reference), theorem = this.findTheoremByReference(reference), conjecture = this.findConjectureByReference(reference), topLevelAssertion = axiom || lemma || theorem || conjecture;
|
|
581
|
+
return topLevelAssertion;
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
key: "findMetavariable",
|
|
586
|
+
value: function findMetavariable(metavariable) {
|
|
587
|
+
var _this = this;
|
|
588
|
+
var metavariables = this.getMetavariables(), specificMetavariable = metavariable; ///
|
|
589
|
+
metavariable = metavariables.find(function(metavariable) {
|
|
590
|
+
var context = _this, generalMetavariable = metavariable, metavariableUnifies = generalMetavariable.unifyMetavariable(specificMetavariable, context);
|
|
591
|
+
if (metavariableUnifies) {
|
|
592
|
+
return true;
|
|
593
|
+
}
|
|
594
|
+
}) || null;
|
|
595
|
+
return metavariable;
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
key: "findTypeByTypeName",
|
|
600
|
+
value: function findTypeByTypeName(typeName) {
|
|
601
|
+
var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
|
|
602
|
+
var types = this.getTypes(includeRelease, includeDependencies);
|
|
603
|
+
var baseType = (0, _types.baseTypeFromNothing)();
|
|
604
|
+
types = _to_consumable_array(types).concat([
|
|
605
|
+
baseType
|
|
606
|
+
]);
|
|
607
|
+
var type = types.find(function(type) {
|
|
608
|
+
var typeComparesToTypeName = type.compareTypeName(typeName);
|
|
609
|
+
if (typeComparesToTypeName) {
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
612
|
+
}) || null;
|
|
613
|
+
return type;
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
key: "findTypeByNominalTypeName",
|
|
618
|
+
value: function findTypeByNominalTypeName(nominalTypeName) {
|
|
619
|
+
var types = this.getTypes();
|
|
620
|
+
var baseType = (0, _types.baseTypeFromNothing)();
|
|
621
|
+
types = _to_consumable_array(types).concat([
|
|
622
|
+
baseType
|
|
623
|
+
]);
|
|
624
|
+
var type = types.find(function(type) {
|
|
625
|
+
var typeComparesToNominalTypeName = type.compareNominalTypeName(nominalTypeName);
|
|
626
|
+
if (typeComparesToNominalTypeName) {
|
|
627
|
+
return true;
|
|
628
|
+
}
|
|
629
|
+
}) || null;
|
|
630
|
+
return type;
|
|
631
|
+
}
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
key: "findTypeByPrefixedTypeName",
|
|
635
|
+
value: function findTypeByPrefixedTypeName(prefixedTypeName) {
|
|
636
|
+
var types = this.getTypes();
|
|
637
|
+
var baseType = (0, _types.baseTypeFromNothing)();
|
|
638
|
+
types = _to_consumable_array(types).concat([
|
|
639
|
+
baseType
|
|
640
|
+
]);
|
|
641
|
+
var type = types.find(function(type) {
|
|
642
|
+
var typeComparesToPrefixedTypeName = type.comparePrefixedTypeName(prefixedTypeName);
|
|
643
|
+
if (typeComparesToPrefixedTypeName) {
|
|
644
|
+
return true;
|
|
645
|
+
}
|
|
646
|
+
}) || null;
|
|
647
|
+
return type;
|
|
648
|
+
}
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
key: "findMetaTypeByMetaTypeName",
|
|
652
|
+
value: function findMetaTypeByMetaTypeName(metaTypeName) {
|
|
653
|
+
var metaTypes = this.getMetaTypes(), metaType = metaTypes.find(function(metaType) {
|
|
654
|
+
var metaTypeComparesToMetaTypeName = metaType.compareMetaTypeName(metaTypeName);
|
|
655
|
+
if (metaTypeComparesToMetaTypeName) {
|
|
656
|
+
return true;
|
|
657
|
+
}
|
|
658
|
+
}) || null;
|
|
659
|
+
return metaType;
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
key: "findTypePrefixByTypePrefixName",
|
|
664
|
+
value: function findTypePrefixByTypePrefixName(typePrefixName) {
|
|
665
|
+
var typePrefixes = this.getTypePrefixes(), typePrefix = typePrefixes.find(function(typePrefix) {
|
|
666
|
+
var typePrefixComparesToTypePrefixName = typePrefix.compareTypePrefixName(typePrefixName);
|
|
667
|
+
if (typePrefixComparesToTypePrefixName) {
|
|
668
|
+
return true;
|
|
669
|
+
}
|
|
670
|
+
}) || null;
|
|
671
|
+
return typePrefix;
|
|
672
|
+
}
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
key: "findVariableByVariableIdentifier",
|
|
676
|
+
value: function findVariableByVariableIdentifier(variableIdentifier) {
|
|
677
|
+
var variables = this.getVariables(), variable = variables.find(function(variable) {
|
|
678
|
+
var variableComparesToVariableIdentifier = variable.compareVariableIdentifier(variableIdentifier);
|
|
679
|
+
if (variableComparesToVariableIdentifier) {
|
|
680
|
+
return true;
|
|
681
|
+
}
|
|
682
|
+
}) || null;
|
|
683
|
+
return variable;
|
|
684
|
+
}
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
key: "findLabelByMetavariableName",
|
|
688
|
+
value: function findLabelByMetavariableName(metavariableName) {
|
|
689
|
+
var labels = this.getLabels(), label = labels.find(function(label) {
|
|
690
|
+
var labelComparesToMetavariableName = label.compareMetavariableName(metavariableName);
|
|
691
|
+
if (labelComparesToMetavariableName) {
|
|
692
|
+
return true;
|
|
693
|
+
}
|
|
694
|
+
}) || null;
|
|
695
|
+
return label;
|
|
696
|
+
}
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
key: "findLabelByMetavariable",
|
|
700
|
+
value: function findLabelByMetavariable(metavariable) {
|
|
701
|
+
var labels = this.getLabels(), label = labels.find(function(label) {
|
|
702
|
+
var metavariableEqualToLabelMetavariable = label.isMetavariableEqualToMetavariable(metavariable);
|
|
703
|
+
if (metavariableEqualToLabelMetavariable) {
|
|
704
|
+
return true;
|
|
705
|
+
}
|
|
706
|
+
}) || null;
|
|
707
|
+
return label;
|
|
708
|
+
}
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
key: "findJudgementByMetavariable",
|
|
712
|
+
value: function findJudgementByMetavariable(metavariable) {
|
|
713
|
+
var judgements = this.getJudgements(), judgement = judgements.find(function(judgement) {
|
|
714
|
+
var judgementSingular = judgement.isSingular();
|
|
715
|
+
if (judgementSingular) {
|
|
716
|
+
var judgementMetavariable = judgement.getMetavariable(), judgementMetavariableEqualToMetavariable = judgementMetavariable.isEqualTo(metavariable);
|
|
717
|
+
if (judgementMetavariableEqualToMetavariable) {
|
|
718
|
+
return true;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}) || null;
|
|
722
|
+
return judgement;
|
|
723
|
+
}
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
key: "findMetavariableByMetavariableName",
|
|
727
|
+
value: function findMetavariableByMetavariableName(metavariableName) {
|
|
728
|
+
var metavariables = this.getMetavariables(), metavariable = metavariables.find(function(metavariable) {
|
|
729
|
+
var metavariableComparesToMetavariableName = metavariable.compareMetavariableName(metavariableName);
|
|
730
|
+
if (metavariableComparesToMetavariableName) {
|
|
731
|
+
return true;
|
|
732
|
+
}
|
|
733
|
+
}) || null;
|
|
734
|
+
return metavariable;
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
key: "isMetavariablePresent",
|
|
739
|
+
value: function isMetavariablePresent(metavariable) {
|
|
740
|
+
metavariable = this.findMetavariable(metavariable);
|
|
741
|
+
var metavariablePresent = metavariable !== null;
|
|
742
|
+
return metavariablePresent;
|
|
743
|
+
}
|
|
744
|
+
},
|
|
745
|
+
{
|
|
746
|
+
key: "isTypePresentByTypeName",
|
|
747
|
+
value: function isTypePresentByTypeName(typeName) {
|
|
748
|
+
var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
|
|
749
|
+
var type = this.findTypeByTypeName(typeName, includeRelease, includeDependencies), typePresent = type !== null;
|
|
750
|
+
return typePresent;
|
|
751
|
+
}
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
key: "isTypePresentByNominalTypeName",
|
|
755
|
+
value: function isTypePresentByNominalTypeName(nominalTypeName) {
|
|
756
|
+
var type = this.findTypeByNominalTypeName(nominalTypeName), typePresent = type !== null;
|
|
757
|
+
return typePresent;
|
|
758
|
+
}
|
|
759
|
+
},
|
|
760
|
+
{
|
|
761
|
+
key: "isTypePresentByPrefixedTypeName",
|
|
762
|
+
value: function isTypePresentByPrefixedTypeName(prefixedTypeName) {
|
|
763
|
+
var type = this.findTypeByPrefixedTypeName(prefixedTypeName), typePresent = type !== null;
|
|
764
|
+
return typePresent;
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
key: "isTypePrefixPresentByTypePrefixName",
|
|
769
|
+
value: function isTypePrefixPresentByTypePrefixName(typePrefixName) {
|
|
770
|
+
var typePrefix = this.findTypePrefixByTypePrefixName(typePrefixName), typePrefixPresent = typePrefix !== null;
|
|
771
|
+
return typePrefixPresent;
|
|
772
|
+
}
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
key: "isVariablePresentByVariableIdentifier",
|
|
776
|
+
value: function isVariablePresentByVariableIdentifier(variableIdentifier) {
|
|
777
|
+
var variable = this.findVariableByVariableIdentifier(variableIdentifier), variablePresent = variable !== null;
|
|
778
|
+
return variablePresent;
|
|
779
|
+
}
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
key: "isLabelPresentByMetavariableName",
|
|
783
|
+
value: function isLabelPresentByMetavariableName(metavariableName) {
|
|
784
|
+
var label = this.findLabelByMetavariableName(metavariableName), labelPresent = label !== null;
|
|
785
|
+
return labelPresent;
|
|
786
|
+
}
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
key: "isLabelPresentByMetavariable",
|
|
790
|
+
value: function isLabelPresentByMetavariable(metavariable) {
|
|
791
|
+
var label = this.findLabelByMetavariable(metavariable), labelPresent = label !== null;
|
|
792
|
+
return labelPresent;
|
|
793
|
+
}
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
key: "isMetavariablePresentByMetavariableName",
|
|
797
|
+
value: function isMetavariablePresentByMetavariableName(metavariableName) {
|
|
798
|
+
var metavariable = this.findMetavariableByMetavariableName(metavariableName), metavariablePresent = metavariable !== null;
|
|
799
|
+
return metavariablePresent;
|
|
800
|
+
}
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
key: "isLabelPresentByReference",
|
|
804
|
+
value: function isLabelPresentByReference(reference) {
|
|
805
|
+
var _this = this;
|
|
806
|
+
var labels = this.getLabels(), labelPresent = labels.some(function(label) {
|
|
807
|
+
var context = _this, labelUnifies = reference.unifyLabel(label, context);
|
|
808
|
+
if (labelUnifies) {
|
|
809
|
+
return true;
|
|
810
|
+
}
|
|
811
|
+
});
|
|
812
|
+
return labelPresent;
|
|
813
|
+
}
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
key: "isProcedurePresentByName",
|
|
817
|
+
value: function isProcedurePresentByName(name) {
|
|
818
|
+
var procedure = this.findProcedureByName(name), procedurePresent = procedure !== null;
|
|
819
|
+
return procedurePresent;
|
|
820
|
+
}
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
key: "isMetavariablePresentByReference",
|
|
824
|
+
value: function isMetavariablePresentByReference(reference) {
|
|
825
|
+
var _this = this;
|
|
826
|
+
var metavariables = this.getMetavariables(), metavariablePresent = metavariables.some(function(metavariable) {
|
|
827
|
+
var context = _this, metavariableUnifies = reference.unifyMetavariable(metavariable, context);
|
|
828
|
+
if (metavariableUnifies) {
|
|
829
|
+
return true;
|
|
830
|
+
}
|
|
831
|
+
});
|
|
832
|
+
return metavariablePresent;
|
|
833
|
+
}
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
key: "isTopLevelMetaAssertionPresentByReference",
|
|
837
|
+
value: function isTopLevelMetaAssertionPresentByReference(reference) {
|
|
838
|
+
var topLevelMetaAssertion = this.findTopLevelMetaAssertionByReference(reference), topLevelMetaAssertionPresent = topLevelMetaAssertion !== null;
|
|
839
|
+
return topLevelMetaAssertionPresent;
|
|
840
|
+
}
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
key: "verify",
|
|
844
|
+
value: function verify() {
|
|
845
|
+
var verifies = false;
|
|
846
|
+
this.prepare();
|
|
847
|
+
if (this.node === null) {
|
|
848
|
+
this.warning("Unable to verify the '".concat(this.filePath, "' file because it cannot be parsed."));
|
|
849
|
+
} else {
|
|
850
|
+
this.debug("Verifying the '".concat(this.filePath, "' file..."));
|
|
851
|
+
var context = this, fileNode = this.node; ///
|
|
852
|
+
verifies = (0, _verify.verifyFile)(fileNode, context);
|
|
853
|
+
verifies ? this.complete() : this.clear();
|
|
854
|
+
if (verifies) {
|
|
855
|
+
this.info("...verified the '".concat(this.filePath, "' file."));
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
return verifies;
|
|
859
|
+
}
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
key: "prepare",
|
|
863
|
+
value: function prepare() {
|
|
864
|
+
if (this.tokens !== null) {
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
var file = this.findFile(this.filePath), lexer = this.getLexer(), parser = this.getParser(), content = file.getContent();
|
|
868
|
+
this.tokens = lexer.tokenise(content);
|
|
869
|
+
this.node = parser.parse(this.tokens);
|
|
870
|
+
}
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
key: "clear",
|
|
874
|
+
value: function clear() {
|
|
875
|
+
this.lineIndex = null;
|
|
876
|
+
this.types = [];
|
|
877
|
+
this.rules = [];
|
|
878
|
+
this.axioms = [];
|
|
879
|
+
this.lemmas = [];
|
|
880
|
+
this.theorems = [];
|
|
881
|
+
this.variables = [];
|
|
882
|
+
this.metaLemmas = [];
|
|
883
|
+
this.conjectures = [];
|
|
884
|
+
this.combinators = [];
|
|
885
|
+
this.typePrefixes = [];
|
|
886
|
+
this.constructors = [];
|
|
887
|
+
this.metatheorems = [];
|
|
888
|
+
this.metavariables = [];
|
|
889
|
+
}
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
key: "complete",
|
|
893
|
+
value: function complete() {
|
|
894
|
+
this.lineIndex = null;
|
|
895
|
+
}
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
key: "initialise",
|
|
899
|
+
value: function initialise(json) {
|
|
900
|
+
var fileContext = this; ///
|
|
901
|
+
this.types = [];
|
|
902
|
+
(0, _json.typesFromJSON)(json, this.types, fileContext);
|
|
903
|
+
this.rules = (0, _json.rulesFromJSON)(json, fileContext);
|
|
904
|
+
this.axioms = (0, _json.axiomsFromJSON)(json, fileContext);
|
|
905
|
+
this.lemmas = (0, _json.lemmasFromNothing)();
|
|
906
|
+
this.theorems = (0, _json.theoremsFromJSON)(json, fileContext);
|
|
907
|
+
this.variables = (0, _json.variablesFromJSON)(json, fileContext);
|
|
908
|
+
this.metaLemmas = (0, _json.metaLemmasFromNothing)();
|
|
909
|
+
this.conjectures = (0, _json.conjecturesFromJSON)(json, fileContext);
|
|
910
|
+
this.combinators = (0, _json.combinatorsFromJSON)(json, fileContext);
|
|
911
|
+
this.typePrefixes = (0, _json.typePrefixesFromJSON)(json, fileContext);
|
|
912
|
+
this.constructors = (0, _json.constructorsFromJSON)(json, fileContext);
|
|
913
|
+
this.metatheorems = (0, _json.metatheoremsFromJSON)(json, fileContext);
|
|
914
|
+
this.metavariables = (0, _json.metavariablesFromJSON)(json, fileContext);
|
|
915
|
+
}
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
key: "toJSON",
|
|
919
|
+
value: function toJSON() {
|
|
920
|
+
var typesJSON = (0, _json.typesToTypesJSON)(this.types), rulesJSON = (0, _json.rulesToRulesJSON)(this.rules), axiomsJSON = (0, _json.axiomsToAxiomsJSON)(this.axioms), theoremsJSON = (0, _json.theoremsToTheoremsJSON)(this.theorems), variablesJSON = (0, _json.variablesToVariablesJSON)(this.variables), conjecturesJSON = (0, _json.conjecturesToConjecturesJSON)(this.conjectures), combinatorsJSON = (0, _json.combinatorsToCombinatorsJSON)(this.combinators), typePrefixesJSON = (0, _json.typePrefixesToTypePrefixesJSON)(this.typePrefixes), constructorsJSON = (0, _json.constructorsToConstructorsJSON)(this.constructors), metatheoremsJSON = (0, _json.metatheoremsToMetatheoremsJSON)(this.metatheorems), metavariablesJSON = (0, _json.metavariablesToMetavariablesJSON)(this.metavariables), filePath = this.filePath, types = typesJSON, rules = rulesJSON, axioms = axiomsJSON, theorems = theoremsJSON, variables = variablesJSON, conjectures = conjecturesJSON, combinators = combinatorsJSON, typePrefixes = typePrefixesJSON, constructors = constructorsJSON, metatheorems = metatheoremsJSON, metavariables = metavariablesJSON, json = {
|
|
921
|
+
filePath: filePath,
|
|
922
|
+
types: types,
|
|
923
|
+
rules: rules,
|
|
924
|
+
axioms: axioms,
|
|
925
|
+
theorems: theorems,
|
|
926
|
+
variables: variables,
|
|
927
|
+
conjectures: conjectures,
|
|
928
|
+
combinators: combinators,
|
|
929
|
+
typePrefixes: typePrefixes,
|
|
930
|
+
constructors: constructors,
|
|
931
|
+
metatheorems: metatheorems,
|
|
932
|
+
metavariables: metavariables
|
|
933
|
+
};
|
|
934
|
+
return json;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
], [
|
|
938
|
+
{
|
|
939
|
+
key: "fromFile",
|
|
940
|
+
value: function fromFile(file, context) {
|
|
941
|
+
var filePath = file.getPath(), tokens = null, node = null, types = [], rules = [], axioms = [], lemmas = [], theorems = [], variables = [], metaLemmas = [], conjectures = [], combinators = [], typePrefixes = [], constructors = [], metatheorems = [], metavariables = [], fileContext = new NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables);
|
|
942
|
+
return fileContext;
|
|
943
|
+
}
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
key: "fromFilePath",
|
|
947
|
+
value: function fromFilePath(filePath, context) {
|
|
948
|
+
var tokens = null, node = null, types = null, rules = null, axioms = null, lemmas = null, theorems = null, variables = null, metaLemmas = null, conjectures = null, combinators = null, typePrefixes = null, constructors = null, metatheorems = null, metavariables = null, fileContext = new NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables);
|
|
949
|
+
return fileContext;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
]);
|
|
953
|
+
return NominalFileContext;
|
|
954
|
+
}(_file.default);
|
|
955
|
+
|
|
956
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0L2ZpbGUvbm9taW5hbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBGaWxlQ29udGV4dCBmcm9tIFwiLi4vLi4vY29udGV4dC9maWxlXCI7XG5cbmltcG9ydCB7IHZlcmlmeUZpbGUgfSBmcm9tIFwiLi4vcHJvY2Vzcy92ZXJpZnlcIjtcbmltcG9ydCB7IGNoYWluQ29udGV4dCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgYmFzZVR5cGVGcm9tTm90aGluZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZXNGcm9tSlNPTixcbiAgICAgICAgIHJ1bGVzRnJvbUpTT04sXG4gICAgICAgICBheGlvbXNGcm9tSlNPTixcbiAgICAgICAgIHR5cGVzVG9UeXBlc0pTT04sXG4gICAgICAgICBydWxlc1RvUnVsZXNKU09OLFxuICAgICAgICAgdGhlb3JlbXNGcm9tSlNPTixcbiAgICAgICAgIHZhcmlhYmxlc0Zyb21KU09OLFxuICAgICAgICAgbGVtbWFzRnJvbU5vdGhpbmcsXG4gICAgICAgICBheGlvbXNUb0F4aW9tc0pTT04sXG4gICAgICAgICBjb25qZWN0dXJlc0Zyb21KU09OLFxuICAgICAgICAgY29tYmluYXRvcnNGcm9tSlNPTixcbiAgICAgICAgIHR5cGVQcmVmaXhlc0Zyb21KU09OLFxuICAgICAgICAgY29uc3RydWN0b3JzRnJvbUpTT04sXG4gICAgICAgICBtZXRhdGhlb3JlbXNGcm9tSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIG1ldGFMZW1tYXNGcm9tTm90aGluZyxcbiAgICAgICAgIHRoZW9yZW1zVG9UaGVvcmVtc0pTT04sXG4gICAgICAgICB2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04sXG4gICAgICAgICBjb25qZWN0dXJlc1RvQ29uamVjdHVyZXNKU09OLFxuICAgICAgICAgY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTixcbiAgICAgICAgIHR5cGVQcmVmaXhlc1RvVHlwZVByZWZpeGVzSlNPTixcbiAgICAgICAgIGNvbnN0cnVjdG9yc1RvQ29uc3RydWN0b3JzSlNPTixcbiAgICAgICAgIG1ldGF0aGVvcmVtc1RvTWV0YXRoZW9yZW1zSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9qc29uXCI7XG5cbmNvbnN0IHsgcHVzaCwgZmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9taW5hbEZpbGVDb250ZXh0IGV4dGVuZHMgRmlsZUNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBmaWxlUGF0aCwgdG9rZW5zLCBub2RlLCB0eXBlcywgcnVsZXMsIGF4aW9tcywgbGVtbWFzLCB0aGVvcmVtcywgdmFyaWFibGVzLCBtZXRhTGVtbWFzLCBjb25qZWN0dXJlcywgY29tYmluYXRvcnMsIHR5cGVQcmVmaXhlcywgY29uc3RydWN0b3JzLCBtZXRhdGhlb3JlbXMsIG1ldGF2YXJpYWJsZXMpIHtcbiAgICBzdXBlcihjb250ZXh0LCBmaWxlUGF0aCwgbm9kZSwgdG9rZW5zKVxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoO1xuICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICB0aGlzLmF4aW9tcyA9IGF4aW9tcztcbiAgICB0aGlzLmxlbW1hcyA9IGxlbW1hcztcbiAgICB0aGlzLnRoZW9yZW1zID0gdGhlb3JlbXM7XG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gbWV0YUxlbW1hcztcbiAgICB0aGlzLmNvbmplY3R1cmVzID0gY29uamVjdHVyZXM7XG4gICAgdGhpcy5jb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzO1xuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gY29uc3RydWN0b3JzO1xuICAgIHRoaXMubWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zO1xuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXM7XG5cbiAgICByZXR1cm4gY2hhaW5Db250ZXh0KHRoaXMpO1xuICB9XG5cbiAgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgZ2V0RmlsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGg7XG4gIH1cblxuICBnZXRMaW5lSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMubGluZUluZGV4O1xuICB9XG5cbiAgZ2V0VG9rZW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfVxuXG4gIGdldE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudHMoKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRFcXVpdmFsZW5jZXMoKSB7XG4gICAgZGVidWdnZXJcbiAgfVxuXG4gIGdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSB7XG4gICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IFtdO1xuXG4gICAgcmV0dXJuIHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRMYWJlbHMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbGFiZWxzID0gW107XG5cbiAgICBpZiAoaW5jbHVkZVJlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0TGFiZWxzID0gdGhpcy5jb250ZXh0LmdldExhYmVscygpO1xuXG4gICAgICBwdXNoKGxhYmVscywgcmVsZWFzZUNvbnRleHRMYWJlbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUxhYmVscyA9IHJ1bGUuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIHJ1bGVMYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXhpb21zLmZvckVhY2goKGF4aW9tKSA9PiB7XG4gICAgICAgIGNvbnN0IGF4aW9tTGFiZWxzID0gYXhpb20uZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGF4aW9tTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxlbW1hcy5mb3JFYWNoKChsZW1tYSkgPT4ge1xuICAgICAgICBjb25zdCBsZW1tYUxhYmVscyA9IGxlbW1hLmdldExhYmVscygpO1xuXG4gICAgICAgIHB1c2gobGFiZWxzLCBsZW1tYUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50aGVvcmVtcy5mb3JFYWNoKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHRoZW9yZW1MYWJlbHMgPSB0aGVvcmVtLmdldExhYmVscygpO1xuXG4gICAgICAgIHB1c2gobGFiZWxzLCB0aGVvcmVtTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbmplY3R1cmVzLmZvckVhY2goKGNvbmplY3R1cmUpID0+IHtcbiAgICAgICAgY29uc3QgY29uamVjdHVyZUxhYmVscyA9IGNvbmplY3R1cmUuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGNvbmplY3R1cmVMYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubWV0YXRoZW9yZW1zLmZvckVhY2goKG1ldGF0aGVvcmVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGF0aGVvcmVtTGFiZWwgPSBtZXRhdGhlb3JlbS5nZXRMYWJlbCgpO1xuXG4gICAgICAgIGxhYmVscy5wdXNoKG1ldGF0aGVvcmVtTGFiZWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFR5cGVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSwgaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCB0eXBlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFR5cGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVzO1xuXG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG5cbiAgZ2V0UnVsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcnVsZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRSdWxlcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVzO1xuXG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG5cbiAgZ2V0QXhpb21zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGF4aW9tcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRBeGlvbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpb21zO1xuXG4gICAgcmV0dXJuIGF4aW9tcztcbiAgfVxuXG4gIGdldExlbW1hcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBsZW1tYXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0TGVtbWFzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlbW1hcztcblxuICAgIHJldHVybiBsZW1tYXM7XG4gIH1cblxuICBnZXRUaGVvcmVtcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCB0aGVvcmVtcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFRoZW9yZW1zKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlb3JlbXM7XG5cbiAgICByZXR1cm4gdGhlb3JlbXM7XG4gIH1cblxuICBnZXRWYXJpYWJsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0UHJvY2VkdXJlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRQcm9jZWR1cmVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsgIC8vL1xuXG4gICAgcmV0dXJuIHByb2NlZHVyZXM7XG4gIH1cblxuICBnZXRNZXRhTGVtbWFzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldE1ldGFMZW1tYXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGFMZW1tYXM7XG5cbiAgICByZXR1cm4gbWV0YUxlbW1hcztcbiAgfVxuXG4gIGdldENvbmplY3R1cmVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbmplY3R1cmVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29uamVjdHVyZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25qZWN0dXJlcztcblxuICAgIHJldHVybiBjb25qZWN0dXJlcztcbiAgfVxuXG4gIGdldENvbWJpbmF0b3JzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbWJpbmF0b3JzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29tYmluYXRvcnMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21iaW5hdG9ycztcblxuICAgIHJldHVybiBjb21iaW5hdG9ycztcbiAgfVxuXG4gIGdldFR5cGVQcmVmaXhlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VHlwZVByZWZpeGVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVQcmVmaXhlcztcblxuICAgIHJldHVybiB0eXBlUHJlZml4ZXM7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uc3RydWN0b3JzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldENvbnN0cnVjdG9ycygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcnM7XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3JzO1xuICB9XG5cbiAgZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRNZXRhdGhlb3JlbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YXRoZW9yZW1zO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtcztcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGFkZFR5cGUodHlwZSkge1xuICAgIHRoaXMudHlwZXMucHVzaCh0eXBlKTtcbiAgfVxuXG4gIGFkZFJ1bGUocnVsZSkge1xuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgfVxuXG4gIGFkZEF4aW9tKGF4aW9tKSB7XG4gICAgdGhpcy5heGlvbXMucHVzaChheGlvbSk7XG4gIH1cblxuICBhZGRMZW1tYShsZW1tYSkge1xuICAgIHRoaXMubGVtbWFzLnB1c2gobGVtbWEpO1xuICB9XG5cbiAgYWRkVGhlb3JlbSh0aGVvcmVtKSB7XG4gICAgdGhpcy50aGVvcmVtcy5wdXNoKHRoZW9yZW0pO1xuICB9XG5cbiAgYWRkVmFyaWFibGUodmFyaWFibGUpIHtcbiAgICB0aGlzLnZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgfVxuXG4gIGFkZE1ldGFMZW1tYShtZXRhTGVtbWEpIHtcbiAgICB0aGlzLm1ldGFMZW1tYXMucHVzaChtZXRhTGVtbWEpO1xuICB9XG5cbiAgYWRkQ29uamVjdHVyZShjb25qZWN0dXJlKSB7XG4gICAgdGhpcy5jb25qZWN0dXJlcy5wdXNoKGNvbmplY3R1cmUpO1xuICB9XG5cbiAgYWRkQ29tYmluYXRvcihjb21iaW5hdG9yKSB7XG4gICAgdGhpcy5jb21iaW5hdG9ycy5wdXNoKGNvbWJpbmF0b3IpO1xuICB9XG5cbiAgYWRkVHlwZVByZWZpeCh0eXBlUHJlZml4KSB7XG4gICAgdGhpcy50eXBlUHJlZml4ZXMucHVzaCh0eXBlUHJlZml4KTtcbiAgfVxuXG4gIGFkZENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMucHVzaChjb25zdHJ1Y3Rvcik7XG4gIH1cblxuICBhZGRNZXRhdGhlb3JlbShtZXRhdGhlb3JlbSkge1xuICAgIHRoaXMubWV0YXRoZW9yZW1zLnB1c2gobWV0YXRoZW9yZW0pO1xuICB9XG5cbiAgYWRkTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIHRoaXMubWV0YXZhcmlhYmxlcy5wdXNoKG1ldGF2YXJpYWJsZSk7XG4gIH1cblxuICBmaW5kTGFiZWxCeVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsID0gbGFiZWxzLmZpbmQoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVVbmlmaWVzID0gbGFiZWwudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCksXG4gICAgICAgICAgbWV0YUxlbW1hID0gbWV0YUxlbW1hcy5maW5kKChtZXRhTGVtbWEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFMZW1tYUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhTGVtbWEuY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgICAgICBpZiAobWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYTtcbiAgfVxuXG4gIGZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCksXG4gICAgICAgICAgbWV0YXRoZW9yZW0gPSBtZXRhdGhlb3JlbXMuZmluZCgobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSA9IG1ldGF0aGVvcmVtLmNvbXBhcmVSZWZlcmVuY2UocmVmZXJlbmNlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtO1xuICB9XG5cbiAgZmluZFJ1bGVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gcmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICBydWxlID0gcnVsZXMuZmluZCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gcnVsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICBmaW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbXMgPSB0aGlzLmdldEF4aW9tcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGF4aW9tID0gYXhpb21zLmZpbmQoKGF4aW9tKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gYXhpb20uY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXhpb207XG4gIH1cblxuICBmaW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsZW1tYXMgPSB0aGlzLmdldExlbW1hcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGxlbW1hID0gbGVtbWFzLmZpbmQoKGxlbW1hKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGVtbWEuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGVtbWE7XG4gIH1cblxuICBmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gdGhpcy5nZXRUaGVvcmVtcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIHRoZW9yZW0gPSB0aGVvcmVtcy5maW5kKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aGVvcmVtQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGVvcmVtLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAodGhlb3JlbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGhlb3JlbTtcbiAgfVxuXG4gIGZpbmRQcm9jZWR1cmVCeU5hbWUobmFtZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZXMgPSB0aGlzLmdldFByb2NlZHVyZXMoKSxcbiAgICAgICAgICBwcm9jZWR1cmUgPSBwcm9jZWR1cmVzLmZpbmQoKHByb2NlZHVyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmFtZU1hdGNoZXMgPSBwcm9jZWR1cmUubWF0Y2hOYW1lKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobmFtZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBwcm9jZWR1cmU7XG4gIH1cblxuICBmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbmplY3R1cmVzID0gdGhpcy5nZXRDb25qZWN0dXJlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGNvbmplY3R1cmUgPSBjb25qZWN0dXJlcy5maW5kKChjb25qZWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25qZWN0dXJlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSBjb25qZWN0dXJlLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29uamVjdHVyZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gY29uamVjdHVyZTtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IHRoaXMuZ2V0TWV0YUxlbW1hcygpO1xuXG4gICAgZmlsdGVyKG1ldGFMZW1tYXMsIChtZXRhTGVtbWEpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbiA9IG1ldGFMZW1tYSwgLy8vXG4gICAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25VbmlmaWVzID0gcmVmZXJlbmNlLnVuaWZ5VG9wTGV2ZWxNZXRhQXNzZXJ0aW9uKHRvcExldmVsTWV0YUFzc2VydGlvbiwgY29udGV4dCk7XG5cbiAgICAgIGlmICh0b3BMZXZlbE1ldGFBc3NlcnRpb25VbmlmaWVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYXM7XG4gIH1cblxuICBmaW5kTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gdGhpcy5nZXRNZXRhdGhlb3JlbXMoKTtcblxuICAgIGZpbHRlcihtZXRhdGhlb3JlbXMsIChtZXRhdGhlb3JlbSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gbWV0YXRoZW9yZW0sIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeVRvcExldmVsTWV0YUFzc2VydGlvbih0b3BMZXZlbE1ldGFBc3NlcnRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAodG9wTGV2ZWxNZXRhQXNzZXJ0aW9uVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdGhlb3JlbXM7XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hID0gdGhpcy5maW5kTWV0YUxlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbSA9IHRoaXMuZmluZE1ldGF0aGVvcmVtQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb24gPSAobWV0YUxlbW1hIHx8IG1ldGF0aGVvcmVtKTsgIC8vL1xuXG4gICAgcmV0dXJuIHRvcExldmVsTWV0YUFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25zQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IHRoaXMuZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IHRoaXMuZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9ucyA9IFtcbiAgICAgICAgICAgIC4uLm1ldGFMZW1tYXMsXG4gICAgICAgICAgICAuLi5tZXRhdGhlb3JlbXNcbiAgICAgICAgICBdO1xuXG4gICAgcmV0dXJuIHRvcExldmVsTWV0YUFzc2VydGlvbnM7XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxBc3NlcnRpb25CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbSA9IHRoaXMuZmluZEF4aW9tQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBsZW1tYSA9IHRoaXMuZmluZExlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0aGVvcmVtID0gdGhpcy5maW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgY29uamVjdHVyZSA9IHRoaXMuZmluZENvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIHRvcExldmVsQXNzZXJ0aW9uID0gKGF4aW9tIHx8IGxlbW1hIHx8IHRoZW9yZW0gfHwgY29uamVjdHVyZSk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxBc3NlcnRpb247XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZTsgIC8vL1xuXG4gICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IGdlbmVyYWxNZXRhdmFyaWFibGUudW5pZnlNZXRhdmFyaWFibGUoc3BlY2lmaWNNZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGxldCB0eXBlcyA9IHRoaXMuZ2V0VHlwZXMoaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvVHlwZU5hbWUgPSB0eXBlLmNvbXBhcmVUeXBlTmFtZSh0eXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb1R5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcygpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvTm9taW5hbFR5cGVOYW1lID0gdHlwZS5jb21wYXJlTm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb05vbWluYWxUeXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBmaW5kVHlwZUJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcygpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvUHJlZml4ZWRUeXBlTmFtZSA9IHR5cGUuY29tcGFyZVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb1ByZWZpeGVkVHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YVR5cGVzID0gdGhpcy5nZXRNZXRhVHlwZXMoKSxcbiAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlcy5maW5kKChtZXRhVHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0YVR5cGVDb21wYXJlc1RvTWV0YVR5cGVOYW1lID0gbWV0YVR5cGUuY29tcGFyZU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YVR5cGVDb21wYXJlc1RvTWV0YVR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YVR5cGU7XG4gIH1cblxuICBmaW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcygpLFxuICAgICAgICAgIHR5cGVQcmVmaXggPSB0eXBlUHJlZml4ZXMuZmluZCgodHlwZVByZWZpeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZVByZWZpeENvbXBhcmVzVG9UeXBlUHJlZml4TmFtZSA9IHR5cGVQcmVmaXguY29tcGFyZVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVQcmVmaXhDb21wYXJlc1RvVHlwZVByZWZpeE5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlUHJlZml4O1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGUuY29tcGFyZVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgICBpZiAodmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG4gIH1cblxuICBmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSBsYWJlbC5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGxhYmVsQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZUVxdWFsVG9MYWJlbE1ldGF2YXJpYWJsZSA9IGxhYmVsLmlzTWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlRXF1YWxUb0xhYmVsTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IGp1ZGdlbWVudHMuZmluZCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRTaW5ndWxhciA9IGp1ZGdlbWVudC5pc1Npbmd1bGFyKCk7XG5cbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRTaW5ndWxhcikge1xuICAgICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRNZXRhdmFyaWFibGUgPSBqdWRnZW1lbnQuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudE1ldGF2YXJpYWJsZUVxdWFsVG9NZXRhdmFyaWFibGUgPSBqdWRnZW1lbnRNZXRhdmFyaWFibGUuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGp1ZGdlbWVudE1ldGF2YXJpYWJsZUVxdWFsVG9NZXRhdmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50KG1ldGF2YXJpYWJsZSkge1xuICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlUHJlc2VudCA9IChtZXRhdmFyaWFibGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZVByZXNlbnQ7XG4gIH1cblxuICBpc1R5cGVQcmVzZW50QnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSxcbiAgICAgICAgICB0eXBlUHJlc2VudCA9ICh0eXBlICE9PSBudWxsKTtcblxuICAgIHJldHVybiB0eXBlUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZXNlbnRCeVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlQcmVmaXhlZFR5cGVOYW1lKHByZWZpeGVkVHlwZU5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ID0gdGhpcy5maW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVmaXhQcmVzZW50ID0gKHR5cGVQcmVmaXggIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXhQcmVzZW50O1xuICB9XG5cbiAgaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgICAgICB2YXJpYWJsZVByZXNlbnQgPSAodmFyaWFibGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGxhYmVsUHJlc2VudCA9IChsYWJlbCAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbGFiZWxQcmVzZW50O1xuICB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZmluZExhYmVsQnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSxcbiAgICAgICAgICBsYWJlbFByZXNlbnQgPSAobGFiZWwgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSAobWV0YXZhcmlhYmxlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsUHJlc2VudCA9IGxhYmVscy5zb21lKChsYWJlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbGFiZWxVbmlmaWVzID0gcmVmZXJlbmNlLnVuaWZ5TGFiZWwobGFiZWwsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobGFiZWxVbmlmaWVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5TmFtZShuYW1lKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gdGhpcy5maW5kUHJvY2VkdXJlQnlOYW1lKG5hbWUpLFxuICAgICAgICAgIHByb2NlZHVyZVByZXNlbnQgPSAocHJvY2VkdXJlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSBtZXRhdmFyaWFibGVzLnNvbWUoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gdGhpcy5maW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50ID0gKHRvcExldmVsTWV0YUFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIHZlcmlmeSgpIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIHRoaXMucHJlcGFyZSgpO1xuXG4gICAgaWYgKHRoaXMubm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy53YXJuaW5nKGBVbmFibGUgdG8gdmVyaWZ5IHRoZSAnJHt0aGlzLmZpbGVQYXRofScgZmlsZSBiZWNhdXNlIGl0IGNhbm5vdCBiZSBwYXJzZWQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVidWcoYFZlcmlmeWluZyB0aGUgJyR7dGhpcy5maWxlUGF0aH0nIGZpbGUuLi5gKTtcblxuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgZmlsZU5vZGUgPSB0aGlzLm5vZGU7IC8vL1xuXG4gICAgICB2ZXJpZmllcyA9IHZlcmlmeUZpbGUoZmlsZU5vZGUsIGNvbnRleHQpO1xuXG4gICAgICB2ZXJpZmllcyA/XG4gICAgICAgIHRoaXMuY29tcGxldGUoKSA6XG4gICAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgICAgdGhpcy5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7dGhpcy5maWxlUGF0aH0nIGZpbGUuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgcHJlcGFyZSgpIHtcbiAgICBpZiAodGhpcy50b2tlbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gdGhpcy5maW5kRmlsZSh0aGlzLmZpbGVQYXRoKSxcbiAgICAgICAgICBsZXhlciA9IHRoaXMuZ2V0TGV4ZXIoKSxcbiAgICAgICAgICBwYXJzZXIgPSB0aGlzLmdldFBhcnNlcigpLFxuICAgICAgICAgIGNvbnRlbnQgPSBmaWxlLmdldENvbnRlbnQoKTtcblxuICAgIHRoaXMudG9rZW5zID0gbGV4ZXIudG9rZW5pc2UoY29udGVudCk7XG5cbiAgICB0aGlzLm5vZGUgPSBwYXJzZXIucGFyc2UodGhpcy50b2tlbnMpO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5saW5lSW5kZXggPSBudWxsO1xuXG4gICAgdGhpcy50eXBlcyA9IFtdO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmF4aW9tcyA9IFtdO1xuICAgIHRoaXMubGVtbWFzID0gW107XG4gICAgdGhpcy50aGVvcmVtcyA9IFtdO1xuICAgIHRoaXMudmFyaWFibGVzID0gW107XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gW107XG4gICAgdGhpcy5jb25qZWN0dXJlcyA9IFtdO1xuICAgIHRoaXMuY29tYmluYXRvcnMgPSBbXTtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcyA9IFtdO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gW107XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBbXTtcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBbXTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIHRoaXMubGluZUluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIGluaXRpYWxpc2UoanNvbikge1xuICAgIGNvbnN0IGZpbGVDb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICB0aGlzLnR5cGVzID0gW107XG5cbiAgICB0eXBlc0Zyb21KU09OKGpzb24sIHRoaXMudHlwZXMsIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMucnVsZXMgPSBydWxlc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMuYXhpb21zID0gYXhpb21zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy5sZW1tYXMgPSBsZW1tYXNGcm9tTm90aGluZygpO1xuXG4gICAgdGhpcy50aGVvcmVtcyA9IHRoZW9yZW1zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzRnJvbU5vdGhpbmcoKTtcblxuICAgIHRoaXMuY29uamVjdHVyZXMgPSBjb25qZWN0dXJlc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMuY29tYmluYXRvcnMgPSBjb21iaW5hdG9yc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGF0aGVvcmVtcyA9IG1ldGF0aGVvcmVtc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgdHlwZXNKU09OID0gdHlwZXNUb1R5cGVzSlNPTih0aGlzLnR5cGVzKSxcbiAgICAgICAgICBydWxlc0pTT04gPSBydWxlc1RvUnVsZXNKU09OKHRoaXMucnVsZXMpLFxuICAgICAgICAgIGF4aW9tc0pTT04gPSBheGlvbXNUb0F4aW9tc0pTT04odGhpcy5heGlvbXMpLFxuICAgICAgICAgIHRoZW9yZW1zSlNPTiA9IHRoZW9yZW1zVG9UaGVvcmVtc0pTT04odGhpcy50aGVvcmVtcyksXG4gICAgICAgICAgdmFyaWFibGVzSlNPTiA9IHZhcmlhYmxlc1RvVmFyaWFibGVzSlNPTih0aGlzLnZhcmlhYmxlcyksXG4gICAgICAgICAgY29uamVjdHVyZXNKU09OID0gY29uamVjdHVyZXNUb0NvbmplY3R1cmVzSlNPTih0aGlzLmNvbmplY3R1cmVzKSxcbiAgICAgICAgICBjb21iaW5hdG9yc0pTT04gPSBjb21iaW5hdG9yc1RvQ29tYmluYXRvcnNKU09OKHRoaXMuY29tYmluYXRvcnMpLFxuICAgICAgICAgIHR5cGVQcmVmaXhlc0pTT04gPSB0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04odGhpcy50eXBlUHJlZml4ZXMpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yc0pTT04gPSBjb25zdHJ1Y3RvcnNUb0NvbnN0cnVjdG9yc0pTT04odGhpcy5jb25zdHJ1Y3RvcnMpLFxuICAgICAgICAgIG1ldGF0aGVvcmVtc0pTT04gPSBtZXRhdGhlb3JlbXNUb01ldGF0aGVvcmVtc0pTT04odGhpcy5tZXRhdGhlb3JlbXMpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXNKU09OID0gbWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04odGhpcy5tZXRhdmFyaWFibGVzKSxcbiAgICAgICAgICBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgsXG4gICAgICAgICAgdHlwZXMgPSB0eXBlc0pTT04sICAvLy9cbiAgICAgICAgICBydWxlcyA9IHJ1bGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGF4aW9tcyA9IGF4aW9tc0pTT04sICAvLy9cbiAgICAgICAgICB0aGVvcmVtcyA9IHRoZW9yZW1zSlNPTiwgIC8vL1xuICAgICAgICAgIHZhcmlhYmxlcyA9IHZhcmlhYmxlc0pTT04sICAvLy9cbiAgICAgICAgICBjb25qZWN0dXJlcyA9IGNvbmplY3R1cmVzSlNPTiwgIC8vL1xuICAgICAgICAgIGNvbWJpbmF0b3JzID0gY29tYmluYXRvcnNKU09OLCAgLy8vXG4gICAgICAgICAgdHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9yc0pTT04sICAvLy9cbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSBtZXRhdGhlb3JlbXNKU09OLCAgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNKU09OLCAgLy8vXG4gICAgICAgICAganNvbiA9IHtcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgdHlwZXMsXG4gICAgICAgICAgICBydWxlcyxcbiAgICAgICAgICAgIGF4aW9tcyxcbiAgICAgICAgICAgIHRoZW9yZW1zLFxuICAgICAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICAgICAgY29uamVjdHVyZXMsXG4gICAgICAgICAgICBjb21iaW5hdG9ycyxcbiAgICAgICAgICAgIHR5cGVQcmVmaXhlcyxcbiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyxcbiAgICAgICAgICAgIG1ldGF0aGVvcmVtcyxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZXNcbiAgICAgICAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUZpbGUoZmlsZSwgY29udGV4dCkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5nZXRQYXRoKCksXG4gICAgICAgICAgdG9rZW5zID0gbnVsbCxcbiAgICAgICAgICBub2RlID0gbnVsbCxcbiAgICAgICAgICB0eXBlcyA9IFtdLFxuICAgICAgICAgIHJ1bGVzID0gW10sXG4gICAgICAgICAgYXhpb21zID0gW10sXG4gICAgICAgICAgbGVtbWFzID0gW10sXG4gICAgICAgICAgdGhlb3JlbXMgPSBbXSxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gW10sXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBbXSxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IFtdLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IFtdLFxuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IFtdLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBmaWxlQ29udGV4dCA9IG5ldyBOb21pbmFsRmlsZUNvbnRleHQoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzKTtcblxuICAgIHJldHVybiBmaWxlQ29udGV4dDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmlsZVBhdGgoZmlsZVBhdGgsIGNvbnRleHQpIHtcbiAgICBjb25zdCB0b2tlbnMgPSBudWxsLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIHR5cGVzID0gbnVsbCxcbiAgICAgICAgICBydWxlcyA9IG51bGwsXG4gICAgICAgICAgYXhpb21zID0gbnVsbCxcbiAgICAgICAgICBsZW1tYXMgPSBudWxsLFxuICAgICAgICAgIHRoZW9yZW1zID0gbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBudWxsLFxuICAgICAgICAgIG1ldGFMZW1tYXMgPSBudWxsLFxuICAgICAgICAgIGNvbmplY3R1cmVzID0gbnVsbCxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IG51bGwsXG4gICAgICAgICAgdHlwZVByZWZpeGVzID0gbnVsbCxcbiAgICAgICAgICBjb25zdHJ1Y3RvcnMgPSBudWxsLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IG51bGwsXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG51bGwsXG4gICAgICAgICAgZmlsZUNvbnRleHQgPSBuZXcgTm9taW5hbEZpbGVDb250ZXh0KGNvbnRleHQsIGZpbGVQYXRoLCB0b2tlbnMsIG5vZGUsIHR5cGVzLCBydWxlcywgYXhpb21zLCBsZW1tYXMsIHRoZW9yZW1zLCB2YXJpYWJsZXMsIG1ldGFMZW1tYXMsIGNvbmplY3R1cmVzLCBjb21iaW5hdG9ycywgdHlwZVByZWZpeGVzLCBjb25zdHJ1Y3RvcnMsIG1ldGF0aGVvcmVtcywgbWV0YXZhcmlhYmxlcyk7XG5cbiAgICByZXR1cm4gZmlsZUNvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJOb21pbmFsRmlsZUNvbnRleHQiLCJwdXNoIiwiYXJyYXlVdGlsaXRpZXMiLCJmaWx0ZXIiLCJjb250ZXh0IiwiZmlsZVBhdGgiLCJ0b2tlbnMiLCJub2RlIiwidHlwZXMiLCJydWxlcyIsImF4aW9tcyIsImxlbW1hcyIsInRoZW9yZW1zIiwidmFyaWFibGVzIiwibWV0YUxlbW1hcyIsImNvbmplY3R1cmVzIiwiY29tYmluYXRvcnMiLCJ0eXBlUHJlZml4ZXMiLCJjb25zdHJ1Y3RvcnMiLCJtZXRhdGhlb3JlbXMiLCJtZXRhdmFyaWFibGVzIiwiY2hhaW5Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEZpbGVQYXRoIiwiZ2V0TGluZUluZGV4IiwibGluZUluZGV4IiwiZ2V0VG9rZW5zIiwiZ2V0Tm9kZSIsImdldEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRzIiwiZ2V0RXF1aXZhbGVuY2VzIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJnZXRMYWJlbHMiLCJpbmNsdWRlUmVsZWFzZSIsImxhYmVscyIsInJlbGVhc2VDb250ZXh0TGFiZWxzIiwiZm9yRWFjaCIsInJ1bGUiLCJydWxlTGFiZWxzIiwiYXhpb20iLCJheGlvbUxhYmVscyIsImxlbW1hIiwibGVtbWFMYWJlbHMiLCJ0aGVvcmVtIiwidGhlb3JlbUxhYmVscyIsImNvbmplY3R1cmUiLCJjb25qZWN0dXJlTGFiZWxzIiwibWV0YXRoZW9yZW0iLCJtZXRhdGhlb3JlbUxhYmVsIiwiZ2V0TGFiZWwiLCJnZXRUeXBlcyIsImluY2x1ZGVEZXBlbmRlbmNpZXMiLCJnZXRSdWxlcyIsImdldEF4aW9tcyIsImdldExlbW1hcyIsImdldFRoZW9yZW1zIiwiZ2V0VmFyaWFibGVzIiwiZ2V0UHJvY2VkdXJlcyIsInByb2NlZHVyZXMiLCJnZXRNZXRhTGVtbWFzIiwiZ2V0Q29uamVjdHVyZXMiLCJnZXRDb21iaW5hdG9ycyIsImdldFR5cGVQcmVmaXhlcyIsImdldENvbnN0cnVjdG9ycyIsImdldE1ldGF0aGVvcmVtcyIsImdldE1ldGF2YXJpYWJsZXMiLCJhZGRUeXBlIiwidHlwZSIsImFkZFJ1bGUiLCJhZGRBeGlvbSIsImFkZExlbW1hIiwiYWRkVGhlb3JlbSIsImFkZFZhcmlhYmxlIiwidmFyaWFibGUiLCJhZGRNZXRhTGVtbWEiLCJtZXRhTGVtbWEiLCJhZGRDb25qZWN0dXJlIiwiYWRkQ29tYmluYXRvciIsImNvbWJpbmF0b3IiLCJhZGRUeXBlUHJlZml4IiwidHlwZVByZWZpeCIsImFkZENvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiLCJhZGRNZXRhdGhlb3JlbSIsImFkZE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsImZpbmRMYWJlbEJ5UmVmZXJlbmNlIiwicmVmZXJlbmNlIiwibGFiZWwiLCJmaW5kIiwibWV0YXZhcmlhYmxlVW5pZmllcyIsInVuaWZ5UmVmZXJlbmNlIiwiZmluZE1ldGFMZW1tYUJ5UmVmZXJlbmNlIiwibWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSIsImNvbXBhcmVSZWZlcmVuY2UiLCJmaW5kTWV0YXRoZW9yZW1CeVJlZmVyZW5jZSIsIm1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSIsImZpbmRSdWxlQnlSZWZlcmVuY2UiLCJtZXRhdmFyaWFibGVOYW1lIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsInJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVNZXRhdmFyaWFibGVOYW1lIiwiZmluZEF4aW9tQnlSZWZlcmVuY2UiLCJheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZExlbW1hQnlSZWZlcmVuY2UiLCJsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZFRoZW9yZW1CeVJlZmVyZW5jZSIsInRoZW9yZW1Db21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRQcm9jZWR1cmVCeU5hbWUiLCJuYW1lIiwicHJvY2VkdXJlIiwibmFtZU1hdGNoZXMiLCJtYXRjaE5hbWUiLCJmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlIiwiY29uamVjdHVyZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZSIsInRvcExldmVsTWV0YUFzc2VydGlvbiIsInRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMiLCJ1bmlmeVRvcExldmVsTWV0YUFzc2VydGlvbiIsImZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25CeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25zQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25zIiwiZmluZFRvcExldmVsQXNzZXJ0aW9uQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbEFzc2VydGlvbiIsImZpbmRNZXRhdmFyaWFibGUiLCJzcGVjaWZpY01ldGF2YXJpYWJsZSIsImdlbmVyYWxNZXRhdmFyaWFibGUiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsImZpbmRUeXBlQnlUeXBlTmFtZSIsInR5cGVOYW1lIiwiYmFzZVR5cGUiLCJiYXNlVHlwZUZyb21Ob3RoaW5nIiwidHlwZUNvbXBhcmVzVG9UeXBlTmFtZSIsImNvbXBhcmVUeXBlTmFtZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJub21pbmFsVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb05vbWluYWxUeXBlTmFtZSIsImNvbXBhcmVOb21pbmFsVHlwZU5hbWUiLCJmaW5kVHlwZUJ5UHJlZml4ZWRUeXBlTmFtZSIsInByZWZpeGVkVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb1ByZWZpeGVkVHlwZU5hbWUiLCJjb21wYXJlUHJlZml4ZWRUeXBlTmFtZSIsImZpbmRNZXRhVHlwZUJ5TWV0YVR5cGVOYW1lIiwibWV0YVR5cGVOYW1lIiwibWV0YVR5cGVzIiwiZ2V0TWV0YVR5cGVzIiwibWV0YVR5cGUiLCJtZXRhVHlwZUNvbXBhcmVzVG9NZXRhVHlwZU5hbWUiLCJjb21wYXJlTWV0YVR5cGVOYW1lIiwiZmluZFR5cGVQcmVmaXhCeVR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4Q29tcGFyZXNUb1R5cGVQcmVmaXhOYW1lIiwiY29tcGFyZVR5cGVQcmVmaXhOYW1lIiwiZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIiLCJjb21wYXJlVmFyaWFibGVJZGVudGlmaWVyIiwiZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lIiwibGFiZWxDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRXF1YWxUb0xhYmVsTWV0YXZhcmlhYmxlIiwiaXNNZXRhdmFyaWFibGVFcXVhbFRvTWV0YXZhcmlhYmxlIiwiZmluZEp1ZGdlbWVudEJ5TWV0YXZhcmlhYmxlIiwianVkZ2VtZW50IiwianVkZ2VtZW50U2luZ3VsYXIiLCJpc1Npbmd1bGFyIiwianVkZ2VtZW50TWV0YXZhcmlhYmxlIiwiZ2V0TWV0YXZhcmlhYmxlIiwianVkZ2VtZW50TWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZSIsImlzRXF1YWxUbyIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudCIsIm1ldGF2YXJpYWJsZVByZXNlbnQiLCJpc1R5cGVQcmVzZW50QnlUeXBlTmFtZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lIiwiaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZSIsImlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeFByZXNlbnQiLCJpc1ZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVJZGVudGlmaWVyIiwidmFyaWFibGVQcmVzZW50IiwiaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJsYWJlbFByZXNlbnQiLCJpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lIiwiaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZSIsInNvbWUiLCJsYWJlbFVuaWZpZXMiLCJ1bmlmeUxhYmVsIiwiaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lIiwicHJvY2VkdXJlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5UmVmZXJlbmNlIiwiaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50IiwidmVyaWZ5IiwidmVyaWZpZXMiLCJwcmVwYXJlIiwid2FybmluZyIsImRlYnVnIiwiZmlsZU5vZGUiLCJ2ZXJpZnlGaWxlIiwiY29tcGxldGUiLCJjbGVhciIsImluZm8iLCJmaWxlIiwiZmluZEZpbGUiLCJsZXhlciIsImdldExleGVyIiwicGFyc2VyIiwiZ2V0UGFyc2VyIiwiY29udGVudCIsImdldENvbnRlbnQiLCJ0b2tlbmlzZSIsInBhcnNlIiwiaW5pdGlhbGlzZSIsImpzb24iLCJmaWxlQ29udGV4dCIsInR5cGVzRnJvbUpTT04iLCJydWxlc0Zyb21KU09OIiwiYXhpb21zRnJvbUpTT04iLCJsZW1tYXNGcm9tTm90aGluZyIsInRoZW9yZW1zRnJvbUpTT04iLCJ2YXJpYWJsZXNGcm9tSlNPTiIsIm1ldGFMZW1tYXNGcm9tTm90aGluZyIsImNvbmplY3R1cmVzRnJvbUpTT04iLCJjb21iaW5hdG9yc0Zyb21KU09OIiwidHlwZVByZWZpeGVzRnJvbUpTT04iLCJjb25zdHJ1Y3RvcnNGcm9tSlNPTiIsIm1ldGF0aGVvcmVtc0Zyb21KU09OIiwibWV0YXZhcmlhYmxlc0Zyb21KU09OIiwidG9KU09OIiwidHlwZXNKU09OIiwidHlwZXNUb1R5cGVzSlNPTiIsInJ1bGVzSlNPTiIsInJ1bGVzVG9SdWxlc0pTT04iLCJheGlvbXNKU09OIiwiYXhpb21zVG9BeGlvbXNKU09OIiwidGhlb3JlbXNKU09OIiwidGhlb3JlbXNUb1RoZW9yZW1zSlNPTiIsInZhcmlhYmxlc0pTT04iLCJ2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04iLCJjb25qZWN0dXJlc0pTT04iLCJjb25qZWN0dXJlc1RvQ29uamVjdHVyZXNKU09OIiwiY29tYmluYXRvcnNKU09OIiwiY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTiIsInR5cGVQcmVmaXhlc0pTT04iLCJ0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04iLCJjb25zdHJ1Y3RvcnNKU09OIiwiY29uc3RydWN0b3JzVG9Db25zdHJ1Y3RvcnNKU09OIiwibWV0YXRoZW9yZW1zSlNPTiIsIm1ldGF0aGVvcmVtc1RvTWV0YXRoZW9yZW1zSlNPTiIsIm1ldGF2YXJpYWJsZXNKU09OIiwibWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04iLCJmcm9tRmlsZSIsImdldFBhdGgiLCJmcm9tRmlsZVBhdGgiLCJGaWxlQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFvQ3FCQTs7O3lCQWxDVTsyREFFUDtzQkFFRzt1QkFDRTtxQkFDTztvQkF3QmE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWpELElBQVFDLE9BQWlCQyx5QkFBYyxDQUEvQkQsTUFBTUUsU0FBV0QseUJBQWMsQ0FBekJDO0FBRUMsSUFBQSxBQUFNSCxtQ0FBTjtjQUFNQTthQUFBQSxtQkFDUEksT0FBTyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsV0FBVyxFQUFFQyxZQUFZLEVBQUVDLFlBQVksRUFBRUMsWUFBWSxFQUFFQyxhQUFhO2dDQUQxS3BCOztnQkFFakIsa0JBRmlCQTtZQUVYSTtZQUFTQztZQUFVRTtZQUFNRDs7UUFDL0IsTUFBS0YsT0FBTyxHQUFHQTtRQUNmLE1BQUtDLFFBQVEsR0FBR0E7UUFDaEIsTUFBS0MsTUFBTSxHQUFHQTtRQUNkLE1BQUtDLElBQUksR0FBR0E7UUFDWixNQUFLQyxLQUFLLEdBQUdBO1FBQ2IsTUFBS0MsS0FBSyxHQUFHQTtRQUNiLE1BQUtDLE1BQU0sR0FBR0E7UUFDZCxNQUFLQyxNQUFNLEdBQUdBO1FBQ2QsTUFBS0MsUUFBUSxHQUFHQTtRQUNoQixNQUFLQyxTQUFTLEdBQUdBO1FBQ2pCLE1BQUtDLFVBQVUsR0FBR0E7UUFDbEIsTUFBS0MsV0FBVyxHQUFHQTtRQUNuQixNQUFLQyxXQUFXLEdBQUdBO1FBQ25CLE1BQUtDLFlBQVksR0FBR0E7UUFDcEIsTUFBS0MsWUFBWSxHQUFHQTtRQUNwQixNQUFLQyxZQUFZLEdBQUdBO1FBQ3BCLE1BQUtDLGFBQWEsR0FBR0E7UUFFckIsMkNBQU9DLElBQUFBLHFCQUFZOztrQkFyQkZyQjs7WUF3Qm5Cc0IsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLE9BQU8sSUFBSSxDQUFDbEIsT0FBTztZQUNyQjs7O1lBRUFtQixLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNsQixRQUFRO1lBQ3RCOzs7WUFFQW1CLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0MsU0FBUztZQUN2Qjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ3BCLE1BQU07WUFDcEI7OztZQUVBcUIsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLE9BQU8sSUFBSSxDQUFDcEIsSUFBSTtZQUNsQjs7O1lBRUFxQixLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTUMsYUFBYSxFQUFFO2dCQUVyQixPQUFPQTtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLFFBQVE7WUFDVjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFNQyw0QkFBNEIsRUFBRTtnQkFFcEMsT0FBT0E7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBVUMsaUJBQUFBLGlFQUFpQjtnQkFDekIsSUFBTUMsU0FBUyxFQUFFO2dCQUVqQixJQUFJRCxnQkFBZ0I7b0JBQ2xCLElBQU1FLHVCQUF1QixJQUFJLENBQUNoQyxPQUFPLENBQUM2QixTQUFTO29CQUVuRGhDLEtBQUtrQyxRQUFRQztnQkFDZixPQUFPO29CQUNMLElBQUksQ0FBQzNCLEtBQUssQ0FBQzRCLE9BQU8sQ0FBQyxTQUFDQzt3QkFDbEIsSUFBTUMsYUFBYUQsS0FBS0wsU0FBUzt3QkFFakNoQyxLQUFLa0MsUUFBUUk7b0JBQ2Y7b0JBRUEsSUFBSSxDQUFDN0IsTUFBTSxDQUFDMkIsT0FBTyxDQUFDLFNBQUNHO3dCQUNuQixJQUFNQyxjQUFjRCxNQUFNUCxTQUFTO3dCQUVuQ2hDLEtBQUtrQyxRQUFRTTtvQkFDZjtvQkFFQSxJQUFJLENBQUM5QixNQUFNLENBQUMwQixPQUFPLENBQUMsU0FBQ0s7d0JBQ25CLElBQU1DLGNBQWNELE1BQU1ULFNBQVM7d0JBRW5DaEMsS0FBS2tDLFFBQVFRO29CQUNmO29CQUVBLElBQUksQ0FBQy9CLFFBQVEsQ0FBQ3lCLE9BQU8sQ0FBQyxTQUFDTzt3QkFDckIsSUFBTUMsZ0JBQWdCRCxRQUFRWCxTQUFTO3dCQUV2Q2hDLEtBQUtrQyxRQUFRVTtvQkFDZjtvQkFFQSxJQUFJLENBQUM5QixXQUFXLENBQUNzQixPQUFPLENBQUMsU0FBQ1M7d0JBQ3hCLElBQU1DLG1CQUFtQkQsV0FBV2IsU0FBUzt3QkFFN0NoQyxLQUFLa0MsUUFBUVk7b0JBQ2Y7b0JBRUEsSUFBSSxDQUFDNUIsWUFBWSxDQUFDa0IsT0FBTyxDQUFDLFNBQUNXO3dCQUN6QixJQUFNQyxtQkFBbUJELFlBQVlFLFFBQVE7d0JBRTdDZixPQUFPbEMsSUFBSSxDQUFDZ0Q7b0JBQ2Q7Z0JBQ0Y7Z0JBRUEsT0FBT2Q7WUFDVDs7O1lBRUFnQixLQUFBQTttQkFBQUEsU0FBQUE7b0JBQVNqQixpQkFBQUEsaUVBQWlCLE1BQU1rQixzQkFBQUEsaUVBQXNCO2dCQUNwRCxJQUFNNUMsUUFBUTBCLGlCQUNFLElBQUksQ0FBQzlCLE9BQU8sQ0FBQytDLFFBQVEsQ0FBQ0MsdUJBQ3BCLElBQUksQ0FBQzVDLEtBQUs7Z0JBRTVCLE9BQU9BO1lBQ1Q7OztZQUVBNkMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFTbkIsaUJBQUFBLGlFQUFpQjtnQkFDeEIsSUFBTXpCLFFBQVF5QixpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUNpRCxRQUFRLEtBQ25CLElBQUksQ0FBQzVDLEtBQUs7Z0JBRTVCLE9BQU9BO1lBQ1Q7OztZQUVBNkMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFVcEIsaUJBQUFBLGlFQUFpQjtnQkFDekIsSUFBTXhCLFNBQVN3QixpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUNrRCxTQUFTLEtBQ3BCLElBQUksQ0FBQzVDLE1BQU07Z0JBRTlCLE9BQU9BO1lBQ1Q7OztZQUVBNkMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFVckIsaUJBQUFBLGlFQUFpQjtnQkFDekIsSUFBTXZCLFNBQVN1QixpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUNtRCxTQUFTLEtBQ3BCLElBQUksQ0FBQzVDLE1BQU07Z0JBRTlCLE9BQU9BO1lBQ1Q7OztZQUVBNkMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFZdEIsaUJBQUFBLGlFQUFpQjtnQkFDM0IsSUFBTXRCLFdBQVdzQixpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUNvRCxXQUFXLEtBQ3RCLElBQUksQ0FBQzVDLFFBQVE7Z0JBRWxDLE9BQU9BO1lBQ1Q7OztZQUVBNkMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFhdkIsaUJBQUFBLGlFQUFpQjtnQkFDNUIsT0FBTyxJQUFJLENBQUNyQixTQUFTO1lBQ3ZCOzs7WUFFQTZDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBY3hCLGlCQUFBQSxpRUFBaUI7Z0JBQzdCLElBQU15QixhQUFhekIsaUJBQ0UsSUFBSSxDQUFDOUIsT0FBTyxDQUFDc0QsYUFBYSxLQUN4QixNQUFPLEdBQUc7Z0JBRWpDLE9BQU9DO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWMxQixpQkFBQUEsaUVBQWlCO2dCQUM3QixJQUFNcEIsYUFBYW9CLGlCQUNFLElBQUksQ0FBQzlCLE9BQU8sQ0FBQ3dELGFBQWEsS0FDeEIsSUFBSSxDQUFDOUMsVUFBVTtnQkFFdEMsT0FBT0E7WUFDVDs7O1lBRUErQyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWUzQixpQkFBQUEsaUVBQWlCO2dCQUM5QixJQUFNbkIsY0FBY21CLGlCQUNFLElBQUksQ0FBQzlCLE9BQU8sQ0FBQ3lELGNBQWMsS0FDekIsSUFBSSxDQUFDOUMsV0FBVztnQkFFeEMsT0FBT0E7WUFDVDs7O1lBRUErQyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWU1QixpQkFBQUEsaUVBQWlCO2dCQUM5QixJQUFNbEIsY0FBY2tCLGlCQUNFLElBQUksQ0FBQzlCLE9BQU8sQ0FBQzBELGNBQWMsS0FDekIsSUFBSSxDQUFDOUMsV0FBVztnQkFFeEMsT0FBT0E7WUFDVDs7O1lBRUErQyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWdCN0IsaUJBQUFBLGlFQUFpQjtnQkFDL0IsSUFBTWpCLGVBQWVpQixpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUMyRCxlQUFlLEtBQzFCLElBQUksQ0FBQzlDLFlBQVk7Z0JBRTFDLE9BQU9BO1lBQ1Q7OztZQUVBK0MsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFnQjlCLGlCQUFBQSxpRUFBaUI7Z0JBQy9CLElBQU1oQixlQUFlZ0IsaUJBQ0UsSUFBSSxDQUFDOUIsT0FBTyxDQUFDNEQsZUFBZSxLQUMxQixJQUFJLENBQUM5QyxZQUFZO2dCQUUxQyxPQUFPQTtZQUNUOzs7WUFFQStDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBZ0IvQixpQkFBQUEsaUVBQWlCO2dCQUMvQixJQUFNZixlQUFlZSxpQkFDRSxJQUFJLENBQUM5QixPQUFPLENBQUM2RCxlQUFlLEtBQzFCLElBQUksQ0FBQzlDLFlBQVk7Z0JBRTFDLE9BQU9BO1lBQ1Q7OztZQUVBK0MsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFpQmhDLGlCQUFBQSxpRUFBaUI7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDZCxhQUFhO1lBQzNCOzs7WUFFQStDLEtBQUFBO21CQUFBQSxTQUFBQSxRQUFRQyxJQUFJO2dCQUNWLElBQUksQ0FBQzVELEtBQUssQ0FBQ1AsSUFBSSxDQUFDbUU7WUFDbEI7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsUUFBUS9CLElBQUk7Z0JBQ1YsSUFBSSxDQUFDN0IsS0FBSyxDQUFDUixJQUFJLENBQUNxQztZQUNsQjs7O1lBRUFnQyxLQUFBQTttQkFBQUEsU0FBQUEsU0FBUzlCLEtBQUs7Z0JBQ1osSUFBSSxDQUFDOUIsTUFBTSxDQUFDVCxJQUFJLENBQUN1QztZQUNuQjs7O1lBRUErQixLQUFBQTttQkFBQUEsU0FBQUEsU0FBUzdCLEtBQUs7Z0JBQ1osSUFBSSxDQUFDL0IsTUFBTSxDQUFDVixJQUFJLENBQUN5QztZQUNuQjs7O1lBRUE4QixLQUFBQTttQkFBQUEsU0FBQUEsV0FBVzVCLE9BQU87Z0JBQ2hCLElBQUksQ0FBQ2hDLFFBQVEsQ0FBQ1gsSUFBSSxDQUFDMkM7WUFDckI7OztZQUVBNkIsS0FBQUE7bUJBQUFBLFNBQUFBLFlBQVlDLFFBQVE7Z0JBQ2xCLElBQUksQ0FBQzdELFNBQVMsQ0FBQ1osSUFBSSxDQUFDeUU7WUFDdEI7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsYUFBYUMsU0FBUztnQkFDcEIsSUFBSSxDQUFDOUQsVUFBVSxDQUFDYixJQUFJLENBQUMyRTtZQUN2Qjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxjQUFjL0IsVUFBVTtnQkFDdEIsSUFBSSxDQUFDL0IsV0FBVyxDQUFDZCxJQUFJLENBQUM2QztZQUN4Qjs7O1lBRUFnQyxLQUFBQTttQkFBQUEsU0FBQUEsY0FBY0MsVUFBVTtnQkFDdEIsSUFBSSxDQUFDL0QsV0FBVyxDQUFDZixJQUFJLENBQUM4RTtZQUN4Qjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxjQUFjQyxVQUFVO2dCQUN0QixJQUFJLENBQUNoRSxZQUFZLENBQUNoQixJQUFJLENBQUNnRjtZQUN6Qjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxlQUFlQyxXQUFXO2dCQUN4QixJQUFJLENBQUNqRSxZQUFZLENBQUNqQixJQUFJLENBQUNrRjtZQUN6Qjs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxlQUFlcEMsV0FBVztnQkFDeEIsSUFBSSxDQUFDN0IsWUFBWSxDQUFDbEIsSUFBSSxDQUFDK0M7WUFDekI7OztZQUVBcUMsS0FBQUE7bUJBQUFBLFNBQUFBLGdCQUFnQkMsWUFBWTtnQkFDMUIsSUFBSSxDQUFDbEUsYUFBYSxDQUFDbkIsSUFBSSxDQUFDcUY7WUFDMUI7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEscUJBQXFCQyxTQUFTLEVBQUVwRixPQUFPO2dCQUNyQyxJQUFNK0IsU0FBUyxJQUFJLENBQUNGLFNBQVMsSUFDdkJ3RCxRQUFRdEQsT0FBT3VELElBQUksQ0FBQyxTQUFDRDtvQkFDbkIsSUFBTUUsc0JBQXNCRixNQUFNRyxjQUFjLENBQUNKLFdBQVdwRjtvQkFFNUQsSUFBSXVGLHFCQUFxQjt3QkFDdkIsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9GO1lBQ1Q7OztZQUVBSSxLQUFBQTttQkFBQUEsU0FBQUEseUJBQXlCTCxTQUFTO2dCQUNoQyxJQUFNMUUsYUFBYSxJQUFJLENBQUM4QyxhQUFhLElBQy9CZ0IsWUFBWTlELFdBQVc0RSxJQUFJLENBQUMsU0FBQ2Q7b0JBQzNCLElBQU1rQiwrQkFBK0JsQixVQUFVbUIsZ0JBQWdCLENBQUNQO29CQUVoRSxJQUFJTSw4QkFBOEI7d0JBQ2hDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPbEI7WUFDVDs7O1lBRUFvQixLQUFBQTttQkFBQUEsU0FBQUEsMkJBQTJCUixTQUFTO2dCQUNsQyxJQUFNckUsZUFBZSxJQUFJLENBQUM4QyxlQUFlLElBQ25DakIsY0FBYzdCLGFBQWF1RSxJQUFJLENBQUMsU0FBQzFDO29CQUMvQixJQUFNaUQsaUNBQWlDakQsWUFBWStDLGdCQUFnQixDQUFDUDtvQkFFcEUsSUFBSVMsZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT2pEO1lBQ1Q7OztZQUVBa0QsS0FBQUE7bUJBQUFBLFNBQUFBLG9CQUFvQlYsU0FBUztnQkFDM0IsSUFBTS9FLFFBQVEsSUFBSSxDQUFDNEMsUUFBUSxJQUNyQjhDLG1CQUFtQlgsVUFBVVksbUJBQW1CLElBQ2hEOUQsT0FBTzdCLE1BQU1pRixJQUFJLENBQUMsU0FBQ3BEO29CQUNqQixJQUFNK0QsaUNBQWlDL0QsS0FBS2dFLHVCQUF1QixDQUFDSDtvQkFFcEUsSUFBSUUsZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBTy9EO1lBQ1Q7OztZQUVBaUUsS0FBQUE7bUJBQUFBLFNBQUFBLHFCQUFxQmYsU0FBUztnQkFDNUIsSUFBTTlFLFNBQVMsSUFBSSxDQUFDNEMsU0FBUyxJQUN2QjZDLG1CQUFtQlgsVUFBVVksbUJBQW1CLElBQ2hENUQsUUFBUTlCLE9BQU9nRixJQUFJLENBQUMsU0FBQ2xEO29CQUNuQixJQUFNZ0Usa0NBQWtDaEUsTUFBTThELHVCQUF1QixDQUFDSDtvQkFFdEUsSUFBSUssaUNBQWlDO3dCQUNuQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT2hFO1lBQ1Q7OztZQUVBaUUsS0FBQUE7bUJBQUFBLFNBQUFBLHFCQUFxQmpCLFNBQVM7Z0JBQzVCLElBQU03RSxTQUFTLElBQUksQ0FBQzRDLFNBQVMsSUFDdkI0QyxtQkFBbUJYLFVBQVVZLG1CQUFtQixJQUNoRDFELFFBQVEvQixPQUFPK0UsSUFBSSxDQUFDLFNBQUNoRDtvQkFDbkIsSUFBTWdFLGtDQUFrQ2hFLE1BQU00RCx1QkFBdUIsQ0FBQ0g7b0JBRXRFLElBQUlPLGlDQUFpQzt3QkFDbkMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9oRTtZQUNUOzs7WUFFQWlFLEtBQUFBO21CQUFBQSxTQUFBQSx1QkFBdUJuQixTQUFTO2dCQUM5QixJQUFNNUUsV0FBVyxJQUFJLENBQUM0QyxXQUFXLElBQzNCMkMsbUJBQW1CWCxVQUFVWSxtQkFBbUIsSUFDaER4RCxVQUFVaEMsU0FBUzhFLElBQUksQ0FBQyxTQUFDOUM7b0JBQ3ZCLElBQU1nRSxvQ0FBb0NoRSxRQUFRMEQsdUJBQXVCLENBQUNIO29CQUUxRSxJQUFJUyxtQ0FBbUM7d0JBQ3JDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPaEU7WUFDVDs7O1lBRUFpRSxLQUFBQTttQkFBQUEsU0FBQUEsb0JBQW9CQyxJQUFJO2dCQUN0QixJQUFNbkQsYUFBYSxJQUFJLENBQUNELGFBQWEsSUFDL0JxRCxZQUFZcEQsV0FBVytCLElBQUksQ0FBQyxTQUFDcUI7b0JBQzNCLElBQU1DLGNBQWNELFVBQVVFLFNBQVMsQ0FBQ0g7b0JBRXhDLElBQUlFLGFBQWE7d0JBQ2YsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9EO1lBQ1Q7OztZQUVBRyxLQUFBQTttQkFBQUEsU0FBQUEsMEJBQTBCMUIsU0FBUztnQkFDakMsSUFBTXpFLGNBQWMsSUFBSSxDQUFDOEMsY0FBYyxJQUNqQ3NDLG1CQUFtQlgsVUFBVVksbUJBQW1CLElBQ2hEdEQsYUFBYS9CLFlBQVkyRSxJQUFJLENBQUMsU0FBQzVDO29CQUM3QixJQUFNcUUsdUNBQXVDckUsV0FBV3dELHVCQUF1QixDQUFDSDtvQkFFaEYsSUFBSWdCLHNDQUFzQzt3QkFDeEMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9yRTtZQUNUOzs7WUFFQXNFLEtBQUFBO21CQUFBQSxTQUFBQSwwQkFBMEI1QixTQUFTOztnQkFDakMsSUFBTTFFLGFBQWEsSUFBSSxDQUFDOEMsYUFBYTtnQkFFckN6RCxPQUFPVyxZQUFZLFNBQUM4RDtvQkFDbEIsSUFBTXhFLGlCQUNBaUgsd0JBQXdCekMsV0FDeEIwQywrQkFBK0I5QixVQUFVK0IsMEJBQTBCLENBQUNGLHVCQUF1QmpIO29CQUVqRyxJQUFJa0gsOEJBQThCO3dCQUNoQyxPQUFPO29CQUNUO2dCQUNGO2dCQUVBLE9BQU94RztZQUNUOzs7WUFFQTBHLEtBQUFBO21CQUFBQSxTQUFBQSw0QkFBNEJoQyxTQUFTOztnQkFDbkMsSUFBTXJFLGVBQWUsSUFBSSxDQUFDOEMsZUFBZTtnQkFFekM5RCxPQUFPZ0IsY0FBYyxTQUFDNkI7b0JBQ3BCLElBQU01QyxpQkFDQWlILHdCQUF3QnJFLGFBQ3hCc0UsK0JBQStCOUIsVUFBVStCLDBCQUEwQixDQUFDRix1QkFBdUJqSDtvQkFFakcsSUFBSWtILDhCQUE4Qjt3QkFDaEMsT0FBTztvQkFDVDtnQkFDRjtnQkFFQSxPQUFPbkc7WUFDVDs7O1lBRUFzRyxLQUFBQTttQkFBQUEsU0FBQUEscUNBQXFDakMsU0FBUztnQkFDNUMsSUFBTVosWUFBWSxJQUFJLENBQUNpQix3QkFBd0IsQ0FBQ0wsWUFDMUN4QyxjQUFjLElBQUksQ0FBQ2dELDBCQUEwQixDQUFDUixZQUM5QzZCLHdCQUF5QnpDLGFBQWE1QixhQUFlLEdBQUc7Z0JBRTlELE9BQU9xRTtZQUNUOzs7WUFFQUssS0FBQUE7bUJBQUFBLFNBQUFBLHNDQUFzQ2xDLFNBQVM7Z0JBQzdDLElBQU0xRSxhQUFhLElBQUksQ0FBQ3NHLHlCQUF5QixDQUFDNUIsWUFDNUNyRSxlQUFlLElBQUksQ0FBQ3FHLDJCQUEyQixDQUFDaEMsWUFDaERtQyx5QkFBeUIsQUFDdkIscUJBQUc3RyxtQkFDSCxxQkFBR0s7Z0JBR1gsT0FBT3dHO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsaUNBQWlDcEMsU0FBUztnQkFDeEMsSUFBTWhELFFBQVEsSUFBSSxDQUFDK0Qsb0JBQW9CLENBQUNmLFlBQ2xDOUMsUUFBUSxJQUFJLENBQUMrRCxvQkFBb0IsQ0FBQ2pCLFlBQ2xDNUMsVUFBVSxJQUFJLENBQUMrRCxzQkFBc0IsQ0FBQ25CLFlBQ3RDMUMsYUFBYSxJQUFJLENBQUNvRSx5QkFBeUIsQ0FBQzFCLFlBQzVDcUMsb0JBQXFCckYsU0FBU0UsU0FBU0UsV0FBV0U7Z0JBRXhELE9BQU8rRTtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLGlCQUFpQnhDLFlBQVk7O2dCQUMzQixJQUFNbEUsZ0JBQWdCLElBQUksQ0FBQzhDLGdCQUFnQixJQUNyQzZELHVCQUF1QnpDLGNBQWUsR0FBRztnQkFFL0NBLGVBQWVsRSxjQUFjc0UsSUFBSSxDQUFDLFNBQUNKO29CQUNqQyxJQUFNbEYsaUJBQ0E0SCxzQkFBc0IxQyxjQUN0Qkssc0JBQXNCcUMsb0JBQW9CQyxpQkFBaUIsQ0FBQ0Ysc0JBQXNCM0g7b0JBRXhGLElBQUl1RixxQkFBcUI7d0JBQ3ZCLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFTixPQUFPTDtZQUNUOzs7WUFFQTRDLEtBQUFBO21CQUFBQSxTQUFBQSxtQkFBbUJDLFFBQVE7b0JBQUVqRyxpQkFBQUEsaUVBQWlCLE1BQU1rQixzQkFBQUEsaUVBQXNCO2dCQUN4RSxJQUFJNUMsUUFBUSxJQUFJLENBQUMyQyxRQUFRLENBQUNqQixnQkFBZ0JrQjtnQkFFMUMsSUFBTWdGLFdBQVdDLElBQUFBLDBCQUFtQjtnQkFFcEM3SCxRQUFRLEFBQ04scUJBQUdBLGNBREc7b0JBRU40SDtpQkFDRDtnQkFFRCxJQUFNaEUsT0FBTzVELE1BQU1rRixJQUFJLENBQUMsU0FBQ3RCO29CQUN2QixJQUFNa0UseUJBQXlCbEUsS0FBS21FLGVBQWUsQ0FBQ0o7b0JBRXBELElBQUlHLHdCQUF3Qjt3QkFDMUIsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVOLE9BQU9sRTtZQUNUOzs7WUFFQW9FLEtBQUFBO21CQUFBQSxTQUFBQSwwQkFBMEJDLGVBQWU7Z0JBQ3ZDLElBQUlqSSxRQUFRLElBQUksQ0FBQzJDLFFBQVE7Z0JBRXpCLElBQU1pRixXQUFXQyxJQUFBQSwwQkFBbUI7Z0JBRXBDN0gsUUFBUSxBQUNOLHFCQUFHQSxjQURHO29CQUVONEg7aUJBQ0Q7Z0JBRUQsSUFBTWhFLE9BQU81RCxNQUFNa0YsSUFBSSxDQUFDLFNBQUN0QjtvQkFDdkIsSUFBTXNFLGdDQUFnQ3RFLEtBQUt1RSxzQkFBc0IsQ0FBQ0Y7b0JBRWxFLElBQUlDLCtCQUErQjt3QkFDakMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVOLE9BQU90RTtZQUNUOzs7WUFFQXdFLEtBQUFBO21CQUFBQSxTQUFBQSwyQkFBMkJDLGdCQUFnQjtnQkFDekMsSUFBSXJJLFFBQVEsSUFBSSxDQUFDMkMsUUFBUTtnQkFFekIsSUFBTWlGLFdBQVdDLElBQUFBLDBCQUFtQjtnQkFFcEM3SCxRQUFRLEFBQ04scUJBQUdBLGNBREc7b0JBRU40SDtpQkFDRDtnQkFFRCxJQUFNaEUsT0FBTzVELE1BQU1rRixJQUFJLENBQUMsU0FBQ3RCO29CQUN2QixJQUFNMEUsaUNBQWlDMUUsS0FBSzJFLHVCQUF1QixDQUFDRjtvQkFFcEUsSUFBSUMsZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRU4sT0FBTzFFO1lBQ1Q7OztZQUVBNEUsS0FBQUE7bUJBQUFBLFNBQUFBLDJCQUEyQkMsWUFBWTtnQkFDckMsSUFBTUMsWUFBWSxJQUFJLENBQUNDLFlBQVksSUFDN0JDLFdBQVdGLFVBQVV4RCxJQUFJLENBQUMsU0FBQzBEO29CQUN6QixJQUFNQyxpQ0FBaUNELFNBQVNFLG1CQUFtQixDQUFDTDtvQkFFcEUsSUFBSUksZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT0Q7WUFDVDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQSwrQkFBK0JDLGNBQWM7Z0JBQzNDLElBQU12SSxlQUFlLElBQUksQ0FBQzhDLGVBQWUsSUFDbkNrQixhQUFhaEUsYUFBYXlFLElBQUksQ0FBQyxTQUFDVDtvQkFDOUIsSUFBTXdFLHFDQUFxQ3hFLFdBQVd5RSxxQkFBcUIsQ0FBQ0Y7b0JBRTVFLElBQUlDLG9DQUFvQzt3QkFDdEMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU94RTtZQUNUOzs7WUFFQTBFLEtBQUFBO21CQUFBQSxTQUFBQSxpQ0FBaUNDLGtCQUFrQjtnQkFDakQsSUFBTS9JLFlBQVksSUFBSSxDQUFDNEMsWUFBWSxJQUM3QmlCLFdBQVc3RCxVQUFVNkUsSUFBSSxDQUFDLFNBQUNoQjtvQkFDekIsSUFBTW1GLHVDQUF1Q25GLFNBQVNvRix5QkFBeUIsQ0FBQ0Y7b0JBRWhGLElBQUlDLHNDQUFzQzt3QkFDeEMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9uRjtZQUNUOzs7WUFFQXFGLEtBQUFBO21CQUFBQSxTQUFBQSw0QkFBNEI1RCxnQkFBZ0I7Z0JBQzFDLElBQU1oRSxTQUFTLElBQUksQ0FBQ0YsU0FBUyxJQUN2QndELFFBQVF0RCxPQUFPdUQsSUFBSSxDQUFDLFNBQUNEO29CQUNuQixJQUFNdUUsa0NBQWtDdkUsTUFBTWEsdUJBQXVCLENBQUNIO29CQUV0RSxJQUFJNkQsaUNBQWlDO3dCQUNuQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT3ZFO1lBQ1Q7OztZQUVBd0UsS0FBQUE7bUJBQUFBLFNBQUFBLHdCQUF3QjNFLFlBQVk7Z0JBQ2xDLElBQU1uRCxTQUFTLElBQUksQ0FBQ0YsU0FBUyxJQUN2QndELFFBQVF0RCxPQUFPdUQsSUFBSSxDQUFDLFNBQUNEO29CQUNuQixJQUFNeUUsdUNBQXVDekUsTUFBTTBFLGlDQUFpQyxDQUFDN0U7b0JBRXJGLElBQUk0RSxzQ0FBc0M7d0JBQ3hDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPekU7WUFDVDs7O1lBRUEyRSxLQUFBQTttQkFBQUEsU0FBQUEsNEJBQTRCOUUsWUFBWTtnQkFDdEMsSUFBTXpELGFBQWEsSUFBSSxDQUFDRCxhQUFhLElBQy9CeUksWUFBWXhJLFdBQVc2RCxJQUFJLENBQUMsU0FBQzJFO29CQUMzQixJQUFNQyxvQkFBb0JELFVBQVVFLFVBQVU7b0JBRTlDLElBQUlELG1CQUFtQjt3QkFDckIsSUFBTUUsd0JBQXdCSCxVQUFVSSxlQUFlLElBQ2pEQywyQ0FBMkNGLHNCQUFzQkcsU0FBUyxDQUFDckY7d0JBRWpGLElBQUlvRiwwQ0FBMEM7NEJBQzVDLE9BQU87d0JBQ1Q7b0JBQ0Y7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPTDtZQUNUOzs7WUFFQU8sS0FBQUE7bUJBQUFBLFNBQUFBLG1DQUFtQ3pFLGdCQUFnQjtnQkFDakQsSUFBTS9FLGdCQUFnQixJQUFJLENBQUM4QyxnQkFBZ0IsSUFDckNvQixlQUFlbEUsY0FBY3NFLElBQUksQ0FBQyxTQUFDSjtvQkFDakMsSUFBTXVGLHlDQUF5Q3ZGLGFBQWFnQix1QkFBdUIsQ0FBQ0g7b0JBRXBGLElBQUkwRSx3Q0FBd0M7d0JBQzFDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPdkY7WUFDVDs7O1lBRUF3RixLQUFBQTttQkFBQUEsU0FBQUEsc0JBQXNCeEYsWUFBWTtnQkFDaENBLGVBQWUsSUFBSSxDQUFDd0MsZ0JBQWdCLENBQUN4QztnQkFFckMsSUFBTXlGLHNCQUF1QnpGLGlCQUFpQjtnQkFFOUMsT0FBT3lGO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsd0JBQXdCN0MsUUFBUTtvQkFBRWpHLGlCQUFBQSxpRUFBaUIsTUFBTWtCLHNCQUFBQSxpRUFBc0I7Z0JBQzdFLElBQU1nQixPQUFPLElBQUksQ0FBQzhELGtCQUFrQixDQUFDQyxVQUFVakcsZ0JBQWdCa0Isc0JBQ3pENkgsY0FBZTdHLFNBQVM7Z0JBRTlCLE9BQU82RztZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLCtCQUErQnpDLGVBQWU7Z0JBQzVDLElBQU1yRSxPQUFPLElBQUksQ0FBQ29FLHlCQUF5QixDQUFDQyxrQkFDdEN3QyxjQUFlN0csU0FBUztnQkFFOUIsT0FBTzZHO1lBQ1Q7OztZQUVBRSxLQUFBQTttQkFBQUEsU0FBQUEsZ0NBQWdDdEMsZ0JBQWdCO2dCQUM5QyxJQUFNekUsT0FBTyxJQUFJLENBQUN3RSwwQkFBMEIsQ0FBQ0MsbUJBQ3ZDb0MsY0FBZTdHLFNBQVM7Z0JBRTlCLE9BQU82RztZQUNUOzs7WUFFQUcsS0FBQUE7bUJBQUFBLFNBQUFBLG9DQUFvQzVCLGNBQWM7Z0JBQ2hELElBQU12RSxhQUFhLElBQUksQ0FBQ3NFLDhCQUE4QixDQUFDQyxpQkFDakQ2QixvQkFBcUJwRyxlQUFlO2dCQUUxQyxPQUFPb0c7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxzQ0FBc0MxQixrQkFBa0I7Z0JBQ3RELElBQU1sRixXQUFXLElBQUksQ0FBQ2lGLGdDQUFnQyxDQUFDQyxxQkFDakQyQixrQkFBbUI3RyxhQUFhO2dCQUV0QyxPQUFPNkc7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxpQ0FBaUNyRixnQkFBZ0I7Z0JBQy9DLElBQU1WLFFBQVEsSUFBSSxDQUFDc0UsMkJBQTJCLENBQUM1RCxtQkFDekNzRixlQUFnQmhHLFVBQVU7Z0JBRWhDLE9BQU9nRztZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLDZCQUE2QnBHLFlBQVk7Z0JBQ3ZDLElBQU1HLFFBQVEsSUFBSSxDQUFDd0UsdUJBQXVCLENBQUMzRSxlQUNyQ21HLGVBQWdCaEcsVUFBVTtnQkFFaEMsT0FBT2dHO1lBQ1Q7OztZQUVBRSxLQUFBQTttQkFBQUEsU0FBQUEsd0NBQXdDeEYsZ0JBQWdCO2dCQUN0RCxJQUFNYixlQUFlLElBQUksQ0FBQ3NGLGtDQUFrQyxDQUFDekUsbUJBQ3ZENEUsc0JBQXVCekYsaUJBQWlCO2dCQUU5QyxPQUFPeUY7WUFDVDs7O1lBRUFhLEtBQUFBO21CQUFBQSxTQUFBQSwwQkFBMEJwRyxTQUFTOztnQkFDakMsSUFBTXJELFNBQVMsSUFBSSxDQUFDRixTQUFTLElBQ3ZCd0osZUFBZXRKLE9BQU8wSixJQUFJLENBQUMsU0FBQ3BHO29CQUMxQixJQUFNckYsaUJBQ0EwTCxlQUFldEcsVUFBVXVHLFVBQVUsQ0FBQ3RHLE9BQU9yRjtvQkFFakQsSUFBSTBMLGNBQWM7d0JBQ2hCLE9BQU87b0JBQ1Q7Z0JBQ0Y7Z0JBRU4sT0FBT0w7WUFDVDs7O1lBRUFPLEtBQUFBO21CQUFBQSxTQUFBQSx5QkFBeUJsRixJQUFJO2dCQUMzQixJQUFNQyxZQUFZLElBQUksQ0FBQ0YsbUJBQW1CLENBQUNDLE9BQ3JDbUYsbUJBQW9CbEYsY0FBYztnQkFFeEMsT0FBT2tGO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEsaUNBQWlDMUcsU0FBUzs7Z0JBQ3hDLElBQU1wRSxnQkFBZ0IsSUFBSSxDQUFDOEMsZ0JBQWdCLElBQ3JDNkcsc0JBQXNCM0osY0FBY3lLLElBQUksQ0FBQyxTQUFDdkc7b0JBQ3hDLElBQU1sRixpQkFDQXVGLHNCQUFzQkgsVUFBVXlDLGlCQUFpQixDQUFDM0MsY0FBY2xGO29CQUV0RSxJQUFJdUYscUJBQXFCO3dCQUN2QixPQUFPO29CQUNUO2dCQUNGO2dCQUVOLE9BQU9vRjtZQUNUOzs7WUFFQW9CLEtBQUFBO21CQUFBQSxTQUFBQSwwQ0FBMEMzRyxTQUFTO2dCQUNqRCxJQUFNNkIsd0JBQXdCLElBQUksQ0FBQ0ksb0NBQW9DLENBQUNqQyxZQUNsRTRHLCtCQUFnQy9FLDBCQUEwQjtnQkFFaEUsT0FBTytFO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBSUMsV0FBVztnQkFFZixJQUFJLENBQUNDLE9BQU87Z0JBRVosSUFBSSxJQUFJLENBQUNoTSxJQUFJLEtBQUssTUFBTTtvQkFDdEIsSUFBSSxDQUFDaU0sT0FBTyxDQUFDLEFBQUMseUJBQXNDLE9BQWQsSUFBSSxDQUFDbk0sUUFBUSxFQUFDO2dCQUN0RCxPQUFPO29CQUNMLElBQUksQ0FBQ29NLEtBQUssQ0FBQyxBQUFDLGtCQUErQixPQUFkLElBQUksQ0FBQ3BNLFFBQVEsRUFBQztvQkFFM0MsSUFBTUQsVUFBVSxJQUFJLEVBQ2RzTSxXQUFXLElBQUksQ0FBQ25NLElBQUksRUFBRSxHQUFHO29CQUUvQitMLFdBQVdLLElBQUFBLGtCQUFVLEVBQUNELFVBQVV0TTtvQkFFaENrTSxXQUNFLElBQUksQ0FBQ00sUUFBUSxLQUNYLElBQUksQ0FBQ0MsS0FBSztvQkFFZCxJQUFJUCxVQUFVO3dCQUNaLElBQUksQ0FBQ1EsSUFBSSxDQUFDLEFBQUMsb0JBQWlDLE9BQWQsSUFBSSxDQUFDek0sUUFBUSxFQUFDO29CQUM5QztnQkFDRjtnQkFFQSxPQUFPaU07WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFJLElBQUksQ0FBQ2pNLE1BQU0sS0FBSyxNQUFNO29CQUN4QjtnQkFDRjtnQkFFQSxJQUFNeU0sT0FBTyxJQUFJLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUMzTSxRQUFRLEdBQ2xDNE0sUUFBUSxJQUFJLENBQUNDLFFBQVEsSUFDckJDLFNBQVMsSUFBSSxDQUFDQyxTQUFTLElBQ3ZCQyxVQUFVTixLQUFLTyxVQUFVO2dCQUUvQixJQUFJLENBQUNoTixNQUFNLEdBQUcyTSxNQUFNTSxRQUFRLENBQUNGO2dCQUU3QixJQUFJLENBQUM5TSxJQUFJLEdBQUc0TSxPQUFPSyxLQUFLLENBQUMsSUFBSSxDQUFDbE4sTUFBTTtZQUN0Qzs7O1lBRUF1TSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBSSxDQUFDcEwsU0FBUyxHQUFHO2dCQUVqQixJQUFJLENBQUNqQixLQUFLLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUNDLEtBQUssR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQ0MsTUFBTSxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksQ0FBQ0MsVUFBVSxHQUFHLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLEVBQUU7WUFDekI7OztZQUVBd0wsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQUksQ0FBQ25MLFNBQVMsR0FBRztZQUNuQjs7O1lBRUFnTSxLQUFBQTttQkFBQUEsU0FBQUEsV0FBV0MsSUFBSTtnQkFDYixJQUFNQyxjQUFjLElBQUksRUFBRSxHQUFHO2dCQUU3QixJQUFJLENBQUNuTixLQUFLLEdBQUcsRUFBRTtnQkFFZm9OLElBQUFBLG1CQUFhLEVBQUNGLE1BQU0sSUFBSSxDQUFDbE4sS0FBSyxFQUFFbU47Z0JBRWhDLElBQUksQ0FBQ2xOLEtBQUssR0FBR29OLElBQUFBLG1CQUFhLEVBQUNILE1BQU1DO2dCQUVqQyxJQUFJLENBQUNqTixNQUFNLEdBQUdvTixJQUFBQSxvQkFBYyxFQUFDSixNQUFNQztnQkFFbkMsSUFBSSxDQUFDaE4sTUFBTSxHQUFHb04sSUFBQUEsdUJBQWlCO2dCQUUvQixJQUFJLENBQUNuTixRQUFRLEdBQUdvTixJQUFBQSxzQkFBZ0IsRUFBQ04sTUFBTUM7Z0JBRXZDLElBQUksQ0FBQzlNLFNBQVMsR0FBR29OLElBQUFBLHVCQUFpQixFQUFDUCxNQUFNQztnQkFFekMsSUFBSSxDQUFDN00sVUFBVSxHQUFHb04sSUFBQUEsMkJBQXFCO2dCQUV2QyxJQUFJLENBQUNuTixXQUFXLEdBQUdvTixJQUFBQSx5QkFBbUIsRUFBQ1QsTUFBTUM7Z0JBRTdDLElBQUksQ0FBQzNNLFdBQVcsR0FBR29OLElBQUFBLHlCQUFtQixFQUFDVixNQUFNQztnQkFFN0MsSUFBSSxDQUFDMU0sWUFBWSxHQUFHb04sSUFBQUEsMEJBQW9CLEVBQUNYLE1BQU1DO2dCQUUvQyxJQUFJLENBQUN6TSxZQUFZLEdBQUdvTixJQUFBQSwwQkFBb0IsRUFBQ1osTUFBTUM7Z0JBRS9DLElBQUksQ0FBQ3hNLFlBQVksR0FBR29OLElBQUFBLDBCQUFvQixFQUFDYixNQUFNQztnQkFFL0MsSUFBSSxDQUFDdk0sYUFBYSxHQUFHb04sSUFBQUEsMkJBQXFCLEVBQUNkLE1BQU1DO1lBQ25EOzs7WUFFQWMsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQU1DLFlBQVlDLElBQUFBLHNCQUFnQixFQUFDLElBQUksQ0FBQ25PLEtBQUssR0FDdkNvTyxZQUFZQyxJQUFBQSxzQkFBZ0IsRUFBQyxJQUFJLENBQUNwTyxLQUFLLEdBQ3ZDcU8sYUFBYUMsSUFBQUEsd0JBQWtCLEVBQUMsSUFBSSxDQUFDck8sTUFBTSxHQUMzQ3NPLGVBQWVDLElBQUFBLDRCQUFzQixFQUFDLElBQUksQ0FBQ3JPLFFBQVEsR0FDbkRzTyxnQkFBZ0JDLElBQUFBLDhCQUF3QixFQUFDLElBQUksQ0FBQ3RPLFNBQVMsR0FDdkR1TyxrQkFBa0JDLElBQUFBLGtDQUE0QixFQUFDLElBQUksQ0FBQ3RPLFdBQVcsR0FDL0R1TyxrQkFBa0JDLElBQUFBLGtDQUE0QixFQUFDLElBQUksQ0FBQ3ZPLFdBQVcsR0FDL0R3TyxtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQ3hPLFlBQVksR0FDbkV5TyxtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQ3pPLFlBQVksR0FDbkUwTyxtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQzFPLFlBQVksR0FDbkUyTyxvQkFBb0JDLElBQUFBLHNDQUFnQyxFQUFDLElBQUksQ0FBQzNPLGFBQWEsR0FDdkVmLFdBQVcsSUFBSSxDQUFDQSxRQUFRLEVBQ3hCRyxRQUFRa08sV0FDUmpPLFFBQVFtTyxXQUNSbE8sU0FBU29PLFlBQ1RsTyxXQUFXb08sY0FDWG5PLFlBQVlxTyxlQUNabk8sY0FBY3FPLGlCQUNkcE8sY0FBY3NPLGlCQUNkck8sZUFBZXVPLGtCQUNmdE8sZUFBZXdPLGtCQUNmdk8sZUFBZXlPLGtCQUNmeE8sZ0JBQWdCME8sbUJBQ2hCcEMsT0FBTztvQkFDTHJOLFVBQUFBO29CQUNBRyxPQUFBQTtvQkFDQUMsT0FBQUE7b0JBQ0FDLFFBQUFBO29CQUNBRSxVQUFBQTtvQkFDQUMsV0FBQUE7b0JBQ0FFLGFBQUFBO29CQUNBQyxhQUFBQTtvQkFDQUMsY0FBQUE7b0JBQ0FDLGNBQUFBO29CQUNBQyxjQUFBQTtvQkFDQUMsZUFBQUE7Z0JBQ0Y7Z0JBRU4sT0FBT3NNO1lBQ1Q7Ozs7WUFFT3NDLEtBQUFBO21CQUFQLFNBQU9BLFNBQVNqRCxJQUFJLEVBQUUzTSxPQUFPO2dCQUMzQixJQUFNQyxXQUFXME0sS0FBS2tELE9BQU8sSUFDdkIzUCxTQUFTLE1BQ1RDLE9BQU8sTUFDUEMsUUFBUSxFQUFFLEVBQ1ZDLFFBQVEsRUFBRSxFQUNWQyxTQUFTLEVBQUUsRUFDWEMsU0FBUyxFQUFFLEVBQ1hDLFdBQVcsRUFBRSxFQUNiQyxZQUFZLEVBQUUsRUFDZEMsYUFBYSxFQUFFLEVBQ2ZDLGNBQWMsRUFBRSxFQUNoQkMsY0FBYyxFQUFFLEVBQ2hCQyxlQUFlLEVBQUUsRUFDakJDLGVBQWUsRUFBRSxFQUNqQkMsZUFBZSxFQUFFLEVBQ2pCQyxnQkFBZ0IsRUFBRSxFQUNsQnVNLGNBQWMsSUFwM0JIM04sbUJBbzNCMEJJLFNBQVNDLFVBQVVDLFFBQVFDLE1BQU1DLE9BQU9DLE9BQU9DLFFBQVFDLFFBQVFDLFVBQVVDLFdBQVdDLFlBQVlDLGFBQWFDLGFBQWFDLGNBQWNDLGNBQWNDLGNBQWNDO2dCQUUvTSxPQUFPdU07WUFDVDs7O1lBRU91QyxLQUFBQTttQkFBUCxTQUFPQSxhQUFhN1AsUUFBUSxFQUFFRCxPQUFPO2dCQUNuQyxJQUFNRSxTQUFTLE1BQ1RDLE9BQU8sTUFDUEMsUUFBUSxNQUNSQyxRQUFRLE1BQ1JDLFNBQVMsTUFDVEMsU0FBUyxNQUNUQyxXQUFXLE1BQ1hDLFlBQVksTUFDWkMsYUFBYSxNQUNiQyxjQUFjLE1BQ2RDLGNBQWMsTUFDZEMsZUFBZSxNQUNmQyxlQUFlLE1BQ2ZDLGVBQWUsTUFDZkMsZ0JBQWdCLE1BQ2hCdU0sY0FBYyxJQXo0QkgzTixtQkF5NEIwQkksU0FBU0MsVUFBVUMsUUFBUUMsTUFBTUMsT0FBT0MsT0FBT0MsUUFBUUMsUUFBUUMsVUFBVUMsV0FBV0MsWUFBWUMsYUFBYUMsYUFBYUMsY0FBY0MsY0FBY0MsY0FBY0M7Z0JBRS9NLE9BQU91TTtZQUNUOzs7V0E1NEJtQjNOO0VBQTJCbVEsYUFBVyJ9
|