@datagrok/sequence-translator 0.0.9 → 1.0.1
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 +19 -11
- package/css/style.css +18 -0
- package/dist/package-test.js +2454 -0
- package/dist/package.js +5234 -0
- package/package.json +19 -10
- package/src/defineAxolabsPattern.ts +58 -55
- package/src/package-test.ts +1 -1
- package/src/package.ts +53 -50
- package/src/salts.ts +2 -2
- package/src/structures-works/from-monomers.ts +20 -12
- package/src/structures-works/mol-transformations.ts +34 -18
- package/src/structures-works/save-sense-antisense.ts +5 -2
- package/src/structures-works/sequence-codes-tools.ts +192 -93
- package/src/tests/smiles-tests.ts +31 -27
- package/{test-SequenceTranslator-2e08c8e54bde-1367d435.html → test-SequenceTranslator-089b6516ed77-2280593f.html} +2 -2
|
@@ -0,0 +1,2454 @@
|
|
|
1
|
+
var sequencetranslator_test;
|
|
2
|
+
/******/ (() => { // webpackBootstrap
|
|
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 */ "tests": () => (/* binding */ tests),
|
|
15
|
+
/* harmony export */ "currentCategory": () => (/* binding */ currentCategory),
|
|
16
|
+
/* harmony export */ "assure": () => (/* binding */ assure),
|
|
17
|
+
/* harmony export */ "Test": () => (/* binding */ Test),
|
|
18
|
+
/* harmony export */ "test": () => (/* binding */ test),
|
|
19
|
+
/* harmony export */ "assertNoError": () => (/* binding */ assertNoError),
|
|
20
|
+
/* harmony export */ "expect": () => (/* binding */ expect),
|
|
21
|
+
/* harmony export */ "expectFloat": () => (/* binding */ expectFloat),
|
|
22
|
+
/* harmony export */ "category": () => (/* binding */ category),
|
|
23
|
+
/* harmony export */ "before": () => (/* binding */ before),
|
|
24
|
+
/* harmony export */ "after": () => (/* binding */ after),
|
|
25
|
+
/* harmony export */ "runTests": () => (/* binding */ runTests),
|
|
26
|
+
/* harmony export */ "delay": () => (/* binding */ delay)
|
|
27
|
+
/* harmony export */ });
|
|
28
|
+
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
|
|
29
|
+
/* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
|
|
30
|
+
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
31
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
32
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
33
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
34
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
35
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
36
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
let tests = {};
|
|
41
|
+
let currentCategory;
|
|
42
|
+
var assure;
|
|
43
|
+
(function (assure) {
|
|
44
|
+
function notNull(value, name) {
|
|
45
|
+
if (value == null)
|
|
46
|
+
throw `${name == null ? 'Value' : name} not defined`;
|
|
47
|
+
}
|
|
48
|
+
assure.notNull = notNull;
|
|
49
|
+
})(assure || (assure = {}));
|
|
50
|
+
class Test {
|
|
51
|
+
constructor(category, name, test, options) {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
this.category = category;
|
|
54
|
+
this.name = name;
|
|
55
|
+
options !== null && options !== void 0 ? options : (options = {});
|
|
56
|
+
(_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);
|
|
57
|
+
(_b = options.unhandledExceptionTimeout) !== null && _b !== void 0 ? _b : (options.unhandledExceptionTimeout = 2000);
|
|
58
|
+
this.options = options;
|
|
59
|
+
this.test = () => __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
let result = '';
|
|
62
|
+
try {
|
|
63
|
+
datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError = '';
|
|
64
|
+
result = yield test();
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
reject(e);
|
|
68
|
+
}
|
|
69
|
+
if (!(yield assertNoError(options.unhandledExceptionTimeout)))
|
|
70
|
+
reject(`Unhandled exception during test: ${datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError}`);
|
|
71
|
+
resolve(result);
|
|
72
|
+
}));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function test(name, test, options) {
|
|
77
|
+
if (tests[currentCategory] == undefined)
|
|
78
|
+
tests[currentCategory] = {};
|
|
79
|
+
if (tests[currentCategory].tests == undefined)
|
|
80
|
+
tests[currentCategory].tests = [];
|
|
81
|
+
tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));
|
|
82
|
+
}
|
|
83
|
+
/** Awaits for a while checking the error status of the platform */
|
|
84
|
+
function assertNoError(ms) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
for (let i = 0; i < ms / 500; ++i) {
|
|
87
|
+
yield delay(500);
|
|
88
|
+
if (datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError.length !== 0)
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Tests two objects for equality, throws an exception if they are not equal. */
|
|
95
|
+
function expect(actual, expected) {
|
|
96
|
+
if (actual !== expected)
|
|
97
|
+
throw `Expected "${expected}", got "${actual}"`;
|
|
98
|
+
}
|
|
99
|
+
function expectFloat(actual, expected, tolerance = 0.001) {
|
|
100
|
+
const areEqual = Math.abs(actual - expected) < 0.001;
|
|
101
|
+
if (!areEqual)
|
|
102
|
+
throw `Expected ${expected}, got ${actual} (tolerance = ${tolerance})`;
|
|
103
|
+
}
|
|
104
|
+
/** Defines a test suite. */
|
|
105
|
+
function category(category, tests) {
|
|
106
|
+
currentCategory = category;
|
|
107
|
+
tests();
|
|
108
|
+
}
|
|
109
|
+
/** Defines a function to be executed before the tests in this category are executed. */
|
|
110
|
+
function before(before) {
|
|
111
|
+
if (tests[currentCategory] == undefined)
|
|
112
|
+
tests[currentCategory] = {};
|
|
113
|
+
tests[currentCategory].before = before;
|
|
114
|
+
}
|
|
115
|
+
/** Defines a function to be executed after the tests in this category are executed. */
|
|
116
|
+
function after(after) {
|
|
117
|
+
if (tests[currentCategory] == undefined)
|
|
118
|
+
tests[currentCategory] = {};
|
|
119
|
+
tests[currentCategory].after = after;
|
|
120
|
+
}
|
|
121
|
+
function runTests(options) {
|
|
122
|
+
var _a;
|
|
123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
let results = [];
|
|
125
|
+
for (const [key, value] of Object.entries(tests)) {
|
|
126
|
+
if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {
|
|
127
|
+
if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
if (value.before)
|
|
132
|
+
yield value.before();
|
|
133
|
+
}
|
|
134
|
+
catch (x) {
|
|
135
|
+
value.beforeStatus = x.toString();
|
|
136
|
+
}
|
|
137
|
+
let t = (_a = value.tests) !== null && _a !== void 0 ? _a : [];
|
|
138
|
+
let res = [];
|
|
139
|
+
for (let i = 0; i < t.length; i++) {
|
|
140
|
+
res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));
|
|
141
|
+
}
|
|
142
|
+
let data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');
|
|
143
|
+
try {
|
|
144
|
+
if (value.after)
|
|
145
|
+
yield value.after();
|
|
146
|
+
}
|
|
147
|
+
catch (x) {
|
|
148
|
+
value.afterStatus = x.toString();
|
|
149
|
+
}
|
|
150
|
+
if (value.afterStatus)
|
|
151
|
+
data.push({ category: key, name: 'init', result: value.afterStatus, success: false });
|
|
152
|
+
if (value.beforeStatus)
|
|
153
|
+
data.push({ category: key, name: 'init', result: value.beforeStatus, success: false });
|
|
154
|
+
results.push(...data);
|
|
155
|
+
}
|
|
156
|
+
return results;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function execTest(t, predicate) {
|
|
160
|
+
var _a;
|
|
161
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
let r;
|
|
163
|
+
try {
|
|
164
|
+
if (predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase())))
|
|
165
|
+
r = { success: true, result: 'skipped' };
|
|
166
|
+
else
|
|
167
|
+
r = { success: true, result: (_a = yield t.test()) !== null && _a !== void 0 ? _a : 'OK' };
|
|
168
|
+
}
|
|
169
|
+
catch (x) {
|
|
170
|
+
r = { success: false, result: x.toString() };
|
|
171
|
+
}
|
|
172
|
+
r.category = t.category;
|
|
173
|
+
r.name = t.name;
|
|
174
|
+
return r;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function delay(ms) {
|
|
178
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
yield new Promise(r => setTimeout(r, ms));
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQThJLEVBQUUsQ0FBQztBQUVqSyxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDO0lBQ3pELENBQUM7SUFIZSxjQUFPLFVBR3RCLENBQUE7QUFDSCxDQUFDLEVBTmdCLE1BQU0sS0FBTixNQUFNLFFBTXRCO0FBT0QsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FBcUI7O1FBQ3pGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxJQUFQLE9BQU8sR0FBSyxFQUFFLEVBQUM7UUFDZixNQUFBLE9BQU8sQ0FBQyxPQUFPLG9DQUFmLE9BQU8sQ0FBQyxPQUFPLEdBQUssS0FBSyxFQUFDO1FBQzFCLE1BQUEsT0FBTyxDQUFDLHlCQUF5QixvQ0FBakMsT0FBTyxDQUFDLHlCQUF5QixHQUFLLElBQUksRUFBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQXVCLEVBQUU7WUFDbkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFPLE9BQU8s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QUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsQ0FBQzs7Z0JBRXZDLENBQUMsR0FBRyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQUEsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLG1DQUFJLElBQUksRUFBQyxDQUFDO1NBQ3ZEO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixDQUFDLEdBQUcsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUMsQ0FBQztTQUM1QztRQUNELENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4QixDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEIsT0FBTyxDQUFDLENBQUM7O0NBQ1Y7QUFFRCxNQUFNLFVBQWdCLEtBQUssQ0FBQyxFQUFVOztRQUNwQyxNQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSBcImRhdGFncm9rLWFwaS9ncm9rXCI7XG5cbmV4cG9ydCBsZXQgdGVzdHM6IHtba2V5OiBzdHJpbmddOiB7dGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYmVmb3JlU3RhdHVzPzogc3RyaW5nLCBhZnRlclN0YXR1cz86IHN0cmluZ319ID0ge307XG5cbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5OiBzdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgYXNzdXJlIHtcblxuICBleHBvcnQgZnVuY3Rpb24gbm90TnVsbCh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICB0aHJvdyBgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICB0aW1lb3V0PyA6IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD8gOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICBvcHRpb25zLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQgPz89IDIwMDA7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGF3YWl0IGFzc2VydE5vRXJyb3Iob3B0aW9ucyEudW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dCEpKSlcbiAgICAgICAgICByZWplY3QoYFVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIHRlc3Q6ICR7Z3Jvay5zaGVsbC5sYXN0RXJyb3J9YCk7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiogQXdhaXRzIGZvciBhIHdoaWxlIGNoZWNraW5nIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIHBsYXRmb3JtICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0Tm9FcnJvcihtczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbXMgLyA1MDA7ICsraSkge1xuICAgIGF3YWl0IGRlbGF5KDUwMCk7XG4gICAgaWYgKGdyb2suc2hlbGwubGFzdEVycm9yLmxlbmd0aCAhPT0gMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KTogdm9pZCB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKVxuICAgIHRocm93IGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSk6IHZvaWQge1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IDAuMDAxO1xuICBpZiAoIWFyZUVxdWFsKVxuICAgIHRocm93IGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWA7XG59XG5cbi8qKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0czogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHMoKTtcbn1cblxuLyoqIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86IHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZ30pIHtcbiAgbGV0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nfVtdID0gW107XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBsZXQgdCA9IHZhbHVlLnRlc3RzID8/IFtdO1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gKGF3YWl0IFByb21pc2UuYWxsKHJlcykpLmZpbHRlcigoZCkgPT4gZC5yZXN1bHQgIT0gJ3NraXBwZWQnKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmFmdGVyKVxuICAgICAgICBhd2FpdCB2YWx1ZS5hZnRlcigpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYWZ0ZXJTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5hZnRlclN0YXR1cylcbiAgICAgIGRhdGEucHVzaCh7Y2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmFmdGVyU3RhdHVzLCBzdWNjZXNzOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlfSk7XG4gICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGxldCByOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZyB9O1xuICB0cnkge1xuICAgIGlmIChwcmVkaWNhdGUgIT0gdW5kZWZpbmVkICYmICghdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSkpKVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6ICdza2lwcGVkJ307XG4gICAgZWxzZVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IGF3YWl0IHQudGVzdCgpID8/ICdPSyd9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKX07XG4gIH1cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7XG4gIGF3YWl0ICBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cbiJdfQ==
|
|
183
|
+
|
|
184
|
+
/***/ }),
|
|
185
|
+
|
|
186
|
+
/***/ "./src/structures-works/converters.ts":
|
|
187
|
+
/*!********************************************!*\
|
|
188
|
+
!*** ./src/structures-works/converters.ts ***!
|
|
189
|
+
\********************************************/
|
|
190
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
191
|
+
|
|
192
|
+
__webpack_require__.r(__webpack_exports__);
|
|
193
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
194
|
+
/* harmony export */ "asoGapmersNucleotidesToBioSpring": () => (/* binding */ asoGapmersNucleotidesToBioSpring),
|
|
195
|
+
/* harmony export */ "asoGapmersNucleotidesToGcrs": () => (/* binding */ asoGapmersNucleotidesToGcrs),
|
|
196
|
+
/* harmony export */ "asoGapmersBioSpringToNucleotides": () => (/* binding */ asoGapmersBioSpringToNucleotides),
|
|
197
|
+
/* harmony export */ "asoGapmersBioSpringToGcrs": () => (/* binding */ asoGapmersBioSpringToGcrs),
|
|
198
|
+
/* harmony export */ "asoGapmersGcrsToBioSpring": () => (/* binding */ asoGapmersGcrsToBioSpring),
|
|
199
|
+
/* harmony export */ "asoGapmersGcrsToNucleotides": () => (/* binding */ asoGapmersGcrsToNucleotides),
|
|
200
|
+
/* harmony export */ "siRnaBioSpringToNucleotides": () => (/* binding */ siRnaBioSpringToNucleotides),
|
|
201
|
+
/* harmony export */ "siRnaBioSpringToAxolabs": () => (/* binding */ siRnaBioSpringToAxolabs),
|
|
202
|
+
/* harmony export */ "siRnaBioSpringToGcrs": () => (/* binding */ siRnaBioSpringToGcrs),
|
|
203
|
+
/* harmony export */ "siRnaAxolabsToGcrs": () => (/* binding */ siRnaAxolabsToGcrs),
|
|
204
|
+
/* harmony export */ "siRnaAxolabsToBioSpring": () => (/* binding */ siRnaAxolabsToBioSpring),
|
|
205
|
+
/* harmony export */ "siRnaAxolabsToNucleotides": () => (/* binding */ siRnaAxolabsToNucleotides),
|
|
206
|
+
/* harmony export */ "siRnaGcrsToNucleotides": () => (/* binding */ siRnaGcrsToNucleotides),
|
|
207
|
+
/* harmony export */ "siRnaGcrsToBioSpring": () => (/* binding */ siRnaGcrsToBioSpring),
|
|
208
|
+
/* harmony export */ "siRnaGcrsToAxolabs": () => (/* binding */ siRnaGcrsToAxolabs),
|
|
209
|
+
/* harmony export */ "siRnaNucleotideToBioSpringSenseStrand": () => (/* binding */ siRnaNucleotideToBioSpringSenseStrand),
|
|
210
|
+
/* harmony export */ "siRnaNucleotidesToGcrs": () => (/* binding */ siRnaNucleotidesToGcrs),
|
|
211
|
+
/* harmony export */ "siRnaNucleotideToAxolabsSenseStrand": () => (/* binding */ siRnaNucleotideToAxolabsSenseStrand),
|
|
212
|
+
/* harmony export */ "siRnaNucleotideToAxolabsAntisenseStrand": () => (/* binding */ siRnaNucleotideToAxolabsAntisenseStrand),
|
|
213
|
+
/* harmony export */ "gcrsToNucleotides": () => (/* binding */ gcrsToNucleotides),
|
|
214
|
+
/* harmony export */ "gcrsToMermade12": () => (/* binding */ gcrsToMermade12)
|
|
215
|
+
/* harmony export */ });
|
|
216
|
+
//name: asoGapmersNucleotidesToBioSpring
|
|
217
|
+
//input: string nucleotides {semType: DNA nucleotides}
|
|
218
|
+
//output: string result {semType: BioSpring / Gapmers}
|
|
219
|
+
function asoGapmersNucleotidesToBioSpring(nucleotides) {
|
|
220
|
+
let count = -1;
|
|
221
|
+
const objForEdges = {
|
|
222
|
+
'(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': '5*', 'A': '6*', 'C': '7*', 'G': '8*'
|
|
223
|
+
};
|
|
224
|
+
const objForCenter = {
|
|
225
|
+
'(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': 'T*', 'A': 'A*', 'C': '9*', 'G': 'G*'
|
|
226
|
+
};
|
|
227
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|T|C|G)/g, function (x) {
|
|
228
|
+
count++;
|
|
229
|
+
return (count > 4 && count < 15) ? objForCenter[x] : objForEdges[x];
|
|
230
|
+
}).slice(0, (nucleotides.endsWith('(invabasic)') || nucleotides.endsWith('(GalNAc-2-JNJ)')) ?
|
|
231
|
+
nucleotides.length : 2 * count + 1);
|
|
232
|
+
}
|
|
233
|
+
//name: asoGapmersNucleotidesToGcrs
|
|
234
|
+
//input: string nucleotides {semType: DNA nucleotides}
|
|
235
|
+
//output: string result {semType: GCRS / Gapmers}
|
|
236
|
+
function asoGapmersNucleotidesToGcrs(nucleotides) {
|
|
237
|
+
let count = -1;
|
|
238
|
+
const objForEdges = {
|
|
239
|
+
'(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': 'moeUnps',
|
|
240
|
+
'A': 'moeAnps', 'C': 'moe5mCnps', 'G': 'moeGnps'
|
|
241
|
+
};
|
|
242
|
+
const objForCenter = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
243
|
+
'C': '5mCps', 'A': 'Aps', 'T': 'Tps', 'G': 'Gps' };
|
|
244
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|T|C|G)/g, function (x) {
|
|
245
|
+
count++;
|
|
246
|
+
if (count < 5)
|
|
247
|
+
return (count == 4) ? objForEdges[x].slice(0, -3) + 'ps' : objForEdges[x];
|
|
248
|
+
if (count < 15)
|
|
249
|
+
return (count == 14) ? objForCenter[x].slice(0, -2) + 'nps' : objForCenter[x];
|
|
250
|
+
return objForEdges[x];
|
|
251
|
+
}).slice(0, (nucleotides.endsWith('(invabasic)') || nucleotides.endsWith('(GalNAc-2-JNJ)')) ?
|
|
252
|
+
nucleotides.length : -3);
|
|
253
|
+
}
|
|
254
|
+
//name: asoGapmersBioSpringToNucleotides
|
|
255
|
+
//input: string nucleotides {semType: BioSpring / Gapmers}
|
|
256
|
+
//output: string result {semType: DNA nucleotides}
|
|
257
|
+
function asoGapmersBioSpringToNucleotides(nucleotides) {
|
|
258
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
259
|
+
'*': '', '5': 'T', '6': 'A', '7': 'C', '8': 'G', '9': 'C' };
|
|
260
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|\*|5|6|7|8|9)/g, function (x) { return obj[x]; });
|
|
261
|
+
}
|
|
262
|
+
//name: asoGapmersBioSpringToGcrs
|
|
263
|
+
//input: string nucleotides {semType: BioSpring / Gapmers}
|
|
264
|
+
//output: string result {semType: GCRS / Gapmers}
|
|
265
|
+
function asoGapmersBioSpringToGcrs(nucleotides) {
|
|
266
|
+
let count = -1;
|
|
267
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
268
|
+
'5*': 'moeUnps', '6*': 'moeAnps', '7*': 'moe5mCnps', '8*': 'moeGnps', '9*': '5mCps', 'A*': 'Aps', 'T*': 'Tps',
|
|
269
|
+
'G*': 'Gps', 'C*': 'Cps', '5': 'moeU', '6': 'moeA', '7': 'moe5mC', '8': 'moeG',
|
|
270
|
+
};
|
|
271
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|5\*|6\*|7\*|8\*|9\*|A\*|T\*|G\*|C\*|5|6|7|8)/g, function (x) {
|
|
272
|
+
count++;
|
|
273
|
+
return (count == 4) ? obj[x].slice(0, -3) + 'ps' : (count == 14) ? obj[x].slice(0, -2) + 'nps' : obj[x];
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
//name: asoGapmersGcrsToBioSpring
|
|
277
|
+
//input: string nucleotides {semType: GCRS / Gapmers}
|
|
278
|
+
//output: string result {semType: BioSpring / Gapmers}
|
|
279
|
+
function asoGapmersGcrsToBioSpring(nucleotides) {
|
|
280
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
281
|
+
'moeT': '5', 'moeA': '6', 'moe5mC': '7', 'moeG': '8', 'moeU': '5', '5mC': '9', 'nps': '*', 'ps': '*', 'U': 'T',
|
|
282
|
+
};
|
|
283
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|moeT|moeA|moe5mC|moeG|moeU|5mC|nps|ps|U)/g, function (x) { return obj[x]; });
|
|
284
|
+
}
|
|
285
|
+
//name: asoGapmersGcrsToNucleotides
|
|
286
|
+
//input: string nucleotides {semType: GCRS / Gapmers}
|
|
287
|
+
//output: string result {semType: DNA nucleotides}
|
|
288
|
+
function asoGapmersGcrsToNucleotides(nucleotides) {
|
|
289
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
290
|
+
'moe': '', '5m': '', 'n': '', 'ps': '', 'U': 'T' };
|
|
291
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|moe|5m|n|ps|U)/g, function (x) { return obj[x]; });
|
|
292
|
+
}
|
|
293
|
+
//name: siRnaBioSpringToNucleotides
|
|
294
|
+
//input: string nucleotides {semType: BioSpring / siRNA}
|
|
295
|
+
//output: string result {semType: RNA nucleotides}
|
|
296
|
+
function siRnaBioSpringToNucleotides(nucleotides) {
|
|
297
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
298
|
+
'1': 'U', '2': 'A', '3': 'C', '4': 'G', '5': 'U', '6': 'A', '7': 'C', '8': 'G', '*': '' };
|
|
299
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
|
|
300
|
+
}
|
|
301
|
+
//name: siRnaBioSpringToAxolabs
|
|
302
|
+
//input: string nucleotides {semType: BioSpring / siRNA}
|
|
303
|
+
//output: string result {semType: Axolabs / siRNA}
|
|
304
|
+
function siRnaBioSpringToAxolabs(nucleotides) {
|
|
305
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
306
|
+
'1': 'Uf', '2': 'Af', '3': 'Cf', '4': 'Gf', '5': 'u', '6': 'a', '7': 'c', '8': 'g', '*': 's' };
|
|
307
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
|
|
308
|
+
}
|
|
309
|
+
//name: siRnaBioSpringToGcrs
|
|
310
|
+
//input: string nucleotides {semType: BioSpring / siRNA}
|
|
311
|
+
//output: string result {semType: GCRS}
|
|
312
|
+
function siRnaBioSpringToGcrs(nucleotides) {
|
|
313
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
314
|
+
'1': 'fU', '2': 'fA', '3': 'fC', '4': 'fG', '5': 'mU', '6': 'mA', '7': 'mC', '8': 'mG', '*': 'ps' };
|
|
315
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
|
|
316
|
+
}
|
|
317
|
+
//name: siRnaAxolabsToGcrs
|
|
318
|
+
//input: string nucleotides {semType: Axolabs / siRNA}
|
|
319
|
+
//output: string result {semType: GCRS}
|
|
320
|
+
function siRnaAxolabsToGcrs(nucleotides) {
|
|
321
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
322
|
+
'Uf': 'fU', 'Af': 'fA', 'Cf': 'fC', 'Gf': 'fG', 'u': 'mU', 'a': 'mA', 'c': 'mC', 'g': 'mG', 's': 'ps',
|
|
323
|
+
};
|
|
324
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
|
|
325
|
+
}
|
|
326
|
+
//name: siRnaAxolabsToBioSpring
|
|
327
|
+
//input: string nucleotides {semType: Axolabs / siRNA}
|
|
328
|
+
//output: string result {semType: BioSpring / siRNA}
|
|
329
|
+
function siRnaAxolabsToBioSpring(nucleotides) {
|
|
330
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
331
|
+
'Uf': '1', 'Af': '2', 'Cf': '3', 'Gf': '4', 'u': '5', 'a': '6', 'c': '7', 'g': '8', 's': '*',
|
|
332
|
+
};
|
|
333
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
|
|
334
|
+
}
|
|
335
|
+
//name: siRnaAxolabsToNucleotides
|
|
336
|
+
//input: string nucleotides {semType: Axolabs / siRNA}
|
|
337
|
+
//output: string result {semType: RNA nucleotides}
|
|
338
|
+
function siRnaAxolabsToNucleotides(nucleotides) {
|
|
339
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
340
|
+
'Uf': 'U', 'Af': 'A', 'Cf': 'C', 'Gf': 'G', 'u': 'U', 'a': 'A', 'c': 'C', 'g': 'G', 's': '',
|
|
341
|
+
};
|
|
342
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
|
|
343
|
+
}
|
|
344
|
+
//name: siRnaGcrsToNucleotides
|
|
345
|
+
//input: string nucleotides {semType: GCRS}
|
|
346
|
+
//output: string result {semType: RNA nucleotides}
|
|
347
|
+
function siRnaGcrsToNucleotides(nucleotides) {
|
|
348
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
349
|
+
'fU': 'U', 'fA': 'A', 'fC': 'C', 'fG': 'G', 'mU': 'U', 'mA': 'A', 'mC': 'C', 'mG': 'G', 'ps': '',
|
|
350
|
+
};
|
|
351
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
|
|
352
|
+
}
|
|
353
|
+
//name: siRnaGcrsToBioSpring
|
|
354
|
+
//input: string nucleotides {semType: GCRS}
|
|
355
|
+
//output: string result {semType: BioSpring / siRNA}
|
|
356
|
+
function siRnaGcrsToBioSpring(nucleotides) {
|
|
357
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
358
|
+
'fU': '1', 'fA': '2', 'fC': '3', 'fG': '4', 'mU': '5', 'mA': '6', 'mC': '7', 'mG': '8', 'ps': '*',
|
|
359
|
+
};
|
|
360
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
|
|
361
|
+
}
|
|
362
|
+
//name: siRnaGcrsToAxolabs
|
|
363
|
+
//input: string nucleotides {semType: GCRS}
|
|
364
|
+
//output: string result {semType: Axolabs / siRNA}
|
|
365
|
+
function siRnaGcrsToAxolabs(nucleotides) {
|
|
366
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
367
|
+
'fU': 'Uf', 'fA': 'Af', 'fC': 'Cf', 'fG': 'Gf', 'mU': 'u', 'mA': 'a', 'mC': 'c', 'mG': 'g', 'ps': 's',
|
|
368
|
+
};
|
|
369
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
|
|
370
|
+
}
|
|
371
|
+
//name: siRnaNucleotideToBioSpringSenseStrand
|
|
372
|
+
//input: string nucleotides {semType: RNA nucleotides}
|
|
373
|
+
//output: string result {semType: BioSpring / siRNA}
|
|
374
|
+
function siRnaNucleotideToBioSpringSenseStrand(nucleotides) {
|
|
375
|
+
let count = -1;
|
|
376
|
+
const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
377
|
+
'A': '6*', 'U': '5*', 'G': '8*', 'C': '7*' };
|
|
378
|
+
const objForRightEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
379
|
+
'A': '*6', 'U': '*5', 'G': '*8', 'C': '*7' };
|
|
380
|
+
const objForOddIndices = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
381
|
+
'A': '6', 'U': '5', 'G': '8', 'C': '7' };
|
|
382
|
+
const objForEvenIndices = { '(invabasic)': '(invabasic)',
|
|
383
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': '2', 'U': '1', 'G': '4', 'C': '3' };
|
|
384
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
|
|
385
|
+
count++;
|
|
386
|
+
if (count < 2)
|
|
387
|
+
return objForLeftEdge[x];
|
|
388
|
+
if (count > nucleotides.length - 3)
|
|
389
|
+
return objForRightEdge[x];
|
|
390
|
+
return (count % 2 == 0) ? objForEvenIndices[x] : objForOddIndices[x];
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
//name: siRnaNucleotidesToGcrs
|
|
394
|
+
//input: string nucleotides {semType: RNA nucleotides}
|
|
395
|
+
//output: string result {semType: GCRS}
|
|
396
|
+
function siRnaNucleotidesToGcrs(nucleotides) {
|
|
397
|
+
let count = -1;
|
|
398
|
+
const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
399
|
+
'A': 'mAps', 'U': 'mUps', 'G': 'mGps', 'C': 'mCps' };
|
|
400
|
+
const objForRightEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
401
|
+
'A': 'psmA', 'U': 'psmU', 'G': 'psmG', 'C': 'psmC' };
|
|
402
|
+
const objForEvenIndices = { '(invabasic)': '(invabasic)',
|
|
403
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'fA', 'U': 'fU', 'G': 'fG', 'C': 'fC' };
|
|
404
|
+
const objForOddIndices = { '(invabasic)': '(invabasic)',
|
|
405
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'mA', 'U': 'mU', 'G': 'mG', 'C': 'mC' };
|
|
406
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
|
|
407
|
+
count++;
|
|
408
|
+
if (count < 2)
|
|
409
|
+
return objForLeftEdge[x];
|
|
410
|
+
if (count > nucleotides.length - 3)
|
|
411
|
+
return objForRightEdge[x];
|
|
412
|
+
return (count % 2 == 0) ? objForEvenIndices[x] : objForOddIndices[x];
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
//name: siRnaNucleotideToAxolabsSenseStrand
|
|
416
|
+
//input: string nucleotides {semType: RNA nucleotides}
|
|
417
|
+
//output: string result {semType: Axolabs}
|
|
418
|
+
function siRnaNucleotideToAxolabsSenseStrand(nucleotides) {
|
|
419
|
+
let count = -1;
|
|
420
|
+
const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
421
|
+
'A': 'as', 'U': 'us', 'G': 'gs', 'C': 'cs' };
|
|
422
|
+
const objForSomeIndices = { '(invabasic)': '(invabasic)',
|
|
423
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Af', 'U': 'Uf', 'G': 'Gf', 'C': 'Cf' };
|
|
424
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
425
|
+
'A': 'a', 'U': 'u', 'G': 'g', 'C': 'c' };
|
|
426
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
|
|
427
|
+
count++;
|
|
428
|
+
if (count < 2)
|
|
429
|
+
return objForLeftEdge[x];
|
|
430
|
+
if (count == 6 || (count > 7 && count < 11))
|
|
431
|
+
return objForSomeIndices[x];
|
|
432
|
+
if (count == nucleotides.length - 1)
|
|
433
|
+
return 'a';
|
|
434
|
+
return obj[x];
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
//name: siRnaNucleotideToAxolabsAntisenseStrand
|
|
438
|
+
//input: string nucleotides {semType: RNA nucleotides}
|
|
439
|
+
//output: string result {semType: Axolabs}
|
|
440
|
+
function siRnaNucleotideToAxolabsAntisenseStrand(nucleotides) {
|
|
441
|
+
let count = -1;
|
|
442
|
+
const objForSmallLinkages = { '(invabasic)': '(invabasic)',
|
|
443
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'as', 'U': 'us', 'G': 'gs', 'C': 'cs' };
|
|
444
|
+
const objForBigLinkages = { '(invabasic)': '(invabasic)',
|
|
445
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Afs', 'U': 'Ufs', 'G': 'Gfs', 'C': 'Cfs' };
|
|
446
|
+
const objForSomeIndices = { '(invabasic)': '(invabasic)',
|
|
447
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Af', 'U': 'Uf', 'G': 'Gf', 'C': 'Cf' };
|
|
448
|
+
const obj = { '(invabasic)': '(invabasic)',
|
|
449
|
+
'(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'a', 'U': 'u', 'G': 'g', 'C': 'c' };
|
|
450
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
|
|
451
|
+
count++;
|
|
452
|
+
if (count > 19 && count < 22)
|
|
453
|
+
return objForSmallLinkages[x];
|
|
454
|
+
if (count == 0)
|
|
455
|
+
return 'us';
|
|
456
|
+
if (count == 1)
|
|
457
|
+
return objForBigLinkages[x];
|
|
458
|
+
return (count == 5 || count == 7 || count == 8 || count == 13 || count == 15) ? objForSomeIndices[x] : obj[x];
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
//name: gcrsToNucleotides
|
|
462
|
+
//input: string nucleotides {semType: GCRS}
|
|
463
|
+
//output: string result {semType: RNA nucleotides}
|
|
464
|
+
function gcrsToNucleotides(nucleotides) {
|
|
465
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
466
|
+
'mAps': 'A', 'mUps': 'U', 'mGps': 'G', 'mCps': 'C', 'fAps': 'A', 'fUps': 'U', 'fGps': 'G', 'fCps': 'C',
|
|
467
|
+
'fU': 'U', 'fA': 'A', 'fC': 'C', 'fG': 'G', 'mU': 'U', 'mA': 'A', 'mC': 'C', 'mG': 'G',
|
|
468
|
+
};
|
|
469
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|mAps|mUps|mGps|mCps|fAps|fUps|fGps|fCps|fU|fA|fC|fG|mU|mA|mC|mG)/g, function (x) { return obj[x]; });
|
|
470
|
+
}
|
|
471
|
+
//name: gcrsToMermade12
|
|
472
|
+
//input: string nucleotides {semType: GCRS}
|
|
473
|
+
//output: string result {semType: Mermade 12 / siRNA}
|
|
474
|
+
function gcrsToMermade12(nucleotides) {
|
|
475
|
+
const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
|
|
476
|
+
'mAps': 'e', 'mUps': 'h', 'mGps': 'g', 'mCps': 'f', 'fAps': 'i', 'fUps': 'l', 'fGps': 'k', 'fCps': 'j', 'fU': 'L',
|
|
477
|
+
'fA': 'I', 'fC': 'J', 'fG': 'K', 'mU': 'H', 'mA': 'E', 'mC': 'F', 'mG': 'G',
|
|
478
|
+
};
|
|
479
|
+
return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|mAps|mUps|mGps|mCps|fAps|fUps|fGps|fCps|fU|fA|fC|fG|mU|mA|mC|mG)/g, function (x) { return obj[x]; });
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
/***/ }),
|
|
484
|
+
|
|
485
|
+
/***/ "./src/structures-works/from-monomers.ts":
|
|
486
|
+
/*!***********************************************!*\
|
|
487
|
+
!*** ./src/structures-works/from-monomers.ts ***!
|
|
488
|
+
\***********************************************/
|
|
489
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
490
|
+
|
|
491
|
+
__webpack_require__.r(__webpack_exports__);
|
|
492
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
493
|
+
/* harmony export */ "sequenceToMolV3000": () => (/* binding */ sequenceToMolV3000),
|
|
494
|
+
/* harmony export */ "sequenceToSmiles": () => (/* binding */ sequenceToSmiles)
|
|
495
|
+
/* harmony export */ });
|
|
496
|
+
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
497
|
+
/* harmony import */ var _sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
|
|
498
|
+
/* harmony import */ var _mol_transformations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mol-transformations */ "./src/structures-works/mol-transformations.ts");
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
function sequenceToMolV3000(sequence, inverted = false, oclRender = false, format) {
|
|
503
|
+
const obj = getObjectWithCodesAndSmiles(sequence, format);
|
|
504
|
+
let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
|
|
505
|
+
let i = 0;
|
|
506
|
+
const smilesCodes = [];
|
|
507
|
+
const codesList = [];
|
|
508
|
+
const links = ['s', 'ps', '*'];
|
|
509
|
+
const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
|
|
510
|
+
const dropdowns = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS);
|
|
511
|
+
codes = codes.concat(dropdowns);
|
|
512
|
+
while (i < sequence.length) {
|
|
513
|
+
const code = codes.find((s) => s == sequence.slice(i, i + s.length));
|
|
514
|
+
i += code.length;
|
|
515
|
+
inverted ? codesList.unshift(code) : codesList.push(code);
|
|
516
|
+
}
|
|
517
|
+
for (let i = 0; i < codesList.length; i++) {
|
|
518
|
+
if (dropdowns.includes(codesList[i])) {
|
|
519
|
+
smilesCodes.push((i >= codesList.length / 2) ?
|
|
520
|
+
_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].right : _map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].left);
|
|
521
|
+
smilesCodes.push(_map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles);
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
if (links.includes(codesList[i]) ||
|
|
525
|
+
includesStandardLinkAlready.includes(codesList[i]) ||
|
|
526
|
+
(i < codesList.length - 1 && links.includes(codesList[i + 1])))
|
|
527
|
+
smilesCodes.push(obj[codesList[i]]);
|
|
528
|
+
else {
|
|
529
|
+
smilesCodes.push(obj[codesList[i]]);
|
|
530
|
+
smilesCodes.push(_map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return (0,_mol_transformations__WEBPACK_IMPORTED_MODULE_2__.getNucleotidesMol)(smilesCodes, oclRender);
|
|
535
|
+
}
|
|
536
|
+
function sequenceToSmiles(sequence, inverted = false, format) {
|
|
537
|
+
const obj = getObjectWithCodesAndSmiles(sequence, format);
|
|
538
|
+
let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
|
|
539
|
+
let i = 0;
|
|
540
|
+
let smiles = '';
|
|
541
|
+
const codesList = [];
|
|
542
|
+
const links = ['s', 'ps', '*'];
|
|
543
|
+
const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
|
|
544
|
+
const dropdowns = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS);
|
|
545
|
+
codes = codes.concat(dropdowns);
|
|
546
|
+
while (i < sequence.length) {
|
|
547
|
+
const code = codes.find((s) => s == sequence.slice(i, i + s.length));
|
|
548
|
+
i += code.length;
|
|
549
|
+
inverted ? codesList.unshift(code) : codesList.push(code);
|
|
550
|
+
}
|
|
551
|
+
for (let i = 0; i < codesList.length; i++) {
|
|
552
|
+
if (dropdowns.includes(codesList[i])) {
|
|
553
|
+
smiles += (i >= codesList.length / 2) ?
|
|
554
|
+
_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].right + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles :
|
|
555
|
+
_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].left + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles;
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
if (links.includes(codesList[i]) ||
|
|
559
|
+
includesStandardLinkAlready.includes(codesList[i]) ||
|
|
560
|
+
(i < codesList.length - 1 && links.includes(codesList[i + 1])))
|
|
561
|
+
smiles += obj[codesList[i]];
|
|
562
|
+
else
|
|
563
|
+
smiles += obj[codesList[i]] + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
smiles = smiles.replace(/OO/g, 'O');
|
|
567
|
+
return ((links.includes(codesList[codesList.length - 1]) &&
|
|
568
|
+
codesList.length > 1 &&
|
|
569
|
+
!includesStandardLinkAlready.includes(codesList[codesList.length - 2])) ||
|
|
570
|
+
dropdowns.includes(codesList[codesList.length - 1]) ||
|
|
571
|
+
includesStandardLinkAlready.includes(codesList[codesList.length - 1])) ?
|
|
572
|
+
smiles :
|
|
573
|
+
smiles.slice(0, smiles.length - _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles.length + 1);
|
|
574
|
+
}
|
|
575
|
+
function getObjectWithCodesAndSmiles(sequence, format) {
|
|
576
|
+
const obj = {};
|
|
577
|
+
if (format == null) {
|
|
578
|
+
for (const synthesizer of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map)) {
|
|
579
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer])) {
|
|
580
|
+
for (const code of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]))
|
|
581
|
+
obj[code] = _map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology][code].SMILES;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[format])) {
|
|
587
|
+
for (const code of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[format][technology]))
|
|
588
|
+
obj[code] = _map__WEBPACK_IMPORTED_MODULE_0__.map[format][technology][code].SMILES;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
// TODO: create object based from synthesizer type to avoid key(codes) duplicates
|
|
592
|
+
const output = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.isValidSequence)(sequence, format);
|
|
593
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12))
|
|
594
|
+
obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
|
|
595
|
+
else if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS))
|
|
596
|
+
obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
|
|
597
|
+
return obj;
|
|
598
|
+
}
|
|
599
|
+
function sortByStringLengthInDescendingOrder(array) {
|
|
600
|
+
return array.sort(function (a, b) { return b.length - a.length; });
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
/***/ }),
|
|
605
|
+
|
|
606
|
+
/***/ "./src/structures-works/map.ts":
|
|
607
|
+
/*!*************************************!*\
|
|
608
|
+
!*** ./src/structures-works/map.ts ***!
|
|
609
|
+
\*************************************/
|
|
610
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
611
|
+
|
|
612
|
+
__webpack_require__.r(__webpack_exports__);
|
|
613
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
614
|
+
/* harmony export */ "SYNTHESIZERS": () => (/* binding */ SYNTHESIZERS),
|
|
615
|
+
/* harmony export */ "TECHNOLOGIES": () => (/* binding */ TECHNOLOGIES),
|
|
616
|
+
/* harmony export */ "COL_NAMES": () => (/* binding */ COL_NAMES),
|
|
617
|
+
/* harmony export */ "MODIFICATIONS": () => (/* binding */ MODIFICATIONS),
|
|
618
|
+
/* harmony export */ "stadardPhosphateLinkSmiles": () => (/* binding */ stadardPhosphateLinkSmiles),
|
|
619
|
+
/* harmony export */ "map": () => (/* binding */ map)
|
|
620
|
+
/* harmony export */ });
|
|
621
|
+
const SYNTHESIZERS = {
|
|
622
|
+
RAW_NUCLEOTIDES: 'Raw Nucleotides',
|
|
623
|
+
BIOSPRING: 'BioSpring Codes',
|
|
624
|
+
GCRS: 'Janssen GCRS Codes',
|
|
625
|
+
AXOLABS: 'Axolabs Codes',
|
|
626
|
+
MERMADE_12: 'Mermade 12',
|
|
627
|
+
};
|
|
628
|
+
const TECHNOLOGIES = {
|
|
629
|
+
DNA: 'DNA',
|
|
630
|
+
RNA: 'RNA',
|
|
631
|
+
ASO_GAPMERS: 'For ASO Gapmers',
|
|
632
|
+
SI_RNA: 'For 2\'-OMe and 2\'-F modified siRNA',
|
|
633
|
+
};
|
|
634
|
+
const COL_NAMES = {
|
|
635
|
+
CHEMISTRY: 'Chemistry',
|
|
636
|
+
NUMBER: 'Number',
|
|
637
|
+
TYPE: 'Type',
|
|
638
|
+
CHEMISTRY_NAME: 'Chemistry Name',
|
|
639
|
+
INTERNAL_COMPOUND_ID: 'Internal compound ID',
|
|
640
|
+
IDP: 'IDP',
|
|
641
|
+
SEQUENCE: 'Sequence',
|
|
642
|
+
COMPOUND_NAME: 'Compound Name',
|
|
643
|
+
COMPOUND_COMMENTS: 'Compound Comments',
|
|
644
|
+
SALT: 'Salt',
|
|
645
|
+
EQUIVALENTS: 'Equivalents',
|
|
646
|
+
PURITY: 'Purity',
|
|
647
|
+
CPD_MW: 'Cpd MW',
|
|
648
|
+
SALT_MASS: 'Salt mass',
|
|
649
|
+
BATCH_MW: 'Batch MW',
|
|
650
|
+
SOURCE: 'Source',
|
|
651
|
+
ICD: 'ICD',
|
|
652
|
+
OWNER: 'Owner',
|
|
653
|
+
};
|
|
654
|
+
// interface CODES {
|
|
655
|
+
// }
|
|
656
|
+
const MODIFICATIONS = {
|
|
657
|
+
'(invabasic)': {
|
|
658
|
+
molecularWeight: 118.13,
|
|
659
|
+
left: 'O[C@@H]1C[C@@H]O[C@H]1CO',
|
|
660
|
+
right: 'O[C@@H]1C[C@@H]O[C@H]1CO',
|
|
661
|
+
},
|
|
662
|
+
'(GalNAc-2-JNJ)': {
|
|
663
|
+
molecularWeight: 1273.3,
|
|
664
|
+
left: 'C(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
665
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
666
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)NC(=O)CCCC(=O)NCC(O)CO',
|
|
667
|
+
right: 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
668
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
669
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)',
|
|
670
|
+
},
|
|
671
|
+
};
|
|
672
|
+
const stadardPhosphateLinkSmiles = 'OP(=O)(O)O';
|
|
673
|
+
const map = {
|
|
674
|
+
'Raw Nucleotides': {
|
|
675
|
+
'DNA': {
|
|
676
|
+
'A': {
|
|
677
|
+
'name': 'Adenine',
|
|
678
|
+
'weight': 313.21,
|
|
679
|
+
'normalized': 'dA',
|
|
680
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
|
|
681
|
+
},
|
|
682
|
+
'T': {
|
|
683
|
+
'name': 'Tyrosine',
|
|
684
|
+
'weight': 304.2,
|
|
685
|
+
'normalized': 'dT',
|
|
686
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
|
|
687
|
+
},
|
|
688
|
+
'G': {
|
|
689
|
+
'name': 'Guanine',
|
|
690
|
+
'weight': 329.21,
|
|
691
|
+
'normalized': 'dG',
|
|
692
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
|
|
693
|
+
},
|
|
694
|
+
'C': {
|
|
695
|
+
'name': 'Cytosine',
|
|
696
|
+
'weight': 289.18,
|
|
697
|
+
'normalized': 'dC',
|
|
698
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
|
|
699
|
+
},
|
|
700
|
+
},
|
|
701
|
+
'RNA': {
|
|
702
|
+
'A': {
|
|
703
|
+
'name': 'Adenine',
|
|
704
|
+
'weight': 313.21,
|
|
705
|
+
'normalized': 'dA',
|
|
706
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
|
|
707
|
+
},
|
|
708
|
+
'U': {
|
|
709
|
+
'name': 'Uracil',
|
|
710
|
+
'weight': 306.17,
|
|
711
|
+
'normalized': 'rU',
|
|
712
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](O)[C@@H]1O',
|
|
713
|
+
},
|
|
714
|
+
'G': {
|
|
715
|
+
'name': 'Guanine',
|
|
716
|
+
'weight': 329.21,
|
|
717
|
+
'normalized': 'dG',
|
|
718
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
|
|
719
|
+
},
|
|
720
|
+
'C': {
|
|
721
|
+
'name': 'Cytosine',
|
|
722
|
+
'weight': 289.18,
|
|
723
|
+
'normalized': 'dC',
|
|
724
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
|
|
725
|
+
},
|
|
726
|
+
},
|
|
727
|
+
},
|
|
728
|
+
'BioSpring Codes': {
|
|
729
|
+
'For ASO Gapmers': {
|
|
730
|
+
'5': {
|
|
731
|
+
'name': '2\'MOE-5Me-rU',
|
|
732
|
+
'weight': 378.27,
|
|
733
|
+
'normalized': 'rU',
|
|
734
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))[C@H](OCCOC)[C@@H]1O',
|
|
735
|
+
},
|
|
736
|
+
'6': {
|
|
737
|
+
'name': '2\'MOE-rA',
|
|
738
|
+
'weight': 387.29,
|
|
739
|
+
'normalized': 'rA',
|
|
740
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
|
|
741
|
+
},
|
|
742
|
+
'7': {
|
|
743
|
+
'name': '2\'MOE-5Me-rC',
|
|
744
|
+
'weight': 377.29,
|
|
745
|
+
'normalized': 'rC',
|
|
746
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
|
|
747
|
+
},
|
|
748
|
+
'8': {
|
|
749
|
+
'name': '2\'MOE-rG',
|
|
750
|
+
'weight': 403.28,
|
|
751
|
+
'normalized': 'rG',
|
|
752
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
|
|
753
|
+
},
|
|
754
|
+
'9': {
|
|
755
|
+
'name': '5-Methyl-dC',
|
|
756
|
+
'weight': 303.21,
|
|
757
|
+
'normalized': 'dC',
|
|
758
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
|
|
759
|
+
},
|
|
760
|
+
'*': {
|
|
761
|
+
'name': 'ps linkage',
|
|
762
|
+
'weight': 16.07,
|
|
763
|
+
'normalized': '',
|
|
764
|
+
'SMILES': 'OP(=O)(S)O',
|
|
765
|
+
},
|
|
766
|
+
'A': {
|
|
767
|
+
'name': 'Adenine',
|
|
768
|
+
'weight': 313.21,
|
|
769
|
+
'normalized': 'dA',
|
|
770
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
|
|
771
|
+
},
|
|
772
|
+
'C': {
|
|
773
|
+
'name': 'Cytosine',
|
|
774
|
+
'weight': 289.18,
|
|
775
|
+
'normalized': 'dC',
|
|
776
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
|
|
777
|
+
},
|
|
778
|
+
'G': {
|
|
779
|
+
'name': 'Guanine',
|
|
780
|
+
'weight': 329.21,
|
|
781
|
+
'normalized': 'dG',
|
|
782
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
|
|
783
|
+
},
|
|
784
|
+
'T': {
|
|
785
|
+
'name': 'Tyrosine',
|
|
786
|
+
'weight': 304.2,
|
|
787
|
+
'normalized': 'dT',
|
|
788
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
|
|
789
|
+
},
|
|
790
|
+
},
|
|
791
|
+
'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
792
|
+
'1': {
|
|
793
|
+
'name': '2\'-fluoro-U',
|
|
794
|
+
'weight': 308.16,
|
|
795
|
+
'normalized': 'rU',
|
|
796
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
|
|
797
|
+
},
|
|
798
|
+
'2': {
|
|
799
|
+
'name': '2\'-fluoro-A',
|
|
800
|
+
'weight': 331.2,
|
|
801
|
+
'normalized': 'rA',
|
|
802
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
803
|
+
},
|
|
804
|
+
'3': {
|
|
805
|
+
'name': '2\'-fluoro-C',
|
|
806
|
+
'weight': 307.18,
|
|
807
|
+
'normalized': 'rC',
|
|
808
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
|
|
809
|
+
},
|
|
810
|
+
'4': {
|
|
811
|
+
'name': '2\'-fluoro-G',
|
|
812
|
+
'weight': 347.19,
|
|
813
|
+
'normalized': 'rG',
|
|
814
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
815
|
+
},
|
|
816
|
+
'5': {
|
|
817
|
+
'name': '2\'OMe-rU',
|
|
818
|
+
'weight': 320.2,
|
|
819
|
+
'normalized': 'rU',
|
|
820
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
|
|
821
|
+
},
|
|
822
|
+
'6': {
|
|
823
|
+
'name': '2\'OMe-rA',
|
|
824
|
+
'weight': 343.24,
|
|
825
|
+
'normalized': 'rA',
|
|
826
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
827
|
+
},
|
|
828
|
+
'7': {
|
|
829
|
+
'name': '2\'OMe-rC',
|
|
830
|
+
'weight': 319.21,
|
|
831
|
+
'normalized': 'rC',
|
|
832
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
|
|
833
|
+
},
|
|
834
|
+
'8': {
|
|
835
|
+
'name': '2\'OMe-rG',
|
|
836
|
+
'weight': 359.24,
|
|
837
|
+
'normalized': 'rG',
|
|
838
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
839
|
+
},
|
|
840
|
+
'*': {
|
|
841
|
+
'name': 'ps linkage',
|
|
842
|
+
'weight': 16.07,
|
|
843
|
+
'normalized': '',
|
|
844
|
+
'SMILES': 'OP(=O)(S)O',
|
|
845
|
+
},
|
|
846
|
+
},
|
|
847
|
+
},
|
|
848
|
+
'Axolabs Codes': {
|
|
849
|
+
'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
850
|
+
'Uf': {
|
|
851
|
+
'name': '2\'-fluoro-U',
|
|
852
|
+
'weight': 308.16,
|
|
853
|
+
'normalized': 'rU',
|
|
854
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
|
|
855
|
+
},
|
|
856
|
+
'Af': {
|
|
857
|
+
'name': '2\'-fluoro-A',
|
|
858
|
+
'weight': 331.2,
|
|
859
|
+
'normalized': 'rA',
|
|
860
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
861
|
+
},
|
|
862
|
+
'Cf': {
|
|
863
|
+
'name': '2\'-fluoro-C',
|
|
864
|
+
'weight': 307.18,
|
|
865
|
+
'normalized': 'rC',
|
|
866
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
|
|
867
|
+
},
|
|
868
|
+
'Gf': {
|
|
869
|
+
'name': '2\'-fluoro-G',
|
|
870
|
+
'weight': 347.19,
|
|
871
|
+
'normalized': 'rG',
|
|
872
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
873
|
+
},
|
|
874
|
+
'u': {
|
|
875
|
+
'name': '2\'OMe-rU',
|
|
876
|
+
'weight': 320.2,
|
|
877
|
+
'normalized': 'rU',
|
|
878
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
|
|
879
|
+
},
|
|
880
|
+
'a': {
|
|
881
|
+
'name': '2\'OMe-rA',
|
|
882
|
+
'weight': 343.24,
|
|
883
|
+
'normalized': 'rA',
|
|
884
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
885
|
+
},
|
|
886
|
+
'c': {
|
|
887
|
+
'name': '2\'OMe-rC',
|
|
888
|
+
'weight': 319.21,
|
|
889
|
+
'normalized': 'rC',
|
|
890
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
|
|
891
|
+
},
|
|
892
|
+
'g': {
|
|
893
|
+
'name': '2\'OMe-rG',
|
|
894
|
+
'weight': 359.,
|
|
895
|
+
'normalized': 'rG',
|
|
896
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
897
|
+
},
|
|
898
|
+
's': {
|
|
899
|
+
'name': 'ps linkage',
|
|
900
|
+
'weight': 16.07,
|
|
901
|
+
'normalized': '',
|
|
902
|
+
'SMILES': 'OP(=O)(S)O',
|
|
903
|
+
},
|
|
904
|
+
},
|
|
905
|
+
},
|
|
906
|
+
'Janssen GCRS Codes': {
|
|
907
|
+
'For ASO Gapmers': {
|
|
908
|
+
'moeT': {
|
|
909
|
+
'name': '2\'MOE-5Me-rU',
|
|
910
|
+
'weight': 378.27,
|
|
911
|
+
'normalized': 'rU',
|
|
912
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))[C@H](OCCOC)[C@@H]1O',
|
|
913
|
+
},
|
|
914
|
+
'moeA': {
|
|
915
|
+
'name': '2\'MOE-rA',
|
|
916
|
+
'weight': 387.29,
|
|
917
|
+
'normalized': 'rA',
|
|
918
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
|
|
919
|
+
},
|
|
920
|
+
'moe5mC': {
|
|
921
|
+
'name': '2\'MOE-5Me-rC',
|
|
922
|
+
'weight': 377.29,
|
|
923
|
+
'normalized': 'rC',
|
|
924
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
|
|
925
|
+
},
|
|
926
|
+
'(5m)moeC': {
|
|
927
|
+
'name': '2\'MOE-5Me-rC',
|
|
928
|
+
'weight': 377.29,
|
|
929
|
+
'normalized': 'rC',
|
|
930
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
|
|
931
|
+
},
|
|
932
|
+
'moeG': {
|
|
933
|
+
'name': '2\'MOE-rG',
|
|
934
|
+
'weight': 403.28,
|
|
935
|
+
'normalized': 'rG',
|
|
936
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
|
|
937
|
+
},
|
|
938
|
+
'5mC': {
|
|
939
|
+
'name': '5-Methyl-dC',
|
|
940
|
+
'weight': 303.28,
|
|
941
|
+
'normalized': 'dC',
|
|
942
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
|
|
943
|
+
},
|
|
944
|
+
'(5m)C': {
|
|
945
|
+
'name': '5-Methyl-dC',
|
|
946
|
+
'weight': 303.28,
|
|
947
|
+
'normalized': 'dC',
|
|
948
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
|
|
949
|
+
},
|
|
950
|
+
'ps': {
|
|
951
|
+
'name': 'ps linkage',
|
|
952
|
+
'weight': 16.07,
|
|
953
|
+
'normalized': '',
|
|
954
|
+
'SMILES': 'OP(=O)(S)O',
|
|
955
|
+
},
|
|
956
|
+
'A': {
|
|
957
|
+
'name': 'Adenine',
|
|
958
|
+
'weight': 313.21,
|
|
959
|
+
'normalized': 'dA',
|
|
960
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
|
|
961
|
+
},
|
|
962
|
+
'dA': {
|
|
963
|
+
'name': 'Adenine',
|
|
964
|
+
'weight': 313.21,
|
|
965
|
+
'normalized': 'dA',
|
|
966
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
|
|
967
|
+
},
|
|
968
|
+
'C': {
|
|
969
|
+
'name': 'Cytosine',
|
|
970
|
+
'weight': 289.18,
|
|
971
|
+
'normalized': 'dC',
|
|
972
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
|
|
973
|
+
},
|
|
974
|
+
'dC': {
|
|
975
|
+
'name': 'Cytosine',
|
|
976
|
+
'weight': 289.18,
|
|
977
|
+
'normalized': 'dC',
|
|
978
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
|
|
979
|
+
},
|
|
980
|
+
'G': {
|
|
981
|
+
'name': 'Guanine',
|
|
982
|
+
'weight': 329.21,
|
|
983
|
+
'normalized': 'dG',
|
|
984
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
|
|
985
|
+
},
|
|
986
|
+
'dG': {
|
|
987
|
+
'name': 'Guanine',
|
|
988
|
+
'weight': 329.21,
|
|
989
|
+
'normalized': 'dG',
|
|
990
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
|
|
991
|
+
},
|
|
992
|
+
'T': {
|
|
993
|
+
'name': 'Tyrosine',
|
|
994
|
+
'weight': 304.2,
|
|
995
|
+
'normalized': 'dT',
|
|
996
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
|
|
997
|
+
},
|
|
998
|
+
'dT': {
|
|
999
|
+
'name': 'Tyrosine',
|
|
1000
|
+
'weight': 304.2,
|
|
1001
|
+
'normalized': 'dT',
|
|
1002
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
|
|
1003
|
+
},
|
|
1004
|
+
'rA': {
|
|
1005
|
+
'name': 'Adenine',
|
|
1006
|
+
'weight': 329.21,
|
|
1007
|
+
'normalized': 'rA',
|
|
1008
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](O)[C@@H]1O',
|
|
1009
|
+
},
|
|
1010
|
+
'rC': {
|
|
1011
|
+
'name': 'Cytosine',
|
|
1012
|
+
'weight': 305.18,
|
|
1013
|
+
'normalized': 'rC',
|
|
1014
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](O)[C@@H]1O',
|
|
1015
|
+
},
|
|
1016
|
+
'rG': {
|
|
1017
|
+
'name': 'Guanine',
|
|
1018
|
+
'weight': 345.21,
|
|
1019
|
+
'normalized': 'rG',
|
|
1020
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](O)[C@@H]1O',
|
|
1021
|
+
},
|
|
1022
|
+
'rU': {
|
|
1023
|
+
'name': 'Uracil',
|
|
1024
|
+
'weight': 306.17,
|
|
1025
|
+
'normalized': 'rU',
|
|
1026
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](O)[C@@H]1O',
|
|
1027
|
+
},
|
|
1028
|
+
},
|
|
1029
|
+
'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
1030
|
+
'fU': {
|
|
1031
|
+
'name': '2\'-fluoro-U',
|
|
1032
|
+
'weight': 308.16,
|
|
1033
|
+
'normalized': 'rU',
|
|
1034
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
|
|
1035
|
+
},
|
|
1036
|
+
'fA': {
|
|
1037
|
+
'name': '2\'-fluoro-A',
|
|
1038
|
+
'weight': 331.2,
|
|
1039
|
+
'normalized': 'rA',
|
|
1040
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
1041
|
+
},
|
|
1042
|
+
'fC': {
|
|
1043
|
+
'name': '2\'-fluoro-C',
|
|
1044
|
+
'weight': 307.18,
|
|
1045
|
+
'normalized': 'rC',
|
|
1046
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
|
|
1047
|
+
},
|
|
1048
|
+
'fG': {
|
|
1049
|
+
'name': '2\'-fluoro-G',
|
|
1050
|
+
'weight': 347.19,
|
|
1051
|
+
'normalized': 'rG',
|
|
1052
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
1053
|
+
},
|
|
1054
|
+
'mU': {
|
|
1055
|
+
'name': '2\'OMe-rU',
|
|
1056
|
+
'weight': 320.2,
|
|
1057
|
+
'normalized': 'rU',
|
|
1058
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
|
|
1059
|
+
},
|
|
1060
|
+
'mA': {
|
|
1061
|
+
'name': '2\'OMe-rA',
|
|
1062
|
+
'weight': 343.24,
|
|
1063
|
+
'normalized': 'rA',
|
|
1064
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
1065
|
+
},
|
|
1066
|
+
'mC': {
|
|
1067
|
+
'name': '2\'OMe-rC',
|
|
1068
|
+
'weight': 319.21,
|
|
1069
|
+
'normalized': 'rC',
|
|
1070
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
|
|
1071
|
+
},
|
|
1072
|
+
'mG': {
|
|
1073
|
+
'name': '2\'OMe-rG',
|
|
1074
|
+
'weight': 359.24,
|
|
1075
|
+
'normalized': 'rG',
|
|
1076
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
1077
|
+
},
|
|
1078
|
+
},
|
|
1079
|
+
},
|
|
1080
|
+
'Mermade 12': {
|
|
1081
|
+
'For 2\'-OMe and 2\'-F modified siRNA': {
|
|
1082
|
+
'e': {
|
|
1083
|
+
'name': '2\'OMe-rA-ps',
|
|
1084
|
+
'weight': 359.31,
|
|
1085
|
+
'normalized': 'rA',
|
|
1086
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)O',
|
|
1087
|
+
},
|
|
1088
|
+
'h': {
|
|
1089
|
+
'name': '2\'OMe-rU-ps',
|
|
1090
|
+
'weight': 336.27,
|
|
1091
|
+
'normalized': 'rU',
|
|
1092
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)O',
|
|
1093
|
+
},
|
|
1094
|
+
'g': {
|
|
1095
|
+
'name': '2\'OMe-rG-ps',
|
|
1096
|
+
'weight': 375.31,
|
|
1097
|
+
'normalized': 'rG',
|
|
1098
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)O',
|
|
1099
|
+
},
|
|
1100
|
+
'f': {
|
|
1101
|
+
'name': '2\'OMe-rC-ps',
|
|
1102
|
+
'weight': 335.28,
|
|
1103
|
+
'normalized': 'rC',
|
|
1104
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)O',
|
|
1105
|
+
},
|
|
1106
|
+
'i': {
|
|
1107
|
+
'name': '2\'-fluoro-A-ps',
|
|
1108
|
+
'weight': 347.27,
|
|
1109
|
+
'normalized': 'rA',
|
|
1110
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)O',
|
|
1111
|
+
},
|
|
1112
|
+
'l': {
|
|
1113
|
+
'name': '2\'-fluoro-U-ps',
|
|
1114
|
+
'weight': 324.23,
|
|
1115
|
+
'normalized': 'rU',
|
|
1116
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)O',
|
|
1117
|
+
},
|
|
1118
|
+
'k': {
|
|
1119
|
+
'name': '2\'-fluoro-G-ps',
|
|
1120
|
+
'weight': 363.26,
|
|
1121
|
+
'normalized': 'rG',
|
|
1122
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)O',
|
|
1123
|
+
},
|
|
1124
|
+
'j': {
|
|
1125
|
+
'name': '2\'-fluoro-C-ps',
|
|
1126
|
+
'weight': 323.25,
|
|
1127
|
+
'normalized': 'rC',
|
|
1128
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)O',
|
|
1129
|
+
},
|
|
1130
|
+
'L': {
|
|
1131
|
+
'name': '2\'-fluoro-U',
|
|
1132
|
+
'weight': 308.16,
|
|
1133
|
+
'normalized': 'rU',
|
|
1134
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
|
|
1135
|
+
},
|
|
1136
|
+
'I': {
|
|
1137
|
+
'name': '2\'-fluoro-A',
|
|
1138
|
+
'weight': 331.2,
|
|
1139
|
+
'normalized': 'rA',
|
|
1140
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
1141
|
+
},
|
|
1142
|
+
'J': {
|
|
1143
|
+
'name': '2\'-fluoro-C',
|
|
1144
|
+
'weight': 307.18,
|
|
1145
|
+
'normalized': 'rC',
|
|
1146
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
|
|
1147
|
+
},
|
|
1148
|
+
'K': {
|
|
1149
|
+
'name': '2\'-fluoro-G',
|
|
1150
|
+
'weight': 347.19,
|
|
1151
|
+
'normalized': 'rG',
|
|
1152
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
|
|
1153
|
+
},
|
|
1154
|
+
'H': {
|
|
1155
|
+
'name': '2\'OMe-rU',
|
|
1156
|
+
'weight': 320.2,
|
|
1157
|
+
'normalized': 'rU',
|
|
1158
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
|
|
1159
|
+
},
|
|
1160
|
+
'E': {
|
|
1161
|
+
'name': '2\'OMe-rA',
|
|
1162
|
+
'weight': 343.24,
|
|
1163
|
+
'normalized': 'rA',
|
|
1164
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
1165
|
+
},
|
|
1166
|
+
'F': {
|
|
1167
|
+
'name': '2\'OMe-rC',
|
|
1168
|
+
'weight': 319.21,
|
|
1169
|
+
'normalized': 'rC',
|
|
1170
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
|
|
1171
|
+
},
|
|
1172
|
+
'G': {
|
|
1173
|
+
'name': '2\'OMe-rG',
|
|
1174
|
+
'weight': 359.24,
|
|
1175
|
+
'normalized': 'rG',
|
|
1176
|
+
'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
|
|
1177
|
+
},
|
|
1178
|
+
},
|
|
1179
|
+
},
|
|
1180
|
+
};
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
/***/ }),
|
|
1184
|
+
|
|
1185
|
+
/***/ "./src/structures-works/mol-transformations.ts":
|
|
1186
|
+
/*!*****************************************************!*\
|
|
1187
|
+
!*** ./src/structures-works/mol-transformations.ts ***!
|
|
1188
|
+
\*****************************************************/
|
|
1189
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1190
|
+
|
|
1191
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1192
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1193
|
+
/* harmony export */ "getNucleotidesMol": () => (/* binding */ getNucleotidesMol),
|
|
1194
|
+
/* harmony export */ "linkV3000": () => (/* binding */ linkV3000)
|
|
1195
|
+
/* harmony export */ });
|
|
1196
|
+
/* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! openchemlib/full.js */ "openchemlib/full.js");
|
|
1197
|
+
/* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
1198
|
+
|
|
1199
|
+
const PHOSHATE = `
|
|
1200
|
+
Datagrok monomer library Nucleotides
|
|
1201
|
+
|
|
1202
|
+
0 0 0 0 0 0 0 V3000
|
|
1203
|
+
M V30 BEGIN CTAB
|
|
1204
|
+
M V30 COUNTS 5 4 0 0 0
|
|
1205
|
+
M V30 BEGIN ATOM
|
|
1206
|
+
M V30 1 O -1.5 0 0 0
|
|
1207
|
+
M V30 2 P 0 0 0 0
|
|
1208
|
+
M V30 3 O 0 1 0 0
|
|
1209
|
+
M V30 4 O 0 -1 0 0
|
|
1210
|
+
M V30 5 O 1.5 0 0 0
|
|
1211
|
+
M V30 END ATOM
|
|
1212
|
+
M V30 BEGIN BOND
|
|
1213
|
+
M V30 1 1 1 2
|
|
1214
|
+
M V30 2 2 2 3
|
|
1215
|
+
M V30 3 1 2 4
|
|
1216
|
+
M V30 4 1 2 5
|
|
1217
|
+
M V30 END BOND
|
|
1218
|
+
M V30 END CTAB
|
|
1219
|
+
M V30 BEGIN COLLECTION
|
|
1220
|
+
M V30 END COLLECTION
|
|
1221
|
+
M END`;
|
|
1222
|
+
const THIOPHOSHATE = `
|
|
1223
|
+
Datagrok monomer library Nucleotides
|
|
1224
|
+
|
|
1225
|
+
0 0 0 0 0 0 0 V3000
|
|
1226
|
+
M V30 BEGIN CTAB
|
|
1227
|
+
M V30 COUNTS 5 4 0 0 0
|
|
1228
|
+
M V30 BEGIN ATOM
|
|
1229
|
+
M V30 1 O -1.5 0 0 0
|
|
1230
|
+
M V30 2 P 0 0 0 0
|
|
1231
|
+
M V30 3 O 0 1 0 0
|
|
1232
|
+
M V30 4 S 0 -1 0 0
|
|
1233
|
+
M V30 5 O 1.5 0 0 0
|
|
1234
|
+
M V30 END ATOM
|
|
1235
|
+
M V30 BEGIN BOND
|
|
1236
|
+
M V30 1 1 1 2
|
|
1237
|
+
M V30 2 2 2 3
|
|
1238
|
+
M V30 3 1 2 4
|
|
1239
|
+
M V30 4 1 2 5
|
|
1240
|
+
M V30 END BOND
|
|
1241
|
+
M V30 END CTAB
|
|
1242
|
+
M V30 BEGIN COLLECTION
|
|
1243
|
+
M V30 END COLLECTION
|
|
1244
|
+
M END`;
|
|
1245
|
+
const INVABASIC = `
|
|
1246
|
+
Datagrok monomer library Nucleotides
|
|
1247
|
+
|
|
1248
|
+
0 0 0 0 0 0 0 V3000
|
|
1249
|
+
M V30 BEGIN CTAB
|
|
1250
|
+
M V30 COUNTS 8 8 0 0 0
|
|
1251
|
+
M V30 BEGIN ATOM
|
|
1252
|
+
M V30 1 O 1.0934 -2.1636 0 0
|
|
1253
|
+
M V30 2 C 1.8365 -1.4945 0 0 CFG=2
|
|
1254
|
+
M V30 3 C 2.8147 -1.7024 0 0
|
|
1255
|
+
M V30 4 C 3.3147 -0.8364 0 0 VAL=3
|
|
1256
|
+
M V30 5 O 2.6455 -0.0932 0 0
|
|
1257
|
+
M V30 6 C 1.732 -0.5 0 0 CFG=1
|
|
1258
|
+
M V30 7 C 0.866 0 0 0
|
|
1259
|
+
M V30 8 O 0.866 1 0 0
|
|
1260
|
+
M V30 END ATOM
|
|
1261
|
+
M V30 BEGIN BOND
|
|
1262
|
+
M V30 1 1 2 1 CFG=1
|
|
1263
|
+
M V30 2 1 2 3
|
|
1264
|
+
M V30 3 1 3 4
|
|
1265
|
+
M V30 4 1 4 5
|
|
1266
|
+
M V30 5 1 6 5
|
|
1267
|
+
M V30 6 1 2 6
|
|
1268
|
+
M V30 7 1 6 7 CFG=3
|
|
1269
|
+
M V30 8 1 7 8
|
|
1270
|
+
M V30 END BOND
|
|
1271
|
+
M V30 BEGIN COLLECTION
|
|
1272
|
+
M V30 MDLV30/STEABS ATOMS=(2 2 6)
|
|
1273
|
+
M V30 END COLLECTION
|
|
1274
|
+
M V30 END CTAB
|
|
1275
|
+
M END`;
|
|
1276
|
+
function getNucleotidesMol(smilesCodes, oclRender = false) {
|
|
1277
|
+
const molBlocks = [];
|
|
1278
|
+
for (let i = 0; i < smilesCodes.length - 1; i++) {
|
|
1279
|
+
smilesCodes[i] == 'OP(=O)(O)O' ? molBlocks.push(PHOSHATE) :
|
|
1280
|
+
smilesCodes[i] == 'OP(=O)(S)O' ? molBlocks.push(THIOPHOSHATE) :
|
|
1281
|
+
smilesCodes[i] == 'O[C@@H]1C[C@@H]O[C@H]1CO' ? molBlocks.push(rotateNucleotidesV3000(INVABASIC)) :
|
|
1282
|
+
molBlocks.push(rotateNucleotidesV3000(smilesCodes[i]));
|
|
1283
|
+
}
|
|
1284
|
+
return linkV3000(molBlocks, false, oclRender);
|
|
1285
|
+
}
|
|
1286
|
+
function linkV3000(molBlocks, twoChains = false, oclRender = false) {
|
|
1287
|
+
let macroMolBlock = '\nDatagrok macromolecule handler\n\n';
|
|
1288
|
+
macroMolBlock += ' 0 0 0 0 0 0 999 V3000\n';
|
|
1289
|
+
macroMolBlock += 'M V30 BEGIN CTAB\n';
|
|
1290
|
+
let atomBlock = '';
|
|
1291
|
+
let bondBlock = '';
|
|
1292
|
+
let collectionBlock = '';
|
|
1293
|
+
const collection = [];
|
|
1294
|
+
let natom = 0;
|
|
1295
|
+
let nbond = 0;
|
|
1296
|
+
let xShift = 0;
|
|
1297
|
+
if (twoChains && molBlocks.length > 1)
|
|
1298
|
+
molBlocks[1] = invertNucleotidesV3000(molBlocks[1]);
|
|
1299
|
+
for (let i = 0; i < molBlocks.length; i++) {
|
|
1300
|
+
molBlocks[i] = molBlocks[i].replaceAll('(-\nM V30 ', '(')
|
|
1301
|
+
.replaceAll('-\nM V30 ', '').replaceAll(' )', ')');
|
|
1302
|
+
const numbers = extractAtomsBondsNumbersV3000(molBlocks[i]);
|
|
1303
|
+
const coordinates = extractAtomDataV3000(molBlocks[i]);
|
|
1304
|
+
if (twoChains) {
|
|
1305
|
+
const xShiftRight = Math.min(...coordinates.x);
|
|
1306
|
+
const yShift = i == 0 ? Math.min(...coordinates.y) - 1 : Math.max(...coordinates.y) + 1;
|
|
1307
|
+
for (let j = 0; j < coordinates.x.length; j++)
|
|
1308
|
+
coordinates.x[j] -= xShiftRight;
|
|
1309
|
+
for (let j = 0; j < coordinates.y.length; j++)
|
|
1310
|
+
coordinates.y[j] -= yShift;
|
|
1311
|
+
}
|
|
1312
|
+
let indexAtoms = molBlocks[i].indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
|
|
1313
|
+
indexAtoms = molBlocks[i].indexOf('\n', indexAtoms);
|
|
1314
|
+
let index = indexAtoms;
|
|
1315
|
+
let indexEnd = indexAtoms;
|
|
1316
|
+
for (let j = 0; j < numbers.natom; j++) {
|
|
1317
|
+
if (coordinates.atomIndex[j] != 1 || i == 0 || twoChains) {
|
|
1318
|
+
//rewrite atom number
|
|
1319
|
+
index = molBlocks[i].indexOf('V30', index) + 4;
|
|
1320
|
+
indexEnd = molBlocks[i].indexOf(' ', index);
|
|
1321
|
+
const atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
|
|
1322
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
|
|
1323
|
+
//rewrite coordinates
|
|
1324
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1325
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1326
|
+
indexEnd = molBlocks[i].indexOf(' ', index);
|
|
1327
|
+
const totalShift = twoChains ? 0 : xShift - coordinates.x[0];
|
|
1328
|
+
let coordinate = twoChains ?
|
|
1329
|
+
Math.round(10000 * coordinates.x[j]) / 10000 :
|
|
1330
|
+
Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + totalShift)) / 10000;
|
|
1331
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
|
|
1332
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1333
|
+
indexEnd = molBlocks[i].indexOf(' ', index);
|
|
1334
|
+
coordinate = twoChains ?
|
|
1335
|
+
Math.round(10000 * coordinates.y[j]) / 10000 :
|
|
1336
|
+
Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)))) / 10000;
|
|
1337
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
|
|
1338
|
+
index = molBlocks[i].indexOf('\n', index) + 1;
|
|
1339
|
+
}
|
|
1340
|
+
else {
|
|
1341
|
+
index = molBlocks[i].indexOf('M V30', index) - 1;
|
|
1342
|
+
indexEnd = molBlocks[i].indexOf('\n', index + 1);
|
|
1343
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + molBlocks[i].slice(indexEnd);
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
const indexAtomsEnd = molBlocks[i].indexOf('M V30 END ATOM');
|
|
1347
|
+
atomBlock += molBlocks[i].substring(indexAtoms + 1, indexAtomsEnd);
|
|
1348
|
+
let indexBonds = molBlocks[i].indexOf('M V30 BEGIN BOND'); // V3000 index for bonds
|
|
1349
|
+
indexBonds = molBlocks[i].indexOf('\n', indexBonds);
|
|
1350
|
+
index = indexBonds;
|
|
1351
|
+
indexEnd = indexBonds;
|
|
1352
|
+
for (let j = 0; j < numbers.nbond; j++) {
|
|
1353
|
+
//rewrite bond number
|
|
1354
|
+
index = molBlocks[i].indexOf('V30', index) + 4;
|
|
1355
|
+
indexEnd = molBlocks[i].indexOf(' ', index);
|
|
1356
|
+
const bondNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + nbond;
|
|
1357
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + bondNumber + molBlocks[i].slice(indexEnd);
|
|
1358
|
+
//rewrite atom pair in bond
|
|
1359
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1360
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1361
|
+
indexEnd = molBlocks[i].indexOf(' ', index);
|
|
1362
|
+
let atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
|
|
1363
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
|
|
1364
|
+
index = molBlocks[i].indexOf(' ', index) + 1;
|
|
1365
|
+
indexEnd = Math.min(molBlocks[i].indexOf('\n', index), molBlocks[i].indexOf(' ', index));
|
|
1366
|
+
atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
|
|
1367
|
+
molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
|
|
1368
|
+
index = molBlocks[i].indexOf('\n', index) + 1;
|
|
1369
|
+
}
|
|
1370
|
+
const indexBondEnd = molBlocks[i].indexOf('M V30 END BOND');
|
|
1371
|
+
bondBlock += molBlocks[i].substring(indexBonds + 1, indexBondEnd);
|
|
1372
|
+
let indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=('); // V3000 index for collections
|
|
1373
|
+
while (indexCollection != -1) {
|
|
1374
|
+
indexCollection += 28;
|
|
1375
|
+
const collectionEnd = molBlocks[i].indexOf(')', indexCollection);
|
|
1376
|
+
const collectionEntries = molBlocks[i].substring(indexCollection, collectionEnd).split(' ').slice(1);
|
|
1377
|
+
collectionEntries.forEach((e) => {
|
|
1378
|
+
collection.push(parseInt(e) + natom);
|
|
1379
|
+
});
|
|
1380
|
+
indexCollection = collectionEnd;
|
|
1381
|
+
indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);
|
|
1382
|
+
}
|
|
1383
|
+
natom += twoChains ? numbers.natom : numbers.natom - 1;
|
|
1384
|
+
nbond += numbers.nbond;
|
|
1385
|
+
xShift += twoChains ? 0 : coordinates.x[numbers.natom - 1] - coordinates.x[0];
|
|
1386
|
+
}
|
|
1387
|
+
const entries = 4;
|
|
1388
|
+
const collNumber = Math.ceil(collection.length / entries);
|
|
1389
|
+
if (oclRender) {
|
|
1390
|
+
collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length;
|
|
1391
|
+
for (let j = 0; j < collection.length; j++)
|
|
1392
|
+
collectionBlock += ' ' + collection[j];
|
|
1393
|
+
collectionBlock += ')\n';
|
|
1394
|
+
}
|
|
1395
|
+
else {
|
|
1396
|
+
collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length + ' -\n';
|
|
1397
|
+
for (let i = 0; i < collNumber; i++) {
|
|
1398
|
+
collectionBlock += 'M V30 ';
|
|
1399
|
+
const entriesCurrent = i + 1 == collNumber ? collection.length - (collNumber - 1) * entries : entries;
|
|
1400
|
+
for (let j = 0; j < entriesCurrent; j++) {
|
|
1401
|
+
collectionBlock += (j + 1 == entriesCurrent) ?
|
|
1402
|
+
(i == collNumber - 1 ? collection[entries * i + j] + ')\n' : collection[entries * i + j] + ' -\n') :
|
|
1403
|
+
collection[entries * i + j] + ' ';
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
//generate file
|
|
1408
|
+
twoChains ? natom : natom++;
|
|
1409
|
+
macroMolBlock += 'M V30 COUNTS ' + natom + ' ' + nbond + ' 0 0 0\n';
|
|
1410
|
+
macroMolBlock += 'M V30 BEGIN ATOM\n';
|
|
1411
|
+
macroMolBlock += atomBlock;
|
|
1412
|
+
macroMolBlock += 'M V30 END ATOM\n';
|
|
1413
|
+
macroMolBlock += 'M V30 BEGIN BOND\n';
|
|
1414
|
+
macroMolBlock += bondBlock;
|
|
1415
|
+
macroMolBlock += 'M V30 END BOND\n';
|
|
1416
|
+
macroMolBlock += 'M V30 BEGIN COLLECTION\n';
|
|
1417
|
+
macroMolBlock += collectionBlock;
|
|
1418
|
+
macroMolBlock += 'M V30 END COLLECTION\n';
|
|
1419
|
+
macroMolBlock += 'M V30 END CTAB\n';
|
|
1420
|
+
macroMolBlock += 'M END\n';
|
|
1421
|
+
return macroMolBlock;
|
|
1422
|
+
}
|
|
1423
|
+
function rotateNucleotidesV3000(molecule) {
|
|
1424
|
+
let molBlock = molecule.includes('M END') ? molecule : openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__.Molecule.fromSmiles(molecule).toMolfileV3();
|
|
1425
|
+
const coordinates = extractAtomDataV3000(molBlock);
|
|
1426
|
+
const natom = coordinates.atomIndex.length;
|
|
1427
|
+
const indexFivePrime = coordinates.atomIndex.indexOf(1);
|
|
1428
|
+
const indexThreePrime = coordinates.atomIndex.indexOf(natom);
|
|
1429
|
+
//fix 5 prime if inadequate
|
|
1430
|
+
if (natom > 8)
|
|
1431
|
+
fix5Prime(coordinates, indexFivePrime, indexThreePrime);
|
|
1432
|
+
const xCenter = (coordinates.x[indexThreePrime] + coordinates.x[indexFivePrime]) / 2;
|
|
1433
|
+
const yCenter = (coordinates.y[indexThreePrime] + coordinates.y[indexFivePrime]) / 2;
|
|
1434
|
+
//place to center
|
|
1435
|
+
for (let i = 0; i < natom; i++) {
|
|
1436
|
+
coordinates.x[i] -= xCenter;
|
|
1437
|
+
coordinates.y[i] -= yCenter;
|
|
1438
|
+
}
|
|
1439
|
+
let angle = 0;
|
|
1440
|
+
if (coordinates.x[indexFivePrime] == 0)
|
|
1441
|
+
angle = coordinates.y[indexFivePrime] > coordinates.y[indexThreePrime] ? Math.PI / 2 : 3 * Math.PI / 2;
|
|
1442
|
+
else if (coordinates.y[indexFivePrime] == 0)
|
|
1443
|
+
angle = coordinates.x[indexFivePrime] > coordinates.x[indexThreePrime] ? Math.PI : 0;
|
|
1444
|
+
else {
|
|
1445
|
+
const derivative = coordinates.y[indexFivePrime] / coordinates.x[indexFivePrime];
|
|
1446
|
+
angle = derivative > 0 ? Math.PI - Math.atan(derivative) : Math.atan(derivative);
|
|
1447
|
+
}
|
|
1448
|
+
const cos = Math.cos(angle);
|
|
1449
|
+
const sin = Math.sin(angle);
|
|
1450
|
+
for (let i = 0; i < natom; i++) {
|
|
1451
|
+
const xAdd = coordinates.x[i];
|
|
1452
|
+
coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;
|
|
1453
|
+
coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;
|
|
1454
|
+
}
|
|
1455
|
+
//place to right
|
|
1456
|
+
const xShift = coordinates.x[indexFivePrime];
|
|
1457
|
+
for (let i = 0; i < natom; i++)
|
|
1458
|
+
coordinates.x[i] -= xShift;
|
|
1459
|
+
//rewrite molBlock
|
|
1460
|
+
let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
|
|
1461
|
+
index = molBlock.indexOf('\n', index);
|
|
1462
|
+
let indexEnd = index;
|
|
1463
|
+
for (let i = 0; i < natom; i++) {
|
|
1464
|
+
index = molBlock.indexOf('V30', index) + 4;
|
|
1465
|
+
index = molBlock.indexOf(' ', index) + 1;
|
|
1466
|
+
index = molBlock.indexOf(' ', index) + 1;
|
|
1467
|
+
indexEnd = molBlock.indexOf(' ', index) + 1;
|
|
1468
|
+
indexEnd = molBlock.indexOf(' ', indexEnd);
|
|
1469
|
+
molBlock = molBlock.slice(0, index) +
|
|
1470
|
+
coordinates.x[i] + ' ' + coordinates.y[i] +
|
|
1471
|
+
molBlock.slice(indexEnd);
|
|
1472
|
+
index = molBlock.indexOf('\n', index) + 1;
|
|
1473
|
+
}
|
|
1474
|
+
return molBlock;
|
|
1475
|
+
}
|
|
1476
|
+
function invertNucleotidesV3000(molecule) {
|
|
1477
|
+
let molBlock = molecule.includes('M END') ? molecule : openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__.Molecule.fromSmiles(molecule).toMolfileV3();
|
|
1478
|
+
const coordinates = extractAtomDataV3000(molBlock);
|
|
1479
|
+
const natom = coordinates.atomIndex.length;
|
|
1480
|
+
const xCenter = (Math.max(...coordinates.x) + Math.min(...coordinates.x)) / 2;
|
|
1481
|
+
const yCenter = (Math.max(...coordinates.y) + Math.min(...coordinates.y)) / 2;
|
|
1482
|
+
//place to center
|
|
1483
|
+
for (let i = 0; i < natom; i++) {
|
|
1484
|
+
coordinates.x[i] -= xCenter;
|
|
1485
|
+
coordinates.y[i] -= yCenter;
|
|
1486
|
+
}
|
|
1487
|
+
const angle = Math.PI;
|
|
1488
|
+
const cos = Math.cos(angle);
|
|
1489
|
+
const sin = Math.sin(angle);
|
|
1490
|
+
for (let i = 0; i < natom; i++) {
|
|
1491
|
+
const xAdd = coordinates.x[i];
|
|
1492
|
+
coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;
|
|
1493
|
+
coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;
|
|
1494
|
+
}
|
|
1495
|
+
//place back
|
|
1496
|
+
const yShift = Math.max(...coordinates.y);
|
|
1497
|
+
for (let i = 0; i < natom; i++) {
|
|
1498
|
+
coordinates.x[i] += xCenter;
|
|
1499
|
+
coordinates.y[i] -= yShift;
|
|
1500
|
+
}
|
|
1501
|
+
//rewrite molBlock
|
|
1502
|
+
let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
|
|
1503
|
+
index = molBlock.indexOf('\n', index);
|
|
1504
|
+
let indexEnd = index;
|
|
1505
|
+
for (let i = 0; i < natom; i++) {
|
|
1506
|
+
index = molBlock.indexOf('V30', index) + 4;
|
|
1507
|
+
index = molBlock.indexOf(' ', index) + 1;
|
|
1508
|
+
index = molBlock.indexOf(' ', index) + 1;
|
|
1509
|
+
indexEnd = molBlock.indexOf(' ', index) + 1;
|
|
1510
|
+
indexEnd = molBlock.indexOf(' ', indexEnd);
|
|
1511
|
+
molBlock = molBlock.slice(0, index) +
|
|
1512
|
+
coordinates.x[i] + ' ' + coordinates.y[i] +
|
|
1513
|
+
molBlock.slice(indexEnd);
|
|
1514
|
+
index = molBlock.indexOf('\n', index) + 1;
|
|
1515
|
+
}
|
|
1516
|
+
return molBlock;
|
|
1517
|
+
}
|
|
1518
|
+
function fix5Prime(coordinates, indexFivePrime, indexThreePrime) {
|
|
1519
|
+
const indexFivePrimeNeighbour = indexFivePrime + 1;
|
|
1520
|
+
const xShift = coordinates.x[indexFivePrimeNeighbour];
|
|
1521
|
+
const yShift = coordinates.y[indexFivePrimeNeighbour];
|
|
1522
|
+
const base3PrimeX = coordinates.x[indexThreePrime] - xShift;
|
|
1523
|
+
const base3PrimeY = coordinates.y[indexThreePrime] - yShift;
|
|
1524
|
+
const base5PrimeX = coordinates.x[indexFivePrime] - xShift;
|
|
1525
|
+
const base5PrimeY = coordinates.y[indexFivePrime] - yShift;
|
|
1526
|
+
const rotated5PrimeX = base5PrimeX * Math.cos(Math.PI * 2 / 3) - base5PrimeY * Math.sin(Math.PI * 2 / 3);
|
|
1527
|
+
const rotated5PrimeY = base5PrimeX * Math.sin(Math.PI * 2 / 3) + base5PrimeY * Math.cos(Math.PI * 2 / 3);
|
|
1528
|
+
const dx = base5PrimeX - base3PrimeX;
|
|
1529
|
+
const dy = base5PrimeY - base3PrimeY;
|
|
1530
|
+
const dxRotated = rotated5PrimeX - base3PrimeX;
|
|
1531
|
+
const dyRotated = rotated5PrimeY - base3PrimeY;
|
|
1532
|
+
if (Math.sqrt(dyRotated * dyRotated + dxRotated * dxRotated) >= Math.sqrt(dy * dy + dx * dx)) {
|
|
1533
|
+
coordinates.x[indexFivePrime] = rotated5PrimeX + xShift;
|
|
1534
|
+
coordinates.y[indexFivePrime] = rotated5PrimeY + yShift;
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
function extractAtomsBondsNumbersV3000(molBlock) {
|
|
1538
|
+
molBlock = molBlock.replaceAll('\r', ''); //equalize old and new sdf standards
|
|
1539
|
+
let index = molBlock.indexOf('COUNTS') + 7; // V3000 index for atoms and bonds number
|
|
1540
|
+
let indexEnd = molBlock.indexOf(' ', index);
|
|
1541
|
+
const atomsNumber = parseInt(molBlock.substring(index, indexEnd));
|
|
1542
|
+
index = indexEnd + 1;
|
|
1543
|
+
indexEnd = molBlock.indexOf(' ', index);
|
|
1544
|
+
const bondsNumber = parseInt(molBlock.substring(index, indexEnd));
|
|
1545
|
+
return { natom: atomsNumber, nbond: bondsNumber };
|
|
1546
|
+
}
|
|
1547
|
+
function extractAtomDataV3000(molBlock) {
|
|
1548
|
+
const numbers = extractAtomsBondsNumbersV3000(molBlock);
|
|
1549
|
+
let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
|
|
1550
|
+
index = molBlock.indexOf('\n', index);
|
|
1551
|
+
let indexEnd = index;
|
|
1552
|
+
const indexes = Array(numbers.natom);
|
|
1553
|
+
const types = Array(numbers.natom);
|
|
1554
|
+
const x = Array(numbers.natom);
|
|
1555
|
+
const y = Array(numbers.natom);
|
|
1556
|
+
for (let i = 0; i < numbers.natom; i++) {
|
|
1557
|
+
index = molBlock.indexOf('V30', index) + 4;
|
|
1558
|
+
indexEnd = molBlock.indexOf(' ', index);
|
|
1559
|
+
indexes[i] = parseInt(molBlock.substring(index, indexEnd));
|
|
1560
|
+
index = indexEnd + 1;
|
|
1561
|
+
indexEnd = molBlock.indexOf(' ', index);
|
|
1562
|
+
types[i] = molBlock.substring(index, indexEnd);
|
|
1563
|
+
index = indexEnd + 1;
|
|
1564
|
+
indexEnd = molBlock.indexOf(' ', index);
|
|
1565
|
+
x[i] = parseFloat(molBlock.substring(index, indexEnd));
|
|
1566
|
+
index = indexEnd + 1;
|
|
1567
|
+
indexEnd = molBlock.indexOf(' ', index);
|
|
1568
|
+
y[i] = parseFloat(molBlock.substring(index, indexEnd));
|
|
1569
|
+
index = molBlock.indexOf('\n', index) + 1;
|
|
1570
|
+
}
|
|
1571
|
+
return { atomIndex: indexes, atomType: types, x: x, y: y };
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
/***/ }),
|
|
1576
|
+
|
|
1577
|
+
/***/ "./src/structures-works/sequence-codes-tools.ts":
|
|
1578
|
+
/*!******************************************************!*\
|
|
1579
|
+
!*** ./src/structures-works/sequence-codes-tools.ts ***!
|
|
1580
|
+
\******************************************************/
|
|
1581
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1582
|
+
|
|
1583
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1584
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1585
|
+
/* harmony export */ "undefinedInputSequence": () => (/* binding */ undefinedInputSequence),
|
|
1586
|
+
/* harmony export */ "getFormat": () => (/* binding */ getFormat),
|
|
1587
|
+
/* harmony export */ "isValidSequence": () => (/* binding */ isValidSequence),
|
|
1588
|
+
/* harmony export */ "convertSequence": () => (/* binding */ convertSequence)
|
|
1589
|
+
/* harmony export */ });
|
|
1590
|
+
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
|
|
1591
|
+
/* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
|
|
1592
|
+
// import * as grok from 'datagrok-api/grok';
|
|
1593
|
+
// import * as ui from 'datagrok-api/ui';
|
|
1594
|
+
// import * as DG from 'datagrok-api/dg';
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
const noTranslationTableAvailable = 'No translation table available';
|
|
1598
|
+
const undefinedInputSequence = 'Type of input sequence is undefined';
|
|
1599
|
+
function getFormat(sequence) {
|
|
1600
|
+
const possibleSynthesizers = getListOfPossibleSynthesizersByFirstMatchedCode(sequence);
|
|
1601
|
+
if (possibleSynthesizers.length == 0)
|
|
1602
|
+
return null;
|
|
1603
|
+
let outputIndex = 0;
|
|
1604
|
+
const firstUniqueCharacters = ['r', 'd'];
|
|
1605
|
+
const nucleotides = ['A', 'U', 'T', 'C', 'G'];
|
|
1606
|
+
possibleSynthesizers.forEach((synthesizer) => {
|
|
1607
|
+
const codes = getAllCodesOfSynthesizer(synthesizer);
|
|
1608
|
+
while (outputIndex < sequence.length) {
|
|
1609
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
1610
|
+
if (matchedCode == null)
|
|
1611
|
+
break;
|
|
1612
|
+
if ( // for mistake pattern 'rAA'
|
|
1613
|
+
outputIndex > 1 &&
|
|
1614
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
1615
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
1616
|
+
break;
|
|
1617
|
+
if ( // for mistake pattern 'ArA'
|
|
1618
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
1619
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
1620
|
+
outputIndex++;
|
|
1621
|
+
break;
|
|
1622
|
+
}
|
|
1623
|
+
outputIndex += matchedCode.length;
|
|
1624
|
+
}
|
|
1625
|
+
});
|
|
1626
|
+
const indexOfFirstNotValidChar = (outputIndex == sequence.length) ? -1 : outputIndex;
|
|
1627
|
+
if (indexOfFirstNotValidChar != -1)
|
|
1628
|
+
return possibleSynthesizers[0];
|
|
1629
|
+
const possibleTechnologies = getListOfPossibleTechnologiesByFirstMatchedCode(sequence, possibleSynthesizers[0]);
|
|
1630
|
+
if (possibleTechnologies.length == 0)
|
|
1631
|
+
return null;
|
|
1632
|
+
outputIndex = 0;
|
|
1633
|
+
possibleTechnologies.forEach((technology) => {
|
|
1634
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[possibleSynthesizers[0]][technology]);
|
|
1635
|
+
while (outputIndex < sequence.length) {
|
|
1636
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
1637
|
+
if (matchedCode == null)
|
|
1638
|
+
break;
|
|
1639
|
+
if ( // for mistake pattern 'rAA'
|
|
1640
|
+
outputIndex > 1 &&
|
|
1641
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
1642
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
1643
|
+
break;
|
|
1644
|
+
if ( // for mistake pattern 'ArA'
|
|
1645
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
1646
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
1647
|
+
outputIndex++;
|
|
1648
|
+
break;
|
|
1649
|
+
}
|
|
1650
|
+
outputIndex += matchedCode.length;
|
|
1651
|
+
}
|
|
1652
|
+
});
|
|
1653
|
+
return possibleSynthesizers[0];
|
|
1654
|
+
}
|
|
1655
|
+
function isValidSequence(sequence, format) {
|
|
1656
|
+
const possibleSynthesizers = format == null ?
|
|
1657
|
+
getListOfPossibleSynthesizersByFirstMatchedCode(sequence) :
|
|
1658
|
+
[format];
|
|
1659
|
+
// if (possibleSynthesizers.length > 1) {
|
|
1660
|
+
// const synthesizer = ui.choiceInput('Choose synthesizer from list: ', possibleSynthesizers[0],
|
|
1661
|
+
// possibleSynthesizers);
|
|
1662
|
+
// ui.dialog('Choose Synthesizer')
|
|
1663
|
+
// .add(ui.panel([synthesizer.root], {style: {fontWeight: 'bold'}}))
|
|
1664
|
+
// .onOK(() => possibleSynthesizers = [synthesizer.value])
|
|
1665
|
+
// .onCancel(() => {
|
|
1666
|
+
// possibleSynthesizers = [possibleSynthesizers[0]];
|
|
1667
|
+
// grok.shell.warning('Input sequence is expected to be in format ' + possibleSynthesizers[0]);
|
|
1668
|
+
// })
|
|
1669
|
+
// .show();
|
|
1670
|
+
// } else if (possibleSynthesizers.length == 0)
|
|
1671
|
+
if (possibleSynthesizers.length == 0)
|
|
1672
|
+
return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
|
|
1673
|
+
let outputIndex = 0;
|
|
1674
|
+
const firstUniqueCharacters = ['r', 'd'];
|
|
1675
|
+
const nucleotides = ['A', 'U', 'T', 'C', 'G'];
|
|
1676
|
+
possibleSynthesizers.forEach((synthesizer) => {
|
|
1677
|
+
const codes = getAllCodesOfSynthesizer(synthesizer);
|
|
1678
|
+
while (outputIndex < sequence.length) {
|
|
1679
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
1680
|
+
if (matchedCode == null)
|
|
1681
|
+
break;
|
|
1682
|
+
if ( // for mistake pattern 'rAA'
|
|
1683
|
+
outputIndex > 1 &&
|
|
1684
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
1685
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
1686
|
+
break;
|
|
1687
|
+
if ( // for mistake pattern 'ArA'
|
|
1688
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
1689
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
1690
|
+
outputIndex++;
|
|
1691
|
+
break;
|
|
1692
|
+
}
|
|
1693
|
+
outputIndex += matchedCode.length;
|
|
1694
|
+
}
|
|
1695
|
+
});
|
|
1696
|
+
const indexOfFirstNotValidChar = (outputIndex == sequence.length) ? -1 : outputIndex;
|
|
1697
|
+
if (indexOfFirstNotValidChar != -1) {
|
|
1698
|
+
return {
|
|
1699
|
+
indexOfFirstNotValidChar: indexOfFirstNotValidChar,
|
|
1700
|
+
synthesizer: possibleSynthesizers,
|
|
1701
|
+
technology: null,
|
|
1702
|
+
};
|
|
1703
|
+
}
|
|
1704
|
+
const possibleTechnologies = getListOfPossibleTechnologiesByFirstMatchedCode(sequence, possibleSynthesizers[0]);
|
|
1705
|
+
// if (possibleTechnologies.length > 1) {
|
|
1706
|
+
// const technology = ui.choiceInput('Choose technology from list: ', possibleTechnologies[0],
|
|
1707
|
+
// possibleTechnologies);
|
|
1708
|
+
// ui.dialog('Choose Technology')
|
|
1709
|
+
// .add(ui.panel([technology.root], {style: {fontWeight: 'bold'}}))
|
|
1710
|
+
// .onOK(() => possibleTechnologies = [technology.value])
|
|
1711
|
+
// .onCancel(() => {
|
|
1712
|
+
// possibleTechnologies = [possibleTechnologies[0]];
|
|
1713
|
+
// grok.shell.warning('Input sequence is expected to be in format ' + possibleTechnologies[0]);
|
|
1714
|
+
// })
|
|
1715
|
+
// .show();
|
|
1716
|
+
// } else if (possibleTechnologies.length == 0)
|
|
1717
|
+
if (possibleTechnologies.length == 0)
|
|
1718
|
+
return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
|
|
1719
|
+
outputIndex = 0;
|
|
1720
|
+
possibleTechnologies.forEach((technology) => {
|
|
1721
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[possibleSynthesizers[0]][technology]);
|
|
1722
|
+
while (outputIndex < sequence.length) {
|
|
1723
|
+
const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
|
|
1724
|
+
if (matchedCode == null)
|
|
1725
|
+
break;
|
|
1726
|
+
if ( // for mistake pattern 'rAA'
|
|
1727
|
+
outputIndex > 1 &&
|
|
1728
|
+
nucleotides.includes(sequence[outputIndex]) &&
|
|
1729
|
+
firstUniqueCharacters.includes(sequence[outputIndex - 2]))
|
|
1730
|
+
break;
|
|
1731
|
+
if ( // for mistake pattern 'ArA'
|
|
1732
|
+
firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
|
|
1733
|
+
nucleotides.includes(sequence[outputIndex])) {
|
|
1734
|
+
outputIndex++;
|
|
1735
|
+
break;
|
|
1736
|
+
}
|
|
1737
|
+
outputIndex += matchedCode.length;
|
|
1738
|
+
}
|
|
1739
|
+
});
|
|
1740
|
+
return {
|
|
1741
|
+
indexOfFirstNotValidChar: indexOfFirstNotValidChar,
|
|
1742
|
+
synthesizer: possibleSynthesizers,
|
|
1743
|
+
technology: [possibleTechnologies[outputIndex]],
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1746
|
+
function getAllCodesOfSynthesizer(synthesizer) {
|
|
1747
|
+
let codes = [];
|
|
1748
|
+
for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer]))
|
|
1749
|
+
codes = codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]));
|
|
1750
|
+
return codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS));
|
|
1751
|
+
}
|
|
1752
|
+
function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
|
|
1753
|
+
const synthesizers = [];
|
|
1754
|
+
Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map).forEach((synthesizer) => {
|
|
1755
|
+
const codes = getAllCodesOfSynthesizer(synthesizer);
|
|
1756
|
+
//TODO: get first non-dropdown code when there are two modifications
|
|
1757
|
+
let start = 0;
|
|
1758
|
+
for (let i = 0; i < sequence.length; i++) {
|
|
1759
|
+
if (sequence[i] == ')' && i != sequence.length - 1) {
|
|
1760
|
+
start = i + 1;
|
|
1761
|
+
break;
|
|
1762
|
+
}
|
|
1763
|
+
}
|
|
1764
|
+
if (codes.some((s) => s == sequence.slice(start, start + s.length)))
|
|
1765
|
+
synthesizers.push(synthesizer);
|
|
1766
|
+
});
|
|
1767
|
+
return synthesizers;
|
|
1768
|
+
}
|
|
1769
|
+
function getListOfPossibleTechnologiesByFirstMatchedCode(sequence, synthesizer) {
|
|
1770
|
+
const technologies = [];
|
|
1771
|
+
Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer]).forEach((technology) => {
|
|
1772
|
+
const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]).concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS));
|
|
1773
|
+
if (codes.some((s) => s == sequence.slice(0, s.length)))
|
|
1774
|
+
technologies.push(technology);
|
|
1775
|
+
});
|
|
1776
|
+
return technologies;
|
|
1777
|
+
}
|
|
1778
|
+
function convertSequence(sequence, output) {
|
|
1779
|
+
if (output.indexOfFirstNotValidChar != -1) {
|
|
1780
|
+
return {
|
|
1781
|
+
// type: '',
|
|
1782
|
+
indexOfFirstNotValidChar: JSON.stringify(output),
|
|
1783
|
+
Error: undefinedInputSequence,
|
|
1784
|
+
};
|
|
1785
|
+
}
|
|
1786
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES)) { //&& output.technology!.includes(TECHNOLOGIES.DNA)) {
|
|
1787
|
+
return {
|
|
1788
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES,
|
|
1789
|
+
Nucleotides: sequence,
|
|
1790
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToBioSpring)(sequence),
|
|
1791
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersNucleotidesToGcrs)(sequence),
|
|
1792
|
+
};
|
|
1793
|
+
}
|
|
1794
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS)) {
|
|
1795
|
+
return {
|
|
1796
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
|
|
1797
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToNucleotides)(sequence),
|
|
1798
|
+
BioSpring: sequence,
|
|
1799
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersBioSpringToGcrs)(sequence),
|
|
1800
|
+
};
|
|
1801
|
+
}
|
|
1802
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS)) {
|
|
1803
|
+
return {
|
|
1804
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.ASO_GAPMERS,
|
|
1805
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersGcrsToNucleotides)(sequence),
|
|
1806
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.asoGapmersGcrsToBioSpring)(sequence),
|
|
1807
|
+
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
1808
|
+
GCRS: sequence,
|
|
1809
|
+
};
|
|
1810
|
+
}
|
|
1811
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA)) {
|
|
1812
|
+
return {
|
|
1813
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.RAW_NUCLEOTIDES + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.RNA,
|
|
1814
|
+
Nucleotides: sequence,
|
|
1815
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToBioSpringSenseStrand)(sequence),
|
|
1816
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotideToAxolabsSenseStrand)(sequence),
|
|
1817
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaNucleotidesToGcrs)(sequence),
|
|
1818
|
+
};
|
|
1819
|
+
}
|
|
1820
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA)) {
|
|
1821
|
+
return {
|
|
1822
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
1823
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToNucleotides)(sequence),
|
|
1824
|
+
BioSpring: sequence,
|
|
1825
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToAxolabs)(sequence),
|
|
1826
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaBioSpringToGcrs)(sequence),
|
|
1827
|
+
};
|
|
1828
|
+
}
|
|
1829
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS)) {
|
|
1830
|
+
return {
|
|
1831
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
1832
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToNucleotides)(sequence),
|
|
1833
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToBioSpring)(sequence),
|
|
1834
|
+
Axolabs: sequence,
|
|
1835
|
+
GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaAxolabsToGcrs)(sequence),
|
|
1836
|
+
};
|
|
1837
|
+
}
|
|
1838
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS) && output.technology.includes(_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA)) {
|
|
1839
|
+
return {
|
|
1840
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA,
|
|
1841
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToNucleotides)(sequence),
|
|
1842
|
+
BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToBioSpring)(sequence),
|
|
1843
|
+
Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.siRnaGcrsToAxolabs)(sequence),
|
|
1844
|
+
MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
1845
|
+
GCRS: sequence,
|
|
1846
|
+
};
|
|
1847
|
+
}
|
|
1848
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS)) {
|
|
1849
|
+
return {
|
|
1850
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.GCRS,
|
|
1851
|
+
Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToNucleotides)(sequence),
|
|
1852
|
+
GCRS: sequence,
|
|
1853
|
+
Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_1__.gcrsToMermade12)(sequence),
|
|
1854
|
+
};
|
|
1855
|
+
}
|
|
1856
|
+
if (output.synthesizer.includes(_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12)) {
|
|
1857
|
+
return {
|
|
1858
|
+
type: _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12,
|
|
1859
|
+
Nucleotides: noTranslationTableAvailable,
|
|
1860
|
+
GCRS: noTranslationTableAvailable,
|
|
1861
|
+
Mermade12: sequence,
|
|
1862
|
+
};
|
|
1863
|
+
}
|
|
1864
|
+
return {
|
|
1865
|
+
type: undefinedInputSequence,
|
|
1866
|
+
Nucleotides: undefinedInputSequence,
|
|
1867
|
+
};
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
|
|
1871
|
+
/***/ }),
|
|
1872
|
+
|
|
1873
|
+
/***/ "./src/tests/smiles-tests.ts":
|
|
1874
|
+
/*!***********************************!*\
|
|
1875
|
+
!*** ./src/tests/smiles-tests.ts ***!
|
|
1876
|
+
\***********************************/
|
|
1877
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1878
|
+
|
|
1879
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1880
|
+
/* 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");
|
|
1881
|
+
/* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
|
|
1882
|
+
/* harmony import */ var _structures_works_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../structures-works/map */ "./src/structures-works/map.ts");
|
|
1883
|
+
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
1884
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1885
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1886
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1887
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1888
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1889
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
1890
|
+
});
|
|
1891
|
+
};
|
|
1892
|
+
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.category)('sequence-translator', () => {
|
|
1896
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('AGGTCCTCTTGACTTAGGCC', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1897
|
+
const expected = 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
|
|
1898
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1899
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1900
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1901
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1902
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1903
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1904
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1905
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1906
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1907
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1908
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
|
|
1909
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1910
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1911
|
+
'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
|
|
1912
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
|
|
1913
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1914
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1915
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O';
|
|
1916
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('AGGTCCTCTTGACTTAGGCC', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.RAW_NUCLEOTIDES), expected);
|
|
1917
|
+
}));
|
|
1918
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac1', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1919
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
1920
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1921
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1922
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
1923
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1924
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1925
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
1926
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgg(invabasic)(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1927
|
+
}));
|
|
1928
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac2', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1929
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
1930
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1931
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1932
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
1933
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1934
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1935
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
1936
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgsg(invabasic)(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1937
|
+
}));
|
|
1938
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac3', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1939
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
1940
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1941
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1942
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
1943
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1944
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1945
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
1946
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sggs(invabasic)(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1947
|
+
}));
|
|
1948
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac4', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1949
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
1950
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1951
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1952
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
1953
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1954
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
1955
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
1956
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgg(invabasic)s(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1957
|
+
}));
|
|
1958
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('usCfCfUfGfAf', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1959
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1960
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1961
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1962
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1963
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1964
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O';
|
|
1965
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('usCfCfUfGfAf', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1966
|
+
}));
|
|
1967
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('usAfsusgsgsg', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1968
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1969
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
1970
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1971
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1972
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1973
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
1974
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('usAfsusgsgsg', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1975
|
+
}));
|
|
1976
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('UfUfUfsCfsuacg', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1977
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1978
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1979
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
1980
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
1981
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1982
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1983
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1984
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
1985
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('UfUfUfsCfsuacg', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1986
|
+
}));
|
|
1987
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('susususauasu', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1988
|
+
const expected = 'OP(=O)(S)OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1989
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1990
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1991
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1992
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
1993
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
1994
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O';
|
|
1995
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('susususauasu', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
1996
|
+
}));
|
|
1997
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('CfGfCfsGfsCf', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1998
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
1999
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2000
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
2001
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
2002
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O';
|
|
2003
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('CfGfCfsGfsCf', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2004
|
+
}));
|
|
2005
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('acacacsacsac', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2006
|
+
const expected = 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2007
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2008
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2009
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2010
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2011
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2012
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2013
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2014
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2015
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O';
|
|
2016
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('acacacsacsac', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2017
|
+
}));
|
|
2018
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('cccgggusug', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2019
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2020
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2021
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2022
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2023
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2024
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2025
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2026
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2027
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
2028
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('cccgggusug', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2029
|
+
}));
|
|
2030
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('UfAfCfGfGfCfAfUf', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2031
|
+
const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2032
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2033
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2034
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2035
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2036
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2037
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2038
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
|
|
2039
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('UfAfCfGfGfCfAfUf', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2040
|
+
}));
|
|
2041
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sucuCfuUf', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2042
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2043
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2044
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2045
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2046
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2047
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2048
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
|
|
2049
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sucuCfuUf', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2050
|
+
}));
|
|
2051
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sAfgcugUf', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2052
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2053
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2054
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2055
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2056
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2057
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2058
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
|
|
2059
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sAfgcugUf', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2060
|
+
}));
|
|
2061
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)cuCfuUfsc', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2062
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2063
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2064
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2065
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2066
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2067
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
2068
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O';
|
|
2069
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)cuCfuUfsc', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2070
|
+
}));
|
|
2071
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scususu(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2072
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2073
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2074
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2075
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2076
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2077
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2078
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2079
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2080
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scususu(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2081
|
+
}));
|
|
2082
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2083
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2084
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2085
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
2086
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2087
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2088
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2089
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2090
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2091
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2092
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2093
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2094
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2095
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2096
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2097
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2098
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2099
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2100
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2101
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2102
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2103
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2104
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O';
|
|
2105
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2106
|
+
}));
|
|
2107
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)asacgGfuGfCfAfacucuauuca', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2108
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2109
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2110
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2111
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2112
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2113
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2114
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2115
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2116
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2117
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2118
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2119
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2120
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2121
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2122
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2123
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2124
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2125
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2126
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2127
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
2128
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)asacgGfuGfCfAfacucuauuca', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2129
|
+
}));
|
|
2130
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsgguGfcAfAfCfucuauucuga', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2131
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2132
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2133
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2134
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2135
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2136
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2137
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2138
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2139
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2140
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2141
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2142
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2143
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2144
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2145
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2146
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2147
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2148
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2149
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2150
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
2151
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsgguGfcAfAfCfucuauucuga', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2152
|
+
}));
|
|
2153
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsaacUfcUfAfUfucuggacuua', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2154
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2155
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2156
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2157
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2158
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2159
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2160
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2161
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2162
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2163
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2164
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2165
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2166
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2167
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2168
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2169
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2170
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2171
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2172
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2173
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
2174
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsaacUfcUfAfUfucuggacuua', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2175
|
+
}));
|
|
2176
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasacuCfuAfUfUfcuggacuuua', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2177
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2178
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2179
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2180
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2181
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2182
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2183
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2184
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2185
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2186
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2187
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2188
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2189
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2190
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2191
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2192
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2193
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2194
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2195
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2196
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
|
|
2197
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasacuCfuAfUfUfcuggacuuua', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2198
|
+
}));
|
|
2199
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)usAfscug(invabasic)(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2200
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2201
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2202
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
|
|
2203
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2204
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2205
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2206
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2207
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2208
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2209
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2210
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)usAfscug(invabasic)(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2211
|
+
}));
|
|
2212
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasuaaCfcUf(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2213
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2214
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2215
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2216
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2217
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2218
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2219
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2220
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2221
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2222
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2223
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2224
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasuaaCfcUf(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2225
|
+
}));
|
|
2226
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasuaaCfcUfCfUfuguaguuaua(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2227
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2228
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2229
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2230
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2231
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2232
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2233
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2234
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2235
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2236
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2237
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2238
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2239
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2240
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2241
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2242
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2243
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2244
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2245
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2246
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2247
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2248
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2249
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2250
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasuaaCfcUfCfUfuguaguuaua(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2251
|
+
}));
|
|
2252
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsaucacguUfGfCfagccgucuua(invabasic)(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2253
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2254
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2255
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2256
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2257
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2258
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2259
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2260
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2261
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2262
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2263
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2264
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2265
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2266
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2267
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2268
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2269
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2270
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2271
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2272
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2273
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2274
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2275
|
+
'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
|
|
2276
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2277
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2278
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2279
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsaucacguUfGfCfagccgucuua(invabasic)(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2280
|
+
}));
|
|
2281
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)susguuUfgCfCfUfacaucuacua(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
2282
|
+
const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
|
|
2283
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
|
|
2284
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2285
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2286
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2287
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2288
|
+
'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2289
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2290
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2291
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
|
|
2292
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2293
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2294
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2295
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2296
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2297
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2298
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2299
|
+
'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2300
|
+
'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2301
|
+
'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
|
|
2302
|
+
'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2303
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
|
|
2304
|
+
'(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
|
|
2305
|
+
(0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)susguuUfgCfCfUfacaucuacua(GalNAc-2-JNJ)', false, _structures_works_map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS), expected);
|
|
2306
|
+
}));
|
|
2307
|
+
});
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
/***/ }),
|
|
2311
|
+
|
|
2312
|
+
/***/ "datagrok-api/dg":
|
|
2313
|
+
/*!*********************!*\
|
|
2314
|
+
!*** external "DG" ***!
|
|
2315
|
+
\*********************/
|
|
2316
|
+
/***/ ((module) => {
|
|
2317
|
+
|
|
2318
|
+
module.exports = DG;
|
|
2319
|
+
|
|
2320
|
+
/***/ }),
|
|
2321
|
+
|
|
2322
|
+
/***/ "openchemlib/full.js":
|
|
2323
|
+
/*!**********************!*\
|
|
2324
|
+
!*** external "OCL" ***!
|
|
2325
|
+
\**********************/
|
|
2326
|
+
/***/ ((module) => {
|
|
2327
|
+
|
|
2328
|
+
module.exports = OCL;
|
|
2329
|
+
|
|
2330
|
+
/***/ }),
|
|
2331
|
+
|
|
2332
|
+
/***/ "datagrok-api/grok":
|
|
2333
|
+
/*!***********************!*\
|
|
2334
|
+
!*** external "grok" ***!
|
|
2335
|
+
\***********************/
|
|
2336
|
+
/***/ ((module) => {
|
|
2337
|
+
|
|
2338
|
+
module.exports = grok;
|
|
2339
|
+
|
|
2340
|
+
/***/ })
|
|
2341
|
+
|
|
2342
|
+
/******/ });
|
|
2343
|
+
/************************************************************************/
|
|
2344
|
+
/******/ // The module cache
|
|
2345
|
+
/******/ var __webpack_module_cache__ = {};
|
|
2346
|
+
/******/
|
|
2347
|
+
/******/ // The require function
|
|
2348
|
+
/******/ function __webpack_require__(moduleId) {
|
|
2349
|
+
/******/ // Check if module is in cache
|
|
2350
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
2351
|
+
/******/ if (cachedModule !== undefined) {
|
|
2352
|
+
/******/ return cachedModule.exports;
|
|
2353
|
+
/******/ }
|
|
2354
|
+
/******/ // Create a new module (and put it into the cache)
|
|
2355
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
2356
|
+
/******/ // no module.id needed
|
|
2357
|
+
/******/ // no module.loaded needed
|
|
2358
|
+
/******/ exports: {}
|
|
2359
|
+
/******/ };
|
|
2360
|
+
/******/
|
|
2361
|
+
/******/ // Execute the module function
|
|
2362
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
2363
|
+
/******/
|
|
2364
|
+
/******/ // Return the exports of the module
|
|
2365
|
+
/******/ return module.exports;
|
|
2366
|
+
/******/ }
|
|
2367
|
+
/******/
|
|
2368
|
+
/************************************************************************/
|
|
2369
|
+
/******/ /* webpack/runtime/compat get default export */
|
|
2370
|
+
/******/ (() => {
|
|
2371
|
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
2372
|
+
/******/ __webpack_require__.n = (module) => {
|
|
2373
|
+
/******/ var getter = module && module.__esModule ?
|
|
2374
|
+
/******/ () => (module['default']) :
|
|
2375
|
+
/******/ () => (module);
|
|
2376
|
+
/******/ __webpack_require__.d(getter, { a: getter });
|
|
2377
|
+
/******/ return getter;
|
|
2378
|
+
/******/ };
|
|
2379
|
+
/******/ })();
|
|
2380
|
+
/******/
|
|
2381
|
+
/******/ /* webpack/runtime/define property getters */
|
|
2382
|
+
/******/ (() => {
|
|
2383
|
+
/******/ // define getter functions for harmony exports
|
|
2384
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
2385
|
+
/******/ for(var key in definition) {
|
|
2386
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
2387
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
2388
|
+
/******/ }
|
|
2389
|
+
/******/ }
|
|
2390
|
+
/******/ };
|
|
2391
|
+
/******/ })();
|
|
2392
|
+
/******/
|
|
2393
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
2394
|
+
/******/ (() => {
|
|
2395
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
2396
|
+
/******/ })();
|
|
2397
|
+
/******/
|
|
2398
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
2399
|
+
/******/ (() => {
|
|
2400
|
+
/******/ // define __esModule on exports
|
|
2401
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
2402
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
2403
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2404
|
+
/******/ }
|
|
2405
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
2406
|
+
/******/ };
|
|
2407
|
+
/******/ })();
|
|
2408
|
+
/******/
|
|
2409
|
+
/************************************************************************/
|
|
2410
|
+
var __webpack_exports__ = {};
|
|
2411
|
+
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
|
|
2412
|
+
(() => {
|
|
2413
|
+
/*!*****************************!*\
|
|
2414
|
+
!*** ./src/package-test.ts ***!
|
|
2415
|
+
\*****************************/
|
|
2416
|
+
__webpack_require__.r(__webpack_exports__);
|
|
2417
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
2418
|
+
/* harmony export */ "_package": () => (/* binding */ _package),
|
|
2419
|
+
/* harmony export */ "tests": () => (/* reexport safe */ _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.tests),
|
|
2420
|
+
/* harmony export */ "test": () => (/* binding */ test)
|
|
2421
|
+
/* harmony export */ });
|
|
2422
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
|
|
2423
|
+
/* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
|
|
2424
|
+
/* 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");
|
|
2425
|
+
/* harmony import */ var _tests_smiles_tests__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tests/smiles-tests */ "./src/tests/smiles-tests.ts");
|
|
2426
|
+
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2427
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
2428
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
2429
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
2430
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
2431
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
2432
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
2433
|
+
});
|
|
2434
|
+
};
|
|
2435
|
+
|
|
2436
|
+
|
|
2437
|
+
|
|
2438
|
+
const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Package();
|
|
2439
|
+
|
|
2440
|
+
//name: test
|
|
2441
|
+
//output: dataframe result
|
|
2442
|
+
function test() {
|
|
2443
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2444
|
+
const data = yield (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.runTests)();
|
|
2445
|
+
return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromObjects(data);
|
|
2446
|
+
});
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
})();
|
|
2450
|
+
|
|
2451
|
+
sequencetranslator_test = __webpack_exports__;
|
|
2452
|
+
/******/ })()
|
|
2453
|
+
;
|
|
2454
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS10ZXN0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQzBDO0FBQ25DO0FBQ0E7QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiwrQkFBK0I7QUFDcEQ7QUFDQTtBQUNBLENBQUMsd0JBQXdCO0FBQ2xCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsOERBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCw4REFBb0IsQ0FBQztBQUNwRjtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esd0JBQXdCLGNBQWM7QUFDdEM7QUFDQSxnQkFBZ0IscUVBQTJCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUDtBQUNBLDJCQUEyQixTQUFTLFVBQVUsT0FBTztBQUNyRDtBQUNPO0FBQ1A7QUFDQTtBQUNBLDBCQUEwQixTQUFTLFFBQVEsUUFBUSxlQUFlLFVBQVU7QUFDNUU7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGNBQWM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix3RUFBd0U7QUFDcEc7QUFDQSw0QkFBNEIseUVBQXlFO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsMkNBQTJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEozQztBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQSxnR0FBZ0csZ0JBQWdCO0FBQ2hIO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSwySEFBMkgsZ0JBQWdCO0FBQzNJO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0EsaUdBQWlHLGdCQUFnQjtBQUNqSDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBLHNHQUFzRyxnQkFBZ0I7QUFDdEg7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUCxrQkFBa0I7QUFDbEI7QUFDQSxzR0FBc0csZ0JBQWdCO0FBQ3RIO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0Esc0dBQXNHLGdCQUFnQjtBQUN0SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EseUdBQXlHLGdCQUFnQjtBQUN6SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EseUdBQXlHLGdCQUFnQjtBQUN6SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EseUdBQXlHLGdCQUFnQjtBQUN6SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsOEdBQThHLGdCQUFnQjtBQUM5SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsOEdBQThHLGdCQUFnQjtBQUM5SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsOEdBQThHLGdCQUFnQjtBQUM5SDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUDtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLGdDQUFnQztBQUNoQztBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDbEI7QUFDUDtBQUNBLGtDQUFrQztBQUNsQztBQUNBLGdDQUFnQztBQUNoQztBQUNBLGdDQUFnQztBQUNoQztBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUNsQjtBQUNQLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxtSkFBbUosZ0JBQWdCO0FBQ25LO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ2xCO0FBQ1Asa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLG1KQUFtSixnQkFBZ0I7QUFDbks7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4UW1HO0FBQzFDO0FBQ0M7QUFDbkQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQywrQ0FBYTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQSxnQkFBZ0IsK0NBQWEsdUJBQXVCLCtDQUFhO0FBQ2pFLDZCQUE2Qiw0REFBMEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw0REFBMEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1RUFBaUI7QUFDNUI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLCtDQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBLGdCQUFnQiwrQ0FBYSx1QkFBdUIsNERBQTBCO0FBQzlFLGdCQUFnQiwrQ0FBYSxzQkFBc0IsNERBQTBCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDREQUEwQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsbUVBQWlDO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLHFDQUFHO0FBQ2pELGlEQUFpRCxxQ0FBRztBQUNwRCwrQ0FBK0MscUNBQUc7QUFDbEQsZ0NBQWdDLHFDQUFHO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHFDQUFHO0FBQ2hELDJDQUEyQyxxQ0FBRztBQUM5Qyw0QkFBNEIscUNBQUc7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNFQUFlO0FBQ2xDLG9DQUFvQyx5REFBdUI7QUFDM0QsbUJBQW1CLHFDQUFHLENBQUMseURBQXVCLEVBQUUscURBQW1CO0FBQ25FLHlDQUF5QyxzREFBb0I7QUFDN0QsbUJBQW1CLHFDQUFHLENBQUMsc0RBQW9CLEVBQUUscURBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qyw2QkFBNkI7QUFDckU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEdPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvaUIyQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG9CQUFv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OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUNBQWlDLFdBQVc7V0FDNUM7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDc0M7QUFDK0I7QUFDdkM7QUFDdkIscUJBQXFCLG9EQUFVO0FBQ3JCO0FBQ2pCO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMkJBQTJCLDRFQUFRO0FBQ25DLGVBQWUsa0VBQXdCO0FBQ3ZDLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90ZXN0LmpzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2NvbnZlcnRlcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9tYXAudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbW9sLXRyYW5zZm9ybWF0aW9ucy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9zZXF1ZW5jZS1jb2Rlcy10b29scy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvdGVzdHMvc21pbGVzLXRlc3RzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJER1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci9leHRlcm5hbCB2YXIgXCJPQ0xcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiZ3Jva1wiIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvcGFja2FnZS10ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tIFwiZGF0YWdyb2stYXBpL2dyb2tcIjtcbmV4cG9ydCBsZXQgdGVzdHMgPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5O1xuZXhwb3J0IHZhciBhc3N1cmU7XG4oZnVuY3Rpb24gKGFzc3VyZSkge1xuICAgIGZ1bmN0aW9uIG5vdE51bGwodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgO1xuICAgIH1cbiAgICBhc3N1cmUubm90TnVsbCA9IG5vdE51bGw7XG59KShhc3N1cmUgfHwgKGFzc3VyZSA9IHt9KSk7XG5leHBvcnQgY2xhc3MgVGVzdCB7XG4gICAgY29uc3RydWN0b3IoY2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiAob3B0aW9ucyA9IHt9KTtcbiAgICAgICAgKF9hID0gb3B0aW9ucy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAob3B0aW9ucy50aW1lb3V0ID0gMzAwMDApO1xuICAgICAgICAoX2IgPSBvcHRpb25zLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChvcHRpb25zLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQgPSAyMDAwKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy50ZXN0ID0gKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geWllbGQgdGVzdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKHlpZWxkIGFzc2VydE5vRXJyb3Iob3B0aW9ucy51bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0KSkpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChgVW5oYW5kbGVkIGV4Y2VwdGlvbiBkdXJpbmcgdGVzdDogJHtncm9rLnNoZWxsLmxhc3RFcnJvcn1gKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWUsIHRlc3QsIG9wdGlvbnMpIHtcbiAgICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzLnB1c2gobmV3IFRlc3QoY3VycmVudENhdGVnb3J5LCBuYW1lLCB0ZXN0LCBvcHRpb25zKSk7XG59XG4vKiogQXdhaXRzIGZvciBhIHdoaWxlIGNoZWNraW5nIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIHBsYXRmb3JtICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9FcnJvcihtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXMgLyA1MDA7ICsraSkge1xuICAgICAgICAgICAgeWllbGQgZGVsYXkoNTAwKTtcbiAgICAgICAgICAgIGlmIChncm9rLnNoZWxsLmxhc3RFcnJvci5sZW5ndGggIT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuLyoqIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICAgICAgdGhyb3cgYEV4cGVjdGVkIFwiJHtleHBlY3RlZH1cIiwgZ290IFwiJHthY3R1YWx9XCJgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbCwgZXhwZWN0ZWQsIHRvbGVyYW5jZSA9IDAuMDAxKSB7XG4gICAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCAwLjAwMTtcbiAgICBpZiAoIWFyZUVxdWFsKVxuICAgICAgICB0aHJvdyBgRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGdvdCAke2FjdHVhbH0gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgO1xufVxuLyoqIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5LCB0ZXN0cykge1xuICAgIGN1cnJlbnRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRlc3RzKCk7XG59XG4vKiogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZSkge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuLyoqIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXIpIHtcbiAgICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmFmdGVyID0gYWZ0ZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0cykpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhdGVnb3J5KSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYmVmb3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmJlZm9yZVN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0ID0gKF9hID0gdmFsdWUudGVzdHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goeWllbGQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRlc3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkYXRhID0gKHlpZWxkIFByb21pc2UuYWxsKHJlcykpLmZpbHRlcigoZCkgPT4gZC5yZXN1bHQgIT0gJ3NraXBwZWQnKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmFmdGVyKVxuICAgICAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZS5hZnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5hZnRlclN0YXR1cylcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goeyBjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYWZ0ZXJTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlIH0pO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZVN0YXR1cylcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goeyBjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYmVmb3JlU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGV4ZWNUZXN0KHQsIHByZWRpY2F0ZSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUgIT0gdW5kZWZpbmVkICYmICghdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSkpKVxuICAgICAgICAgICAgICAgIHIgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogJ3NraXBwZWQnIH07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgciA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiAoX2EgPSB5aWVsZCB0LnRlc3QoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ09LJyB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoICh4KSB7XG4gICAgICAgICAgICByID0geyBzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiB4LnRvU3RyaW5nKCkgfTtcbiAgICAgICAgfVxuICAgICAgICByLmNhdGVnb3J5ID0gdC5jYXRlZ29yeTtcbiAgICAgICAgci5uYW1lID0gdC5uYW1lO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWxheShtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBtcykpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEdWemRDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW5SbGMzUXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdPMEZCUVVFc1QwRkJUeXhMUVVGTExFbEJRVWtzVFVGQlRTeHRRa0ZCYlVJc1EwRkJRenRCUVVVeFF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4TFFVRkxMRWRCUVRoSkxFVkJRVVVzUTBGQlF6dEJRVVZxU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hsUVVGMVFpeERRVUZETzBGQlJXNURMRTFCUVUwc1MwRkJWeXhOUVVGTkxFTkJUWFJDTzBGQlRrUXNWMEZCYVVJc1RVRkJUVHRKUVVWeVFpeFRRVUZuUWl4UFFVRlBMRU5CUVVNc1MwRkJWU3hGUVVGRkxFbEJRV0U3VVVGREwwTXNTVUZCU1N4TFFVRkxMRWxCUVVrc1NVRkJTVHRaUVVObUxFMUJRVTBzUjBGQlJ5eEpRVUZKTEVsQlFVa3NTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NZMEZCWXl4RFFVRkRPMGxCUTNwRUxFTkJRVU03U1VGSVpTeGpRVUZQTEZWQlIzUkNMRU5CUVVFN1FVRkRTQ3hEUVVGRExFVkJUbWRDTEUxQlFVMHNTMEZCVGl4TlFVRk5MRkZCVFhSQ08wRkJUMFFzVFVGQlRTeFBRVUZQTEVsQlFVazdTVUZOWml4WlFVRlpMRkZCUVdkQ0xFVkJRVVVzU1VGQldTeEZRVUZGTEVsQlFYZENMRVZCUVVVc1QwRkJjVUk3TzFGQlEzcEdMRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzVVVGQlVTeERRVUZETzFGQlEzcENMRWxCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETzFGQlEycENMRTlCUVU4c1lVRkJVQ3hQUVVGUExHTkJRVkFzVDBGQlR5eEpRVUZRTEU5QlFVOHNSMEZCU3l4RlFVRkZMRVZCUVVNN1VVRkRaaXhOUVVGQkxFOUJRVThzUTBGQlF5eFBRVUZQTEc5RFFVRm1MRTlCUVU4c1EwRkJReXhQUVVGUExFZEJRVXNzUzBGQlN5eEZRVUZETzFGQlF6RkNMRTFCUVVFc1QwRkJUeXhEUVVGRExIbENRVUY1UWl4dlEwRkJha01zVDBGQlR5eERRVUZETEhsQ1FVRjVRaXhIUVVGTExFbEJRVWtzUlVGQlF6dFJRVU16UXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF6dFJRVU4yUWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFZEJRWFZDTEVWQlFVVTdXVUZEYmtNc1QwRkJUeXhKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZQTEU5QlFVOHNSVUZCUlN4TlFVRk5MRVZCUVVVc1JVRkJSVHRuUWtGRE0wTXNTVUZCU1N4TlFVRk5MRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU5vUWl4SlFVRkpPMjlDUVVOR0xFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNVMEZCVXl4SFFVRkhMRVZCUVVVc1EwRkJRenR2UWtGRE1VSXNUVUZCVFN4SFFVRkhMRTFCUVUwc1NVRkJTU3hGUVVGRkxFTkJRVU03YVVKQlEzWkNPMmRDUVVGRExFOUJRVThzUTBGQlRTeEZRVUZGTzI5Q1FVTm1MRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHBRa0ZEV0R0blFrRkRSQ3hKUVVGSkxFTkJRVU1zUTBGQlF5eE5RVUZOTEdGQlFXRXNRMEZCUXl4UFFVRlJMRU5CUVVNc2VVSkJRVEJDTEVOQlFVTXNRMEZCUXp0dlFrRkROMFFzVFVGQlRTeERRVUZETEc5RFFVRnZReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1owSkJRM0pGTEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRaUVVOc1FpeERRVUZETEVOQlFVRXNRMEZCUXl4RFFVRkRPMUZCUTB3c1EwRkJReXhEUVVGQkxFTkJRVU03U1VGRFNpeERRVUZETzBOQlEwWTdRVUZGUkN4TlFVRk5MRlZCUVZVc1NVRkJTU3hEUVVGRExFbEJRVmtzUlVGQlJTeEpRVUYzUWl4RlFVRkZMRTlCUVhGQ08wbEJRMmhHTEVsQlFVa3NTMEZCU3l4RFFVRkRMR1ZCUVdVc1EwRkJReXhKUVVGSkxGTkJRVk03VVVGRGNrTXNTMEZCU3l4RFFVRkRMR1ZCUVdVc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU01UWl4SlFVRkpMRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NVMEZCVXp0UlFVTXpReXhMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNTMEZCU3l4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVOd1F5eExRVUZMTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNc1MwRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1NVRkJTU3hGUVVGRkxFbEJRVWtzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNKR0xFTkJRVU03UVVGRlJDeHRSVUZCYlVVN1FVRkRia1VzVFVGQlRTeFZRVUZuUWl4aFFVRmhMRU5CUVVNc1JVRkJWVHM3VVVGRE5VTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVU3V1VGRGFrTXNUVUZCVFN4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRGFrSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGTkJRVk1zUTBGQlF5eE5RVUZOTEV0QlFVc3NRMEZCUXp0blFrRkRia01zVDBGQlR5eExRVUZMTEVOQlFVTTdVMEZEYUVJN1VVRkRSQ3hQUVVGUExFbEJRVWtzUTBGQlF6dEpRVU5rTEVOQlFVTTdRMEZCUVR0QlFVVkVMR2xHUVVGcFJqdEJRVU5xUml4TlFVRk5MRlZCUVZVc1RVRkJUU3hEUVVGRExFMUJRVmNzUlVGQlJTeFJRVUZoTzBsQlF5OURMRWxCUVVrc1RVRkJUU3hMUVVGTExGRkJRVkU3VVVGRGNrSXNUVUZCVFN4aFFVRmhMRkZCUVZFc1YwRkJWeXhOUVVGTkxFZEJRVWNzUTBGQlF6dEJRVU53UkN4RFFVRkRPMEZCUlVRc1RVRkJUU3hWUVVGVkxGZEJRVmNzUTBGQlF5eE5RVUZqTEVWQlFVVXNVVUZCWjBJc1JVRkJSU3hUUVVGVExFZEJRVWNzUzBGQlN6dEpRVU0zUlN4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEUxQlFVMHNSMEZCUnl4UlFVRlJMRU5CUVVNc1IwRkJSeXhMUVVGTExFTkJRVU03U1VGRGNrUXNTVUZCU1N4RFFVRkRMRkZCUVZFN1VVRkRXQ3hOUVVGTkxGbEJRVmtzVVVGQlVTeFRRVUZUTEUxQlFVMHNhVUpCUVdsQ0xGTkJRVk1zUjBGQlJ5eERRVUZETzBGQlF6TkZMRU5CUVVNN1FVRkZSQ3cwUWtGQk5FSTdRVUZETlVJc1RVRkJUU3hWUVVGVkxGRkJRVkVzUTBGQlF5eFJRVUZuUWl4RlFVRkZMRXRCUVdsQ08wbEJRekZFTEdWQlFXVXNSMEZCUnl4UlFVRlJMRU5CUVVNN1NVRkRNMElzUzBGQlN5eEZRVUZGTEVOQlFVTTdRVUZEVml4RFFVRkRPMEZCUlVRc2QwWkJRWGRHTzBGQlEzaEdMRTFCUVUwc1ZVRkJWU3hOUVVGTkxFTkJRVU1zVFVGQk1rSTdTVUZEYUVRc1NVRkJTU3hMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVsQlFVa3NVMEZCVXp0UlFVTnlReXhMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMGxCUXpsQ0xFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1RVRkJUU3hEUVVGRE8wRkJRM3BETEVOQlFVTTdRVUZGUkN4MVJrRkJkVVk3UVVGRGRrWXNUVUZCVFN4VlFVRlZMRXRCUVVzc1EwRkJReXhMUVVFd1FqdEpRVU01UXl4SlFVRkpMRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zU1VGQlNTeFRRVUZUTzFGQlEzSkRMRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdTVUZET1VJc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRka01zUTBGQlF6dEJRVWRFTEUxQlFVMHNWVUZCWjBJc1VVRkJVU3hEUVVGRExFOUJRVFJET3pzN1VVRkRla1VzU1VGQlNTeFBRVUZQTEVkQlFUUkZMRVZCUVVVc1EwRkJRenRSUVVVeFJpeExRVUZMTEUxQlFVMHNRMEZCUXl4SFFVRkhMRVZCUVVVc1MwRkJTeXhEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJSVHRaUVVOb1JDeEpRVUZKTEVOQlFVRXNUMEZCVHl4aFFVRlFMRTlCUVU4c2RVSkJRVkFzVDBGQlR5eERRVUZGTEZGQlFWRXNTMEZCU1N4VFFVRlRMRVZCUVVVN1owSkJRMnhETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU1zVlVGQlZTeERRVUZETEU5QlFVOHNZVUZCVUN4UFFVRlBMSFZDUVVGUUxFOUJRVThzUTBGQlJTeFJRVUZSTEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNN2IwSkJRMmhGTEZOQlFWTTdZVUZEV2p0WlFVTkVMRWxCUVVrN1owSkJRMFlzU1VGQlNTeExRVUZMTEVOQlFVTXNUVUZCVFR0dlFrRkRaQ3hOUVVGTkxFdEJRVXNzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0aFFVTjRRanRaUVVGRExFOUJRVThzUTBGQlRTeEZRVUZGTzJkQ1FVTm1MRXRCUVVzc1EwRkJReXhaUVVGWkxFZEJRVWNzUTBGQlF5eERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRPMkZCUTI1RE8xbEJRMFFzU1VGQlNTeERRVUZETEVkQlFVY3NUVUZCUVN4TFFVRkxMRU5CUVVNc1MwRkJTeXh0UTBGQlNTeEZRVUZGTEVOQlFVTTdXVUZETVVJc1NVRkJTU3hIUVVGSExFZEJRVWNzUlVGQlJTeERRVUZETzFsQlEySXNTMEZCU1N4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEyaERMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFOUJRVThzWVVGQlVDeFBRVUZQTEhWQ1FVRlFMRTlCUVU4c1EwRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETzJGQlF5OURPMWxCUlVRc1NVRkJTU3hKUVVGSkxFZEJRVWNzUTBGQlF5eE5RVUZOTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVsQlFVa3NVMEZCVXl4RFFVRkRMRU5CUVVNN1dVRkRla1VzU1VGQlNUdG5Ra0ZEUml4SlFVRkpMRXRCUVVzc1EwRkJReXhMUVVGTE8yOUNRVU5pTEUxQlFVMHNTMEZCU3l4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRE8yRkJRM1pDTzFsQlFVTXNUMEZCVHl4RFFVRk5MRVZCUVVVN1owSkJRMllzUzBGQlN5eERRVUZETEZkQlFWY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1VVRkJVU3hGUVVGRkxFTkJRVU03WVVGRGJFTTdXVUZEUkN4SlFVRkpMRXRCUVVzc1EwRkJReXhYUVVGWE8yZENRVU51UWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVU1zVVVGQlVTeEZRVUZGTEVkQlFVY3NSVUZCUlN4SlFVRkpMRVZCUVVVc1RVRkJUU3hGUVVGRkxFMUJRVTBzUlVGQlJTeExRVUZMTEVOQlFVTXNWMEZCVnl4RlFVRkZMRTlCUVU4c1JVRkJSU3hMUVVGTExFVkJRVU1zUTBGQlF5eERRVUZETzFsQlEzUkdMRWxCUVVrc1MwRkJTeXhEUVVGRExGbEJRVms3WjBKQlEzQkNMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlF5eFJRVUZSTEVWQlFVVXNSMEZCUnl4RlFVRkZMRWxCUVVrc1JVRkJSU3hOUVVGTkxFVkJRVVVzVFVGQlRTeEZRVUZGTEV0QlFVc3NRMEZCUXl4WlFVRlpMRVZCUVVVc1QwRkJUeXhGUVVGRkxFdEJRVXNzUlVGQlF5eERRVUZETEVOQlFVTTdXVUZEZGtZc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4RFFVRkRPMU5CUTNaQ08xRkJSVVFzVDBGQlR5eFBRVUZQTEVOQlFVTTdPME5CUTJoQ08wRkJSVVFzVTBGQlpTeFJRVUZSTEVOQlFVTXNRMEZCVHl4RlFVRkZMRk5CUVRaQ096czdVVUZETlVRc1NVRkJTU3hEUVVGNVJTeERRVUZETzFGQlF6bEZMRWxCUVVrN1dVRkRSaXhKUVVGSkxGTkJRVk1zU1VGQlNTeFRRVUZUTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eERRVUZETzJkQ1FVTjJSaXhEUVVGRExFZEJRVWNzUlVGQlF5eFBRVUZQTEVWQlFVVXNTVUZCU1N4RlFVRkZMRTFCUVUwc1JVRkJSU3hUUVVGVExFVkJRVU1zUTBGQlF6czdaMEpCUlhaRExFTkJRVU1zUjBGQlJ5eEZRVUZETEU5QlFVOHNSVUZCUlN4SlFVRkpMRVZCUVVVc1RVRkJUU3hGUVVGRkxFMUJRVUVzVFVGQlRTeERRVUZETEVOQlFVTXNTVUZCU1N4RlFVRkZMRzFEUVVGSkxFbEJRVWtzUlVGQlF5eERRVUZETzFOQlEzWkVPMUZCUVVNc1QwRkJUeXhEUVVGTkxFVkJRVVU3V1VGRFppeERRVUZETEVkQlFVY3NSVUZCUXl4UFFVRlBMRVZCUVVVc1MwRkJTeXhGUVVGRkxFMUJRVTBzUlVGQlJTeERRVUZETEVOQlFVTXNVVUZCVVN4RlFVRkZMRVZCUVVNc1EwRkJRenRUUVVNMVF6dFJRVU5FTEVOQlFVTXNRMEZCUXl4UlFVRlJMRWRCUVVjc1EwRkJReXhEUVVGRExGRkJRVkVzUTBGQlF6dFJRVU40UWl4RFFVRkRMRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdVVUZEYUVJc1QwRkJUeXhEUVVGRExFTkJRVU03TzBOQlExWTdRVUZGUkN4TlFVRk5MRlZCUVdkQ0xFdEJRVXNzUTBGQlF5eEZRVUZWT3p0UlFVTndReXhOUVVGUExFbEJRVWtzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXpkRExFTkJRVU03UTBGQlFTSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQXFJR0Z6SUdkeWIyc2dabkp2YlNCY0ltUmhkR0ZuY205ckxXRndhUzluY205clhDSTdYRzVjYm1WNGNHOXlkQ0JzWlhRZ2RHVnpkSE02SUh0YmEyVjVPaUJ6ZEhKcGJtZGRPaUI3ZEdWemRITS9PaUJVWlhOMFcxMHNJR0psWm05eVpUODZJQ2dwSUQwK0lGQnliMjFwYzJVOGRtOXBaRDRzSUdGbWRHVnlQem9nS0NrZ1BUNGdVSEp2YldselpUeDJiMmxrUGl3Z1ltVm1iM0psVTNSaGRIVnpQem9nYzNSeWFXNW5MQ0JoWm5SbGNsTjBZWFIxY3o4NklITjBjbWx1WjMxOUlEMGdlMzA3WEc1Y2JtVjRjRzl5ZENCc1pYUWdZM1Z5Y21WdWRFTmhkR1ZuYjNKNU9pQnpkSEpwYm1jN1hHNWNibVY0Y0c5eWRDQnVZVzFsYzNCaFkyVWdZWE56ZFhKbElIdGNibHh1SUNCbGVIQnZjblFnWm5WdVkzUnBiMjRnYm05MFRuVnNiQ2gyWVd4MVpUb2dZVzU1TENCdVlXMWxQem9nYzNSeWFXNW5LU0I3WEc0Z0lDQWdhV1lnS0haaGJIVmxJRDA5SUc1MWJHd3BYRzRnSUNBZ0lDQjBhSEp2ZHlCZ0pIdHVZVzFsSUQwOUlHNTFiR3dnUHlBblZtRnNkV1VuSURvZ2JtRnRaWDBnYm05MElHUmxabWx1WldSZ08xeHVJQ0I5WEc1OVhHNWNibVY0Y0c5eWRDQnBiblJsY21aaFkyVWdWR1Z6ZEU5d2RHbHZibk1nZTF4dUlDQjBhVzFsYjNWMFB5QTZJRzUxYldKbGNqdGNiaUFnZFc1b1lXNWtiR1ZrUlhoalpYQjBhVzl1VkdsdFpXOTFkRDhnT2lCdWRXMWlaWEk3WEc1OVhHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCVVpYTjBJSHRjYmlBZ2RHVnpkRG9nS0NrZ1BUNGdVSEp2YldselpUeGhibmsrTzF4dUlDQnVZVzFsT2lCemRISnBibWM3WEc0Z0lHTmhkR1ZuYjNKNU9pQnpkSEpwYm1jN1hHNGdJRzl3ZEdsdmJuTS9PaUJVWlhOMFQzQjBhVzl1Y3p0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loallYUmxaMjl5ZVRvZ2MzUnlhVzVuTENCdVlXMWxPaUJ6ZEhKcGJtY3NJSFJsYzNRNklDZ3BJRDArSUZCeWIyMXBjMlU4WVc1NVBpd2diM0IwYVc5dWN6ODZJRlJsYzNSUGNIUnBiMjV6S1NCN1hHNGdJQ0FnZEdocGN5NWpZWFJsWjI5eWVTQTlJR05oZEdWbmIzSjVPMXh1SUNBZ0lIUm9hWE11Ym1GdFpTQTlJRzVoYldVN1hHNGdJQ0FnYjNCMGFXOXVjeUEvUHowZ2UzMDdYRzRnSUNBZ2IzQjBhVzl1Y3k1MGFXMWxiM1YwSUQ4L1BTQXpNREF3TUR0Y2JpQWdJQ0J2Y0hScGIyNXpMblZ1YUdGdVpHeGxaRVY0WTJWd2RHbHZibFJwYldWdmRYUWdQejg5SURJd01EQTdYRzRnSUNBZ2RHaHBjeTV2Y0hScGIyNXpJRDBnYjNCMGFXOXVjenRjYmlBZ0lDQjBhR2x6TG5SbGMzUWdQU0JoYzNsdVl5QW9LVG9nVUhKdmJXbHpaVHhoYm5rK0lEMCtJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2hoYzNsdVl5QW9jbVZ6YjJ4MlpTd2djbVZxWldOMEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUd4bGRDQnlaWE4xYkhRZ1BTQW5KenRjYmlBZ0lDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdJQ0JuY205ckxuTm9aV3hzTG14aGMzUkZjbkp2Y2lBOUlDY25PMXh1SUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdGM1lXbDBJSFJsYzNRb0tUdGNiaUFnSUNBZ0lDQWdmU0JqWVhSamFDQW9aVG9nWVc1NUtTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WcVpXTjBLR1VwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2doS0dGM1lXbDBJR0Z6YzJWeWRFNXZSWEp5YjNJb2IzQjBhVzl1Y3lFdWRXNW9ZVzVrYkdWa1JYaGpaWEIwYVc5dVZHbHRaVzkxZENFcEtTbGNiaUFnSUNBZ0lDQWdJQ0J5WldwbFkzUW9ZRlZ1YUdGdVpHeGxaQ0JsZUdObGNIUnBiMjRnWkhWeWFXNW5JSFJsYzNRNklDUjdaM0p2YXk1emFHVnNiQzVzWVhOMFJYSnliM0o5WUNrN1hHNGdJQ0FnSUNBZ0lISmxjMjlzZG1Vb2NtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwN1hHNGdJSDFjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlIUmxjM1FvYm1GdFpUb2djM1J5YVc1bkxDQjBaWE4wT2lBb0tTQTlQaUJRY205dGFYTmxQR0Z1ZVQ0c0lHOXdkR2x2Ym5NL09pQlVaWE4wVDNCMGFXOXVjeWs2SUhadmFXUWdlMXh1SUNCcFppQW9kR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFNBOVBTQjFibVJsWm1sdVpXUXBYRzRnSUNBZ2RHVnpkSE5iWTNWeWNtVnVkRU5oZEdWbmIzSjVYU0E5SUh0OU8xeHVJQ0JwWmlBb2RHVnpkSE5iWTNWeWNtVnVkRU5oZEdWbmIzSjVYUzUwWlhOMGN5QTlQU0IxYm1SbFptbHVaV1FwWEc0Z0lDQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1MFpYTjBjeUE5SUZ0ZE8xeHVJQ0IwWlhOMGMxdGpkWEp5Wlc1MFEyRjBaV2R2Y25sZExuUmxjM1J6SVM1d2RYTm9LRzVsZHlCVVpYTjBLR04xY25KbGJuUkRZWFJsWjI5eWVTd2dibUZ0WlN3Z2RHVnpkQ3dnYjNCMGFXOXVjeWtwTzF4dWZWeHVYRzR2S2lvZ1FYZGhhWFJ6SUdadmNpQmhJSGRvYVd4bElHTm9aV05yYVc1bklIUm9aU0JsY25KdmNpQnpkR0YwZFhNZ2IyWWdkR2hsSUhCc1lYUm1iM0p0SUNvdlhHNWxlSEJ2Y25RZ1lYTjVibU1nWm5WdVkzUnBiMjRnWVhOelpYSjBUbTlGY25KdmNpaHRjem9nYm5WdFltVnlLVG9nVUhKdmJXbHpaVHhpYjI5c1pXRnVQaUI3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2diWE1nTHlBMU1EQTdJQ3NyYVNrZ2UxeHVJQ0FnSUdGM1lXbDBJR1JsYkdGNUtEVXdNQ2s3WEc0Z0lDQWdhV1lnS0dkeWIyc3VjMmhsYkd3dWJHRnpkRVZ5Y205eUxteGxibWQwYUNBaFBUMGdNQ2xjYmlBZ0lDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnZEhKMVpUdGNibjFjYmx4dUx5b3FJRlJsYzNSeklIUjNieUJ2WW1wbFkzUnpJR1p2Y2lCbGNYVmhiR2wwZVN3Z2RHaHliM2R6SUdGdUlHVjRZMlZ3ZEdsdmJpQnBaaUIwYUdWNUlHRnlaU0J1YjNRZ1pYRjFZV3d1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1pYaHdaV04wS0dGamRIVmhiRG9nWVc1NUxDQmxlSEJsWTNSbFpEb2dZVzU1S1RvZ2RtOXBaQ0I3WEc0Z0lHbG1JQ2hoWTNSMVlXd2dJVDA5SUdWNGNHVmpkR1ZrS1Z4dUlDQWdJSFJvY205M0lHQkZlSEJsWTNSbFpDQmNJaVI3Wlhod1pXTjBaV1I5WENJc0lHZHZkQ0JjSWlSN1lXTjBkV0ZzZlZ3aVlEdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdWNGNHVmpkRVpzYjJGMEtHRmpkSFZoYkRvZ2JuVnRZbVZ5TENCbGVIQmxZM1JsWkRvZ2JuVnRZbVZ5TENCMGIyeGxjbUZ1WTJVZ1BTQXdMakF3TVNrNklIWnZhV1FnZTF4dUlDQmpiMjV6ZENCaGNtVkZjWFZoYkNBOUlFMWhkR2d1WVdKektHRmpkSFZoYkNBdElHVjRjR1ZqZEdWa0tTQThJREF1TURBeE8xeHVJQ0JwWmlBb0lXRnlaVVZ4ZFdGc0tWeHVJQ0FnSUhSb2NtOTNJR0JGZUhCbFkzUmxaQ0FrZTJWNGNHVmpkR1ZrZlN3Z1oyOTBJQ1I3WVdOMGRXRnNmU0FvZEc5c1pYSmhibU5sSUQwZ0pIdDBiMnhsY21GdVkyVjlLV0E3WEc1OVhHNWNiaThxS2lCRVpXWnBibVZ6SUdFZ2RHVnpkQ0J6ZFdsMFpTNGdLaTljYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJqWVhSbFoyOXllU2hqWVhSbFoyOXllVG9nYzNSeWFXNW5MQ0IwWlhOMGN6b2dLQ2tnUFQ0Z2RtOXBaQ2s2SUhadmFXUWdlMXh1SUNCamRYSnlaVzUwUTJGMFpXZHZjbmtnUFNCallYUmxaMjl5ZVR0Y2JpQWdkR1Z6ZEhNb0tUdGNibjFjYmx4dUx5b3FJRVJsWm1sdVpYTWdZU0JtZFc1amRHbHZiaUIwYnlCaVpTQmxlR1ZqZFhSbFpDQmlaV1p2Y21VZ2RHaGxJSFJsYzNSeklHbHVJSFJvYVhNZ1kyRjBaV2R2Y25rZ1lYSmxJR1Y0WldOMWRHVmtMaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdKbFptOXlaU2hpWldadmNtVTZJQ2dwSUQwK0lGQnliMjFwYzJVOGRtOXBaRDRwT2lCMmIybGtJSHRjYmlBZ2FXWWdLSFJsYzNSelcyTjFjbkpsYm5SRFlYUmxaMjl5ZVYwZ1BUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFNCN2ZUdGNiaUFnZEdWemRITmJZM1Z5Y21WdWRFTmhkR1ZuYjNKNVhTNWlaV1p2Y21VZ1BTQmlaV1p2Y21VN1hHNTlYRzVjYmk4cUtpQkVaV1pwYm1WeklHRWdablZ1WTNScGIyNGdkRzhnWW1VZ1pYaGxZM1YwWldRZ1lXWjBaWElnZEdobElIUmxjM1J6SUdsdUlIUm9hWE1nWTJGMFpXZHZjbmtnWVhKbElHVjRaV04xZEdWa0xpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR0ZtZEdWeUtHRm1kR1Z5T2lBb0tTQTlQaUJRY205dGFYTmxQSFp2YVdRK0tUb2dkbTlwWkNCN1hHNGdJR2xtSUNoMFpYTjBjMXRqZFhKeVpXNTBRMkYwWldkdmNubGRJRDA5SUhWdVpHVm1hVzVsWkNsY2JpQWdJQ0IwWlhOMGMxdGpkWEp5Wlc1MFEyRjBaV2R2Y25sZElEMGdlMzA3WEc0Z0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjB1WVdaMFpYSWdQU0JoWm5SbGNqdGNibjFjYmx4dVhHNWxlSEJ2Y25RZ1lYTjVibU1nWm5WdVkzUnBiMjRnY25WdVZHVnpkSE1vYjNCMGFXOXVjejg2SUh0allYUmxaMjl5ZVQ4NklITjBjbWx1Wnl3Z2RHVnpkRDg2SUhOMGNtbHVaMzBwSUh0Y2JpQWdiR1YwSUhKbGMzVnNkSE02SUhzZ1kyRjBaV2R2Y25rL09pQnpkSEpwYm1jc0lHNWhiV1UvT2lCemRISnBibWNzSUhOMVkyTmxjM002SUdKdmIyeGxZVzRzSUhKbGMzVnNkRG9nYzNSeWFXNW5mVnRkSUQwZ1cxMDdYRzVjYmlBZ1ptOXlJQ2hqYjI1emRDQmJhMlY1TENCMllXeDFaVjBnYjJZZ1QySnFaV04wTG1WdWRISnBaWE1vZEdWemRITXBLU0I3WEc0Z0lDQWdhV1lnS0c5d2RHbHZibk0vTG1OaGRHVm5iM0o1SUNFOUlIVnVaR1ZtYVc1bFpDa2dlMXh1SUNBZ0lDQWdhV1lnS0NGclpYa3VkRzlNYjNkbGNrTmhjMlVvS1M1emRHRnlkSE5YYVhSb0tHOXdkR2x2Ym5NL0xtTmhkR1ZuYjNKNUxuUnZURzkzWlhKRFlYTmxLQ2twS1Z4dUlDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0I5WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUdsbUlDaDJZV3gxWlM1aVpXWnZjbVVwWEc0Z0lDQWdJQ0FnSUdGM1lXbDBJSFpoYkhWbExtSmxabTl5WlNncE8xeHVJQ0FnSUgwZ1kyRjBZMmdnS0hnNklHRnVlU2tnZTF4dUlDQWdJQ0FnZG1Gc2RXVXVZbVZtYjNKbFUzUmhkSFZ6SUQwZ2VDNTBiMU4wY21sdVp5Z3BPMXh1SUNBZ0lIMWNiaUFnSUNCc1pYUWdkQ0E5SUhaaGJIVmxMblJsYzNSeklEOC9JRnRkTzF4dUlDQWdJR3hsZENCeVpYTWdQU0JiWFR0Y2JpQWdJQ0JtYjNJb2JHVjBJR2tnUFNBd095QnBJRHdnZEM1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdjbVZ6TG5CMWMyZ29ZWGRoYVhRZ1pYaGxZMVJsYzNRb2RGdHBYU3dnYjNCMGFXOXVjejh1ZEdWemRDa3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHeGxkQ0JrWVhSaElEMGdLR0YzWVdsMElGQnliMjFwYzJVdVlXeHNLSEpsY3lrcExtWnBiSFJsY2lnb1pDa2dQVDRnWkM1eVpYTjFiSFFnSVQwZ0ozTnJhWEJ3WldRbktUdGNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdhV1lnS0haaGJIVmxMbUZtZEdWeUtWeHVJQ0FnSUNBZ0lDQmhkMkZwZENCMllXeDFaUzVoWm5SbGNpZ3BPMXh1SUNBZ0lIMGdZMkYwWTJnZ0tIZzZJR0Z1ZVNrZ2UxeHVJQ0FnSUNBZ2RtRnNkV1V1WVdaMFpYSlRkR0YwZFhNZ1BTQjRMblJ2VTNSeWFXNW5LQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lHbG1JQ2gyWVd4MVpTNWhablJsY2xOMFlYUjFjeWxjYmlBZ0lDQWdJR1JoZEdFdWNIVnphQ2g3WTJGMFpXZHZjbms2SUd0bGVTd2dibUZ0WlRvZ0oybHVhWFFuTENCeVpYTjFiSFE2SUhaaGJIVmxMbUZtZEdWeVUzUmhkSFZ6TENCemRXTmpaWE56T2lCbVlXeHpaWDBwTzF4dUlDQWdJR2xtSUNoMllXeDFaUzVpWldadmNtVlRkR0YwZFhNcFhHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2UyTmhkR1ZuYjNKNU9pQnJaWGtzSUc1aGJXVTZJQ2RwYm1sMEp5d2djbVZ6ZFd4ME9pQjJZV3gxWlM1aVpXWnZjbVZUZEdGMGRYTXNJSE4xWTJObGMzTTZJR1poYkhObGZTazdYRzRnSUNBZ2NtVnpkV3gwY3k1d2RYTm9LQzR1TG1SaGRHRXBPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJSEpsYzNWc2RITTdYRzU5WEc1Y2JtRnplVzVqSUdaMWJtTjBhVzl1SUdWNFpXTlVaWE4wS0hRNklGUmxjM1FzSUhCeVpXUnBZMkYwWlRvZ2MzUnlhVzVuSUh3Z2RXNWtaV1pwYm1Wa0tTQjdYRzRnSUd4bGRDQnlPaUI3SUdOaGRHVm5iM0o1UHpvZ2MzUnlhVzVuTENCdVlXMWxQem9nYzNSeWFXNW5MQ0J6ZFdOalpYTnpPaUJpYjI5c1pXRnVMQ0J5WlhOMWJIUTZJSE4wY21sdVp5QjlPMXh1SUNCMGNua2dlMXh1SUNBZ0lHbG1JQ2h3Y21Wa2FXTmhkR1VnSVQwZ2RXNWtaV1pwYm1Wa0lDWW1JQ2doZEM1dVlXMWxMblJ2VEc5M1pYSkRZWE5sS0NrdWMzUmhjblJ6VjJsMGFDaHdjbVZrYVdOaGRHVXVkRzlNYjNkbGNrTmhjMlVvS1NrcEtWeHVJQ0FnSUNBZ2NpQTlJSHR6ZFdOalpYTnpPaUIwY25WbExDQnlaWE4xYkhRNklDZHphMmx3Y0dWa0ozMDdYRzRnSUNBZ1pXeHpaVnh1SUNBZ0lDQWdjaUE5SUh0emRXTmpaWE56T2lCMGNuVmxMQ0J5WlhOMWJIUTZJR0YzWVdsMElIUXVkR1Z6ZENncElEOC9JQ2RQU3lkOU8xeHVJQ0I5SUdOaGRHTm9JQ2g0T2lCaGJua3BJSHRjYmlBZ0lDQnlJRDBnZTNOMVkyTmxjM002SUdaaGJITmxMQ0J5WlhOMWJIUTZJSGd1ZEc5VGRISnBibWNvS1gwN1hHNGdJSDFjYmlBZ2NpNWpZWFJsWjI5eWVTQTlJSFF1WTJGMFpXZHZjbms3WEc0Z0lISXVibUZ0WlNBOUlIUXVibUZ0WlR0Y2JpQWdjbVYwZFhKdUlISTdYRzU5WEc1Y2JtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUJrWld4aGVTaHRjem9nYm5WdFltVnlLU0I3WEc0Z0lHRjNZV2wwSUNCdVpYY2dVSEp2YldselpTaHlJRDArSUhObGRGUnBiV1Z2ZFhRb2Npd2diWE1wS1R0Y2JuMWNiaUpkZlE9PSIsIi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnNSonLCAnQSc6ICc2KicsICdDJzogJzcqJywgJ0cnOiAnOConXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJ1QqJywgJ0EnOiAnQSonLCAnQyc6ICc5KicsICdHJzogJ0cqJ1xuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VHxDfEcpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPiA0ICYmIGNvdW50IDwgMTUpID8gb2JqRm9yQ2VudGVyW3hdIDogb2JqRm9yRWRnZXNbeF07XG4gICAgfSkuc2xpY2UoMCwgKG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoaW52YWJhc2ljKScpIHx8IG51Y2xlb3RpZGVzLmVuZHNXaXRoKCcoR2FsTkFjLTItSk5KKScpKSA/XG4gICAgICAgIG51Y2xlb3RpZGVzLmxlbmd0aCA6IDIgKiBjb3VudCArIDEpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlMgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckVkZ2VzID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdtb2VVbnBzJyxcbiAgICAgICAgJ0EnOiAnbW9lQW5wcycsICdDJzogJ21vZTVtQ25wcycsICdHJzogJ21vZUducHMnXG4gICAgfTtcbiAgICBjb25zdCBvYmpGb3JDZW50ZXIgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdDJzogJzVtQ3BzJywgJ0EnOiAnQXBzJywgJ1QnOiAnVHBzJywgJ0cnOiAnR3BzJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCA1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9iakZvckVkZ2VzW3hdLnNsaWNlKDAsIC0zKSArICdwcycgOiBvYmpGb3JFZGdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50IDwgMTUpXG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ID09IDE0KSA/IG9iakZvckNlbnRlclt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9iakZvckNlbnRlclt4XTtcbiAgICAgICAgcmV0dXJuIG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAtMyk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnKic6ICcnLCAnNSc6ICdUJywgJzYnOiAnQScsICc3JzogJ0MnLCAnOCc6ICdHJywgJzknOiAnQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8XFwqfDV8Nnw3fDh8OSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnNSonOiAnbW9lVW5wcycsICc2Kic6ICdtb2VBbnBzJywgJzcqJzogJ21vZTVtQ25wcycsICc4Kic6ICdtb2VHbnBzJywgJzkqJzogJzVtQ3BzJywgJ0EqJzogJ0FwcycsICdUKic6ICdUcHMnLFxuICAgICAgICAnRyonOiAnR3BzJywgJ0MqJzogJ0NwcycsICc1JzogJ21vZVUnLCAnNic6ICdtb2VBJywgJzcnOiAnbW9lNW1DJywgJzgnOiAnbW9lRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8NVxcKnw2XFwqfDdcXCp8OFxcKnw5XFwqfEFcXCp8VFxcKnxHXFwqfENcXCp8NXw2fDd8OCkvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA0KSA/IG9ialt4XS5zbGljZSgwLCAtMykgKyAncHMnIDogKGNvdW50ID09IDE0KSA/IG9ialt4XS5zbGljZSgwLCAtMikgKyAnbnBzJyA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtb2VUJzogJzUnLCAnbW9lQSc6ICc2JywgJ21vZTVtQyc6ICc3JywgJ21vZUcnOiAnOCcsICdtb2VVJzogJzUnLCAnNW1DJzogJzknLCAnbnBzJzogJyonLCAncHMnOiAnKicsICdVJzogJ1QnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZVR8bW9lQXxtb2U1bUN8bW9lR3xtb2VVfDVtQ3xucHN8cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBETkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbW9lJzogJycsICc1bSc6ICcnLCAnbic6ICcnLCAncHMnOiAnJywgJ1UnOiAnVCcgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bW9lfDVtfG58cHN8VSkvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdVJywgJzInOiAnQScsICczJzogJ0MnLCAnNCc6ICdHJywgJzUnOiAnVScsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICcqJzogJycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVWYnLCAnMic6ICdBZicsICczJzogJ0NmJywgJzQnOiAnR2YnLCAnNSc6ICd1JywgJzYnOiAnYScsICc3JzogJ2MnLCAnOCc6ICdnJywgJyonOiAncycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ2ZVJywgJzInOiAnZkEnLCAnMyc6ICdmQycsICc0JzogJ2ZHJywgJzUnOiAnbVUnLCAnNic6ICdtQScsICc3JzogJ21DJywgJzgnOiAnbUcnLCAnKic6ICdwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8MXwyfDN8NHw1fDZ8N3w4fFxcKikvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdmVScsICdBZic6ICdmQScsICdDZic6ICdmQycsICdHZic6ICdmRycsICd1JzogJ21VJywgJ2EnOiAnbUEnLCAnYyc6ICdtQycsICdnJzogJ21HJywgJ3MnOiAncHMnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ1VmJzogJzEnLCAnQWYnOiAnMicsICdDZic6ICczJywgJ0dmJzogJzQnLCAndSc6ICc1JywgJ2EnOiAnNicsICdjJzogJzcnLCAnZyc6ICc4JywgJ3MnOiAnKicsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICdVJywgJ0FmJzogJ0EnLCAnQ2YnOiAnQycsICdHZic6ICdHJywgJ3UnOiAnVScsICdhJzogJ0EnLCAnYyc6ICdDJywgJ2cnOiAnRycsICdzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8VWZ8QWZ8Q2Z8R2Z8dXxhfGN8Z3xzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnVScsICdmQSc6ICdBJywgJ2ZDJzogJ0MnLCAnZkcnOiAnRycsICdtVSc6ICdVJywgJ21BJzogJ0EnLCAnbUMnOiAnQycsICdtRyc6ICdHJywgJ3BzJzogJycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUdjcnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEJpb1NwcmluZyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnZlUnOiAnMScsICdmQSc6ICcyJywgJ2ZDJzogJzMnLCAnZkcnOiAnNCcsICdtVSc6ICc1JywgJ21BJzogJzYnLCAnbUMnOiAnNycsICdtRyc6ICc4JywgJ3BzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9BeG9sYWJzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hR2Nyc1RvQXhvbGFicyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1VmJywgJ2ZBJzogJ0FmJywgJ2ZDJzogJ0NmJywgJ2ZHJzogJ0dmJywgJ21VJzogJ3UnLCAnbUEnOiAnYScsICdtQyc6ICdjJywgJ21HJzogJ2cnLCAncHMnOiAncycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUd8cHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYqJywgJ1UnOiAnNSonLCAnRyc6ICc4KicsICdDJzogJzcqJyB9O1xuICAgIGNvbnN0IG9iakZvclJpZ2h0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnKjYnLCAnVSc6ICcqNScsICdHJzogJyo4JywgJ0MnOiAnKjcnIH07XG4gICAgY29uc3Qgb2JqRm9yT2RkSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnNicsICdVJzogJzUnLCAnRyc6ICc4JywgJ0MnOiAnNycgfTtcbiAgICBjb25zdCBvYmpGb3JFdmVuSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnMicsICdVJzogJzEnLCAnRyc6ICc0JywgJ0MnOiAnMycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JMZWZ0RWRnZSA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ0EnOiAnbUFwcycsICdVJzogJ21VcHMnLCAnRyc6ICdtR3BzJywgJ0MnOiAnbUNwcycgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ3BzbUEnLCAnVSc6ICdwc21VJywgJ0cnOiAncHNtRycsICdDJzogJ3BzbUMnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2ZBJywgJ1UnOiAnZlUnLCAnRyc6ICdmRycsICdDJzogJ2ZDJyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ21BJywgJ1UnOiAnbVUnLCAnRyc6ICdtRycsICdDJzogJ21DJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPiBudWNsZW90aWRlcy5sZW5ndGggLSAzKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclJpZ2h0RWRnZVt4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCAlIDIgPT0gMCkgPyBvYmpGb3JFdmVuSW5kaWNlc1t4XSA6IG9iakZvck9kZEluZGljZXNbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSA2IHx8IChjb3VudCA+IDcgJiYgY291bnQgPCAxMSkpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU29tZUluZGljZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA9PSBudWNsZW90aWRlcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgcmV0dXJuICdhJztcbiAgICAgICAgcmV0dXJuIG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9BeG9sYWJzQW50aXNlbnNlU3RyYW5kXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvclNtYWxsTGlua2FnZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2FzJywgJ1UnOiAndXMnLCAnRyc6ICdncycsICdDJzogJ2NzJyB9O1xuICAgIGNvbnN0IG9iakZvckJpZ0xpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZnMnLCAnVSc6ICdVZnMnLCAnRyc6ICdHZnMnLCAnQyc6ICdDZnMnIH07XG4gICAgY29uc3Qgb2JqRm9yU29tZUluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ0FmJywgJ1UnOiAnVWYnLCAnRyc6ICdHZicsICdDJzogJ0NmJyB9O1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnYScsICdVJzogJ3UnLCAnRyc6ICdnJywgJ0MnOiAnYycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50ID4gMTkgJiYgY291bnQgPCAyMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JTbWFsbExpbmthZ2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiAndXMnO1xuICAgICAgICBpZiAoY291bnQgPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JCaWdMaW5rYWdlc1t4XTtcbiAgICAgICAgcmV0dXJuIChjb3VudCA9PSA1IHx8IGNvdW50ID09IDcgfHwgY291bnQgPT0gOCB8fCBjb3VudCA9PSAxMyB8fCBjb3VudCA9PSAxNSkgPyBvYmpGb3JTb21lSW5kaWNlc1t4XSA6IG9ialt4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gZ2Nyc1RvTnVjbGVvdGlkZXMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ0EnLCAnbVVwcyc6ICdVJywgJ21HcHMnOiAnRycsICdtQ3BzJzogJ0MnLCAnZkFwcyc6ICdBJywgJ2ZVcHMnOiAnVScsICdmR3BzJzogJ0cnLCAnZkNwcyc6ICdDJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogZ2Nyc1RvTWVybWFkZTEyXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogTWVybWFkZSAxMiAvIHNpUk5BfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb01lcm1hZGUxMihudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21BcHMnOiAnZScsICdtVXBzJzogJ2gnLCAnbUdwcyc6ICdnJywgJ21DcHMnOiAnZicsICdmQXBzJzogJ2knLCAnZlVwcyc6ICdsJywgJ2ZHcHMnOiAnaycsICdmQ3BzJzogJ2onLCAnZlUnOiAnTCcsXG4gICAgICAgICdmQSc6ICdJJywgJ2ZDJzogJ0onLCAnZkcnOiAnSycsICdtVSc6ICdIJywgJ21BJzogJ0UnLCAnbUMnOiAnRicsICdtRyc6ICdHJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtQXBzfG1VcHN8bUdwc3xtQ3BzfGZBcHN8ZlVwc3xmR3BzfGZDcHN8ZlV8ZkF8ZkN8Zkd8bVV8bUF8bUN8bUcpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuIiwiaW1wb3J0IHsgbWFwLCBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcywgU1lOVEhFU0laRVJTLCBURUNITk9MT0dJRVMsIE1PRElGSUNBVElPTlMgfSBmcm9tICcuL21hcCc7XG5pbXBvcnQgeyBpc1ZhbGlkU2VxdWVuY2UgfSBmcm9tICcuL3NlcXVlbmNlLWNvZGVzLXRvb2xzJztcbmltcG9ydCB7IGdldE51Y2xlb3RpZGVzTW9sIH0gZnJvbSAnLi9tb2wtdHJhbnNmb3JtYXRpb25zJztcbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRvTW9sVjMwMDAoc2VxdWVuY2UsIGludmVydGVkID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHNtaWxlc0NvZGVzID0gW107XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0IDogTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQpO1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb1NtaWxlcyhzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpO1xuICAgIGxldCBjb2RlcyA9IHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKE9iamVjdC5rZXlzKG9iaikpO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgc21pbGVzID0gJyc7XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXMgKz0gKGkgPj0gY29kZXNMaXN0Lmxlbmd0aCAvIDIpID9cbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ucmlnaHQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyA6XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQgKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICAoaSA8IGNvZGVzTGlzdC5sZW5ndGggLSAxICYmIGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpICsgMV0pKSlcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc21pbGVzICs9IG9ialtjb2Rlc0xpc3RbaV1dICsgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc21pbGVzID0gc21pbGVzLnJlcGxhY2UoL09PL2csICdPJyk7XG4gICAgcmV0dXJuICgobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgJiZcbiAgICAgICAgY29kZXNMaXN0Lmxlbmd0aCA+IDEgJiZcbiAgICAgICAgIWluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDJdKSkgfHxcbiAgICAgICAgZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pIHx8XG4gICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSkgP1xuICAgICAgICBzbWlsZXMgOlxuICAgICAgICBzbWlsZXMuc2xpY2UoMCwgc21pbGVzLmxlbmd0aCAtIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzLmxlbmd0aCArIDEpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0V2l0aENvZGVzQW5kU21pbGVzKHNlcXVlbmNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBpZiAoZm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgZm9yIChjb25zdCBzeW50aGVzaXplciBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtzeW50aGVzaXplcl1bdGVjaG5vbG9neV1bY29kZV0uU01JTEVTO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHRlY2hub2xvZ3kgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW2Zvcm1hdF1bdGVjaG5vbG9neV0pKVxuICAgICAgICAgICAgICAgIG9ialtjb2RlXSA9IG1hcFtmb3JtYXRdW3RlY2hub2xvZ3ldW2NvZGVdLlNNSUxFUztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPOiBjcmVhdGUgb2JqZWN0IGJhc2VkIGZyb20gc3ludGhlc2l6ZXIgdHlwZSB0byBhdm9pZCBrZXkoY29kZXMpIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBvdXRwdXQgPSBpc1ZhbGlkU2VxdWVuY2Uoc2VxdWVuY2UsIGZvcm1hdCk7XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuTUVSTUFERV8xMikpXG4gICAgICAgIG9ialsnZyddID0gbWFwW1NZTlRIRVNJWkVSUy5NRVJNQURFXzEyXVtURUNITk9MT0dJRVMuU0lfUk5BXVsnZyddLlNNSUxFUztcbiAgICBlbHNlIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNZTlRIRVNJWkVSUyA9IHtcbiAgICBSQVdfTlVDTEVPVElERVM6ICdSYXcgTnVjbGVvdGlkZXMnLFxuICAgIEJJT1NQUklORzogJ0Jpb1NwcmluZyBDb2RlcycsXG4gICAgR0NSUzogJ0phbnNzZW4gR0NSUyBDb2RlcycsXG4gICAgQVhPTEFCUzogJ0F4b2xhYnMgQ29kZXMnLFxuICAgIE1FUk1BREVfMTI6ICdNZXJtYWRlIDEyJyxcbn07XG5leHBvcnQgY29uc3QgVEVDSE5PTE9HSUVTID0ge1xuICAgIEROQTogJ0ROQScsXG4gICAgUk5BOiAnUk5BJyxcbiAgICBBU09fR0FQTUVSUzogJ0ZvciBBU08gR2FwbWVycycsXG4gICAgU0lfUk5BOiAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnLFxufTtcbmV4cG9ydCBjb25zdCBDT0xfTkFNRVMgPSB7XG4gICAgQ0hFTUlTVFJZOiAnQ2hlbWlzdHJ5JyxcbiAgICBOVU1CRVI6ICdOdW1iZXInLFxuICAgIFRZUEU6ICdUeXBlJyxcbiAgICBDSEVNSVNUUllfTkFNRTogJ0NoZW1pc3RyeSBOYW1lJyxcbiAgICBJTlRFUk5BTF9DT01QT1VORF9JRDogJ0ludGVybmFsIGNvbXBvdW5kIElEJyxcbiAgICBJRFA6ICdJRFAnLFxuICAgIFNFUVVFTkNFOiAnU2VxdWVuY2UnLFxuICAgIENPTVBPVU5EX05BTUU6ICdDb21wb3VuZCBOYW1lJyxcbiAgICBDT01QT1VORF9DT01NRU5UUzogJ0NvbXBvdW5kIENvbW1lbnRzJyxcbiAgICBTQUxUOiAnU2FsdCcsXG4gICAgRVFVSVZBTEVOVFM6ICdFcXVpdmFsZW50cycsXG4gICAgUFVSSVRZOiAnUHVyaXR5JyxcbiAgICBDUERfTVc6ICdDcGQgTVcnLFxuICAgIFNBTFRfTUFTUzogJ1NhbHQgbWFzcycsXG4gICAgQkFUQ0hfTVc6ICdCYXRjaCBNVycsXG4gICAgU09VUkNFOiAnU291cmNlJyxcbiAgICBJQ0Q6ICdJQ0QnLFxuICAgIE9XTkVSOiAnT3duZXInLFxufTtcbi8vIGludGVyZmFjZSBDT0RFUyB7XG4vLyB9XG5leHBvcnQgY29uc3QgTU9ESUZJQ0FUSU9OUyA9IHtcbiAgICAnKGludmFiYXNpYyknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTE4LjEzLFxuICAgICAgICBsZWZ0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgIH0sXG4gICAgJyhHYWxOQWMtMi1KTkopJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDEyNzMuMyxcbiAgICAgICAgbGVmdDogJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3Qgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgPSAnT1AoPU8pKE8pTyc7XG5leHBvcnQgY29uc3QgbWFwID0ge1xuICAgICdSYXcgTnVjbGVvdGlkZXMnOiB7XG4gICAgICAgICdETkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdSTkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQmlvU3ByaW5nIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzknOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICcxJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcyJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQXhvbGFicyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ1VmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdjJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0phbnNzZW4gR0NSUyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICdtb2VUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2U1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKW1vZUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3BzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDUuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ1LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnclUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdmVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21HJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIiwiaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuY29uc3QgUEhPU0hBVEUgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA1IDQgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0xLjUgMCAwIDBcbk0gIFYzMCAyIFAgMCAwIDAgMFxuTSAgVjMwIDMgTyAwIDEgMCAwXG5NICBWMzAgNCBPIDAgLTEgMCAwXG5NICBWMzAgNSBPIDEuNSAwIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAxIDJcbk0gIFYzMCAyIDIgMiAzXG5NICBWMzAgMyAxIDIgNFxuTSAgVjMwIDQgMSAyIDVcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEVORCBDVEFCXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBFTkRgO1xuY29uc3QgVEhJT1BIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgUyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IElOVkFCQVNJQyA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDggOCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMS4wOTM0IC0yLjE2MzYgMCAwXG5NICBWMzAgMiBDIDEuODM2NSAtMS40OTQ1IDAgMCBDRkc9MlxuTSAgVjMwIDMgQyAyLjgxNDcgLTEuNzAyNCAwIDBcbk0gIFYzMCA0IEMgMy4zMTQ3IC0wLjgzNjQgMCAwIFZBTD0zXG5NICBWMzAgNSBPIDIuNjQ1NSAtMC4wOTMyIDAgMFxuTSAgVjMwIDYgQyAxLjczMiAtMC41IDAgMCBDRkc9MVxuTSAgVjMwIDcgQyAwLjg2NiAwIDAgMFxuTSAgVjMwIDggTyAwLjg2NiAxIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAyIDEgQ0ZHPTFcbk0gIFYzMCAyIDEgMiAzXG5NICBWMzAgMyAxIDMgNFxuTSAgVjMwIDQgMSA0IDVcbk0gIFYzMCA1IDEgNiA1XG5NICBWMzAgNiAxIDIgNlxuTSAgVjMwIDcgMSA2IDcgQ0ZHPTNcbk0gIFYzMCA4IDEgNyA4XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oMiAyIDYpXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ1RBQlxuTSAgRU5EYDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROdWNsZW90aWRlc01vbChzbWlsZXNDb2Rlcywgb2NsUmVuZGVyID0gZmFsc2UpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2NrcywgZmFsc2UsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gbGlua1YzMDAwKG1vbEJsb2NrcywgdHdvQ2hhaW5zID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCB4U2hpZnQgPSAwO1xuICAgIGlmICh0d29DaGFpbnMgJiYgbW9sQmxvY2tzLmxlbmd0aCA+IDEpXG4gICAgICAgIG1vbEJsb2Nrc1sxXSA9IGludmVydE51Y2xlb3RpZGVzVjMwMDAobW9sQmxvY2tzWzFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbEJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0ucmVwbGFjZUFsbCgnKC1cXG5NICBWMzAgJywgJygnKVxuICAgICAgICAgICAgLnJlcGxhY2VBbGwoJy1cXG5NICBWMzAgJywgJycpLnJlcGxhY2VBbGwoJyApJywgJyknKTtcbiAgICAgICAgY29uc3QgbnVtYmVycyA9IGV4dHJhY3RBdG9tc0JvbmRzTnVtYmVyc1YzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZXh0cmFjdEF0b21EYXRhVjMwMDAobW9sQmxvY2tzW2ldKTtcbiAgICAgICAgaWYgKHR3b0NoYWlucykge1xuICAgICAgICAgICAgY29uc3QgeFNoaWZ0UmlnaHQgPSBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KTtcbiAgICAgICAgICAgIGNvbnN0IHlTaGlmdCA9IGkgPT0gMCA/IE1hdGgubWluKC4uLmNvb3JkaW5hdGVzLnkpIC0gMSA6IE1hdGgubWF4KC4uLmNvb3JkaW5hdGVzLnkpICsgMTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29vcmRpbmF0ZXMueC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlcy54W2pdIC09IHhTaGlmdFJpZ2h0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlcy55Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnlbal0gLT0geVNoaWZ0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgICAgICBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4QXRvbXMpO1xuICAgICAgICBsZXQgaW5kZXggPSBpbmRleEF0b21zO1xuICAgICAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmF0b207IGorKykge1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmF0b21JbmRleFtqXSAhPSAxIHx8IGkgPT0gMCB8fCB0d29DaGFpbnMpIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0gdHdvQ2hhaW5zID8gMCA6IHhTaGlmdCAtIGNvb3JkaW5hdGVzLnhbMF07XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGUgPSB0d29DaGFpbnMgP1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKDEwMDAwICogY29vcmRpbmF0ZXMueFtqXSkgLyAxMDAwMCA6XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9IHR3b0NoYWlucyA/XG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoMTAwMDAgKiBjb29yZGluYXRlcy55W2pdKSAvIDEwMDAwIDpcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgxMDAwMCAqIChwYXJzZUZsb2F0KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkpKSAvIDEwMDAwO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBjb29yZGluYXRlICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwJywgaW5kZXgpIC0gMTtcbiAgICAgICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4QXRvbXNFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBBVE9NJyk7XG4gICAgICAgIGF0b21CbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4QXRvbXMgKyAxLCBpbmRleEF0b21zRW5kKTtcbiAgICAgICAgbGV0IGluZGV4Qm9uZHMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEJFR0lOIEJPTkQnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGJvbmRzXG4gICAgICAgIGluZGV4Qm9uZHMgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXhCb25kcyk7XG4gICAgICAgIGluZGV4ID0gaW5kZXhCb25kcztcbiAgICAgICAgaW5kZXhFbmQgPSBpbmRleEJvbmRzO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmJvbmQ7IGorKykge1xuICAgICAgICAgICAgLy9yZXdyaXRlIGJvbmQgbnVtYmVyXG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGJvbmROdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmJvbmQ7XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYm9uZE51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBwYWlyIGluIGJvbmRcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgbGV0IGF0b21OdW1iZXIgPSBwYXJzZUludChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgbmF0b207XG4gICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gTWF0aC5taW4obW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSwgbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkpO1xuICAgICAgICAgICAgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhCb25kRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBFTkQgQk9ORCcpO1xuICAgICAgICBib25kQmxvY2sgKz0gbW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleEJvbmRzICsgMSwgaW5kZXhCb25kRW5kKTtcbiAgICAgICAgbGV0IGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyk7IC8vIFYzMDAwIGluZGV4IGZvciBjb2xsZWN0aW9uc1xuICAgICAgICB3aGlsZSAoaW5kZXhDb2xsZWN0aW9uICE9IC0xKSB7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gKz0gMjg7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyknLCBpbmRleENvbGxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Q29sbGVjdGlvbiwgY29sbGVjdGlvbkVuZCkuc3BsaXQoJyAnKS5zbGljZSgxKTtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25FbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2gocGFyc2VJbnQoZSkgKyBuYXRvbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IGNvbGxlY3Rpb25FbmQ7XG4gICAgICAgICAgICBpbmRleENvbGxlY3Rpb24gPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgbmF0b20gKz0gdHdvQ2hhaW5zID8gbnVtYmVycy5uYXRvbSA6IG51bWJlcnMubmF0b20gLSAxO1xuICAgICAgICBuYm9uZCArPSBudW1iZXJzLm5ib25kO1xuICAgICAgICB4U2hpZnQgKz0gdHdvQ2hhaW5zID8gMCA6IGNvb3JkaW5hdGVzLnhbbnVtYmVycy5uYXRvbSAtIDFdIC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IDQ7XG4gICAgY29uc3QgY29sbE51bWJlciA9IE1hdGguY2VpbChjb2xsZWN0aW9uLmxlbmd0aCAvIGVudHJpZXMpO1xuICAgIGlmIChvY2xSZW5kZXIpIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJyAnICsgY29sbGVjdGlvbltqXTtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICcpXFxuJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCAnO1xuICAgICAgICAgICAgY29uc3QgZW50cmllc0N1cnJlbnQgPSBpICsgMSA9PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpICogZW50cmllcyA6IGVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVudHJpZXNDdXJyZW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gKGogKyAxID09IGVudHJpZXNDdXJyZW50KSA/XG4gICAgICAgICAgICAgICAgICAgIChpID09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJylcXG4nIDogY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAtXFxuJykgOlxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9nZW5lcmF0ZSBmaWxlXG4gICAgdHdvQ2hhaW5zID8gbmF0b20gOiBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDT0xMRUNUSU9OXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORFxcbic7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZigxKTtcbiAgICBjb25zdCBpbmRleFRocmVlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZihuYXRvbSk7XG4gICAgLy9maXggNSBwcmltZSBpZiBpbmFkZXF1YXRlXG4gICAgaWYgKG5hdG9tID4gOClcbiAgICAgICAgZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKTtcbiAgICBjb25zdCB4Q2VudGVyID0gKGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSAvIDIgOiAzICogTWF0aC5QSSAvIDI7XG4gICAgZWxzZSBpZiAoY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgOiAwO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXJpdmF0aXZlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICAgICAgYW5nbGUgPSBkZXJpdmF0aXZlID4gMCA/IE1hdGguUEkgLSBNYXRoLmF0YW4oZGVyaXZhdGl2ZSkgOiBNYXRoLmF0YW4oZGVyaXZhdGl2ZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhBZGQgPSBjb29yZGluYXRlcy54W2ldO1xuICAgICAgICBjb29yZGluYXRlcy54W2ldID0geEFkZCAqIGNvcyAtIGNvb3JkaW5hdGVzLnlbaV0gKiBzaW47XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gPSB4QWRkICogc2luICsgY29vcmRpbmF0ZXMueVtpXSAqIGNvcztcbiAgICB9XG4gICAgLy9wbGFjZSB0byByaWdodFxuICAgIGNvbnN0IHhTaGlmdCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKylcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4U2hpZnQ7XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gaW52ZXJ0TnVjbGVvdGlkZXNWMzAwMChtb2xlY3VsZSkge1xuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEk7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIGJhY2tcbiAgICBjb25zdCB5U2hpZnQgPSBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlTaGlmdDtcbiAgICB9XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKSB7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWVOZWlnaGJvdXIgPSBpbmRleEZpdmVQcmltZSArIDE7XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgeVNoaWZ0ID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgYmFzZTNQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gLSB4U2hpZnQ7XG4gICAgY29uc3QgYmFzZTNQcmltZVkgPSBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3QgYmFzZTVQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC0geVNoaWZ0O1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVYID0gYmFzZTVQcmltZVggKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpIC0gYmFzZTVQcmltZVkgKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVZID0gYmFzZTVQcmltZVggKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpICsgYmFzZTVQcmltZVkgKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IGR4ID0gYmFzZTVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeSA9IGJhc2U1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgY29uc3QgZHhSb3RhdGVkID0gcm90YXRlZDVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeVJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWSAtIGJhc2UzUHJpbWVZO1xuICAgIGlmIChNYXRoLnNxcnQoZHlSb3RhdGVkICogZHlSb3RhdGVkICsgZHhSb3RhdGVkICogZHhSb3RhdGVkKSA+PSBNYXRoLnNxcnQoZHkgKiBkeSArIGR4ICogZHgpKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVggKyB4U2hpZnQ7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVkgKyB5U2hpZnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2spIHtcbiAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3OyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgYW5kIGJvbmRzIG51bWJlclxuICAgIGxldCBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYXRvbXNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgIGNvbnN0IGJvbmRzTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgIHJldHVybiB7IG5hdG9tOiBhdG9tc051bWJlciwgbmJvbmQ6IGJvbmRzTnVtYmVyIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jaykge1xuICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jayk7XG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgY29uc3QgaW5kZXhlcyA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHR5cGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeCA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHkgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgaW5kZXhlc1tpXSA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgdHlwZXNbaV0gPSBtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgeFtpXSA9IHBhcnNlRmxvYXQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB5W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXRvbUluZGV4OiBpbmRleGVzLCBhdG9tVHlwZTogdHlwZXMsIHg6IHgsIHk6IHkgfTtcbn1cbiIsIi8vIGltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuLy8gaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbi8vIGltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBtYXAsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcsIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMsIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZywgZ2Nyc1RvTWVybWFkZTEyLCBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZCwgc2lSbmFOdWNsZW90aWRlc1RvR2Nycywgc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicywgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMsIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nLCBzaVJuYUF4b2xhYnNUb0djcnMsIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMsIHNpUm5hR2Nyc1RvQmlvU3ByaW5nLCBzaVJuYUdjcnNUb0F4b2xhYnMsIGdjcnNUb051Y2xlb3RpZGVzIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmNvbnN0IG5vVHJhbnNsYXRpb25UYWJsZUF2YWlsYWJsZSA9ICdObyB0cmFuc2xhdGlvbiB0YWJsZSBhdmFpbGFibGUnO1xuZXhwb3J0IGNvbnN0IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgPSAnVHlwZSBvZiBpbnB1dCBzZXF1ZW5jZSBpcyB1bmRlZmluZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdChzZXF1ZW5jZSkge1xuICAgIGNvbnN0IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpO1xuICAgIGlmIChwb3NzaWJsZVN5bnRoZXNpemVycy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG91dHB1dEluZGV4ID0gMDtcbiAgICBjb25zdCBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMgPSBbJ3InLCAnZCddO1xuICAgIGNvbnN0IG51Y2xlb3RpZGVzID0gWydBJywgJ1UnLCAnVCcsICdDJywgJ0cnXTtcbiAgICBwb3NzaWJsZVN5bnRoZXNpemVycy5mb3JFYWNoKChzeW50aGVzaXplcikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcik7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgPSAob3V0cHV0SW5kZXggPT0gc2VxdWVuY2UubGVuZ3RoKSA/IC0xIDogb3V0cHV0SW5kZXg7XG4gICAgaWYgKGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciAhPSAtMSlcbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdO1xuICAgIGNvbnN0IHBvc3NpYmxlVGVjaG5vbG9naWVzID0gZ2V0TGlzdE9mUG9zc2libGVUZWNobm9sb2dpZXNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UsIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdKTtcbiAgICBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcG9zc2libGVTeW50aGVzaXplcnNbMF07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBwb3NzaWJsZVN5bnRoZXNpemVycyA9IGZvcm1hdCA9PSBudWxsID9cbiAgICAgICAgZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIDpcbiAgICAgICAgW2Zvcm1hdF07XG4gICAgLy8gaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyAgIGNvbnN0IHN5bnRoZXNpemVyID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSBzeW50aGVzaXplciBmcm9tIGxpc3Q6ICcsIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdLFxuICAgIC8vICBwb3NzaWJsZVN5bnRoZXNpemVycyk7XG4gICAgLy8gICB1aS5kaWFsb2coJ0Nob29zZSBTeW50aGVzaXplcicpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3N5bnRoZXNpemVyLnJvb3RdLCB7c3R5bGU6IHtmb250V2VpZ2h0OiAnYm9sZCd9fSkpXG4gICAgLy8gICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3N5bnRoZXNpemVyLnZhbHVlXSlcbiAgICAvLyAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAvLyAgICAgICBwb3NzaWJsZVN5bnRoZXNpemVycyA9IFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV07XG4gICAgLy8gICAgICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdJbnB1dCBzZXF1ZW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbiBmb3JtYXQgJyArIHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdKTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgICAgLnNob3coKTtcbiAgICAvLyB9IGVsc2UgaWYgKHBvc3NpYmxlU3ludGhlc2l6ZXJzLmxlbmd0aCA9PSAwKVxuICAgIGlmIChwb3NzaWJsZVN5bnRoZXNpemVycy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIGxldCBvdXRwdXRJbmRleCA9IDA7XG4gICAgY29uc3QgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzID0gWydyJywgJ2QnXTtcbiAgICBjb25zdCBudWNsZW90aWRlcyA9IFsnQScsICdVJywgJ1QnLCAnQycsICdHJ107XG4gICAgcG9zc2libGVTeW50aGVzaXplcnMuZm9yRWFjaCgoc3ludGhlc2l6ZXIpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBnZXRBbGxDb2Rlc09mU3ludGhlc2l6ZXIoc3ludGhlc2l6ZXIpO1xuICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgoYykgPT4gYyA9PSBzZXF1ZW5jZS5zbGljZShvdXRwdXRJbmRleCwgb3V0cHV0SW5kZXggKyBjLmxlbmd0aCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDb2RlID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAgICAgICAgIG91dHB1dEluZGV4ID4gMSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggLSAyXSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ0FyQSdcbiAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyID0gKG91dHB1dEluZGV4ID09IHNlcXVlbmNlLmxlbmd0aCkgPyAtMSA6IG91dHB1dEluZGV4O1xuICAgIGlmIChpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIgIT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyLFxuICAgICAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzLFxuICAgICAgICAgICAgdGVjaG5vbG9neTogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcG9zc2libGVUZWNobm9sb2dpZXMgPSBnZXRMaXN0T2ZQb3NzaWJsZVRlY2hub2xvZ2llc0J5Rmlyc3RNYXRjaGVkQ29kZShzZXF1ZW5jZSwgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgIC8vIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPiAxKSB7XG4gICAgLy8gICBjb25zdCB0ZWNobm9sb2d5ID0gdWkuY2hvaWNlSW5wdXQoJ0Nob29zZSB0ZWNobm9sb2d5IGZyb20gbGlzdDogJywgcG9zc2libGVUZWNobm9sb2dpZXNbMF0sXG4gICAgLy8gcG9zc2libGVUZWNobm9sb2dpZXMpO1xuICAgIC8vICAgdWkuZGlhbG9nKCdDaG9vc2UgVGVjaG5vbG9neScpXG4gICAgLy8gICAgIC5hZGQodWkucGFuZWwoW3RlY2hub2xvZ3kucm9vdF0sIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJ319KSlcbiAgICAvLyAgICAgLm9uT0soKCkgPT4gcG9zc2libGVUZWNobm9sb2dpZXMgPSBbdGVjaG5vbG9neS52YWx1ZV0pXG4gICAgLy8gICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgLy8gICAgICAgcG9zc2libGVUZWNobm9sb2dpZXMgPSBbcG9zc2libGVUZWNobm9sb2dpZXNbMF1dO1xuICAgIC8vICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5zaG93KCk7XG4gICAgLy8gfSBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICBpZiAocG9zc2libGVUZWNobm9sb2dpZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiB7IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IG51bGwsIHRlY2hub2xvZ3k6IG51bGwgfTtcbiAgICBvdXRwdXRJbmRleCA9IDA7XG4gICAgcG9zc2libGVUZWNobm9sb2dpZXMuZm9yRWFjaCgodGVjaG5vbG9neSkgPT4ge1xuICAgICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC5rZXlzKG1hcFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV1bdGVjaG5vbG9neV0pO1xuICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRDb2RlID0gY29kZXMuZmluZCgoYykgPT4gYyA9PSBzZXF1ZW5jZS5zbGljZShvdXRwdXRJbmRleCwgb3V0cHV0SW5kZXggKyBjLmxlbmd0aCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRDb2RlID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ3JBQSdcbiAgICAgICAgICAgIG91dHB1dEluZGV4ID4gMSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkgJiZcbiAgICAgICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggLSAyXSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoIC8vIGZvciBtaXN0YWtlIHBhdHRlcm4gJ0FyQSdcbiAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCArIDFdKSAmJlxuICAgICAgICAgICAgICAgIG51Y2xlb3RpZGVzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gbWF0Y2hlZENvZGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXIsXG4gICAgICAgIHN5bnRoZXNpemVyOiBwb3NzaWJsZVN5bnRoZXNpemVycyxcbiAgICAgICAgdGVjaG5vbG9neTogW3Bvc3NpYmxlVGVjaG5vbG9naWVzW291dHB1dEluZGV4XV0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikge1xuICAgIGxldCBjb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSlcbiAgICAgICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpO1xuICAgIHJldHVybiBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpKSB7IC8vJiYgb3V0cHV0LnRlY2hub2xvZ3khLmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5ETkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5HQ1JTKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyArICcgJyArIFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMpICYmIG91dHB1dC50ZWNobm9sb2d5LmluY2x1ZGVzKFRFQ0hOT0xPR0lFUy5STkEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICsgJyAnICsgVEVDSE5PTE9HSUVTLlJOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuQklPU1BSSU5HKSAmJiBvdXRwdXQudGVjaG5vbG9neS5pbmNsdWRlcyhURUNITk9MT0dJRVMuU0lfUk5BKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkJJT1NQUklORyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUJpb1NwcmluZ1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIuaW5jbHVkZXMoU1lOVEhFU0laRVJTLkFYT0xBQlMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuQVhPTEFCUyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFBeG9sYWJzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBCaW9TcHJpbmc6IHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgR0NSUzogc2lSbmFBeG9sYWJzVG9HY3JzKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykgJiYgb3V0cHV0LnRlY2hub2xvZ3kuaW5jbHVkZXMoVEVDSE5PTE9HSUVTLlNJX1JOQSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTICsgJyAnICsgVEVDSE5PTE9HSUVTLlNJX1JOQSxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBzaVJuYUdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2lSbmFHY3JzVG9CaW9TcHJpbmcoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQXhvbGFiczogc2lSbmFHY3JzVG9BeG9sYWJzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIE1NMTI6IGdjcnNUb01lcm1hZGUxMihzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplci5pbmNsdWRlcyhTWU5USEVTSVpFUlMuR0NSUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5HQ1JTLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IGdjcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBnY3JzVG9NZXJtYWRlMTIoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyLmluY2x1ZGVzKFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgY2F0ZWdvcnksIGV4cGVjdCwgdGVzdCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3Rlc3QnO1xuaW1wb3J0IHsgc2VxdWVuY2VUb1NtaWxlcyB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5pbXBvcnQgeyBTWU5USEVTSVpFUlMgfSBmcm9tICcuLi9zdHJ1Y3R1cmVzLXdvcmtzL21hcCc7XG5jYXRlZ29yeSgnc2VxdWVuY2UtdHJhbnNsYXRvcicsICgpID0+IHtcbiAgICB0ZXN0KCdBR0dUQ0NUQ1RUR0FDVFRBR0dDQycsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdBR0dUQ0NUQ1RUR0FDVFRBR0dDQycsIGZhbHNlLCBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCdpbnZhYmFzaWMvZ2FsbmFjMScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2dnKGludmFiYXNpYykoR2FsTkFjLTItSk5KKScsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnaW52YWJhc2ljL2dhbG5hYzInLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNnc2coaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCdpbnZhYmFzaWMvZ2FsbmFjMycsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2dncyhpbnZhYmFzaWMpKEdhbE5BYy0yLUpOSiknLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ2ludmFiYXNpYy9nYWxuYWM0JywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzZ2coaW52YWJhc2ljKXMoR2FsTkFjLTItSk5KKScsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgndXNDZkNmVWZHZkFmJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJ3VzQ2ZDZlVmR2ZBZicsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgndXNBZnN1c2dzZ3NnJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCd1c0Fmc3VzZ3Nnc2cnLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ1VmVWZVZnNDZnN1YWNnJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnVWZVZlVmc0Nmc3VhY2cnLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ3N1c3VzdXNhdWFzdScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPUCg9TykoUylPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnc3VzdXN1c2F1YXN1JywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCdDZkdmQ2ZzR2ZzQ2YnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJ0NmR2ZDZnNHZnNDZicsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnYWNhY2Fjc2Fjc2FjJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdhY2FjYWNzYWNzYWMnLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ2NjY2dnZ3VzdWcnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdjY2NnZ2d1c3VnJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCdVZkFmQ2ZHZkdmQ2ZBZlVmJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdVZkFmQ2ZHZkdmQ2ZBZlVmJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXN1Y3VDZnVVZicsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc3VjdUNmdVVmJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXNBZmdjdWdVZicsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc0FmZ2N1Z1VmJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKWN1Q2Z1VWZzYycsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpY3VDZnVVZnNjJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXNjdXN1c3UoR2FsTkFjLTItSk5KKScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzY3VzdXN1KEdhbE5BYy0yLUpOSiknLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpdXNBZnN1Y3VDZnVVZkFmZ2N1Z1VmZ0NmYWN1c3VzdScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYyl1c0Fmc3VjdUNmdVVmQWZnY3VnVWZnQ2ZhY3VzdXN1JywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKWFzYWNnR2Z1R2ZDZkFmYWN1Y3VhdXVjYScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpYXNhY2dHZnVHZkNmQWZhY3VjdWF1dWNhJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXNjc2dndUdmY0FmQWZDZnVjdWF1dWN1Z2EnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNjc2dndUdmY0FmQWZDZnVjdWF1dWN1Z2EnLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2NzYWFjVWZjVWZBZlVmdWN1Z2dhY3V1YScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2NzYWFjVWZjVWZBZlVmdWN1Z2dhY3V1YScsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylzYXNhY3VDZnVBZlVmVWZjdWdnYWN1dXVhJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzYXNhY3VDZnVBZlVmVWZjdWdnYWN1dXVhJywgZmFsc2UsIFNZTlRIRVNJWkVSUy5BWE9MQUJTKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXVzQWZzY3VnKGludmFiYXNpYykoR2FsTkFjLTItSk5KKScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYyl1c0Fmc2N1ZyhpbnZhYmFzaWMpKEdhbE5BYy0yLUpOSiknLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWYoR2FsTkFjLTItSk5KKScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWYoR2FsTkFjLTItSk5KKScsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylzYXN1YWFDZmNVZkNmVWZ1Z3VhZ3V1YXVhKEdhbE5BYy0yLUpOSiknLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzYXN1YWFDZmNVZkNmVWZ1Z3VhZ3V1YXVhKEdhbE5BYy0yLUpOSiknLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2NzYXVjYWNndVVmR2ZDZmFnY2NndWN1dWEoaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNjc2F1Y2FjZ3VVZkdmQ2ZhZ2NjZ3VjdXVhKGludmFiYXNpYykoR2FsTkFjLTItSk5KKScsIGZhbHNlLCBTWU5USEVTSVpFUlMuQVhPTEFCUyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylzdXNndXVVZmdDZkNmVWZhY2F1Y3VhY3VhKEdhbE5BYy0yLUpOSiknLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzdXNndXVVZmdDZkNmVWZhY2F1Y3VhY3VhKEdhbE5BYy0yLUpOSiknLCBmYWxzZSwgU1lOVEhFU0laRVJTLkFYT0xBQlMpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IERHOyIsIm1vZHVsZS5leHBvcnRzID0gT0NMOyIsIm1vZHVsZS5leHBvcnRzID0gZ3JvazsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgcnVuVGVzdHMsIHRlc3RzIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdCc7XG5pbXBvcnQgJy4vdGVzdHMvc21pbGVzLXRlc3RzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5leHBvcnQgeyB0ZXN0cyB9O1xuLy9uYW1lOiB0ZXN0XG4vL291dHB1dDogZGF0YWZyYW1lIHJlc3VsdFxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIHJ1blRlc3RzKCk7XG4gICAgICAgIHJldHVybiBERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoZGF0YSk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|