@datagrok/helm 2.1.6 → 2.1.8
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/README.md +13 -10
- package/dist/package-test.js +2 -735
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -2465
- package/dist/package.js.map +1 -0
- package/package.json +1 -1
- package/src/cell-renderer.ts +8 -3
- package/src/package.ts +5 -1
- package/tsconfig.json +1 -1
- package/webpack.config.js +1 -1
package/dist/package-test.js
CHANGED
|
@@ -1,735 +1,2 @@
|
|
|
1
|
-
var helm_test;
|
|
2
|
-
|
|
3
|
-
/******/ "use strict";
|
|
4
|
-
/******/ var __webpack_modules__ = ({
|
|
5
|
-
|
|
6
|
-
/***/ "./node_modules/@datagrok-libraries/utils/src/test.js":
|
|
7
|
-
/*!************************************************************!*\
|
|
8
|
-
!*** ./node_modules/@datagrok-libraries/utils/src/test.js ***!
|
|
9
|
-
\************************************************************/
|
|
10
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
11
|
-
|
|
12
|
-
__webpack_require__.r(__webpack_exports__);
|
|
13
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
14
|
-
/* harmony export */ "Test": () => (/* binding */ Test),
|
|
15
|
-
/* harmony export */ "TestContext": () => (/* binding */ TestContext),
|
|
16
|
-
/* harmony export */ "after": () => (/* binding */ after),
|
|
17
|
-
/* harmony export */ "assure": () => (/* binding */ assure),
|
|
18
|
-
/* harmony export */ "awaitCheck": () => (/* binding */ awaitCheck),
|
|
19
|
-
/* harmony export */ "before": () => (/* binding */ before),
|
|
20
|
-
/* harmony export */ "category": () => (/* binding */ category),
|
|
21
|
-
/* harmony export */ "currentCategory": () => (/* binding */ currentCategory),
|
|
22
|
-
/* harmony export */ "delay": () => (/* binding */ delay),
|
|
23
|
-
/* harmony export */ "expect": () => (/* binding */ expect),
|
|
24
|
-
/* harmony export */ "expectArray": () => (/* binding */ expectArray),
|
|
25
|
-
/* harmony export */ "expectFloat": () => (/* binding */ expectFloat),
|
|
26
|
-
/* harmony export */ "expectObject": () => (/* binding */ expectObject),
|
|
27
|
-
/* harmony export */ "isDialogPresent": () => (/* binding */ isDialogPresent),
|
|
28
|
-
/* harmony export */ "runTests": () => (/* binding */ runTests),
|
|
29
|
-
/* harmony export */ "test": () => (/* binding */ test),
|
|
30
|
-
/* harmony export */ "testEvent": () => (/* binding */ testEvent),
|
|
31
|
-
/* harmony export */ "testViewer": () => (/* binding */ testViewer),
|
|
32
|
-
/* harmony export */ "tests": () => (/* binding */ tests)
|
|
33
|
-
/* harmony export */ });
|
|
34
|
-
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
|
|
35
|
-
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
|
|
36
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
37
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__);
|
|
38
|
-
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
39
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
40
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
41
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
42
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
43
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
44
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
45
|
-
});
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const tests = {};
|
|
50
|
-
let currentCategory;
|
|
51
|
-
var assure;
|
|
52
|
-
(function (assure) {
|
|
53
|
-
function notNull(value, name) {
|
|
54
|
-
if (value == null)
|
|
55
|
-
throw new Error(`${name == null ? 'Value' : name} not defined`);
|
|
56
|
-
}
|
|
57
|
-
assure.notNull = notNull;
|
|
58
|
-
})(assure || (assure = {}));
|
|
59
|
-
class TestContext {
|
|
60
|
-
constructor(catchUnhandled, report) {
|
|
61
|
-
this.catchUnhandled = true;
|
|
62
|
-
this.report = false;
|
|
63
|
-
if (catchUnhandled !== undefined)
|
|
64
|
-
this.catchUnhandled = catchUnhandled;
|
|
65
|
-
if (report !== undefined)
|
|
66
|
-
this.report = report;
|
|
67
|
-
}
|
|
68
|
-
;
|
|
69
|
-
}
|
|
70
|
-
class Test {
|
|
71
|
-
constructor(category, name, test, options) {
|
|
72
|
-
var _a;
|
|
73
|
-
this.category = category;
|
|
74
|
-
this.name = name;
|
|
75
|
-
options !== null && options !== void 0 ? options : (options = {});
|
|
76
|
-
(_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);
|
|
77
|
-
this.options = options;
|
|
78
|
-
this.test = () => __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
let result = '';
|
|
81
|
-
try {
|
|
82
|
-
result = yield test();
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
reject(e);
|
|
86
|
-
}
|
|
87
|
-
resolve(result);
|
|
88
|
-
}));
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function testEvent(event, handler, trigger, ms = 0) {
|
|
93
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
let sub;
|
|
95
|
-
return new Promise((resolve, reject) => {
|
|
96
|
-
sub = event.subscribe((args) => {
|
|
97
|
-
try {
|
|
98
|
-
handler(args);
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
reject(e);
|
|
102
|
-
}
|
|
103
|
-
sub.unsubscribe();
|
|
104
|
-
resolve('OK');
|
|
105
|
-
});
|
|
106
|
-
setTimeout(() => {
|
|
107
|
-
sub.unsubscribe();
|
|
108
|
-
// eslint-disable-next-line prefer-promise-reject-errors
|
|
109
|
-
reject('timeout');
|
|
110
|
-
}, ms);
|
|
111
|
-
trigger();
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function test(name, test, options) {
|
|
116
|
-
if (tests[currentCategory] == undefined)
|
|
117
|
-
tests[currentCategory] = {};
|
|
118
|
-
if (tests[currentCategory].tests == undefined)
|
|
119
|
-
tests[currentCategory].tests = [];
|
|
120
|
-
tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));
|
|
121
|
-
}
|
|
122
|
-
/* Tests two objects for equality, throws an exception if they are not equal. */
|
|
123
|
-
function expect(actual, expected) {
|
|
124
|
-
if (actual !== expected)
|
|
125
|
-
throw new Error(`Expected "${expected}", got "${actual}"`);
|
|
126
|
-
}
|
|
127
|
-
function expectFloat(actual, expected, tolerance = 0.001) {
|
|
128
|
-
const areEqual = Math.abs(actual - expected) < tolerance;
|
|
129
|
-
if (!areEqual)
|
|
130
|
-
throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);
|
|
131
|
-
}
|
|
132
|
-
function expectObject(actual, expected) {
|
|
133
|
-
for (const [expectedKey, expectedValue] of Object.entries(expected)) {
|
|
134
|
-
if (!actual.hasOwnProperty(expectedKey))
|
|
135
|
-
throw new Error(`Expected property "${expectedKey}" not found`);
|
|
136
|
-
const actualValue = actual[expectedKey];
|
|
137
|
-
if (actualValue instanceof Array && expectedValue instanceof Array)
|
|
138
|
-
expectArray(actualValue, expectedValue);
|
|
139
|
-
else if (actualValue instanceof Object && expectedValue instanceof Object)
|
|
140
|
-
expectObject(actualValue, expectedValue);
|
|
141
|
-
else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))
|
|
142
|
-
expectFloat(actualValue, expectedValue);
|
|
143
|
-
else if (actualValue != expectedValue)
|
|
144
|
-
throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
function expectArray(actual, expected) {
|
|
148
|
-
const actualLength = actual.length;
|
|
149
|
-
const expectedLength = expected.length;
|
|
150
|
-
if (actualLength != expectedLength) {
|
|
151
|
-
throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +
|
|
152
|
-
`and expected array length is ${expectedLength}`);
|
|
153
|
-
}
|
|
154
|
-
for (let i = 0; i < actualLength; i++) {
|
|
155
|
-
if (actual[i] instanceof Array && expected[i] instanceof Array)
|
|
156
|
-
expectArray(actual[i], expected[i]);
|
|
157
|
-
else if (actual[i] instanceof Object && expected[i] instanceof Object)
|
|
158
|
-
expectObject(actual[i], expected[i]);
|
|
159
|
-
else if (actual[i] != expected[i])
|
|
160
|
-
throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/* Defines a test suite. */
|
|
164
|
-
function category(category, tests) {
|
|
165
|
-
currentCategory = category;
|
|
166
|
-
tests();
|
|
167
|
-
}
|
|
168
|
-
/* Defines a function to be executed before the tests in this category are executed. */
|
|
169
|
-
function before(before) {
|
|
170
|
-
if (tests[currentCategory] == undefined)
|
|
171
|
-
tests[currentCategory] = {};
|
|
172
|
-
tests[currentCategory].before = before;
|
|
173
|
-
}
|
|
174
|
-
/* Defines a function to be executed after the tests in this category are executed. */
|
|
175
|
-
function after(after) {
|
|
176
|
-
if (tests[currentCategory] == undefined)
|
|
177
|
-
tests[currentCategory] = {};
|
|
178
|
-
tests[currentCategory].after = after;
|
|
179
|
-
}
|
|
180
|
-
function runTests(options) {
|
|
181
|
-
var _a, _b, _c, _d;
|
|
182
|
-
var _e;
|
|
183
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
-
const results = [];
|
|
185
|
-
const packageName = (_b = (_a = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;
|
|
186
|
-
console.log(`Running tests`);
|
|
187
|
-
options !== null && options !== void 0 ? options : (options = {});
|
|
188
|
-
(_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());
|
|
189
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError = '';
|
|
190
|
-
for (const [key, value] of Object.entries(tests)) {
|
|
191
|
-
if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {
|
|
192
|
-
if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
console.log(`Started ${key} category`);
|
|
196
|
-
try {
|
|
197
|
-
if (value.before)
|
|
198
|
-
yield value.before();
|
|
199
|
-
}
|
|
200
|
-
catch (x) {
|
|
201
|
-
value.beforeStatus = x.toString();
|
|
202
|
-
}
|
|
203
|
-
const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];
|
|
204
|
-
const res = [];
|
|
205
|
-
for (let i = 0; i < t.length; i++)
|
|
206
|
-
res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));
|
|
207
|
-
const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');
|
|
208
|
-
try {
|
|
209
|
-
if (value.after)
|
|
210
|
-
yield value.after();
|
|
211
|
-
}
|
|
212
|
-
catch (x) {
|
|
213
|
-
value.afterStatus = x.toString();
|
|
214
|
-
}
|
|
215
|
-
if (value.afterStatus)
|
|
216
|
-
data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });
|
|
217
|
-
if (value.beforeStatus)
|
|
218
|
-
data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });
|
|
219
|
-
results.push(...data);
|
|
220
|
-
}
|
|
221
|
-
if (options.testContext.catchUnhandled) {
|
|
222
|
-
yield delay(1000);
|
|
223
|
-
if (datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError.length > 0) {
|
|
224
|
-
results.push({
|
|
225
|
-
category: 'Unhandled exceptions',
|
|
226
|
-
name: 'exceptions',
|
|
227
|
-
result: datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError, success: false, ms: 0, skipped: false
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (options.testContext.report) {
|
|
232
|
-
const logger = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Logger();
|
|
233
|
-
const successful = results.filter((r) => r.success).length;
|
|
234
|
-
const skipped = results.filter((r) => r.skipped).length;
|
|
235
|
-
const failed = results.filter((r) => !r.success);
|
|
236
|
-
const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';
|
|
237
|
-
const params = {
|
|
238
|
-
successful: successful,
|
|
239
|
-
skipped: skipped,
|
|
240
|
-
failed: failed.length,
|
|
241
|
-
package: packageName
|
|
242
|
-
};
|
|
243
|
-
for (const r of failed)
|
|
244
|
-
Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });
|
|
245
|
-
logger.log(description, params, 'package-tested');
|
|
246
|
-
}
|
|
247
|
-
return results;
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
function execTest(t, predicate) {
|
|
251
|
-
var _a, _b, _c;
|
|
252
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
253
|
-
let r;
|
|
254
|
-
const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));
|
|
255
|
-
const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;
|
|
256
|
-
const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;
|
|
257
|
-
if (!skip)
|
|
258
|
-
console.log(`Started ${t.category} ${t.name}`);
|
|
259
|
-
const start = new Date();
|
|
260
|
-
try {
|
|
261
|
-
if (skip)
|
|
262
|
-
r = { success: true, result: skipReason, ms: 0, skipped: true };
|
|
263
|
-
else
|
|
264
|
-
r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };
|
|
265
|
-
}
|
|
266
|
-
catch (x) {
|
|
267
|
-
r = { success: false, result: x.toString(), ms: 0, skipped: false };
|
|
268
|
-
}
|
|
269
|
-
const stop = new Date();
|
|
270
|
-
// @ts-ignore
|
|
271
|
-
r.ms = stop - start;
|
|
272
|
-
if (!skip)
|
|
273
|
-
console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);
|
|
274
|
-
r.category = t.category;
|
|
275
|
-
r.name = t.name;
|
|
276
|
-
return r;
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
/* Waits [ms] milliseconds */
|
|
280
|
-
function delay(ms) {
|
|
281
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
282
|
-
yield new Promise((r) => setTimeout(r, ms));
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {
|
|
286
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
287
|
-
return new Promise((resolve, reject) => {
|
|
288
|
-
setTimeout(() => {
|
|
289
|
-
clearInterval(interval);
|
|
290
|
-
reject(new Error(error));
|
|
291
|
-
}, wait);
|
|
292
|
-
// @ts-ignore
|
|
293
|
-
const interval = setInterval(() => {
|
|
294
|
-
if (checkHandler()) {
|
|
295
|
-
clearInterval(interval);
|
|
296
|
-
resolve();
|
|
297
|
-
}
|
|
298
|
-
}, 50);
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
function isDialogPresent(dialogTitle) {
|
|
303
|
-
for (let i = 0; i < datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Dialog.getOpenDialogs().length; i++) {
|
|
304
|
-
if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Dialog.getOpenDialogs()[i].title == dialogTitle)
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
function testViewer(v, df, detectSemanticTypes = false) {
|
|
310
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
311
|
-
if (detectSemanticTypes)
|
|
312
|
-
yield datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.data.detectSemanticTypes(df);
|
|
313
|
-
const tv = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.addTableView(df);
|
|
314
|
-
const viewerName = `[name=viewer-${v.replace(/\s+/g, '-')} i]`;
|
|
315
|
-
const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,
|
|
316
|
-
${viewerName} input,${viewerName} h1,${viewerName} a`;
|
|
317
|
-
const res = [];
|
|
318
|
-
try {
|
|
319
|
-
let viewer = tv.addViewer(v);
|
|
320
|
-
yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);
|
|
321
|
-
res.push(Array.from(tv.viewers).length);
|
|
322
|
-
Array.from(df.row(0).cells).forEach((c) => c.value = null);
|
|
323
|
-
df.rows.select((row) => row.idx > 1 && row.idx < 7);
|
|
324
|
-
for (let i = 7; i < 12; i++)
|
|
325
|
-
df.filter.set(i, false);
|
|
326
|
-
df.currentRowIdx = 1;
|
|
327
|
-
const props = viewer.getOptions(true).look;
|
|
328
|
-
const newProps = {};
|
|
329
|
-
Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);
|
|
330
|
-
viewer.setOptions(newProps);
|
|
331
|
-
yield delay(250);
|
|
332
|
-
const layout = tv.saveLayout();
|
|
333
|
-
const oldProps = viewer.getOptions().look;
|
|
334
|
-
tv.resetLayout();
|
|
335
|
-
res.push(Array.from(tv.viewers).length);
|
|
336
|
-
tv.loadLayout(layout);
|
|
337
|
-
yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);
|
|
338
|
-
yield delay(250);
|
|
339
|
-
res.push(Array.from(tv.viewers).length);
|
|
340
|
-
viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');
|
|
341
|
-
expectArray(res, [2, 1, 2]);
|
|
342
|
-
expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));
|
|
343
|
-
}
|
|
344
|
-
finally {
|
|
345
|
-
tv.close();
|
|
346
|
-
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.closeTable(df);
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=
|
|
351
|
-
|
|
352
|
-
/***/ }),
|
|
353
|
-
|
|
354
|
-
/***/ "./src/tests/helm-tests.ts":
|
|
355
|
-
/*!*********************************!*\
|
|
356
|
-
!*** ./src/tests/helm-tests.ts ***!
|
|
357
|
-
\*********************************/
|
|
358
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
359
|
-
|
|
360
|
-
__webpack_require__.r(__webpack_exports__);
|
|
361
|
-
/* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
|
|
362
|
-
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ "./src/utils.ts");
|
|
363
|
-
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
364
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
365
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
366
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
367
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
368
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
369
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
370
|
-
});
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.category)('Helm', () => {
|
|
375
|
-
//These tests require webservice that is not present on test stand
|
|
376
|
-
// test('helmToFasta', async () => {
|
|
377
|
-
// expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');
|
|
378
|
-
// expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');
|
|
379
|
-
// expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');
|
|
380
|
-
// });
|
|
381
|
-
//
|
|
382
|
-
// test('helmToRNA', async () => {
|
|
383
|
-
// expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');
|
|
384
|
-
// expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');
|
|
385
|
-
// // eslint-disable-next-line max-len
|
|
386
|
-
// expect(await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA');
|
|
387
|
-
// });
|
|
388
|
-
//
|
|
389
|
-
// test('helmToPeptide', async () => {
|
|
390
|
-
// expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');
|
|
391
|
-
// expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');
|
|
392
|
-
// // eslint-disable-next-line max-len
|
|
393
|
-
// expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');
|
|
394
|
-
// });
|
|
395
|
-
// detectMacromolecule is a function of Bio package
|
|
396
|
-
// test('detectMacromolecule', async () => {
|
|
397
|
-
// const file = await _package.files.readAsText('tests/test.csv');
|
|
398
|
-
// const df = DG.DataFrame.fromCsv(file);
|
|
399
|
-
// const col = df.columns.byName('HELM string');
|
|
400
|
-
// await grok.data.detectSemanticTypes(df);
|
|
401
|
-
// expect(col.semType, DG.SEMTYPE.MACROMOLECULE);
|
|
402
|
-
// });
|
|
403
|
-
// semType and units tags are detecting by Bio package function detectMacromolecule
|
|
404
|
-
// test('detectHelm', async () => {
|
|
405
|
-
// const file = await _package.files.readAsText('tests/test.csv');
|
|
406
|
-
// const df = DG.DataFrame.fromCsv(file);
|
|
407
|
-
// const col = df.columns.byName('HELM string');
|
|
408
|
-
// await grok.data.detectSemanticTypes(df);
|
|
409
|
-
// expect(col.tags[DG.TAGS.UNITS], 'HELM');
|
|
410
|
-
// });
|
|
411
|
-
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('parseHelm', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
412
|
-
const expectedResults = [
|
|
413
|
-
['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],
|
|
414
|
-
['A', 'C', 'T', 'G', 'W', 'E', 'Q'],
|
|
415
|
-
['R', 'U', 'P', 'T', 'A'],
|
|
416
|
-
['A', '*', 'G', 'C']
|
|
417
|
-
];
|
|
418
|
-
const helmStrings = [
|
|
419
|
-
'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',
|
|
420
|
-
'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',
|
|
421
|
-
'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',
|
|
422
|
-
'PEPTIDE1{A.*.G.C}$$$$V2.0'
|
|
423
|
-
];
|
|
424
|
-
for (let idx = 0; idx < helmStrings.length; ++idx) {
|
|
425
|
-
let monomerSet = new Set((0,_utils__WEBPACK_IMPORTED_MODULE_1__.parseHelm)(helmStrings[idx]));
|
|
426
|
-
let monomerArray = Array.from(monomerSet);
|
|
427
|
-
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));
|
|
428
|
-
}
|
|
429
|
-
}));
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
/***/ }),
|
|
434
|
-
|
|
435
|
-
/***/ "./src/utils.ts":
|
|
436
|
-
/*!**********************!*\
|
|
437
|
-
!*** ./src/utils.ts ***!
|
|
438
|
-
\**********************/
|
|
439
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
440
|
-
|
|
441
|
-
__webpack_require__.r(__webpack_exports__);
|
|
442
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
443
|
-
/* harmony export */ "findMonomers": () => (/* binding */ findMonomers),
|
|
444
|
-
/* harmony export */ "getParts": () => (/* binding */ getParts),
|
|
445
|
-
/* harmony export */ "parseHelm": () => (/* binding */ parseHelm)
|
|
446
|
-
/* harmony export */ });
|
|
447
|
-
function getParts(subParts, s) {
|
|
448
|
-
let j = 0;
|
|
449
|
-
let allParts = [];
|
|
450
|
-
for (let k = 0; k < subParts.length; ++k) {
|
|
451
|
-
let indexOfMonomer = s.indexOf(subParts[k]);
|
|
452
|
-
let helmBeforeMonomer = s.slice(j, indexOfMonomer);
|
|
453
|
-
allParts.push(helmBeforeMonomer);
|
|
454
|
-
allParts.push(subParts[k]);
|
|
455
|
-
s = s.substring(indexOfMonomer + subParts[k].length);
|
|
456
|
-
}
|
|
457
|
-
allParts.push(s);
|
|
458
|
-
return allParts;
|
|
459
|
-
}
|
|
460
|
-
function parseHelm(s) {
|
|
461
|
-
var sections = split(s, '$');
|
|
462
|
-
s = sections[0];
|
|
463
|
-
var monomers = [];
|
|
464
|
-
//@ts-ignore
|
|
465
|
-
if (!scil.Utils.isNullOrEmpty(s)) {
|
|
466
|
-
var seqs = split(s, '|');
|
|
467
|
-
for (var i = 0; i < seqs.length; ++i) {
|
|
468
|
-
var e = detachAnnotation(seqs[i]);
|
|
469
|
-
s = e.str;
|
|
470
|
-
var p = s.indexOf('{');
|
|
471
|
-
s = s.substring(p + 1);
|
|
472
|
-
p = s.indexOf('}');
|
|
473
|
-
s = s.substring(0, p);
|
|
474
|
-
var ss = split(s, '.');
|
|
475
|
-
for (var monomer of ss) {
|
|
476
|
-
if (monomer.includes('(') && monomer.includes(')')) {
|
|
477
|
-
var elements = monomer.replace(/[()]/g, '').split('');
|
|
478
|
-
for (var el of elements) {
|
|
479
|
-
monomers.push(el);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
else if (monomer.includes('[') && monomer.includes(']')) {
|
|
483
|
-
var element = monomer.match(/(?<=\[).*?(?=\])/g, '');
|
|
484
|
-
monomers.push(element[0]);
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
487
|
-
monomers.push(monomer);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
return monomers;
|
|
493
|
-
}
|
|
494
|
-
function findMonomers(helmString) {
|
|
495
|
-
//@ts-ignore
|
|
496
|
-
const types = Object.keys(org.helm.webeditor.monomerTypeList());
|
|
497
|
-
const monomers = [];
|
|
498
|
-
const monomer_names = [];
|
|
499
|
-
for (var i = 0; i < types.length; i++) {
|
|
500
|
-
//@ts-ignore
|
|
501
|
-
monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));
|
|
502
|
-
Object.keys(monomers[i]).forEach(k => {
|
|
503
|
-
monomer_names.push(monomers[i][k].id);
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
const split_string = parseHelm(helmString);
|
|
507
|
-
return new Set(split_string.filter(val => !monomer_names.includes(val)));
|
|
508
|
-
}
|
|
509
|
-
function split(s, sep) {
|
|
510
|
-
var ret = [];
|
|
511
|
-
var frag = '';
|
|
512
|
-
var parentheses = 0;
|
|
513
|
-
var bracket = 0;
|
|
514
|
-
var braces = 0;
|
|
515
|
-
var quote = 0;
|
|
516
|
-
for (var i = 0; i < s.length; ++i) {
|
|
517
|
-
var c = s.substring(i, i + 1);
|
|
518
|
-
if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {
|
|
519
|
-
ret.push(frag);
|
|
520
|
-
frag = '';
|
|
521
|
-
}
|
|
522
|
-
else {
|
|
523
|
-
frag += c;
|
|
524
|
-
if (quote > 0) {
|
|
525
|
-
if (c == '\\' && i + 1 < s.length) {
|
|
526
|
-
++i;
|
|
527
|
-
var c2 = s.substring(i, i + 1);
|
|
528
|
-
frag += c2;
|
|
529
|
-
c += c2;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
if (c == '\"') {
|
|
533
|
-
if (!(i > 0 && s.substring(i - 1, i) == '\\'))
|
|
534
|
-
quote = quote == 0 ? 1 : 0;
|
|
535
|
-
}
|
|
536
|
-
else if (c == '[')
|
|
537
|
-
++bracket;
|
|
538
|
-
else if (c == ']')
|
|
539
|
-
--bracket;
|
|
540
|
-
else if (c == '(')
|
|
541
|
-
++parentheses;
|
|
542
|
-
else if (c == ')')
|
|
543
|
-
--parentheses;
|
|
544
|
-
else if (c == '{')
|
|
545
|
-
++braces;
|
|
546
|
-
else if (c == '}')
|
|
547
|
-
--braces;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
ret.push(frag);
|
|
551
|
-
return ret;
|
|
552
|
-
}
|
|
553
|
-
function detachAnnotation(s) {
|
|
554
|
-
var ret = _detachAppendix(s, '\"');
|
|
555
|
-
if (ret.tag != null)
|
|
556
|
-
return ret;
|
|
557
|
-
var r = _detachAppendix(s, '\'');
|
|
558
|
-
return { tag: ret.tag, repeat: r.tag, str: r.str };
|
|
559
|
-
}
|
|
560
|
-
function _detachAppendix(s, c) {
|
|
561
|
-
var tag = null;
|
|
562
|
-
//@ts-ignore
|
|
563
|
-
if (scil.Utils.endswith(s, c)) {
|
|
564
|
-
var p = s.length - 1;
|
|
565
|
-
while (p > 0) {
|
|
566
|
-
p = s.lastIndexOf(c, p - 1);
|
|
567
|
-
if (p <= 0 || s.substring(p - 1, p) != '\\')
|
|
568
|
-
break;
|
|
569
|
-
}
|
|
570
|
-
if (p > 0 && p < s.length - 1) {
|
|
571
|
-
tag = s.substring(p + 1, s.length - 1);
|
|
572
|
-
s = s.substring(0, p);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
if (tag != null)
|
|
576
|
-
tag = tag.replace(new RegExp('\\' + c, 'g'), c);
|
|
577
|
-
return { tag: unescape(tag), str: s };
|
|
578
|
-
}
|
|
579
|
-
function unescape(s) {
|
|
580
|
-
//@ts-ignore
|
|
581
|
-
if (scil.Utils.isNullOrEmpty(s))
|
|
582
|
-
return s;
|
|
583
|
-
return s.replace(/[\\]./g, function (m) {
|
|
584
|
-
switch (m) {
|
|
585
|
-
case '\\r':
|
|
586
|
-
return '\r';
|
|
587
|
-
case '\\n':
|
|
588
|
-
return '\n';
|
|
589
|
-
case '\\t':
|
|
590
|
-
return '\t';
|
|
591
|
-
default:
|
|
592
|
-
return m.substring(1);
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
/***/ }),
|
|
599
|
-
|
|
600
|
-
/***/ "datagrok-api/dg":
|
|
601
|
-
/*!*********************!*\
|
|
602
|
-
!*** external "DG" ***!
|
|
603
|
-
\*********************/
|
|
604
|
-
/***/ ((module) => {
|
|
605
|
-
|
|
606
|
-
module.exports = DG;
|
|
607
|
-
|
|
608
|
-
/***/ }),
|
|
609
|
-
|
|
610
|
-
/***/ "datagrok-api/grok":
|
|
611
|
-
/*!***********************!*\
|
|
612
|
-
!*** external "grok" ***!
|
|
613
|
-
\***********************/
|
|
614
|
-
/***/ ((module) => {
|
|
615
|
-
|
|
616
|
-
module.exports = grok;
|
|
617
|
-
|
|
618
|
-
/***/ })
|
|
619
|
-
|
|
620
|
-
/******/ });
|
|
621
|
-
/************************************************************************/
|
|
622
|
-
/******/ // The module cache
|
|
623
|
-
/******/ var __webpack_module_cache__ = {};
|
|
624
|
-
/******/
|
|
625
|
-
/******/ // The require function
|
|
626
|
-
/******/ function __webpack_require__(moduleId) {
|
|
627
|
-
/******/ // Check if module is in cache
|
|
628
|
-
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
629
|
-
/******/ if (cachedModule !== undefined) {
|
|
630
|
-
/******/ return cachedModule.exports;
|
|
631
|
-
/******/ }
|
|
632
|
-
/******/ // Create a new module (and put it into the cache)
|
|
633
|
-
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
634
|
-
/******/ // no module.id needed
|
|
635
|
-
/******/ // no module.loaded needed
|
|
636
|
-
/******/ exports: {}
|
|
637
|
-
/******/ };
|
|
638
|
-
/******/
|
|
639
|
-
/******/ // Execute the module function
|
|
640
|
-
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
641
|
-
/******/
|
|
642
|
-
/******/ // Return the exports of the module
|
|
643
|
-
/******/ return module.exports;
|
|
644
|
-
/******/ }
|
|
645
|
-
/******/
|
|
646
|
-
/************************************************************************/
|
|
647
|
-
/******/ /* webpack/runtime/compat get default export */
|
|
648
|
-
/******/ (() => {
|
|
649
|
-
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
650
|
-
/******/ __webpack_require__.n = (module) => {
|
|
651
|
-
/******/ var getter = module && module.__esModule ?
|
|
652
|
-
/******/ () => (module['default']) :
|
|
653
|
-
/******/ () => (module);
|
|
654
|
-
/******/ __webpack_require__.d(getter, { a: getter });
|
|
655
|
-
/******/ return getter;
|
|
656
|
-
/******/ };
|
|
657
|
-
/******/ })();
|
|
658
|
-
/******/
|
|
659
|
-
/******/ /* webpack/runtime/define property getters */
|
|
660
|
-
/******/ (() => {
|
|
661
|
-
/******/ // define getter functions for harmony exports
|
|
662
|
-
/******/ __webpack_require__.d = (exports, definition) => {
|
|
663
|
-
/******/ for(var key in definition) {
|
|
664
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
665
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
666
|
-
/******/ }
|
|
667
|
-
/******/ }
|
|
668
|
-
/******/ };
|
|
669
|
-
/******/ })();
|
|
670
|
-
/******/
|
|
671
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
672
|
-
/******/ (() => {
|
|
673
|
-
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
674
|
-
/******/ })();
|
|
675
|
-
/******/
|
|
676
|
-
/******/ /* webpack/runtime/make namespace object */
|
|
677
|
-
/******/ (() => {
|
|
678
|
-
/******/ // define __esModule on exports
|
|
679
|
-
/******/ __webpack_require__.r = (exports) => {
|
|
680
|
-
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
681
|
-
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
682
|
-
/******/ }
|
|
683
|
-
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
684
|
-
/******/ };
|
|
685
|
-
/******/ })();
|
|
686
|
-
/******/
|
|
687
|
-
/************************************************************************/
|
|
688
|
-
var __webpack_exports__ = {};
|
|
689
|
-
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
690
|
-
(() => {
|
|
691
|
-
/*!*****************************!*\
|
|
692
|
-
!*** ./src/package-test.ts ***!
|
|
693
|
-
\*****************************/
|
|
694
|
-
__webpack_require__.r(__webpack_exports__);
|
|
695
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
696
|
-
/* harmony export */ "_package": () => (/* binding */ _package),
|
|
697
|
-
/* harmony export */ "test": () => (/* binding */ test),
|
|
698
|
-
/* harmony export */ "tests": () => (/* reexport safe */ _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.tests)
|
|
699
|
-
/* harmony export */ });
|
|
700
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
701
|
-
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
702
|
-
/* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
|
|
703
|
-
/* harmony import */ var _tests_helm_tests_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tests/helm-tests.ts */ "./src/tests/helm-tests.ts");
|
|
704
|
-
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
705
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
706
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
707
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
708
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
709
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
710
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
711
|
-
});
|
|
712
|
-
};
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Package();
|
|
717
|
-
|
|
718
|
-
//name: test
|
|
719
|
-
//input: string category {optional: true}
|
|
720
|
-
//input: string test {optional: true}
|
|
721
|
-
//input: object testContext {optional: true}
|
|
722
|
-
//output: dataframe result
|
|
723
|
-
function test(category, test, testContext) {
|
|
724
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
725
|
-
const data = yield (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.runTests)({ category, test, testContext });
|
|
726
|
-
return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromObjects(data);
|
|
727
|
-
});
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
})();
|
|
731
|
-
|
|
732
|
-
helm_test = __webpack_exports__;
|
|
733
|
-
/******/ })()
|
|
734
|
-
;
|
|
735
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDc0M7QUFDK0I7QUFDdEM7QUFDeEIscUJBQXFCLG9EQUFVO0FBQ3JCO0FBQ2pCO0FBQ0EsMEJBQTBCO0FBQzFCLHNCQUFzQjtBQUN0Qiw2QkFBNkI7QUFDN0I7QUFDTztBQUNQO0FBQ0EsMkJBQTJCLDRFQUFRLEdBQUcsNkJBQTZCO0FBQ25FLGVBQWUsa0VBQXdCO0FBQ3ZDLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdC5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL3Rlc3RzL2hlbG0tdGVzdHMudHMiLCJ3ZWJwYWNrOi8vaGVsbS8uL3NyYy91dGlscy50cyIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcIkRHXCIiLCJ3ZWJwYWNrOi8vaGVsbS9leHRlcm5hbCB2YXIgXCJncm9rXCIiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2hlbG0vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2hlbG0vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vaGVsbS8uL3NyYy9wYWNrYWdlLXRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5leHBvcnQgY29uc3QgdGVzdHMgPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5O1xuZXhwb3J0IHZhciBhc3N1cmU7XG4oZnVuY3Rpb24gKGFzc3VyZSkge1xuICAgIGZ1bmN0aW9uIG5vdE51bGwodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYCk7XG4gICAgfVxuICAgIGFzc3VyZS5ub3ROdWxsID0gbm90TnVsbDtcbn0pKGFzc3VyZSB8fCAoYXNzdXJlID0ge30pKTtcbmV4cG9ydCBjbGFzcyBUZXN0Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2F0Y2hVbmhhbmRsZWQsIHJlcG9ydCkge1xuICAgICAgICB0aGlzLmNhdGNoVW5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBvcnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNhdGNoVW5oYW5kbGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xuICAgIH1cbiAgICA7XG59XG5leHBvcnQgY2xhc3MgVGVzdCB7XG4gICAgY29uc3RydWN0b3IoY2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IChvcHRpb25zID0ge30pO1xuICAgICAgICAoX2EgPSBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChvcHRpb25zLnRpbWVvdXQgPSAzMDAwMCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudGVzdCA9ICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIHRlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RXZlbnQoZXZlbnQsIGhhbmRsZXIsIHRyaWdnZXIsIG1zID0gMCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBzdWI7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdWIgPSBldmVudC5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICB9LCBtcyk7XG4gICAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZSwgdGVzdCwgb3B0aW9ucykge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cbi8qIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsLCBleHBlY3RlZCwgdG9sZXJhbmNlID0gMC4wMDEpIHtcbiAgICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgICBpZiAoIWFyZUVxdWFsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuICAgICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgICAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICAgICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICAgICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgICAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgICB9XG59XG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeSwgdGVzdHMpIHtcbiAgICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICB0ZXN0cygpO1xufVxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZSkge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihhZnRlcikge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHZhciBfZTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gKF9iID0gKF9hID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZ1bmMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYWNrYWdlO1xuICAgICAgICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiAob3B0aW9ucyA9IHt9KTtcbiAgICAgICAgKF9jID0gKF9lID0gb3B0aW9ucykudGVzdENvbnRleHQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IChfZS50ZXN0Q29udGV4dCA9IG5ldyBUZXN0Q29udGV4dCgpKTtcbiAgICAgICAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeSkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYmVmb3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmJlZm9yZVN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHQgPSAoX2QgPSB2YWx1ZS50ZXN0cykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW107XG4gICAgICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICByZXMucHVzaCh5aWVsZCBleGVjVGVzdCh0W2ldLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGVzdCkpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9ICh5aWVsZCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYWZ0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuYWZ0ZXJTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgY2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmFmdGVyU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZVN0YXR1cylcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goeyBjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYmVmb3JlU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LmNhdGNoVW5oYW5kbGVkKSB7XG4gICAgICAgICAgICB5aWVsZCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgIGlmIChncm9rLnNoZWxsLmxhc3RFcnJvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgICAgICAgICAgY29uc3QgbG9nZ2VyID0gbmV3IERHLkxvZ2dlcigpO1xuICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBmYWlsZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gIXIuc3VjY2Vzcyk7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICdQYWNrYWdlIEBwYWNrYWdlIHRlc3RlZDogQHN1Y2Nlc3NmdWwgc3VjY2Vzc2Z1bCwgQHNraXBwZWQgc2tpcHBlZCwgQGZhaWxlZCBmYWlsZWQgdGVzdHMnO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICAgICAgICAgICAgc2tpcHBlZDogc2tpcHBlZCxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcGFja2FnZTogcGFja2FnZU5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgZmFpbGVkKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IFtgJHtyLmNhdGVnb3J5fSB8ICR7ci5uYW1lfWBdOiByLnJlc3VsdCB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5sb2coZGVzY3JpcHRpb24sIHBhcmFtcywgJ3BhY2thZ2UtdGVzdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBleGVjVGVzdCh0LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcjtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgY29uc3Qgc2tpcCA9ICgoX2EgPSB0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5za2lwUmVhc29uKSB8fCBmaWx0ZXI7XG4gICAgICAgIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiAoX2IgPSB0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5za2lwUmVhc29uO1xuICAgICAgICBpZiAoIXNraXApXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICByID0geyBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24sIG1zOiAwLCBza2lwcGVkOiB0cnVlIH07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgciA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiAoX2MgPSB5aWVsZCB0LnRlc3QoKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHIgPSB7IHN1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgci5tcyA9IHN0b3AgLSBzdGFydDtcbiAgICAgICAgaWYgKCFza2lwKVxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG4gICAgICAgIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICAgICAgICByLm5hbWUgPSB0Lm5hbWU7XG4gICAgICAgIHJldHVybiByO1xuICAgIH0pO1xufVxuLyogV2FpdHMgW21zXSBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxheShtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXIsIGVycm9yID0gJ1RpbWVvdXQgZXhjZWVkZWQnLCB3YWl0ID0gNTAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgIH0sIHdhaXQpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RpYWxvZ1ByZXNlbnQoZGlhbG9nVGl0bGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERHLkRpYWxvZy5nZXRPcGVuRGlhbG9ncygpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKVtpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdFZpZXdlcih2LCBkZiwgZGV0ZWN0U2VtYW50aWNUeXBlcyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGRldGVjdFNlbWFudGljVHlwZXMpXG4gICAgICAgICAgICB5aWVsZCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgICAgIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICAgICAgICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2aWV3ZXIgPSB0di5hZGRWaWV3ZXIodik7XG4gICAgICAgICAgICB5aWVsZCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLCAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgICAgICAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGRmLnJvdygwKS5jZWxscykuZm9yRWFjaCgoYykgPT4gYy52YWx1ZSA9IG51bGwpO1xuICAgICAgICAgICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDc7IGkgPCAxMjsgaSsrKVxuICAgICAgICAgICAgICAgIGRmLmZpbHRlci5zZXQoaSwgZmFsc2UpO1xuICAgICAgICAgICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoaykgPT4gdHlwZW9mIHByb3BzW2tdID09PSAnYm9vbGVhbicpLmZvckVhY2goKGspID0+IG5ld1Byb3BzW2tdID0gIXByb3BzW2tdKTtcbiAgICAgICAgICAgIHZpZXdlci5zZXRPcHRpb25zKG5ld1Byb3BzKTtcbiAgICAgICAgICAgIHlpZWxkIGRlbGF5KDI1MCk7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKCkubG9vaztcbiAgICAgICAgICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgICAgICAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgICAgICAgICB0di5sb2FkTGF5b3V0KGxheW91dCk7XG4gICAgICAgICAgICB5aWVsZCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLCAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgICAgICAgICB5aWVsZCBkZWxheSgyNTApO1xuICAgICAgICAgICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgICAgICAgICAgdmlld2VyID0gQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5maW5kKCh2KSA9PiB2LnR5cGUgIT09ICdHcmlkJyk7XG4gICAgICAgICAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHR2LmNsb3NlKCk7XG4gICAgICAgICAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkR1Z6ZEM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblJsYzNRdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVUVzVDBGQlR5eExRVUZMTEVsQlFVa3NUVUZCVFN4dFFrRkJiVUlzUTBGQlF6dEJRVU14UXl4UFFVRlBMRXRCUVVzc1JVRkJSU3hOUVVGTkxHbENRVUZwUWl4RFFVRkRPMEZCU1hSRExFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NSMEZMWkN4RlFVRkZMRU5CUVVNN1FVRkZVQ3hOUVVGTkxFTkJRVU1zU1VGQlNTeGxRVUYxUWl4RFFVRkRPMEZCUlc1RExFMUJRVTBzUzBGQlZ5eE5RVUZOTEVOQlRYUkNPMEZCVGtRc1YwRkJhVUlzVFVGQlRUdEpRVVZ5UWl4VFFVRm5RaXhQUVVGUExFTkJRVU1zUzBGQlZTeEZRVUZGTEVsQlFXRTdVVUZETDBNc1NVRkJTU3hMUVVGTExFbEJRVWtzU1VGQlNUdFpRVU5tTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc1IwRkJSeXhKUVVGSkxFbEJRVWtzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzWTBGQll5eERRVUZETEVOQlFVTTdTVUZEY0VVc1EwRkJRenRKUVVobExHTkJRVThzVlVGSGRFSXNRMEZCUVR0QlFVTklMRU5CUVVNc1JVRk9aMElzVFVGQlRTeExRVUZPTEUxQlFVMHNVVUZOZEVJN1FVRlJSQ3hOUVVGTkxFOUJRVThzVjBGQlZ6dEpRVWwwUWl4WlFVRlpMR05CUVhkQ0xFVkJRVVVzVFVGQlowSTdVVUZJZEVRc2JVSkJRV01zUjBGQlJ5eEpRVUZKTEVOQlFVTTdVVUZEZEVJc1YwRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF6dFJRVWRpTEVsQlFVa3NZMEZCWXl4TFFVRkxMRk5CUVZNN1dVRkJSU3hKUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEdOQlFXTXNRMEZCUXp0UlFVTjJSU3hKUVVGSkxFMUJRVTBzUzBGQlN5eFRRVUZUTzFsQlFVVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03U1VGRGFrUXNRMEZCUXp0SlFVRkJMRU5CUVVNN1EwRkRTRHRCUVVWRUxFMUJRVTBzVDBGQlR5eEpRVUZKTzBsQlRXWXNXVUZCV1N4UlFVRm5RaXhGUVVGRkxFbEJRVmtzUlVGQlJTeEpRVUYzUWl4RlFVRkZMRTlCUVhGQ096dFJRVU42Uml4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF6dFJRVU42UWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF6dFJRVU5xUWl4UFFVRlBMR0ZCUVZBc1QwRkJUeXhqUVVGUUxFOUJRVThzU1VGQlVDeFBRVUZQTEVkQlFVc3NSVUZCUlN4RlFVRkRPMUZCUTJZc1RVRkJRU3hQUVVGUExFTkJRVU1zVDBGQlR5eHZRMEZCWml4UFFVRlBMRU5CUVVNc1QwRkJUeXhIUVVGTExFdEJRVXNzUlVGQlF6dFJRVU14UWl4SlFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF6dFJRVU4yUWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFZEJRWFZDTEVWQlFVVTdXVUZEYmtNc1QwRkJUeXhKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZQTEU5QlFVOHNSVUZCUlN4TlFVRk5MRVZCUVVVc1JVRkJSVHRuUWtGRE0wTXNTVUZCU1N4TlFVRk5MRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU5vUWl4SlFVRkpPMjlDUVVOR0xFMUJRVTBzUjBGQlJ5eE5RVUZOTEVsQlFVa3NSVUZCUlN4RFFVRkRPMmxDUVVOMlFqdG5Ra0ZCUXl4UFFVRlBMRU5CUVUwc1JVRkJSVHR2UWtGRFppeE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2FVSkJRMWc3WjBKQlEwUXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xbEJRMnhDTEVOQlFVTXNRMEZCUVN4RFFVRkRMRU5CUVVNN1VVRkRUQ3hEUVVGRExFTkJRVUVzUTBGQlF6dEpRVU5LTEVOQlFVTTdRMEZEUmp0QlFVVkVMRTFCUVUwc1ZVRkJaMElzVTBGQlV5eERRVUZKTEV0QlFXOUNMRVZCUTNKRUxFOUJRVEJDTEVWQlFVVXNUMEZCYlVJc1JVRkJSU3hMUVVGaExFTkJRVU03TzFGQlF5OUVMRWxCUVVrc1IwRkJhVUlzUTBGQlF6dFJRVU4wUWl4UFFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zVDBGQlR5eEZRVUZGTEUxQlFVMHNSVUZCUlN4RlFVRkZPMWxCUTNKRExFZEJRVWNzUjBGQlJ5eExRVUZMTEVOQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFVkJRVVU3WjBKQlF6ZENMRWxCUVVrN2IwSkJRMFlzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMmxDUVVObU8yZENRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZPMjlDUVVOV0xFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0cFFrRkRXRHRuUWtGRFJDeEhRVUZITEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNN1owSkJRMnhDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRaUVVOb1FpeERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTklMRlZCUVZVc1EwRkJReXhIUVVGSExFVkJRVVU3WjBKQlEyUXNSMEZCUnl4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8yZENRVU5zUWl4M1JFRkJkMFE3WjBKQlEzaEVMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFpRVU53UWl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03V1VGRFVDeFBRVUZQTEVWQlFVVXNRMEZCUXp0UlFVTmFMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRMHdzUTBGQlF6dERRVUZCTzBGQlJVUXNUVUZCVFN4VlFVRlZMRWxCUVVrc1EwRkJReXhKUVVGWkxFVkJRVVVzU1VGQmQwSXNSVUZCUlN4UFFVRnhRanRKUVVOb1JpeEpRVUZKTEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1NVRkJTU3hUUVVGVE8xRkJRM0pETEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRE9VSXNTVUZCU1N4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUzBGQlN5eEpRVUZKTEZOQlFWTTdVVUZETTBNc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETEV0QlFVc3NSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRjRU1zUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRXRCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRWxCUVVrc1JVRkJSU3hKUVVGSkxFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnlSaXhEUVVGRE8wRkJSVVFzWjBaQlFXZEdPMEZCUTJoR0xFMUJRVTBzVlVGQlZTeE5RVUZOTEVOQlFVTXNUVUZCVnl4RlFVRkZMRkZCUVdFN1NVRkRMME1zU1VGQlNTeE5RVUZOTEV0QlFVc3NVVUZCVVR0UlFVTnlRaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEdGQlFXRXNVVUZCVVN4WFFVRlhMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGREwwUXNRMEZCUXp0QlFVVkVMRTFCUVUwc1ZVRkJWU3hYUVVGWExFTkJRVU1zVFVGQll5eEZRVUZGTEZGQlFXZENMRVZCUVVVc1UwRkJVeXhIUVVGSExFdEJRVXM3U1VGRE4wVXNUVUZCVFN4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eE5RVUZOTEVkQlFVY3NVVUZCVVN4RFFVRkRMRWRCUVVjc1UwRkJVeXhEUVVGRE8wbEJRM3BFTEVsQlFVa3NRMEZCUXl4UlFVRlJPMUZCUTFnc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTEZGQlFWRXNVMEZCVXl4TlFVRk5MR2xDUVVGcFFpeFRRVUZUTEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTNSR0xFTkJRVU03UVVGRlJDeE5RVUZOTEZWQlFWVXNXVUZCV1N4RFFVRkRMRTFCUVRoQ0xFVkJRVVVzVVVGQlowTTdTVUZETTBZc1MwRkJTeXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEdGQlFXRXNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVVVGQlVTeERRVUZETEVWQlFVVTdVVUZEYmtVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eGpRVUZqTEVOQlFVTXNWMEZCVnl4RFFVRkRPMWxCUTNKRExFMUJRVTBzU1VGQlNTeExRVUZMTEVOQlFVTXNjMEpCUVhOQ0xGZEJRVmNzWVVGQllTeERRVUZETEVOQlFVTTdVVUZGYkVVc1RVRkJUU3hYUVVGWExFZEJRVWNzVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMUZCUTNoRExFbEJRVWtzVjBGQlZ5eFpRVUZaTEV0QlFVc3NTVUZCU1N4aFFVRmhMRmxCUVZrc1MwRkJTenRaUVVOb1JTeFhRVUZYTEVOQlFVTXNWMEZCVnl4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRE8yRkJRM0pETEVsQlFVa3NWMEZCVnl4WlFVRlpMRTFCUVUwc1NVRkJTU3hoUVVGaExGbEJRVmtzVFVGQlRUdFpRVU4yUlN4WlFVRlpMRU5CUVVNc1YwRkJWeXhGUVVGRkxHRkJRV0VzUTBGQlF5eERRVUZETzJGQlEzUkRMRWxCUVVrc1RVRkJUU3hEUVVGRExGRkJRVkVzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF6dFpRVU55UlN4WFFVRlhMRU5CUVVNc1YwRkJWeXhGUVVGRkxHRkJRV0VzUTBGQlF5eERRVUZETzJGQlEzSkRMRWxCUVVrc1YwRkJWeXhKUVVGSkxHRkJRV0U3V1VGRGJrTXNUVUZCVFN4SlFVRkpMRXRCUVVzc1EwRkJReXhoUVVGaExHRkJRV0VzWTBGQll5eFhRVUZYTEZkQlFWY3NWMEZCVnl4SFFVRkhMRU5CUVVNc1EwRkJRenRMUVVOcVJ6dEJRVU5JTEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1YwRkJWeXhEUVVGRExFMUJRWE5DTEVWQlFVVXNVVUZCZDBJN1NVRkRNVVVzVFVGQlRTeFpRVUZaTEVkQlFVY3NUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJRenRKUVVOdVF5eE5RVUZOTEdOQlFXTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRE8wbEJSWFpETEVsQlFVa3NXVUZCV1N4SlFVRkpMR05CUVdNc1JVRkJSVHRSUVVOc1F5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMREJFUVVFd1JDeFpRVUZaTEVkQlFVYzdXVUZEZGtZc1owTkJRV2RETEdOQlFXTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1MwRkRja1E3U1VGRlJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzV1VGQldTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUTNKRExFbEJRVWtzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRXRCUVVzc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NTMEZCU3p0WlFVTTFSQ3hYUVVGWExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJGQlEycERMRWxCUVVrc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEUxQlFVMHNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExGbEJRVmtzVFVGQlRUdFpRVU51UlN4WlFVRlpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yRkJRMnhETEVsQlFVa3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdXVUZETDBJc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNVMEZCVXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzB0QlEycEdPMEZCUTBnc1EwRkJRenRCUVVWRUxESkNRVUV5UWp0QlFVTXpRaXhOUVVGTkxGVkJRVlVzVVVGQlVTeERRVUZETEZGQlFXZENMRVZCUVVVc1MwRkJhVUk3U1VGRE1VUXNaVUZCWlN4SFFVRkhMRkZCUVZFc1EwRkJRenRKUVVNelFpeExRVUZMTEVWQlFVVXNRMEZCUXp0QlFVTldMRU5CUVVNN1FVRkZSQ3gxUmtGQmRVWTdRVUZEZGtZc1RVRkJUU3hWUVVGVkxFMUJRVTBzUTBGQlF5eE5RVUV5UWp0SlFVTm9SQ3hKUVVGSkxFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNTVUZCU1N4VFFVRlRPMUZCUTNKRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRPVUlzUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGVrTXNRMEZCUXp0QlFVVkVMSE5HUVVGelJqdEJRVU4wUml4TlFVRk5MRlZCUVZVc1MwRkJTeXhEUVVGRExFdEJRVEJDTzBsQlF6bERMRWxCUVVrc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eEpRVUZKTEZOQlFWTTdVVUZEY2tNc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTTVRaXhMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVOMlF5eERRVUZETzBGQlIwUXNUVUZCVFN4VlFVRm5RaXhSUVVGUkxFTkJRVU1zVDBGQmVVVTdPenM3VVVGRGRFY3NUVUZCVFN4UFFVRlBMRWRCUTNWRUxFVkJRVVVzUTBGQlF6dFJRVU4yUlN4TlFVRk5MRmRCUVZjc1IwRkJSeXhOUVVGQkxFMUJRVUVzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4alFVRmpMRVZCUVVVc01FTkJRVVVzU1VGQlNTd3dRMEZCUlN4UFFVRlBMRU5CUVVNN1VVRkRia1VzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJRenRSUVVNM1FpeFBRVUZQTEdGQlFWQXNUMEZCVHl4alFVRlFMRTlCUVU4c1NVRkJVQ3hQUVVGUExFZEJRVXNzUlVGQlJTeEZRVUZETzFGQlEyWXNXVUZCUVN4UFFVRlJMRVZCUVVNc1YwRkJWeXgxUTBGQldDeFhRVUZYTEVkQlFVc3NTVUZCU1N4WFFVRlhMRVZCUVVVc1JVRkJRenRSUVVNelF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRk5CUVZNc1IwRkJSeXhGUVVGRkxFTkJRVU03VVVGRE1VSXNTMEZCU3l4TlFVRk5MRU5CUVVNc1IwRkJSeXhGUVVGRkxFdEJRVXNzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3V1VGRGFFUXNTVUZCU1N4RFFVRkJMRTlCUVU4c1lVRkJVQ3hQUVVGUExIVkNRVUZRTEU5QlFVOHNRMEZCUlN4UlFVRlJMRXRCUVVrc1UwRkJVeXhGUVVGRk8yZENRVU5zUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEZWQlFWVXNRMEZCUXl4UFFVRlBMR0ZCUVZBc1QwRkJUeXgxUWtGQlVDeFBRVUZQTEVOQlFVVXNVVUZCVVN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8yOUNRVU5vUlN4VFFVRlRPMkZCUTFvN1dVRkRSQ3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEZkQlFWY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1EwRkJRenRaUVVOMlF5eEpRVUZKTzJkQ1FVTkdMRWxCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTA3YjBKQlEyUXNUVUZCVFN4TFFVRkxMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03WVVGRGVFSTdXVUZCUXl4UFFVRlBMRU5CUVUwc1JVRkJSVHRuUWtGRFppeExRVUZMTEVOQlFVTXNXVUZCV1N4SFFVRkhMRU5CUVVNc1EwRkJReXhSUVVGUkxFVkJRVVVzUTBGQlF6dGhRVU51UXp0WlFVTkVMRTFCUVUwc1EwRkJReXhIUVVGSExFMUJRVUVzUzBGQlN5eERRVUZETEV0QlFVc3NiVU5CUVVrc1JVRkJSU3hEUVVGRE8xbEJRelZDTEUxQlFVMHNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVObUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlR0blFrRkRMMElzUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNUMEZCVHl4aFFVRlFMRTlCUVU4c2RVSkJRVkFzVDBGQlR5eERRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkZhRVFzVFVGQlRTeEpRVUZKTEVkQlFVY3NRMEZCUXl4TlFVRk5MRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWxCUVVrc1UwRkJVeXhEUVVGRExFTkJRVU03V1VGRE0wVXNTVUZCU1R0blFrRkRSaXhKUVVGSkxFdEJRVXNzUTBGQlF5eExRVUZMTzI5Q1FVTmlMRTFCUVUwc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETzJGQlEzWkNPMWxCUVVNc1QwRkJUeXhEUVVGTkxFVkJRVVU3WjBKQlEyWXNTMEZCU3l4RFFVRkRMRmRCUVZjc1IwRkJSeXhEUVVGRExFTkJRVU1zVVVGQlVTeEZRVUZGTEVOQlFVTTdZVUZEYkVNN1dVRkRSQ3hKUVVGSkxFdEJRVXNzUTBGQlF5eFhRVUZYTzJkQ1FVTnVRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVTXNVVUZCVVN4RlFVRkZMRWRCUVVjc1JVRkJSU3hKUVVGSkxFVkJRVVVzVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4TFFVRkxMRU5CUVVNc1YwRkJWeXhGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZETEVOQlFVTXNRMEZCUXp0WlFVTTNSeXhKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTzJkQ1FVTndRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVTXNVVUZCVVN4RlFVRkZMRWRCUVVjc1JVRkJSU3hKUVVGSkxFVkJRVVVzVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4TFFVRkxMRU5CUVVNc1dVRkJXU3hGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZETEVOQlFVTXNRMEZCUXp0WlFVTTVSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRU5CUVVNN1UwRkRka0k3VVVGRFJDeEpRVUZKTEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1kwRkJZeXhGUVVGRk8xbEJRM1JETEUxQlFVMHNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xbEJRMnhDTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0blFrRkRia01zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXp0dlFrRkRXQ3hSUVVGUkxFVkJRVVVzYzBKQlFYTkNPMjlDUVVOb1F5eEpRVUZKTEVWQlFVVXNXVUZCV1R0dlFrRkRiRUlzVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJVeXhGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN6dHBRa0ZEY0VVc1EwRkJReXhEUVVGRE8yRkJRMG83VTBGRFJqdFJRVU5FTEVsQlFVa3NUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhOUVVGTkxFVkJRVVU3V1VGRE9VSXNUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hGUVVGRkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdXVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJRenRaUVVNelJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETzFsQlEzaEVMRTFCUVUwc1RVRkJUU3hIUVVGSExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMWxCUTJwRUxFMUJRVTBzVjBGQlZ5eEhRVUZITEhsR1FVRjVSaXhEUVVGRE8xbEJRemxITEUxQlFVMHNUVUZCVFN4SFFVRkhPMmRDUVVOaUxGVkJRVlVzUlVGQlJTeFZRVUZWTzJkQ1FVTjBRaXhQUVVGUExFVkJRVVVzVDBGQlR6dG5Ra0ZEYUVJc1RVRkJUU3hGUVVGRkxFMUJRVTBzUTBGQlF5eE5RVUZOTzJkQ1FVTnlRaXhQUVVGUExFVkJRVVVzVjBGQlZ6dGhRVU55UWl4RFFVRkRPMWxCUTBZc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTzJkQ1FVRkZMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVWQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhSUVVGUkxFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVOQlFVTTdXVUZEZWtZc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eFhRVUZYTEVWQlFVVXNUVUZCVFN4RlFVRkZMR2RDUVVGblFpeERRVUZETEVOQlFVTTdVMEZEYmtRN1VVRkRSQ3hQUVVGUExFOUJRVThzUTBGQlF6czdRMEZEYUVJN1FVRkZSQ3hUUVVGbExGRkJRVkVzUTBGQlF5eERRVUZQTEVWQlFVVXNVMEZCTmtJN096dFJRVU0xUkN4SlFVRkpMRU5CUVhWSExFTkJRVU03VVVGRE5VY3NUVUZCVFN4TlFVRk5MRWRCUVVjc1UwRkJVeXhKUVVGSkxGTkJRVk1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eFZRVUZWTEVOQlFVTXNVMEZCVXl4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU55Unl4TlFVRk5MRWxCUVVrc1IwRkJSeXhEUVVGQkxFMUJRVUVzUTBGQlF5eERRVUZETEU5QlFVOHNNRU5CUVVVc1ZVRkJWU3hMUVVGSkxFMUJRVTBzUTBGQlF6dFJRVU0zUXl4TlFVRk5MRlZCUVZVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJRU3hEUVVGRExFTkJRVU1zVDBGQlR5d3dRMEZCUlN4VlFVRlZMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeERRVUZETEVsQlFVazdXVUZEVUN4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU5xUkN4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFGQlJYcENMRWxCUVVrN1dVRkRSaXhKUVVGSkxFbEJRVWs3WjBKQlEwNHNRMEZCUXl4SFFVRkhMRVZCUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVnl4RlFVRkZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVVzVDBGQlR5eEZRVUZGTEVsQlFVa3NSVUZCUXl4RFFVRkRPenRuUWtGRkwwUXNRMEZCUXl4SFFVRkhMRVZCUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeE5RVUZOTEVWQlFVVXNUVUZCUVN4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzYlVOQlFVa3NTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVVzVDBGQlR5eEZRVUZGTEV0QlFVc3NSVUZCUXl4RFFVRkRPMU5CUXpsRk8xRkJRVU1zVDBGQlR5eERRVUZOTEVWQlFVVTdXVUZEWml4RFFVRkRMRWRCUVVjc1JVRkJReXhQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZGTEUxQlFVMHNSVUZCUlN4RFFVRkRMRU5CUVVNc1VVRkJVU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVOQlFVTXNSVUZCUlN4UFFVRlBMRVZCUVVVc1MwRkJTeXhGUVVGRExFTkJRVU03VTBGRGJrVTdVVUZEUkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFGQlEzaENMR0ZCUVdFN1VVRkRZaXhEUVVGRExFTkJRVU1zUlVGQlJTeEhRVUZITEVsQlFVa3NSMEZCUnl4TFFVRkxMRU5CUVVNN1VVRkRjRUlzU1VGQlNTeERRVUZETEVsQlFVazdXVUZEVUN4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUldwRkxFTkJRVU1zUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4RFFVRkRMRkZCUVZFc1EwRkJRenRSUVVONFFpeERRVUZETEVOQlFVTXNTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU03VVVGRGFFSXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wTkJRMVk3UVVGRlJDdzJRa0ZCTmtJN1FVRkROMElzVFVGQlRTeFZRVUZuUWl4TFFVRkxMRU5CUVVNc1JVRkJWVHM3VVVGRGNFTXNUVUZCVFN4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6bERMRU5CUVVNN1EwRkJRVHRCUVVWRUxFMUJRVTBzVlVGQlowSXNWVUZCVlN4RFFVRkRMRmxCUVRKQ0xFVkJRekZFTEZGQlFXZENMR3RDUVVGclFpeEZRVUZGTEU5QlFXVXNSMEZCUnpzN1VVRkRkRVFzVDBGQlR5eEpRVUZKTEU5QlFVOHNRMEZCUXl4RFFVRkRMRTlCUVU4c1JVRkJSU3hOUVVGTkxFVkJRVVVzUlVGQlJUdFpRVU55UXl4VlFVRlZMRU5CUVVNc1IwRkJSeXhGUVVGRk8yZENRVU5rTEdGQlFXRXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRuUWtGRGVFSXNUVUZCVFN4RFFVRkRMRWxCUVVrc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTTdXVUZETTBJc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETzFsQlExUXNZVUZCWVR0WlFVTmlMRTFCUVUwc1VVRkJVU3hIUVVGWkxGZEJRVmNzUTBGQlF5eEhRVUZITEVWQlFVVTdaMEpCUTNwRExFbEJRVWtzV1VGQldTeEZRVUZGTEVWQlFVVTdiMEpCUTJ4Q0xHRkJRV0VzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0dlFrRkRlRUlzVDBGQlR5eEZRVUZGTEVOQlFVTTdhVUpCUTFnN1dVRkRTQ3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTTdVVUZEVkN4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOTUxFTkJRVU03UTBGQlFUdEJRVVZFTEUxQlFVMHNWVUZCVlN4bFFVRmxMRU5CUVVNc1YwRkJiVUk3U1VGRGFrUXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUXpGRUxFbEJRVWtzUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4alFVRmpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NWMEZCVnp0WlFVTndSQ3hQUVVGUExFbEJRVWtzUTBGQlF6dExRVU5tTzBsQlEwUXNUMEZCVHl4TFFVRkxMRU5CUVVNN1FVRkRaaXhEUVVGRE8wRkJSVVFzVFVGQlRTeFZRVUZuUWl4VlFVRlZMRU5CUVVNc1EwRkJVeXhGUVVGRkxFVkJRV2RDTEVWQlFVVXNjMEpCUVN0Q0xFdEJRVXM3TzFGQlEyaEhMRWxCUVVrc2JVSkJRVzFDTzFsQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8xRkJRMnBGTEUxQlFVMHNSVUZCUlN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMUZCUTNaRExFMUJRVTBzVlVGQlZTeEhRVUZITEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRU5CUVVNc1MwRkJTeXhEUVVGRE8xRkJReTlFTEUxQlFVMHNVVUZCVVN4SFFVRkhMRWRCUVVjc1ZVRkJWU3hYUVVGWExGVkJRVlVzVVVGQlVTeFZRVUZWTzAxQlEycEZMRlZCUVZVc1ZVRkJWU3hWUVVGVkxFOUJRVThzVlVGQlZTeEpRVUZKTEVOQlFVTTdVVUZEZUVRc1RVRkJUU3hIUVVGSExFZEJRVWNzUlVGQlJTeERRVUZETzFGQlEyWXNTVUZCU1R0WlFVTkdMRWxCUVVrc1RVRkJUU3hIUVVGSExFVkJRVVVzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkROMElzVFVGQlRTeFZRVUZWTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4SlFVRkpMRVZCUXpsRUxHOUNRVUZ2UWl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8xbEJRemxDTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03V1VGRGVFTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNRMEZCUXp0WlFVTXpSQ3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRWxCUVVrc1IwRkJSeXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTndSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdG5Ra0ZCUlN4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRja1FzUlVGQlJTeERRVUZETEdGQlFXRXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRja0lzVFVGQlRTeExRVUZMTEVkQlFVY3NUVUZCVFN4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdXVUZETTBNc1RVRkJUU3hSUVVGUkxFZEJRVFJDTEVWQlFVVXNRMEZCUXp0WlFVTTNReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNUMEZCVHl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTjRSeXhOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMWxCUXpWQ0xFMUJRVTBzUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJwQ0xFMUJRVTBzVFVGQlRTeEhRVUZITEVWQlFVVXNRMEZCUXl4VlFVRlZMRVZCUVVVc1EwRkJRenRaUVVNdlFpeE5RVUZOTEZGQlFWRXNSMEZCUnl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETzFsQlF6RkRMRVZCUVVVc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF6dFpRVU5xUWl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFsQlEzaERMRVZCUVVVc1EwRkJReXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdXVUZEZEVJc1RVRkJUU3hWUVVGVkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eEpRVUZKTEVWQlF6bEVMR2REUVVGblF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUXpGRExFMUJRVTBzUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJwQ0xFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1dVRkRlRU1zVFVGQlRTeEhRVUZITEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NTMEZCU3l4TlFVRk5MRU5CUVVVc1EwRkJRenRaUVVOb1JTeFhRVUZYTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUXpWQ0xFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdVMEZETlVVN1owSkJRVk03V1VGRFVpeEZRVUZGTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNN1dVRkRXQ3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZWQlFWVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRUUVVNelFqdEpRVU5JTEVOQlFVTTdRMEZCUVNJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENBcUlHRnpJR2R5YjJzZ1puSnZiU0FuWkdGMFlXZHliMnN0WVhCcEwyZHliMnNuTzF4dWFXMXdiM0owSUNvZ1lYTWdSRWNnWm5KdmJTQW5aR0YwWVdkeWIyc3RZWEJwTDJSbkp6dGNibWx0Y0c5eWRDQjdUMkp6WlhKMllXSnNaU3dnVTNWaWMyTnlhWEIwYVc5dWZTQm1jbTl0SUNkeWVHcHpKenRjYm1sdGNHOXlkQ0JVYVcxbGIzVjBJRDBnVG05a1pVcFRMbFJwYldWdmRYUTdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQjBaWE4wY3pvZ2UxeHVJQ0JiYTJWNU9pQnpkSEpwYm1kZE9pQjdYRzRnSUNBZ2RHVnpkSE0vT2lCVVpYTjBXMTBzSUdKbFptOXlaVDg2SUNncElEMCtJRkJ5YjIxcGMyVThkbTlwWkQ0c0lHRm1kR1Z5UHpvZ0tDa2dQVDRnVUhKdmJXbHpaVHgyYjJsa1BpeGNiaUFnSUNCaVpXWnZjbVZUZEdGMGRYTS9PaUJ6ZEhKcGJtY3NJR0ZtZEdWeVUzUmhkSFZ6UHpvZ2MzUnlhVzVuWEc0Z0lIMWNibjBnUFNCN2ZUdGNibHh1Wlhod2IzSjBJR3hsZENCamRYSnlaVzUwUTJGMFpXZHZjbms2SUhOMGNtbHVaenRjYmx4dVpYaHdiM0owSUc1aGJXVnpjR0ZqWlNCaGMzTjFjbVVnZTF4dVhHNGdJR1Y0Y0c5eWRDQm1kVzVqZEdsdmJpQnViM1JPZFd4c0tIWmhiSFZsT2lCaGJua3NJRzVoYldVL09pQnpkSEpwYm1jcElIdGNiaUFnSUNCcFppQW9kbUZzZFdVZ1BUMGdiblZzYkNsY2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnSkh0dVlXMWxJRDA5SUc1MWJHd2dQeUFuVm1Gc2RXVW5JRG9nYm1GdFpYMGdibTkwSUdSbFptbHVaV1JnS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ2FXNTBaWEptWVdObElGUmxjM1JQY0hScGIyNXpJSHRjYmlBZ2RHbHRaVzkxZEQ4NklHNTFiV0psY2p0Y2JpQWdkVzVvWVc1a2JHVmtSWGhqWlhCMGFXOXVWR2x0Wlc5MWREODZJRzUxYldKbGNqdGNiaUFnYzJ0cGNGSmxZWE52Ymo4NklITjBjbWx1Wnp0Y2JuMWNibHh1Wlhod2IzSjBJR05zWVhOeklGUmxjM1JEYjI1MFpYaDBJSHRjYmlBZ1kyRjBZMmhWYm1oaGJtUnNaV1FnUFNCMGNuVmxPMXh1SUNCeVpYQnZjblFnUFNCbVlXeHpaVHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWhqWVhSamFGVnVhR0Z1Wkd4bFpEODZJR0p2YjJ4bFlXNHNJSEpsY0c5eWREODZJR0p2YjJ4bFlXNHBJSHRjYmlBZ0lDQnBaaUFvWTJGMFkyaFZibWhoYm1Sc1pXUWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2RHaHBjeTVqWVhSamFGVnVhR0Z1Wkd4bFpDQTlJR05oZEdOb1ZXNW9ZVzVrYkdWa08xeHVJQ0FnSUdsbUlDaHlaWEJ2Y25RZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZEdocGN5NXlaWEJ2Y25RZ1BTQnlaWEJ2Y25RN1hHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCVVpYTjBJSHRjYmlBZ2RHVnpkRG9nS0NrZ1BUNGdVSEp2YldselpUeGhibmsrTzF4dUlDQnVZVzFsT2lCemRISnBibWM3WEc0Z0lHTmhkR1ZuYjNKNU9pQnpkSEpwYm1jN1hHNGdJRzl3ZEdsdmJuTS9PaUJVWlhOMFQzQjBhVzl1Y3p0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loallYUmxaMjl5ZVRvZ2MzUnlhVzVuTENCdVlXMWxPaUJ6ZEhKcGJtY3NJSFJsYzNRNklDZ3BJRDArSUZCeWIyMXBjMlU4WVc1NVBpd2diM0IwYVc5dWN6ODZJRlJsYzNSUGNIUnBiMjV6S1NCN1hHNGdJQ0FnZEdocGN5NWpZWFJsWjI5eWVTQTlJR05oZEdWbmIzSjVPMXh1SUNBZ0lIUm9hWE11Ym1GdFpTQTlJRzVoYldVN1hHNGdJQ0FnYjNCMGFXOXVjeUEvUHowZ2UzMDdYRzRnSUNBZ2IzQjBhVzl1Y3k1MGFXMWxiM1YwSUQ4L1BTQXpNREF3TUR0Y2JpQWdJQ0IwYUdsekxtOXdkR2x2Ym5NZ1BTQnZjSFJwYjI1ek8xeHVJQ0FnSUhSb2FYTXVkR1Z6ZENBOUlHRnplVzVqSUNncE9pQlFjbTl0YVhObFBHRnVlVDRnUFQ0Z2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNiaUFnSUNBZ0lDQWdiR1YwSUhKbGMzVnNkQ0E5SUNjbk8xeHVJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHRjNZV2wwSUhSbGMzUW9LVHRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlRvZ1lXNTVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVnFaV04wS0dVcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVW9jbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMDdYRzRnSUgxY2JuMWNibHh1Wlhod2IzSjBJR0Z6ZVc1aklHWjFibU4wYVc5dUlIUmxjM1JGZG1WdWREeFVQaWhsZG1WdWREb2dUMkp6WlhKMllXSnNaVHhVUGl4Y2JpQWdhR0Z1Wkd4bGNqb2dLR0Z5WjNNNklGUXBJRDArSUhadmFXUXNJSFJ5YVdkblpYSTZJQ2dwSUQwK0lIWnZhV1FzSUcxek9pQnVkVzFpWlhJZ1BTQXdLVG9nVUhKdmJXbHpaVHh6ZEhKcGJtYytJSHRjYmlBZ2JHVjBJSE4xWWpvZ1UzVmljMk55YVhCMGFXOXVPMXh1SUNCeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb0tISmxjMjlzZG1Vc0lISmxhbVZqZENrZ1BUNGdlMXh1SUNBZ0lITjFZaUE5SUdWMlpXNTBMbk4xWW5OamNtbGlaU2dvWVhKbmN5a2dQVDRnZTF4dUlDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdhR0Z1Wkd4bGNpaGhjbWR6S1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lDQWdjbVZxWldOMEtHVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjM1ZpTG5WdWMzVmljMk55YVdKbEtDazdYRzRnSUNBZ0lDQnlaWE52YkhabEtDZFBTeWNwTzF4dUlDQWdJSDBwTzF4dUlDQWdJSE5sZEZScGJXVnZkWFFvS0NrZ1BUNGdlMXh1SUNBZ0lDQWdjM1ZpTG5WdWMzVmljMk55YVdKbEtDazdYRzRnSUNBZ0lDQXZMeUJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWdjSEpsWm1WeUxYQnliMjFwYzJVdGNtVnFaV04wTFdWeWNtOXljMXh1SUNBZ0lDQWdjbVZxWldOMEtDZDBhVzFsYjNWMEp5azdYRzRnSUNBZ2ZTd2diWE1wTzF4dUlDQWdJSFJ5YVdkblpYSW9LVHRjYmlBZ2ZTazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCMFpYTjBLRzVoYldVNklITjBjbWx1Wnl3Z2RHVnpkRG9nS0NrZ1BUNGdVSEp2YldselpUeGhibmsrTENCdmNIUnBiMjV6UHpvZ1ZHVnpkRTl3ZEdsdmJuTXBPaUIyYjJsa0lIdGNiaUFnYVdZZ0tIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUhSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMGdQU0I3ZlR0Y2JpQWdhV1lnS0hSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMHVkR1Z6ZEhNZ1BUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjB1ZEdWemRITWdQU0JiWFR0Y2JpQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1MFpYTjBjeUV1Y0hWemFDaHVaWGNnVkdWemRDaGpkWEp5Wlc1MFEyRjBaV2R2Y25rc0lHNWhiV1VzSUhSbGMzUXNJRzl3ZEdsdmJuTXBLVHRjYm4xY2JseHVMeW9nVkdWemRITWdkSGR2SUc5aWFtVmpkSE1nWm05eUlHVnhkV0ZzYVhSNUxDQjBhSEp2ZDNNZ1lXNGdaWGhqWlhCMGFXOXVJR2xtSUhSb1pYa2dZWEpsSUc1dmRDQmxjWFZoYkM0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNRb1lXTjBkV0ZzT2lCaGJua3NJR1Y0Y0dWamRHVmtPaUJoYm5rcE9pQjJiMmxrSUh0Y2JpQWdhV1lnS0dGamRIVmhiQ0FoUFQwZ1pYaHdaV04wWldRcFhHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0JjSWlSN1pYaHdaV04wWldSOVhDSXNJR2R2ZENCY0lpUjdZV04wZFdGc2ZWd2lZQ2s3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNSR2JHOWhkQ2hoWTNSMVlXdzZJRzUxYldKbGNpd2daWGh3WldOMFpXUTZJRzUxYldKbGNpd2dkRzlzWlhKaGJtTmxJRDBnTUM0d01ERXBPaUIyYjJsa0lIdGNiaUFnWTI5dWMzUWdZWEpsUlhGMVlXd2dQU0JOWVhSb0xtRmljeWhoWTNSMVlXd2dMU0JsZUhCbFkzUmxaQ2tnUENCMGIyeGxjbUZ1WTJVN1hHNGdJR2xtSUNnaFlYSmxSWEYxWVd3cFhHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0FrZTJWNGNHVmpkR1ZrZlN3Z1oyOTBJQ1I3WVdOMGRXRnNmU0FvZEc5c1pYSmhibU5sSUQwZ0pIdDBiMnhsY21GdVkyVjlLV0FwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaWGh3WldOMFQySnFaV04wS0dGamRIVmhiRG9nZXlCYmEyVjVPaUJ6ZEhKcGJtZGRPaUJoYm5rZ2ZTd2daWGh3WldOMFpXUTZJSHNnVzJ0bGVUb2djM1J5YVc1blhUb2dZVzU1SUgwcElIdGNiaUFnWm05eUlDaGpiMjV6ZENCYlpYaHdaV04wWldSTFpYa3NJR1Y0Y0dWamRHVmtWbUZzZFdWZElHOW1JRTlpYW1WamRDNWxiblJ5YVdWektHVjRjR1ZqZEdWa0tTa2dlMXh1SUNBZ0lHbG1JQ2doWVdOMGRXRnNMbWhoYzA5M2JsQnliM0JsY25SNUtHVjRjR1ZqZEdWa1MyVjVLU2xjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdSWGh3WldOMFpXUWdjSEp2Y0dWeWRIa2dYQ0lrZTJWNGNHVmpkR1ZrUzJWNWZWd2lJRzV2ZENCbWIzVnVaR0FwTzF4dVhHNGdJQ0FnWTI5dWMzUWdZV04wZFdGc1ZtRnNkV1VnUFNCaFkzUjFZV3hiWlhod1pXTjBaV1JMWlhsZE8xeHVJQ0FnSUdsbUlDaGhZM1IxWVd4V1lXeDFaU0JwYm5OMFlXNWpaVzltSUVGeWNtRjVJQ1ltSUdWNGNHVmpkR1ZrVm1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJCY25KaGVTbGNiaUFnSUNBZ0lHVjRjR1ZqZEVGeWNtRjVLR0ZqZEhWaGJGWmhiSFZsTENCbGVIQmxZM1JsWkZaaGJIVmxLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDaGhZM1IxWVd4V1lXeDFaU0JwYm5OMFlXNWpaVzltSUU5aWFtVmpkQ0FtSmlCbGVIQmxZM1JsWkZaaGJIVmxJR2x1YzNSaGJtTmxiMllnVDJKcVpXTjBLVnh1SUNBZ0lDQWdaWGh3WldOMFQySnFaV04wS0dGamRIVmhiRlpoYkhWbExDQmxlSEJsWTNSbFpGWmhiSFZsS1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2hPZFcxaVpYSXVhWE5HYVc1cGRHVW9ZV04wZFdGc1ZtRnNkV1VwSUNZbUlFNTFiV0psY2k1cGMwWnBibWwwWlNobGVIQmxZM1JsWkZaaGJIVmxLU2xjYmlBZ0lDQWdJR1Y0Y0dWamRFWnNiMkYwS0dGamRIVmhiRlpoYkhWbExDQmxlSEJsWTNSbFpGWmhiSFZsS1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2hoWTNSMVlXeFdZV3gxWlNBaFBTQmxlSEJsWTNSbFpGWmhiSFZsS1Z4dUlDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0FvSkh0bGVIQmxZM1JsWkZaaGJIVmxmU2tnWm05eUlHdGxlU0FuSkh0bGVIQmxZM1JsWkV0bGVYMG5MQ0JuYjNRZ0tDUjdZV04wZFdGc1ZtRnNkV1Y5S1dBcE8xeHVJQ0I5WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNSQmNuSmhlU2hoWTNSMVlXdzZJRUZ5Y21GNVRHbHJaVHhoYm5rK0xDQmxlSEJsWTNSbFpEb2dRWEp5WVhsTWFXdGxQR0Z1ZVQ0cElIdGNiaUFnWTI5dWMzUWdZV04wZFdGc1RHVnVaM1JvSUQwZ1lXTjBkV0ZzTG14bGJtZDBhRHRjYmlBZ1kyOXVjM1FnWlhod1pXTjBaV1JNWlc1bmRHZ2dQU0JsZUhCbFkzUmxaQzVzWlc1bmRHZzdYRzVjYmlBZ2FXWWdLR0ZqZEhWaGJFeGxibWQwYUNBaFBTQmxlSEJsWTNSbFpFeGxibWQwYUNrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUVhKeVlYbHpJR0Z5WlNCdlppQmthV1ptWlhKbGJuUWdiR1Z1WjNSb09pQmhZM1IxWVd3Z1lYSnlZWGtnYkdWdVozUm9JR2x6SUNSN1lXTjBkV0ZzVEdWdVozUm9mU0JnSUN0Y2JpQWdJQ0FnSUdCaGJtUWdaWGh3WldOMFpXUWdZWEp5WVhrZ2JHVnVaM1JvSUdseklDUjdaWGh3WldOMFpXUk1aVzVuZEdoOVlDazdYRzRnSUgxY2JseHVJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdGamRIVmhiRXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnYVdZZ0tHRmpkSFZoYkZ0cFhTQnBibk4wWVc1alpXOW1JRUZ5Y21GNUlDWW1JR1Y0Y0dWamRHVmtXMmxkSUdsdWMzUmhibU5sYjJZZ1FYSnlZWGtwWEc0Z0lDQWdJQ0JsZUhCbFkzUkJjbkpoZVNoaFkzUjFZV3hiYVYwc0lHVjRjR1ZqZEdWa1cybGRLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDaGhZM1IxWVd4YmFWMGdhVzV6ZEdGdVkyVnZaaUJQWW1wbFkzUWdKaVlnWlhod1pXTjBaV1JiYVYwZ2FXNXpkR0Z1WTJWdlppQlBZbXBsWTNRcFhHNGdJQ0FnSUNCbGVIQmxZM1JQWW1wbFkzUW9ZV04wZFdGc1cybGRMQ0JsZUhCbFkzUmxaRnRwWFNrN1hHNGdJQ0FnWld4elpTQnBaaUFvWVdOMGRXRnNXMmxkSUNFOUlHVjRjR1ZqZEdWa1cybGRLVnh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQkZlSEJsWTNSbFpDQWtlMlY0Y0dWamRHVmtXMmxkZlNCaGRDQndiM05wZEdsdmJpQWtlMmw5TENCbmIzUWdKSHRoWTNSMVlXeGJhVjE5WUNrN1hHNGdJSDFjYm4xY2JseHVMeW9nUkdWbWFXNWxjeUJoSUhSbGMzUWdjM1ZwZEdVdUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkYwWldkdmNua29ZMkYwWldkdmNuazZJSE4wY21sdVp5d2dkR1Z6ZEhNNklDZ3BJRDArSUhadmFXUXBPaUIyYjJsa0lIdGNiaUFnWTNWeWNtVnVkRU5oZEdWbmIzSjVJRDBnWTJGMFpXZHZjbms3WEc0Z0lIUmxjM1J6S0NrN1hHNTlYRzVjYmk4cUlFUmxabWx1WlhNZ1lTQm1kVzVqZEdsdmJpQjBieUJpWlNCbGVHVmpkWFJsWkNCaVpXWnZjbVVnZEdobElIUmxjM1J6SUdsdUlIUm9hWE1nWTJGMFpXZHZjbmtnWVhKbElHVjRaV04xZEdWa0xpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR0psWm05eVpTaGlaV1p2Y21VNklDZ3BJRDArSUZCeWIyMXBjMlU4ZG05cFpENHBPaUIyYjJsa0lIdGNiaUFnYVdZZ0tIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUhSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMGdQU0I3ZlR0Y2JpQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1aVpXWnZjbVVnUFNCaVpXWnZjbVU3WEc1OVhHNWNiaThxSUVSbFptbHVaWE1nWVNCbWRXNWpkR2x2YmlCMGJ5QmlaU0JsZUdWamRYUmxaQ0JoWm5SbGNpQjBhR1VnZEdWemRITWdhVzRnZEdocGN5QmpZWFJsWjI5eWVTQmhjbVVnWlhobFkzVjBaV1F1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1lXWjBaWElvWVdaMFpYSTZJQ2dwSUQwK0lGQnliMjFwYzJVOGRtOXBaRDRwT2lCMmIybGtJSHRjYmlBZ2FXWWdLSFJsYzNSelcyTjFjbkpsYm5SRFlYUmxaMjl5ZVYwZ1BUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFNCN2ZUdGNiaUFnZEdWemRITmJZM1Z5Y21WdWRFTmhkR1ZuYjNKNVhTNWhablJsY2lBOUlHRm1kR1Z5TzF4dWZWeHVYRzVjYm1WNGNHOXlkQ0JoYzNsdVl5Qm1kVzVqZEdsdmJpQnlkVzVVWlhOMGN5aHZjSFJwYjI1elB6b2dleUJqWVhSbFoyOXllVDg2SUhOMGNtbHVaeXdnZEdWemREODZJSE4wY21sdVp5d2dkR1Z6ZEVOdmJuUmxlSFEvT2lCVVpYTjBRMjl1ZEdWNGRDQjlLU0I3WEc0Z0lHTnZibk4wSUhKbGMzVnNkSE02SUhzZ1kyRjBaV2R2Y25rL09pQnpkSEpwYm1jc0lHNWhiV1UvT2lCemRISnBibWNzSUhOMVkyTmxjM002SUdKdmIyeGxZVzRzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwT2lCemRISnBibWNzSUcxek9pQnVkVzFpWlhJc0lITnJhWEJ3WldRNklHSnZiMnhsWVc0Z2ZWdGRJRDBnVzEwN1hHNGdJR052Ym5OMElIQmhZMnRoWjJWT1lXMWxJRDBnWjNKdmF5NW1kVzVqZEdsdmJuTXVaMlYwUTNWeWNtVnVkRU5oYkd3b0tUOHVablZ1WXo4dWNHRmphMkZuWlR0Y2JpQWdZMjl1YzI5c1pTNXNiMmNvWUZKMWJtNXBibWNnZEdWemRITmdLVHRjYmlBZ2IzQjBhVzl1Y3lBL1B6MGdlMzA3WEc0Z0lHOXdkR2x2Ym5NaExuUmxjM1JEYjI1MFpYaDBJRDgvUFNCdVpYY2dWR1Z6ZEVOdmJuUmxlSFFvS1R0Y2JpQWdaM0p2YXk1emFHVnNiQzVzWVhOMFJYSnliM0lnUFNBbkp6dGNiaUFnWm05eUlDaGpiMjV6ZENCYmEyVjVMQ0IyWVd4MVpWMGdiMllnVDJKcVpXTjBMbVZ1ZEhKcFpYTW9kR1Z6ZEhNcEtTQjdYRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTS9MbU5oZEdWbmIzSjVJQ0U5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZyWlhrdWRHOU1iM2RsY2tOaGMyVW9LUzV6ZEdGeWRITlhhWFJvS0c5d2RHbHZibk0vTG1OaGRHVm5iM0o1TG5SdlRHOTNaWEpEWVhObEtDa3BLVnh1SUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjMjlzWlM1c2IyY29ZRk4wWVhKMFpXUWdKSHRyWlhsOUlHTmhkR1ZuYjNKNVlDazdYRzRnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJR2xtSUNoMllXeDFaUzVpWldadmNtVXBYRzRnSUNBZ0lDQWdJR0YzWVdsMElIWmhiSFZsTG1KbFptOXlaU2dwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLSGc2SUdGdWVTa2dlMXh1SUNBZ0lDQWdkbUZzZFdVdVltVm1iM0psVTNSaGRIVnpJRDBnZUM1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUgxY2JpQWdJQ0JqYjI1emRDQjBJRDBnZG1Gc2RXVXVkR1Z6ZEhNZ1B6OGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2NtVnpJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCMExteGxibWQwYURzZ2FTc3JLVnh1SUNBZ0lDQWdjbVZ6TG5CMWMyZ29ZWGRoYVhRZ1pYaGxZMVJsYzNRb2RGdHBYU3dnYjNCMGFXOXVjejh1ZEdWemRDa3BPMXh1WEc0Z0lDQWdZMjl1YzNRZ1pHRjBZU0E5SUNoaGQyRnBkQ0JRY205dGFYTmxMbUZzYkNoeVpYTXBLUzVtYVd4MFpYSW9LR1FwSUQwK0lHUXVjbVZ6ZFd4MElDRTlJQ2R6YTJsd2NHVmtKeWs3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUdsbUlDaDJZV3gxWlM1aFpuUmxjaWxjYmlBZ0lDQWdJQ0FnWVhkaGFYUWdkbUZzZFdVdVlXWjBaWElvS1R0Y2JpQWdJQ0I5SUdOaGRHTm9JQ2g0T2lCaGJua3BJSHRjYmlBZ0lDQWdJSFpoYkhWbExtRm1kR1Z5VTNSaGRIVnpJRDBnZUM1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2RtRnNkV1V1WVdaMFpYSlRkR0YwZFhNcFhHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2UyTmhkR1ZuYjNKNU9pQnJaWGtzSUc1aGJXVTZJQ2RwYm1sMEp5d2djbVZ6ZFd4ME9pQjJZV3gxWlM1aFpuUmxjbE4wWVhSMWN5d2djM1ZqWTJWemN6b2dabUZzYzJVc0lHMXpPaUF3TENCemEybHdjR1ZrT2lCbVlXeHpaWDBwTzF4dUlDQWdJR2xtSUNoMllXeDFaUzVpWldadmNtVlRkR0YwZFhNcFhHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2UyTmhkR1ZuYjNKNU9pQnJaWGtzSUc1aGJXVTZJQ2RwYm1sMEp5d2djbVZ6ZFd4ME9pQjJZV3gxWlM1aVpXWnZjbVZUZEdGMGRYTXNJSE4xWTJObGMzTTZJR1poYkhObExDQnRjem9nTUN3Z2MydHBjSEJsWkRvZ1ptRnNjMlY5S1R0Y2JpQWdJQ0J5WlhOMWJIUnpMbkIxYzJnb0xpNHVaR0YwWVNrN1hHNGdJSDFjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVkR1Z6ZEVOdmJuUmxlSFF1WTJGMFkyaFZibWhoYm1Sc1pXUXBJSHRjYmlBZ0lDQmhkMkZwZENCa1pXeGhlU2d4TURBd0tUdGNiaUFnSUNCcFppQW9aM0p2YXk1emFHVnNiQzVzWVhOMFJYSnliM0l1YkdWdVozUm9JRDRnTUNrZ2UxeHVJQ0FnSUNBZ2NtVnpkV3gwY3k1d2RYTm9LSHRjYmlBZ0lDQWdJQ0FnWTJGMFpXZHZjbms2SUNkVmJtaGhibVJzWldRZ1pYaGpaWEIwYVc5dWN5Y3NYRzRnSUNBZ0lDQWdJRzVoYldVNklDZGxlR05sY0hScGIyNXpKeXhjYmlBZ0lDQWdJQ0FnY21WemRXeDBPaUJuY205ckxuTm9aV3hzTG14aGMzUkZjbkp2Y2l3Z2MzVmpZMlZ6Y3pvZ1ptRnNjMlVzSUcxek9pQXdMQ0J6YTJsd2NHVmtPaUJtWVd4elpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lHbG1JQ2h2Y0hScGIyNXpMblJsYzNSRGIyNTBaWGgwTG5KbGNHOXlkQ2tnZTF4dUlDQWdJR052Ym5OMElHeHZaMmRsY2lBOUlHNWxkeUJFUnk1TWIyZG5aWElvS1R0Y2JpQWdJQ0JqYjI1emRDQnpkV05qWlhOelpuVnNJRDBnY21WemRXeDBjeTVtYVd4MFpYSW9LSElwSUQwK0lISXVjM1ZqWTJWemN5a3ViR1Z1WjNSb08xeHVJQ0FnSUdOdmJuTjBJSE5yYVhCd1pXUWdQU0J5WlhOMWJIUnpMbVpwYkhSbGNpZ29jaWtnUFQ0Z2NpNXphMmx3Y0dWa0tTNXNaVzVuZEdnN1hHNGdJQ0FnWTI5dWMzUWdabUZwYkdWa0lEMGdjbVZ6ZFd4MGN5NW1hV3gwWlhJb0tISXBJRDArSUNGeUxuTjFZMk5sYzNNcE8xeHVJQ0FnSUdOdmJuTjBJR1JsYzJOeWFYQjBhVzl1SUQwZ0oxQmhZMnRoWjJVZ1FIQmhZMnRoWjJVZ2RHVnpkR1ZrT2lCQWMzVmpZMlZ6YzJaMWJDQnpkV05qWlhOelpuVnNMQ0JBYzJ0cGNIQmxaQ0J6YTJsd2NHVmtMQ0JBWm1GcGJHVmtJR1poYVd4bFpDQjBaWE4wY3ljN1hHNGdJQ0FnWTI5dWMzUWdjR0Z5WVcxeklEMGdlMXh1SUNBZ0lDQWdjM1ZqWTJWemMyWjFiRG9nYzNWalkyVnpjMloxYkN4Y2JpQWdJQ0FnSUhOcmFYQndaV1E2SUhOcmFYQndaV1FzWEc0Z0lDQWdJQ0JtWVdsc1pXUTZJR1poYVd4bFpDNXNaVzVuZEdnc1hHNGdJQ0FnSUNCd1lXTnJZV2RsT2lCd1lXTnJZV2RsVG1GdFpWeHVJQ0FnSUgwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCeUlHOW1JR1poYVd4bFpDa2dUMkpxWldOMExtRnpjMmxuYmlod1lYSmhiWE1zSUh0YllDUjdjaTVqWVhSbFoyOXllWDBnZkNBa2UzSXVibUZ0WlgxZ1hUb2djaTV5WlhOMWJIUjlLVHRjYmlBZ0lDQnNiMmRuWlhJdWJHOW5LR1JsYzJOeWFYQjBhVzl1TENCd1lYSmhiWE1zSUNkd1lXTnJZV2RsTFhSbGMzUmxaQ2NwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ5WlhOMWJIUnpPMXh1ZlZ4dVhHNWhjM2x1WXlCbWRXNWpkR2x2YmlCbGVHVmpWR1Z6ZENoME9pQlVaWE4wTENCd2NtVmthV05oZEdVNklITjBjbWx1WnlCOElIVnVaR1ZtYVc1bFpDa2dlMXh1SUNCc1pYUWdjam9nZXlCallYUmxaMjl5ZVQ4NklITjBjbWx1Wnl3Z2JtRnRaVDg2SUhOMGNtbHVaeXdnYzNWalkyVnpjem9nWW05dmJHVmhiaXdnY21WemRXeDBPaUJ6ZEhKcGJtY3NJRzF6T2lCdWRXMWlaWElzSUhOcmFYQndaV1E2SUdKdmIyeGxZVzRnZlR0Y2JpQWdZMjl1YzNRZ1ptbHNkR1Z5SUQwZ2NISmxaR2xqWVhSbElDRTlJSFZ1WkdWbWFXNWxaQ0FtSmlBb0lYUXVibUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvY0hKbFpHbGpZWFJsTG5SdlRHOTNaWEpEWVhObEtDa3BLVHRjYmlBZ1kyOXVjM1FnYzJ0cGNDQTlJSFF1YjNCMGFXOXVjejh1YzJ0cGNGSmxZWE52YmlCOGZDQm1hV3gwWlhJN1hHNGdJR052Ym5OMElITnJhWEJTWldGemIyNGdQU0JtYVd4MFpYSWdQeUFuYzJ0cGNIQmxaQ2NnT2lCMExtOXdkR2x2Ym5NL0xuTnJhWEJTWldGemIyNDdYRzRnSUdsbUlDZ2hjMnRwY0NsY2JpQWdJQ0JqYjI1emIyeGxMbXh2WnloZ1UzUmhjblJsWkNBa2UzUXVZMkYwWldkdmNubDlJQ1I3ZEM1dVlXMWxmV0FwTzF4dUlDQmpiMjV6ZENCemRHRnlkQ0E5SUc1bGR5QkVZWFJsS0NrN1hHNWNiaUFnZEhKNUlIdGNiaUFnSUNCcFppQW9jMnRwY0NsY2JpQWdJQ0FnSUhJZ1BTQjdjM1ZqWTJWemN6b2dkSEoxWlN3Z2NtVnpkV3gwT2lCemEybHdVbVZoYzI5dUlTd2diWE02SURBc0lITnJhWEJ3WldRNklIUnlkV1Y5TzF4dUlDQWdJR1ZzYzJWY2JpQWdJQ0FnSUhJZ1BTQjdjM1ZqWTJWemN6b2dkSEoxWlN3Z2NtVnpkV3gwT2lCaGQyRnBkQ0IwTG5SbGMzUW9LU0EvUHlBblQwc25MQ0J0Y3pvZ01Dd2djMnRwY0hCbFpEb2dabUZzYzJWOU8xeHVJQ0I5SUdOaGRHTm9JQ2g0T2lCaGJua3BJSHRjYmlBZ0lDQnlJRDBnZTNOMVkyTmxjM002SUdaaGJITmxMQ0J5WlhOMWJIUTZJSGd1ZEc5VGRISnBibWNvS1N3Z2JYTTZJREFzSUhOcmFYQndaV1E2SUdaaGJITmxmVHRjYmlBZ2ZWeHVJQ0JqYjI1emRDQnpkRzl3SUQwZ2JtVjNJRVJoZEdVb0tUdGNiaUFnTHk4Z1FIUnpMV2xuYm05eVpWeHVJQ0J5TG0xeklEMGdjM1J2Y0NBdElITjBZWEowTzF4dUlDQnBaaUFvSVhOcmFYQXBYRzRnSUNBZ1kyOXVjMjlzWlM1c2IyY29ZRVpwYm1semFHVmtJQ1I3ZEM1allYUmxaMjl5ZVgwZ0pIdDBMbTVoYldWOUlHWnZjaUFrZTNJdWJYTjlJRzF6WUNrN1hHNWNiaUFnY2k1allYUmxaMjl5ZVNBOUlIUXVZMkYwWldkdmNuazdYRzRnSUhJdWJtRnRaU0E5SUhRdWJtRnRaVHRjYmlBZ2NtVjBkWEp1SUhJN1hHNTlYRzVjYmk4cUlGZGhhWFJ6SUZ0dGMxMGdiV2xzYkdselpXTnZibVJ6SUNvdlhHNWxlSEJ2Y25RZ1lYTjVibU1nWm5WdVkzUnBiMjRnWkdWc1lYa29iWE02SUc1MWJXSmxjaWtnZTF4dUlDQmhkMkZwZENCdVpYY2dVSEp2YldselpTZ29jaWtnUFQ0Z2MyVjBWR2x0Wlc5MWRDaHlMQ0J0Y3lrcE8xeHVmVnh1WEc1bGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdZWGRoYVhSRGFHVmpheWhqYUdWamEwaGhibVJzWlhJNklDZ3BJRDArSUdKdmIyeGxZVzRzWEc0Z0lHVnljbTl5T2lCemRISnBibWNnUFNBblZHbHRaVzkxZENCbGVHTmxaV1JsWkNjc0lIZGhhWFE2SUc1MWJXSmxjaUE5SURVd01DazZJRkJ5YjIxcGMyVThkbTlwWkQ0Z2UxeHVJQ0J5WlhSMWNtNGdibVYzSUZCeWIyMXBjMlVvS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVJQ0FnSUhObGRGUnBiV1Z2ZFhRb0tDa2dQVDRnZTF4dUlDQWdJQ0FnWTJ4bFlYSkpiblJsY25aaGJDaHBiblJsY25aaGJDazdYRzRnSUNBZ0lDQnlaV3BsWTNRb2JtVjNJRVZ5Y205eUtHVnljbTl5S1NrN1hHNGdJQ0FnZlN3Z2QyRnBkQ2s3WEc0Z0lDQWdMeThnUUhSekxXbG5ibTl5WlZ4dUlDQWdJR052Ym5OMElHbHVkR1Z5ZG1Gc09pQlVhVzFsYjNWMElEMGdjMlYwU1c1MFpYSjJZV3dvS0NrZ1BUNGdlMXh1SUNBZ0lDQWdhV1lnS0dOb1pXTnJTR0Z1Wkd4bGNpZ3BLU0I3WEc0Z0lDQWdJQ0FnSUdOc1pXRnlTVzUwWlhKMllXd29hVzUwWlhKMllXd3BPMXh1SUNBZ0lDQWdJQ0J5WlhOdmJIWmxLQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU3dnTlRBcE8xeHVJQ0I5S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x6UkdsaGJHOW5VSEpsYzJWdWRDaGthV0ZzYjJkVWFYUnNaVG9nYzNSeWFXNW5LVG9nWW05dmJHVmhiaUI3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dSRWN1UkdsaGJHOW5MbWRsZEU5d1pXNUVhV0ZzYjJkektDa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0JwWmlBb1JFY3VSR2xoYkc5bkxtZGxkRTl3Wlc1RWFXRnNiMmR6S0NsYmFWMHVkR2wwYkdVZ1BUMGdaR2xoYkc5blZHbDBiR1VwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzU5WEc1Y2JtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUIwWlhOMFZtbGxkMlZ5S0hZNklITjBjbWx1Wnl3Z1pHWTZJRVJITGtSaGRHRkdjbUZ0WlN3Z1pHVjBaV04wVTJWdFlXNTBhV05VZVhCbGN6b2dZbTl2YkdWaGJpQTlJR1poYkhObEtUb2dVSEp2YldselpUeDJiMmxrUGlCN1hHNGdJR2xtSUNoa1pYUmxZM1JUWlcxaGJuUnBZMVI1Y0dWektTQmhkMkZwZENCbmNtOXJMbVJoZEdFdVpHVjBaV04wVTJWdFlXNTBhV05VZVhCbGN5aGtaaWs3WEc0Z0lHTnZibk4wSUhSMklEMGdaM0p2YXk1emFHVnNiQzVoWkdSVVlXSnNaVlpwWlhjb1pHWXBPMXh1SUNCamIyNXpkQ0IyYVdWM1pYSk9ZVzFsSUQwZ1lGdHVZVzFsUFhacFpYZGxjaTBrZTNZdWNtVndiR0ZqWlNndlhGeHpLeTluTENBbkxTY3BmU0JwWFdBN1hHNGdJR052Ym5OMElITmxiR1ZqZEc5eUlEMGdZQ1I3ZG1sbGQyVnlUbUZ0WlgwZ1kyRnVkbUZ6TENSN2RtbGxkMlZ5VG1GdFpYMGdjM1puTENSN2RtbGxkMlZ5VG1GdFpYMGdhVzFuTEZ4dUlDQWdJQ1I3ZG1sbGQyVnlUbUZ0WlgwZ2FXNXdkWFFzSkh0MmFXVjNaWEpPWVcxbGZTQm9NU3drZTNacFpYZGxjazVoYldWOUlHRmdPMXh1SUNCamIyNXpkQ0J5WlhNZ1BTQmJYVHRjYmlBZ2RISjVJSHRjYmlBZ0lDQnNaWFFnZG1sbGQyVnlJRDBnZEhZdVlXUmtWbWxsZDJWeUtIWXBPMXh1SUNBZ0lHRjNZV2wwSUdGM1lXbDBRMmhsWTJzb0tDa2dQVDRnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpaHpaV3hsWTNSdmNpa2dJVDA5SUc1MWJHd3NYRzRnSUNBZ0lDQW5ZMkZ1Ym05MElHeHZZV1FnZG1sbGQyVnlKeXdnTXpBd01DazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lFRnljbUY1TG1aeWIyMG9aR1l1Y205M0tEQXBMbU5sYkd4ektTNW1iM0pGWVdOb0tDaGpLU0E5UGlCakxuWmhiSFZsSUQwZ2JuVnNiQ2s3WEc0Z0lDQWdaR1l1Y205M2N5NXpaV3hsWTNRb0tISnZkeWtnUFQ0Z2NtOTNMbWxrZUNBK0lERWdKaVlnY205M0xtbGtlQ0E4SURjcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQTNPeUJwSUR3Z01USTdJR2tyS3lrZ1pHWXVabWxzZEdWeUxuTmxkQ2hwTENCbVlXeHpaU2s3WEc0Z0lDQWdaR1l1WTNWeWNtVnVkRkp2ZDBsa2VDQTlJREU3WEc0Z0lDQWdZMjl1YzNRZ2NISnZjSE1nUFNCMmFXVjNaWEl1WjJWMFQzQjBhVzl1Y3loMGNuVmxLUzVzYjI5ck8xeHVJQ0FnSUdOdmJuTjBJRzVsZDFCeWIzQnpPaUJTWldOdmNtUThjM1J5YVc1bkxDQmliMjlzWldGdVBpQTlJSHQ5TzF4dUlDQWdJRTlpYW1WamRDNXJaWGx6S0hCeWIzQnpLUzVtYVd4MFpYSW9LR3NwSUQwK0lIUjVjR1Z2WmlCd2NtOXdjMXRyWFNBOVBUMGdKMkp2YjJ4bFlXNG5LUzVtYjNKRllXTm9LQ2hyS1NBOVBpQnVaWGRRY205d2MxdHJYU0E5SUNGd2NtOXdjMXRyWFNrN1hHNGdJQ0FnZG1sbGQyVnlMbk5sZEU5d2RHbHZibk1vYm1WM1VISnZjSE1wTzF4dUlDQWdJR0YzWVdsMElHUmxiR0Y1S0RJMU1DazdYRzRnSUNBZ1kyOXVjM1FnYkdGNWIzVjBJRDBnZEhZdWMyRjJaVXhoZVc5MWRDZ3BPMXh1SUNBZ0lHTnZibk4wSUc5c1pGQnliM0J6SUQwZ2RtbGxkMlZ5TG1kbGRFOXdkR2x2Ym5Nb0tTNXNiMjlyTzF4dUlDQWdJSFIyTG5KbGMyVjBUR0Y1YjNWMEtDazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lIUjJMbXh2WVdSTVlYbHZkWFFvYkdGNWIzVjBLVHRjYmlBZ0lDQmhkMkZwZENCaGQyRnBkRU5vWldOcktDZ3BJRDArSUdSdlkzVnRaVzUwTG5GMVpYSjVVMlZzWldOMGIzSW9jMlZzWldOMGIzSXBJQ0U5UFNCdWRXeHNMRnh1SUNBZ0lDQWdKMk5oYm01dmRDQnNiMkZrSUhacFpYZGxjaUJtY205dElHeGhlVzkxZENjc0lETXdNREFwTzF4dUlDQWdJR0YzWVdsMElHUmxiR0Y1S0RJMU1DazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lIWnBaWGRsY2lBOUlFRnljbUY1TG1aeWIyMG9kSFl1ZG1sbGQyVnljeWt1Wm1sdVpDZ29kaWtnUFQ0Z2RpNTBlWEJsSUNFOVBTQW5SM0pwWkNjcElUdGNiaUFnSUNCbGVIQmxZM1JCY25KaGVTaHlaWE1zSUZzeUxDQXhMQ0F5WFNrN1hHNGdJQ0FnWlhod1pXTjBLRXBUVDA0dWMzUnlhVzVuYVdaNUtIWnBaWGRsY2k1blpYUlBjSFJwYjI1ektDa3ViRzl2YXlrc0lFcFRUMDR1YzNSeWFXNW5hV1o1S0c5c1pGQnliM0J6S1NrN1hHNGdJSDBnWm1sdVlXeHNlU0I3WEc0Z0lDQWdkSFl1WTJ4dmMyVW9LVHRjYmlBZ0lDQm5jbTlyTG5Ob1pXeHNMbU5zYjNObFZHRmliR1VvWkdZcE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBjYXRlZ29yeSwgZXhwZWN0LCB0ZXN0IH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdCc7XG5pbXBvcnQgeyBwYXJzZUhlbG0gfSBmcm9tICcuLi91dGlscyc7XG5jYXRlZ29yeSgnSGVsbScsICgpID0+IHtcbiAgICAvL1RoZXNlIHRlc3RzIHJlcXVpcmUgd2Vic2VydmljZSB0aGF0IGlzIG5vdCBwcmVzZW50IG9uIHRlc3Qgc3RhbmRcbiAgICAvLyB0ZXN0KCdoZWxtVG9GYXN0YScsIGFzeW5jICgpID0+IHtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUk5BMXtSKFUpUC5SKFQpUC5SKEcpUC5SKEMpUC5SKEEpfSQkJCQnKSwgJz5STkExVVRHQ0EnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUk5BMXtQLlIoVSkuUC5SKFQpfSQkJCQnKSwgJz5STkExVVQnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUEVQVElERTF7QS5HfSQkJCRWMi4wJyksICc+UEVQVElERTFBRycpO1xuICAgIC8vIH0pO1xuICAgIC8vXG4gICAgLy8gdGVzdCgnaGVsbVRvUk5BJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgZXhwZWN0KGF3YWl0IGhlbG1Ub1JOQSgnUk5BMXtSKFUpUC5SKFQpUC5SKEcpUC5SKEMpUC5SKEEpfSQkJCQnKSwgJ1VUR0NBJyk7XG4gICAgLy8gICBleHBlY3QoYXdhaXQgaGVsbVRvUk5BKCdSTkExe1AuUihVKS5QLlIoVCl9JCQkJCcpLCAnVVQnKTtcbiAgICAvLyAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgLy8gICBleHBlY3QoYXdhaXQgaGVsbVRvUk5BKCdSTkExe1IoVSlQLlIoVClQfXxSTkEye1AuUihBKVAuUihBKX0kUk5BMSxSTkEyLDI6cGFpci02OnBhaXJ8Uk5BMSxSTkEyLDU6cGFpci0zOnBhaXIkJCQnKSwgJ1VUIEFBJyk7XG4gICAgLy8gfSk7XG4gICAgLy9cbiAgICAvLyB0ZXN0KCdoZWxtVG9QZXB0aWRlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgZXhwZWN0KGF3YWl0IGhlbG1Ub1BlcHRpZGUoJ1BFUFRJREUxe0EuR30kJCQkVjIuMCcpLCAnQUcnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9QZXB0aWRlKCdQRVBUSURFMXtMLlYuQX18UEVQVElERTJ7TC5WLkF9JCQkJCcpLCAnTFZBIExWQScpO1xuICAgIC8vICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9QZXB0aWRlKCdQRVBUSURFMXtBLlIuQy5BLkEuSy5ULkMuRC5BfSRQRVBUSURFMSxQRVBUSURFMSw4OlIzLTM6UjMkJCQnKSwgJ0FSQ0FBS1RDREEnKTtcbiAgICAvLyB9KTtcbiAgICAvLyBkZXRlY3RNYWNyb21vbGVjdWxlIGlzIGEgZnVuY3Rpb24gb2YgQmlvIHBhY2thZ2VcbiAgICAvLyB0ZXN0KCdkZXRlY3RNYWNyb21vbGVjdWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZmlsZSA9IGF3YWl0IF9wYWNrYWdlLmZpbGVzLnJlYWRBc1RleHQoJ3Rlc3RzL3Rlc3QuY3N2Jyk7XG4gICAgLy8gICBjb25zdCBkZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGZpbGUpO1xuICAgIC8vICAgY29uc3QgY29sID0gZGYuY29sdW1ucy5ieU5hbWUoJ0hFTE0gc3RyaW5nJyk7XG4gICAgLy8gICBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgLy8gICBleHBlY3QoY29sLnNlbVR5cGUsIERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gICAgLy8gfSk7XG4gICAgLy8gc2VtVHlwZSBhbmQgdW5pdHMgdGFncyBhcmUgZGV0ZWN0aW5nIGJ5IEJpbyBwYWNrYWdlIGZ1bmN0aW9uIGRldGVjdE1hY3JvbW9sZWN1bGVcbiAgICAvLyB0ZXN0KCdkZXRlY3RIZWxtJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZmlsZSA9IGF3YWl0IF9wYWNrYWdlLmZpbGVzLnJlYWRBc1RleHQoJ3Rlc3RzL3Rlc3QuY3N2Jyk7XG4gICAgLy8gICBjb25zdCBkZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGZpbGUpO1xuICAgIC8vICAgY29uc3QgY29sID0gZGYuY29sdW1ucy5ieU5hbWUoJ0hFTE0gc3RyaW5nJyk7XG4gICAgLy8gICBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgLy8gICBleHBlY3QoY29sLnRhZ3NbREcuVEFHUy5VTklUU10sICdIRUxNJyk7XG4gICAgLy8gfSk7XG4gICAgdGVzdCgncGFyc2VIZWxtJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0cyA9IFtcbiAgICAgICAgICAgIFsnbWVJJywgJ2hIaXMnLCAnQWNhJywgJ04nLCAnVCcsICdkSycsICdUaHJfUE8zSDInLCAnRC1UeXJfRXQnLCAnQXplJywgJ2RWJywgJ0UnLCAnUGhlXzRNZSddLFxuICAgICAgICAgICAgWydBJywgJ0MnLCAnVCcsICdHJywgJ1cnLCAnRScsICdRJ10sXG4gICAgICAgICAgICBbJ1InLCAnVScsICdQJywgJ1QnLCAnQSddLFxuICAgICAgICAgICAgWydBJywgJyonLCAnRycsICdDJ11cbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaGVsbVN0cmluZ3MgPSBbXG4gICAgICAgICAgICAnUEVQVElERTF7bWVJLmhIaXMuQWNhLk4uVC5kSy5UaHJfUE8zSDIuQWNhLkQtVHlyX0V0LkF6ZS5kVi5FLk4uZFYuUGhlXzRNZX0kJCQnLFxuICAgICAgICAgICAgJ1BFUFRJREUxe0EuQy5ULkcuQy5ULlcuRy5ULlcuRS5DLlcuQy5RLld9fFBFUFRJREUye0EuQy5ULkcuQy5ULlcuRy5ULlcuRS5RfSRQRVBUSURFMSxQRVBUSURFMSw1OlIzLTE0OlIzfFBFUFRJREUyLFBFUFRJREUxLDI6UjMtMTI6UjMkJCQnLFxuICAgICAgICAgICAgJ1JOQTF7UihVKVAuUihUKVB9fFJOQTJ7UC5SKEEpUC5SKEEpfSRSTkExLFJOQTIsMjpwYWlyLTY6cGFpcnxSTkExLFJOQTIsNTpwYWlyLTM6cGFpciQkJCcsXG4gICAgICAgICAgICAnUEVQVElERTF7QS4qLkcuQ30kJCQkVjIuMCdcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgaGVsbVN0cmluZ3MubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IG1vbm9tZXJTZXQgPSBuZXcgU2V0KHBhcnNlSGVsbShoZWxtU3RyaW5nc1tpZHhdKSk7XG4gICAgICAgICAgICBsZXQgbW9ub21lckFycmF5ID0gQXJyYXkuZnJvbShtb25vbWVyU2V0KTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShtb25vbWVyQXJyYXkpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZFJlc3VsdHNbaWR4XSkpO1xuICAgICAgICB9XG4gICAgfSkpO1xufSk7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0UGFydHMoc3ViUGFydHMsIHMpIHtcbiAgICBsZXQgaiA9IDA7XG4gICAgbGV0IGFsbFBhcnRzID0gW107XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzdWJQYXJ0cy5sZW5ndGg7ICsraykge1xuICAgICAgICBsZXQgaW5kZXhPZk1vbm9tZXIgPSBzLmluZGV4T2Yoc3ViUGFydHNba10pO1xuICAgICAgICBsZXQgaGVsbUJlZm9yZU1vbm9tZXIgPSBzLnNsaWNlKGosIGluZGV4T2ZNb25vbWVyKTtcbiAgICAgICAgYWxsUGFydHMucHVzaChoZWxtQmVmb3JlTW9ub21lcik7XG4gICAgICAgIGFsbFBhcnRzLnB1c2goc3ViUGFydHNba10pO1xuICAgICAgICBzID0gcy5zdWJzdHJpbmcoaW5kZXhPZk1vbm9tZXIgKyBzdWJQYXJ0c1trXS5sZW5ndGgpO1xuICAgIH1cbiAgICBhbGxQYXJ0cy5wdXNoKHMpO1xuICAgIHJldHVybiBhbGxQYXJ0cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhlbG0ocykge1xuICAgIHZhciBzZWN0aW9ucyA9IHNwbGl0KHMsICckJyk7XG4gICAgcyA9IHNlY3Rpb25zWzBdO1xuICAgIHZhciBtb25vbWVycyA9IFtdO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmICghc2NpbC5VdGlscy5pc051bGxPckVtcHR5KHMpKSB7XG4gICAgICAgIHZhciBzZXFzID0gc3BsaXQocywgJ3wnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXFzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGRldGFjaEFubm90YXRpb24oc2Vxc1tpXSk7XG4gICAgICAgICAgICBzID0gZS5zdHI7XG4gICAgICAgICAgICB2YXIgcCA9IHMuaW5kZXhPZigneycpO1xuICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKHAgKyAxKTtcbiAgICAgICAgICAgIHAgPSBzLmluZGV4T2YoJ30nKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBwKTtcbiAgICAgICAgICAgIHZhciBzcyA9IHNwbGl0KHMsICcuJyk7XG4gICAgICAgICAgICBmb3IgKHZhciBtb25vbWVyIG9mIHNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vbm9tZXIuaW5jbHVkZXMoJygnKSAmJiBtb25vbWVyLmluY2x1ZGVzKCcpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gbW9ub21lci5yZXBsYWNlKC9bKCldL2csICcnKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb25vbWVycy5wdXNoKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb25vbWVyLmluY2x1ZGVzKCdbJykgJiYgbW9ub21lci5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbW9ub21lci5tYXRjaCgvKD88PVxcWykuKj8oPz1cXF0pL2csICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbW9ub21lcnMucHVzaChlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbm9tZXJzLnB1c2gobW9ub21lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb25vbWVycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTW9ub21lcnMoaGVsbVN0cmluZykge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LmtleXMob3JnLmhlbG0ud2ViZWRpdG9yLm1vbm9tZXJUeXBlTGlzdCgpKTtcbiAgICBjb25zdCBtb25vbWVycyA9IFtdO1xuICAgIGNvbnN0IG1vbm9tZXJfbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBtb25vbWVycy5wdXNoKG5ldyBzY2lsLmhlbG0uTW9ub21lcnMuZ2V0TW9ub21lclNldCh0eXBlc1tpXSkpO1xuICAgICAgICBPYmplY3Qua2V5cyhtb25vbWVyc1tpXSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIG1vbm9tZXJfbmFtZXMucHVzaChtb25vbWVyc1tpXVtrXS5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdF9zdHJpbmcgPSBwYXJzZUhlbG0oaGVsbVN0cmluZyk7XG4gICAgcmV0dXJuIG5ldyBTZXQoc3BsaXRfc3RyaW5nLmZpbHRlcih2YWwgPT4gIW1vbm9tZXJfbmFtZXMuaW5jbHVkZXModmFsKSkpO1xufVxuZnVuY3Rpb24gc3BsaXQocywgc2VwKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBmcmFnID0gJyc7XG4gICAgdmFyIHBhcmVudGhlc2VzID0gMDtcbiAgICB2YXIgYnJhY2tldCA9IDA7XG4gICAgdmFyIGJyYWNlcyA9IDA7XG4gICAgdmFyIHF1b3RlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7XG4gICAgICAgIGlmIChjID09IHNlcCAmJiBicmFja2V0ID09IDAgJiYgcGFyZW50aGVzZXMgPT0gMCAmJiBicmFjZXMgPT0gMCAmJiBxdW90ZSA9PSAwKSB7XG4gICAgICAgICAgICByZXQucHVzaChmcmFnKTtcbiAgICAgICAgICAgIGZyYWcgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyYWcgKz0gYztcbiAgICAgICAgICAgIGlmIChxdW90ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFxcXCcgJiYgaSArIDEgPCBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjMiA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgZnJhZyArPSBjMjtcbiAgICAgICAgICAgICAgICAgICAgYyArPSBjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PSAnXFxcIicpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShpID4gMCAmJiBzLnN1YnN0cmluZyhpIC0gMSwgaSkgPT0gJ1xcXFwnKSlcbiAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBxdW90ZSA9PSAwID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICdbJylcbiAgICAgICAgICAgICAgICArK2JyYWNrZXQ7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICddJylcbiAgICAgICAgICAgICAgICAtLWJyYWNrZXQ7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICcoJylcbiAgICAgICAgICAgICAgICArK3BhcmVudGhlc2VzO1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnKScpXG4gICAgICAgICAgICAgICAgLS1wYXJlbnRoZXNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ3snKVxuICAgICAgICAgICAgICAgICsrYnJhY2VzO1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnfScpXG4gICAgICAgICAgICAgICAgLS1icmFjZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0LnB1c2goZnJhZyk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGRldGFjaEFubm90YXRpb24ocykge1xuICAgIHZhciByZXQgPSBfZGV0YWNoQXBwZW5kaXgocywgJ1xcXCInKTtcbiAgICBpZiAocmV0LnRhZyAhPSBudWxsKVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIHZhciByID0gX2RldGFjaEFwcGVuZGl4KHMsICdcXCcnKTtcbiAgICByZXR1cm4geyB0YWc6IHJldC50YWcsIHJlcGVhdDogci50YWcsIHN0cjogci5zdHIgfTtcbn1cbmZ1bmN0aW9uIF9kZXRhY2hBcHBlbmRpeChzLCBjKSB7XG4gICAgdmFyIHRhZyA9IG51bGw7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYgKHNjaWwuVXRpbHMuZW5kc3dpdGgocywgYykpIHtcbiAgICAgICAgdmFyIHAgPSBzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChwID4gMCkge1xuICAgICAgICAgICAgcCA9IHMubGFzdEluZGV4T2YoYywgcCAtIDEpO1xuICAgICAgICAgICAgaWYgKHAgPD0gMCB8fCBzLnN1YnN0cmluZyhwIC0gMSwgcCkgIT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID4gMCAmJiBwIDwgcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0YWcgPSBzLnN1YnN0cmluZyhwICsgMSwgcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFnICE9IG51bGwpXG4gICAgICAgIHRhZyA9IHRhZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwnICsgYywgJ2cnKSwgYyk7XG4gICAgcmV0dXJuIHsgdGFnOiB1bmVzY2FwZSh0YWcpLCBzdHI6IHMgfTtcbn1cbmZ1bmN0aW9uIHVuZXNjYXBlKHMpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBpZiAoc2NpbC5VdGlscy5pc051bGxPckVtcHR5KHMpKVxuICAgICAgICByZXR1cm4gcztcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9bXFxcXF0uL2csIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHN3aXRjaCAobSkge1xuICAgICAgICAgICAgY2FzZSAnXFxcXHInOlxuICAgICAgICAgICAgICAgIHJldHVybiAnXFxyJztcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1xcbic7XG4gICAgICAgICAgICBjYXNlICdcXFxcdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBydW5UZXN0cywgdGVzdHMgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90ZXN0JztcbmltcG9ydCAnLi90ZXN0cy9oZWxtLXRlc3RzLnRzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5leHBvcnQgeyB0ZXN0cyB9O1xuLy9uYW1lOiB0ZXN0XG4vL2lucHV0OiBzdHJpbmcgY2F0ZWdvcnkge29wdGlvbmFsOiB0cnVlfVxuLy9pbnB1dDogc3RyaW5nIHRlc3Qge29wdGlvbmFsOiB0cnVlfVxuLy9pbnB1dDogb2JqZWN0IHRlc3RDb250ZXh0IHtvcHRpb25hbDogdHJ1ZX1cbi8vb3V0cHV0OiBkYXRhZnJhbWUgcmVzdWx0XG5leHBvcnQgZnVuY3Rpb24gdGVzdChjYXRlZ29yeSwgdGVzdCwgdGVzdENvbnRleHQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkYXRhID0geWllbGQgcnVuVGVzdHMoeyBjYXRlZ29yeSwgdGVzdCwgdGVzdENvbnRleHQgfSk7XG4gICAgICAgIHJldHVybiBERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoZGF0YSk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
1
|
+
var helm_test;(()=>{"use strict";var t={d:(e,n)=>{for(var s in n)t.o(n,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:n[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>y,test:()=>m,tests:()=>o});const n=DG,s=grok;var r=function(t,e,n,s){return new(n||(n=Promise))((function(r,o){function i(t){try{c(s.next(t))}catch(t){o(t)}}function l(t){try{c(s.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}c((s=s.apply(t,e||[])).next())}))};const o={};let i;var l;!function(t){t.notNull=function(t,e){if(null==t)throw new Error(`${null==e?"Value":e} not defined`)}}(l||(l={}));class c{constructor(t,e){this.catchUnhandled=!0,this.report=!1,void 0!==t&&(this.catchUnhandled=t),void 0!==e&&(this.report=e)}}class a{constructor(t,e,n,s){var o;this.category=t,this.name=e,null!=s||(s={}),null!==(o=s.timeout)&&void 0!==o||(s.timeout=3e4),this.options=s,this.test=()=>r(this,void 0,void 0,(function*(){return new Promise(((t,e)=>r(this,void 0,void 0,(function*(){let s="";try{s=yield n()}catch(t){e(t)}t(s)}))))}))}}function u(t,e){if(t!==e)throw new Error(`Expected "${e}", got "${t}"`)}function f(t,e){var n,s,o;return r(this,void 0,void 0,(function*(){let r;const i=null!=e&&!t.name.toLowerCase().startsWith(e.toLowerCase()),l=(null===(n=t.options)||void 0===n?void 0:n.skipReason)||i,c=i?"skipped":null===(s=t.options)||void 0===s?void 0:s.skipReason;l||console.log(`Started ${t.category} ${t.name}`);const a=new Date;try{r=l?{success:!0,result:c,ms:0,skipped:!0}:{success:!0,result:null!==(o=yield t.test())&&void 0!==o?o:"OK",ms:0,skipped:!1}}catch(t){r={success:!1,result:t.toString(),ms:0,skipped:!1}}const u=new Date;return r.ms=u-a,l||console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`),r.category=t.category,r.name=t.name,r}))}function d(t){t=h(t,"$")[0];var e=[];if(!scil.Utils.isNullOrEmpty(t))for(var n=h(t,"|"),s=0;s<n.length;++s){var r=(t=p(n[s]).str).indexOf("{");r=(t=t.substring(r+1)).indexOf("}");var o=h(t=t.substring(0,r),".");for(var i of o)if(i.includes("(")&&i.includes(")")){var l=i.replace(/[()]/g,"").split("");for(var c of l)e.push(c)}else if(i.includes("[")&&i.includes("]")){var a=i.match(/(?<=\[).*?(?=\])/g,"");e.push(a[0])}else e.push(i)}return e}function h(t,e){for(var n=[],s="",r=0,o=0,i=0,l=0,c=0;c<t.length;++c){var a=t.substring(c,c+1);if(a==e&&0==o&&0==r&&0==i&&0==l)n.push(s),s="";else{if(s+=a,l>0&&"\\"==a&&c+1<t.length){++c;var u=t.substring(c,c+1);s+=u,a+=u}'"'==a?c>0&&"\\"==t.substring(c-1,c)||(l=0==l?1:0):"["==a?++o:"]"==a?--o:"("==a?++r:")"==a?--r:"{"==a?++i:"}"==a&&--i}}return n.push(s),n}function p(t){var e=g(t,'"');if(null!=e.tag)return e;var n=g(t,"'");return{tag:e.tag,repeat:n.tag,str:n.str}}function g(t,e){var n=null;if(scil.Utils.endswith(t,e)){for(var s=t.length-1;s>0&&!((s=t.lastIndexOf(e,s-1))<=0||"\\"!=t.substring(s-1,s)););s>0&&s<t.length-1&&(n=t.substring(s+1,t.length-1),t=t.substring(0,s))}return null!=n&&(n=n.replace(new RegExp("\\"+e,"g"),e)),{tag:v(n),str:t}}function v(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}!function(t,e){i="Helm",e()}(0,(()=>{null==o[i]&&(o[i]={}),null==o[i].tests&&(o[i].tests=[]),o[i].tests.push(new a(i,"parseHelm",(()=>{return t=void 0,e=void 0,s=function*(){const t=[["meI","hHis","Aca","N","T","dK","Thr_PO3H2","D-Tyr_Et","Aze","dV","E","Phe_4Me"],["A","C","T","G","W","E","Q"],["R","U","P","T","A"],["A","*","G","C"]],e=["PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$","PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$","RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$","PEPTIDE1{A.*.G.C}$$$$V2.0"];for(let n=0;n<e.length;++n){let s=new Set(d(e[n])),r=Array.from(s);u(JSON.stringify(r),JSON.stringify(t[n]))}},new((n=void 0)||(n=Promise))((function(r,o){function i(t){try{c(s.next(t))}catch(t){o(t)}}function l(t){try{c(s.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}c((s=s.apply(t,e||[])).next())}));var t,e,n,s}),void 0))}));const y=new n.Package;function m(t,e,i){return l=this,a=void 0,d=function*(){const l=yield function(t){var e,i,l,a,u;return r(this,void 0,void 0,(function*(){const d=[],h=null===(i=null===(e=s.functions.getCurrentCall())||void 0===e?void 0:e.func)||void 0===i?void 0:i.package;console.log("Running tests"),null!=t||(t={}),null!==(l=(u=t).testContext)&&void 0!==l||(u.testContext=new c),s.shell.lastError="";for(const[e,n]of Object.entries(o)){if(null!=(null==t?void 0:t.category)&&!e.toLowerCase().startsWith(null==t?void 0:t.category.toLowerCase()))continue;console.log(`Started ${e} category`);try{n.before&&(yield n.before())}catch(t){n.beforeStatus=t.toString()}const s=null!==(a=n.tests)&&void 0!==a?a:[],r=[];for(let e=0;e<s.length;e++)r.push(yield f(s[e],null==t?void 0:t.test));const o=(yield Promise.all(r)).filter((t=>"skipped"!=t.result));try{n.after&&(yield n.after())}catch(t){n.afterStatus=t.toString()}n.afterStatus&&o.push({category:e,name:"init",result:n.afterStatus,success:!1,ms:0,skipped:!1}),n.beforeStatus&&o.push({category:e,name:"init",result:n.beforeStatus,success:!1,ms:0,skipped:!1}),d.push(...o)}if(t.testContext.catchUnhandled&&(yield function(t){return r(this,void 0,void 0,(function*(){yield new Promise((e=>setTimeout(e,t)))}))}(1e3),s.shell.lastError.length>0&&d.push({category:"Unhandled exceptions",name:"exceptions",result:s.shell.lastError,success:!1,ms:0,skipped:!1})),t.testContext.report){const t=new n.Logger,e=d.filter((t=>t.success)).length,s=d.filter((t=>t.skipped)).length,r=d.filter((t=>!t.success)),o="Package @package tested: @successful successful, @skipped skipped, @failed failed tests",i={successful:e,skipped:s,failed:r.length,package:h};for(const t of r)Object.assign(i,{[`${t.category} | ${t.name}`]:t.result});t.log(o,i,"package-tested")}return d}))}({category:t,test:e,testContext:i});return n.DataFrame.fromObjects(l)},new((u=void 0)||(u=Promise))((function(t,e){function n(t){try{r(d.next(t))}catch(t){e(t)}}function s(t){try{r(d.throw(t))}catch(t){e(t)}}function r(e){var r;e.done?t(e.value):(r=e.value,r instanceof u?r:new u((function(t){t(r)}))).then(n,s)}r((d=d.apply(l,a||[])).next())}));var l,a,u,d}helm_test=e})();
|
|
2
|
+
//# sourceMappingURL=package-test.js.map
|